ern-api-gen
Version:
Electrode Native API generator
227 lines • 10.1 kB
JavaScript
;
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