react-native-builder-bob
Version:
CLI to build JavaScript files for React Native libraries
74 lines (71 loc) • 4.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CODEGEN_DOCS = void 0;
exports.patchCodegenAndroidPackage = patchCodegenAndroidPackage;
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _path = _interopRequireDefault(require("path"));
var _kleur = _interopRequireDefault(require("kleur"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const CODEGEN_DOCS = exports.CODEGEN_DOCS = 'https://reactnative.dev/docs/the-new-architecture/using-codegen#configuring-codegen';
/**
* Currently, running react-native codegen generates java files with package name `com.facebook.fbreact.specs`.
* This is a known issue in react-native itself.
* You can find the relevant line here: https://github.com/facebook/react-native/blob/dc460147bb00d6f912cc0a829f8040d85faeeb13/packages/react-native/scripts/codegen/generate-artifacts-executor.js#L459.
* To workaround, this function renames the package name to the one provided in the codegenConfig.
* @throws if codegenConfig.outputDir.android or codegenConfig.android.javaPackageName is not defined in package.json
* @throws if the codegenAndroidPath does not exist
*/
async function patchCodegenAndroidPackage(projectPath,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
packageJson, report) {
let codegenAndroidPath = packageJson.codegenConfig?.outputDir?.android;
if (!codegenAndroidPath) {
throw new Error(`Your package.json doesn't contain codegenConfig.outputDir.android. Please see ${CODEGEN_DOCS}`);
}
codegenAndroidPath = _path.default.resolve(projectPath, codegenAndroidPath);
if (!(await _fsExtra.default.pathExists(codegenAndroidPath))) {
throw new Error(`The codegen android path defined in your package.json: ${codegenAndroidPath} doesn't exist.`);
}
const codegenJavaPackageName = packageJson.codegenConfig.android.javaPackageName;
if (!codegenJavaPackageName) {
throw new Error(`Your package.json doesn't contain codegenConfig.android.javaPackageName. Please see ${CODEGEN_DOCS}`);
}
const codegenJavaPath = _path.default.resolve(codegenAndroidPath, `java/com/facebook/fbreact/specs`);
// If this issue is ever fixed in react-native, this check will prevent the patching from running.
if (!(await _fsExtra.default.pathExists(codegenJavaPath))) {
report.info(`Could not find ${_kleur.default.blue(_path.default.relative(projectPath, codegenJavaPath))}. Skipping patching codegen java files.`);
return;
}
const javaFiles = await _fsExtra.default.readdir(codegenJavaPath);
await Promise.all(javaFiles.map(async file => {
const filePath = _path.default.resolve(codegenJavaPath, file);
const fileContent = await _fsExtra.default.readFile(filePath, 'utf8');
const newFileContent = fileContent.replace('package com.facebook.fbreact.specs', `package ${codegenJavaPackageName}`);
await _fsExtra.default.writeFile(filePath, newFileContent);
}));
const newPackagePath = _path.default.resolve(codegenAndroidPath, 'java', codegenJavaPackageName.replace(/\./g, _path.default.sep));
if (!(await _fsExtra.default.pathExists(newPackagePath))) {
await _fsExtra.default.mkdir(newPackagePath, {
recursive: true
});
}
await Promise.all(javaFiles.map(async file => {
const filePath = _path.default.resolve(codegenJavaPath, file);
const newFilePath = _path.default.resolve(newPackagePath, file);
await _fsExtra.default.rename(filePath, newFilePath);
}));
if (await _fsExtra.default.pathExists(_path.default.resolve(codegenAndroidPath, 'java/com/facebook/react/viewmanagers'))) {
// Keep the view managers
await _fsExtra.default.rm(_path.default.resolve(codegenAndroidPath, 'java/com/facebook/fbreact'), {
recursive: true
});
} else {
// Delete the entire facebook namespace
await _fsExtra.default.rm(_path.default.resolve(codegenAndroidPath, 'java/com/facebook'), {
recursive: true
});
}
}
//# sourceMappingURL=patchCodegenAndroidPackage.js.map