UNPKG

react-native-builder-bob

Version:

CLI to build JavaScript files for React Native libraries

74 lines (71 loc) 4.03 kB
"use strict"; 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