mirror of
https://github.com/react/react-native.git
synced 2026-09-28 13:23:09 +08:00
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/41574 The codegen scripts hard-code to exclude NativeSampleTurboModule. This diff modifies the codegen infra (i.e: combine-js-to-schema-cli.js) to accept an argument: --exclude <regex>. Auxiliary changes: - Refactor argument parsing to rely on node's util.parseArgs Changelog: [Internal] Reviewed By: javache, dmytrorykun Differential Revision: D51471526 fbshipit-source-id: 98b88058f8c4b6fa4d776d96a1eb0f15144906a8
103 lines
2.6 KiB
JavaScript
103 lines
2.6 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow strict-local
|
|
* @format
|
|
* @oncall react_native
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const path = require('path');
|
|
const util = require('util');
|
|
|
|
function parseArgs(args: string[]): {
|
|
platform: ?string,
|
|
outfile: string,
|
|
fileList: string[],
|
|
exclude: ?RegExp,
|
|
} {
|
|
const parsedArgs = util.parseArgs({
|
|
args: args.slice(2),
|
|
options: {
|
|
platform: {
|
|
short: 'p',
|
|
type: 'string',
|
|
},
|
|
exclude: {
|
|
short: 'e',
|
|
type: 'string',
|
|
},
|
|
},
|
|
allowPositionals: true,
|
|
});
|
|
|
|
const {
|
|
values: {platform, exclude},
|
|
positionals: files,
|
|
} = parsedArgs;
|
|
|
|
const [outfile, ...fileList] = files;
|
|
|
|
return {
|
|
platform: platform ?? null,
|
|
outfile,
|
|
fileList,
|
|
exclude: exclude != null && exclude !== '' ? new RegExp(exclude) : null,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* This function is used by the CLI to decide whether a JS/TS file has to be processed or not by the Codegen.
|
|
* Parameters:
|
|
* - file: the path to the file
|
|
* - currentPlatform: the current platform for which we are creating the specs
|
|
* Returns: `true` if the file can be used to generate some code; `false` otherwise
|
|
*
|
|
*/
|
|
function filterJSFile(
|
|
file: string,
|
|
currentPlatform: ?string,
|
|
excludeRegExp: ?RegExp,
|
|
): boolean {
|
|
const isSpecFile = /^(Native.+|.+NativeComponent)/.test(path.basename(file));
|
|
const isNotNativeUIManager = !file.endsWith('NativeUIManager.js');
|
|
const isNotTest = !file.includes('__tests');
|
|
const isNotExcluded = excludeRegExp == null || !excludeRegExp.test(file);
|
|
const isNotTSTypeDefinition = !file.endsWith('.d.ts');
|
|
|
|
const isValidCandidate =
|
|
isSpecFile &&
|
|
isNotNativeUIManager &&
|
|
isNotExcluded &&
|
|
isNotTest &&
|
|
isNotTSTypeDefinition;
|
|
|
|
const filenameComponents = path.basename(file).split('.');
|
|
const isPlatformAgnostic = filenameComponents.length === 2;
|
|
|
|
if (currentPlatform == null) {
|
|
// need to accept only files that are platform agnostic
|
|
return isValidCandidate && isPlatformAgnostic;
|
|
}
|
|
|
|
// If a platform is passed, accept both platform agnostic specs...
|
|
if (isPlatformAgnostic) {
|
|
return isValidCandidate;
|
|
}
|
|
|
|
// ...and specs that share the same platform as the one passed.
|
|
// specfiles must follow the pattern: <filename>[.<platform>].(js|ts|tsx)
|
|
const filePlatform =
|
|
filenameComponents.length > 2 ? filenameComponents[1] : 'unknown';
|
|
return isValidCandidate && currentPlatform === filePlatform;
|
|
}
|
|
|
|
module.exports = {
|
|
parseArgs,
|
|
filterJSFile,
|
|
};
|