create-react-native-library
Version:
CLI to scaffold React Native libraries
114 lines (111 loc) • 5.13 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 _constants = require("./constants");
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 _local = require("./utils/local");
var _packageManager = require("./utils/packageManager");
var _prompt = require("./utils/prompt");
var _resolveNpmPackageVersion = require("./utils/resolveNpmPackageVersion");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
void _yargs.default.command('$0 [name]', 'create a react native library', _input.acceptedArgs, 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', _constants.FALLBACK_BOB_VERSION);
const nitroModulesVersionPromise = (0, _resolveNpmPackageVersion.resolveNpmPackageVersion)('react-native-nitro-modules', _constants.FALLBACK_NITRO_MODULES_VERSION);
await (0, _assert.assertNpxExists)();
const questions = await (0, _input.createQuestions)(argv);
const answers = await (0, _prompt.prompt)(questions, argv, {
interactive: argv.interactive
});
const bobVersion = await bobVersionPromise;
const nitroModulesVersion = answers.type === 'nitro-module' || answers.type === 'nitro-view' ? await nitroModulesVersionPromise : undefined;
const config = (0, _template.generateTemplateConfiguration)({
versions: {
bob: bobVersion,
nitro: nitroModulesVersion
},
basename: _path.default.basename(answers.name ?? answers.directory),
answers
});
const folder = _path.default.resolve(process.cwd(), answers.directory);
await _fsExtra.default.mkdirp(folder);
if (answers.reactNativeVersion != null && answers.reactNativeVersion !== _constants.SUPPORTED_REACT_NATIVE_VERSION) {
(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)({
root: 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);
}
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
});
const printSuccessMessage = () => spinner.succeed(`Project created successfully at ${_kleur.default.yellow(_path.default.relative(process.cwd(), folder))}!\n`);
if (answers.local) {
const packageManager = await (0, _packageManager.determinePackageManager)();
let addedNitro = false;
if (config.project.moduleConfig === 'nitro-modules') {
addedNitro = await (0, _local.addNitroDependencyToLocalLibrary)(config);
}
const linkedLocalLibrary = await (0, _local.linkLocalLibrary)(config, folder, packageManager);
printSuccessMessage();
(0, _inform.printLocalLibNextSteps)({
config,
packageManager,
linkedLocalLibrary,
addedNitro,
folder
});
} else {
spinner.text = 'Initializing git repository';
try {
const abortController = new AbortController();
// Creating git repository can get stuck in some cases,
// e.g. if git asks for ssh passphrase.
// We abort it after a timeout so that this doesn't hang forever.
await Promise.race([(0, _initialCommit.createInitialGitCommit)(folder, abortController.signal), new Promise((_resolve, reject) => {
setTimeout(() => {
const error = new Error('Creating git repository took too long');
abortController.abort(error.message);
reject(error);
}, 5000);
})]);
} catch (error) {
spinner.warn('Failed to create git repository');
}
printSuccessMessage();
(0, _inform.printNonLocalLibNextSteps)(config);
}
}
//# sourceMappingURL=index.js.map