@react-native/codegen
Version:
Code generation tools for React Native
84 lines (81 loc) • 2.35 kB
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.
*
*
* @format
*/
;
const assert = require('assert');
const fs = require('fs');
const yargs = require('yargs');
const argv = yargs
.option('p', {
alias: 'platform',
type: 'string',
demandOption: true,
})
.option('o', {
alias: 'output',
})
.option('s', {
alias: 'schema-query',
})
.parseSync();
const platform = argv.platform.toLowerCase();
const output = argv.output;
const schemaQuery = argv.s;
if (!['ios', 'android'].includes(platform)) {
throw new Error(`Invalid platform ${platform}`);
}
if (!schemaQuery.startsWith('@')) {
throw new Error(
"The argument provided to --schema-query must be a filename that starts with '@'.",
);
}
const schemaQueryOutputFile = schemaQuery.replace(/^@/, '');
const schemaQueryOutput = fs.readFileSync(schemaQueryOutputFile, 'utf8');
const schemaFiles = schemaQueryOutput.split(' ');
const modules = {};
const specNameToFile = {};
for (const file of schemaFiles) {
const schema = JSON.parse(fs.readFileSync(file, 'utf8'));
if (schema.modules) {
for (const specName in schema.modules) {
var _module$excludedPlatf;
const module = schema.modules[specName];
if (modules[specName]) {
assert.deepEqual(
module,
modules[specName],
`App contained two specs with the same file name '${specName}'. Schemas: ${specNameToFile[specName]}, ${file}. Please rename one of the specs.`,
);
}
const excludedPlatforms =
(_module$excludedPlatf = module.excludedPlatforms) === null ||
_module$excludedPlatf === void 0
? void 0
: _module$excludedPlatf.map(excludedPlatform =>
excludedPlatform.toLowerCase(),
);
if (excludedPlatforms != null) {
const cxxOnlyModule =
excludedPlatforms.includes('ios') &&
excludedPlatforms.includes('android');
if (!cxxOnlyModule && excludedPlatforms.includes(platform)) {
continue;
}
}
modules[specName] = module;
specNameToFile[specName] = file;
}
}
}
fs.writeFileSync(
output,
JSON.stringify({
modules,
}),
);