UNPKG

ern-api-gen

Version:

Electrode Native API generator

227 lines 10.1 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const generateProject_1 = __importStar(require("./generateProject")); const normalizeConfig_1 = __importDefault(require("./normalizeConfig")); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const semver_1 = __importDefault(require("semver")); const Constants_1 = require("./Constants"); const ern_core_1 = require("ern-core"); const inquirer_1 = __importDefault(require("inquirer")); const { execp } = ern_core_1.childProcess; /** * ============================================================================== * Main entry point * ============================================================================== * * Refer to normalizeConfig function doc for the list of options */ function generateApi(options) { return __awaiter(this, void 0, void 0, function* () { const config = normalizeConfig_1.default(options); const outFolder = path_1.default.join(process.cwd(), config.moduleName); if (fs_1.default.existsSync(outFolder)) { ern_core_1.log.error(`${outFolder} directory already exists`); process.exit(1); } // Create output folder ern_core_1.shell.mkdir(outFolder); yield generateProject_1.default(config, outFolder); ern_core_1.log.info(`== Project was generated in ${outFolder}`); }); } exports.generateApi = generateApi; /** * @param options * @returns {Promise.<void>} */ function regenerateCode(options = {}) { return __awaiter(this, void 0, void 0, function* () { const pkg = yield validateApiNameAndGetPackageJson('This is not a properly named API directory. Naming convention is react-native-{name}-api'); const curVersion = pkg.version || '1.0.0'; const pkgName = pkg.name; let newPluginVer; if (options.skipVersion) { newPluginVer = curVersion; } else { newPluginVer = semver_1.default.inc(curVersion, 'minor'); const { confirmPluginVer } = yield inquirer_1.default.prompt([ { message: `Would you like to bump the plugin version from [${pkgName}@${curVersion}] to [${pkgName}@${newPluginVer}]?`, name: 'confirmPluginVer', type: 'confirm', }, ]); if (!confirmPluginVer) { newPluginVer = yield _promptForPluginVersion(curVersion); } } yield _checkDependencyVersion(pkg, options.targetDependencies || []); const isNewVersion = semver_1.default.lt(curVersion, newPluginVer); const extra = (pkg.ern && pkg.ern.message) || {}; const config = normalizeConfig_1.default(Object.assign({ apiAuthor: pkg.author, apiDescription: pkg.description, apiVersion: isNewVersion ? newPluginVer : pkg.version, artifactId: pkg.artifactId, bridgeVersion: options.bridgeVersion || pkg.peerDependencies['react-native-electrode-bridge'], packageName: pkgName }, extra, options, { name: extra && extra.apiName ? extra.apiName : extra && extra.moduleName ? extra.moduleName : pkgName })); yield cleanGenerated(); // Regenerate package.json ern_core_1.fileUtils.writeFile(path_1.default.join(process.cwd(), Constants_1.PKG_FILE), generateProject_1.generatePackageJson(config)); // Regenerate .flowconfig file ern_core_1.fileUtils.writeFile(path_1.default.join(process.cwd(), Constants_1.FLOW_CONFIG_FILE), generateProject_1.generateFlowConfig()); yield generateProject_1.generateSwagger(config, process.cwd()); ern_core_1.log.info('== API generation complete !'); isNewVersion ? yield publish(yield readPackage()) : ern_core_1.log.info('O.K, make sure you bump the version and NPM publish if needed.'); }); } exports.regenerateCode = regenerateCode; function cleanGenerated(outFolder = process.cwd()) { return __awaiter(this, void 0, void 0, function* () { const pkg = yield validateApiNameAndGetPackageJson('This is not a properly named API directory. Naming convention is react-native-{name}-api'); ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, 'javascript')); ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, 'swift')); ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, 'android')); ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, 'IOS')); ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, Constants_1.FLOW_CONFIG_FILE)); ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, Constants_1.PKG_FILE)); return pkg; }); } exports.cleanGenerated = cleanGenerated; function validateApiNameAndGetPackageJson(message) { return __awaiter(this, void 0, void 0, function* () { const pkg = yield readPackage(); if (yield !ern_core_1.utils.isDependencyApi(pkg.name)) { throw new Error(message); } return pkg; }); } function readPackage() { return __awaiter(this, void 0, void 0, function* () { return ern_core_1.fileUtils.readJSON(path_1.default.join(process.cwd(), Constants_1.PKG_FILE)); }); } const nextVersion = (curVersion, userPluginVer) => { switch (userPluginVer.toLowerCase()) { case 'same': case 'no': case 'q': case 'quit': case 'n': return curVersion; default: { try { // If valid return if (semver_1.default.valid(userPluginVer) != null) { return userPluginVer; } const ret = semver_1.default.inc(curVersion, userPluginVer); if (ret) { return ret; } } catch (e) { ern_core_1.log.info(`not a valid version: ${userPluginVer}`); } } } }; function _promptForPluginVersion(curVersion) { return __awaiter(this, void 0, void 0, function* () { const { userPluginVer } = yield inquirer_1.default.prompt([ { message: `Current Plugin Version is ${curVersion}. Type the new plugin version (<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease | same)?`, name: 'userPluginVer', type: 'input', }, ]); const ret = nextVersion(curVersion, userPluginVer); if (ret == null) { ern_core_1.log.info('Enter valid version number. For more details visit https://github.com/npm/node-semver'); return _promptForPluginVersion(curVersion); } return ret; }); } function _checkDependencyVersion(pkg, targetDependencies) { return __awaiter(this, void 0, void 0, function* () { const pluginDependency = pkg.peerDependencies || {}; const targetNativeDependenciesMap = _constructTargetNativeDependenciesMap(targetDependencies); for (const key of Object.keys(pluginDependency)) { if (targetNativeDependenciesMap.has(key) && pluginDependency[key] !== targetNativeDependenciesMap.get(key)) { const answer = yield _promptForMissMatchOfSupportedPlugins(targetNativeDependenciesMap.get(key), key); pluginDependency[key] = answer.userPluginVer ? answer.userPluginVer : targetNativeDependenciesMap.get(key); } } }); } function _constructTargetNativeDependenciesMap(targetDependencies) { return new Map(targetDependencies.map(curVal => { const dependencyString = curVal.toString(); const idx = dependencyString.lastIndexOf('@'); // logic for scoped dependency return [ dependencyString.substring(0, idx), dependencyString.substring(idx + 1), ]; })); } function _promptForMissMatchOfSupportedPlugins(curVersion, pluginName) { return inquirer_1.default.prompt([ { message: `Type new plugin version for ${pluginName}. Press Enter to use the default '${curVersion}'.`, name: 'userPluginVer', type: 'input', }, ]); } function publish({ version }) { return __awaiter(this, void 0, void 0, function* () { const answers = yield inquirer_1.default.prompt([ { message: `Would you like to NPM publish version [${version}] of this API ?`, name: 'confirmNpmPublish', type: 'confirm', }, ]); if (answers.confirmNpmPublish) { yield npmPublish(); } }); } function npmPublish() { return __awaiter(this, void 0, void 0, function* () { return execp('npm publish'); }); } exports.default = { cleanGenerated, generateApi, regenerateCode, }; //# sourceMappingURL=apigen.js.map