create-react-native-library
Version:
CLI to scaffold React Native libraries
145 lines (143 loc) • 5.99 kB
JavaScript
;
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _kleur = _interopRequireDefault(require("kleur"));
var _ora = _interopRequireDefault(require("ora"));
var _path = _interopRequireDefault(require("path"));
var _yargs = _interopRequireDefault(require("yargs"));
var _addCodegenBuildScript = require("./exampleApp/addCodegenBuildScript");
var _dependencies = require("./exampleApp/dependencies");
var _generateExampleApp = _interopRequireDefault(require("./exampleApp/generateExampleApp"));
var _inform = require("./inform");
var _input = require("./input");
var _template = require("./template");
var _assert = require("./utils/assert");
var _initialCommit = require("./utils/initialCommit");
var _prompt = require("./utils/prompt");
var _resolveNpmPackageVersion = require("./utils/resolveNpmPackageVersion");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const FALLBACK_BOB_VERSION = '0.38.3';
const FALLBACK_NITRO_MODULES_VERSION = '0.22.1';
_yargs.default.command('$0 [name]', 'create a react native library', _input.acceptedArgs,
// @ts-expect-error Some types are still incompatible
create).demandCommand().recommendCommands().fail(_inform.printErrorHelp).parserConfiguration({
// don't pass kebab-case args to handler.
'strip-dashed': true
}).strict().argv;
async function create(_argv) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const {
_,
$0,
...argv
} = _argv;
// Prefetch bob version in background while asking questions
const bobVersionPromise = (0, _resolveNpmPackageVersion.resolveNpmPackageVersion)('react-native-builder-bob', FALLBACK_BOB_VERSION);
const nitroModulesVersionPromise = (0, _resolveNpmPackageVersion.resolveNpmPackageVersion)('react-native-nitro-modules', FALLBACK_NITRO_MODULES_VERSION);
const local = await promptLocalLibrary(argv);
const folder = await promptPath(argv, local);
await (0, _assert.assertNpxExists)();
const basename = _path.default.basename(folder);
const questions = await (0, _input.createQuestions)({
basename,
local
});
(0, _assert.assertUserInput)(questions, argv);
const promptAnswers = await (0, _prompt.prompt)(questions, argv);
const answers = {
...promptAnswers,
local
};
(0, _assert.assertUserInput)(questions, answers);
const bobVersion = await bobVersionPromise;
const nitroModulesVersion = answers.type === 'nitro-module' ? await nitroModulesVersionPromise : undefined;
const config = (0, _template.generateTemplateConfiguration)({
versions: {
bob: bobVersion,
nitroModules: nitroModulesVersion,
// Nitro codegen's version is always the same as nitro modules version.
nitroCodegen: nitroModulesVersion
},
basename,
answers
});
await _fsExtra.default.mkdirp(folder);
if (answers.reactNativeVersion != null) {
(0, _inform.printUsedRNVersion)(answers.reactNativeVersion, config);
}
const spinner = (0, _ora.default)().start();
if (config.example !== 'none') {
spinner.text = 'Generating example app';
await (0, _generateExampleApp.default)({
destination: folder,
reactNativeVersion: answers.reactNativeVersion,
config
});
}
spinner.text = 'Copying files';
await (0, _template.applyTemplates)(answers, config, folder);
const rootPackageJson = await _fsExtra.default.readJson(_path.default.join(folder, 'package.json'));
if (config.example !== 'none') {
await (0, _dependencies.alignDependencyVersionsWithExampleApp)(rootPackageJson, folder, config);
}
if (config.example === 'vanilla' && (config.project.moduleConfig === 'turbo-modules' || config.project.viewConfig === 'fabric-view')) {
(0, _addCodegenBuildScript.addCodegenBuildScript)(folder);
}
const libraryMetadata = (0, _input.createMetadata)(answers);
rootPackageJson['create-react-native-library'] = libraryMetadata;
await _fsExtra.default.writeJson(_path.default.join(folder, 'package.json'), rootPackageJson, {
spaces: 2
});
if (!local) {
await (0, _initialCommit.createInitialGitCommit)(folder);
}
spinner.succeed(`Project created successfully at ${_kleur.default.yellow(_path.default.relative(process.cwd(), folder))}!\n`);
await (0, _inform.printNextSteps)(local, folder, config);
}
async function promptLocalLibrary(argv) {
let local = false;
if (typeof argv.local === 'boolean') {
local = argv.local;
} else {
const hasPackageJson = await _fsExtra.default.pathExists(_path.default.join(process.cwd(), 'package.json'));
if (hasPackageJson) {
// If we're under a project with package.json, ask the user if they want to create a local library
const answers = await (0, _prompt.prompt)({
type: 'confirm',
name: 'local',
message: `Looks like you're under a project folder. Do you want to create a local library?`,
initial: true
});
local = answers.local;
}
}
return local;
}
async function promptPath(argv, local) {
let folder;
if (argv.name && !local) {
folder = _path.default.join(process.cwd(), argv.name);
} else {
const answers = await (0, _prompt.prompt)({
type: 'text',
name: 'folder',
message: `Where do you want to create the library?`,
initial: local && argv.name && !argv.name.includes('/') ? `modules/${argv.name}` : argv.name,
validate: input => {
if (!input) {
return 'Cannot be empty';
}
if (_fsExtra.default.pathExistsSync(_path.default.join(process.cwd(), input))) {
return 'Folder already exists';
}
return true;
}
});
folder = _path.default.join(process.cwd(), answers.folder);
}
if (await _fsExtra.default.pathExists(folder)) {
console.log(`A folder already exists at ${_kleur.default.blue(folder)}! Please specify another folder name or delete the existing one.`);
process.exit(1);
}
return folder;
}
//# sourceMappingURL=index.js.map