UNPKG

10.2 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4 return new (P || (P = Promise))(function (resolve, reject) {
5 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8 step((generator = generator.apply(thisArg, _arguments || [])).next());
9 });
10};
11var __importStar = (this && this.__importStar) || function (mod) {
12 if (mod && mod.__esModule) return mod;
13 var result = {};
14 if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
15 result["default"] = mod;
16 return result;
17};
18var __importDefault = (this && this.__importDefault) || function (mod) {
19 return (mod && mod.__esModule) ? mod : { "default": mod };
20};
21Object.defineProperty(exports, "__esModule", { value: true });
22const generateProject_1 = __importStar(require("./generateProject"));
23const normalizeConfig_1 = __importDefault(require("./normalizeConfig"));
24const fs_1 = __importDefault(require("fs"));
25const path_1 = __importDefault(require("path"));
26const semver_1 = __importDefault(require("semver"));
27const Constants_1 = require("./Constants");
28const ern_core_1 = require("ern-core");
29const inquirer_1 = __importDefault(require("inquirer"));
30const { execp } = ern_core_1.childProcess;
31/**
32 * ==============================================================================
33 * Main entry point
34 * ==============================================================================
35 *
36 * Refer to normalizeConfig function doc for the list of options
37 */
38function generateApi(options) {
39 return __awaiter(this, void 0, void 0, function* () {
40 const config = normalizeConfig_1.default(options);
41 const outFolder = path_1.default.join(process.cwd(), config.moduleName);
42 if (fs_1.default.existsSync(outFolder)) {
43 ern_core_1.log.error(`${outFolder} directory already exists`);
44 process.exit(1);
45 }
46 // Create output folder
47 ern_core_1.shell.mkdir(outFolder);
48 yield generateProject_1.default(config, outFolder);
49 ern_core_1.log.info(`== Project was generated in ${outFolder}`);
50 });
51}
52exports.generateApi = generateApi;
53/**
54 * @param options
55 * @returns {Promise.<void>}
56 */
57function regenerateCode(options = {}) {
58 return __awaiter(this, void 0, void 0, function* () {
59 const pkg = yield validateApiNameAndGetPackageJson('This is not a properly named API directory. Naming convention is react-native-{name}-api');
60 const curVersion = pkg.version || '1.0.0';
61 const pkgName = pkg.name;
62 let newPluginVer;
63 if (options.skipVersion) {
64 newPluginVer = curVersion;
65 }
66 else {
67 newPluginVer = semver_1.default.inc(curVersion, 'minor');
68 const { confirmPluginVer } = yield inquirer_1.default.prompt([
69 {
70 message: `Would you like to bump the plugin version from [${pkgName}@${curVersion}] to [${pkgName}@${newPluginVer}]?`,
71 name: 'confirmPluginVer',
72 type: 'confirm',
73 },
74 ]);
75 if (!confirmPluginVer) {
76 newPluginVer = yield _promptForPluginVersion(curVersion);
77 }
78 }
79 yield _checkDependencyVersion(pkg, options.targetDependencies || []);
80 const isNewVersion = semver_1.default.lt(curVersion, newPluginVer);
81 const extra = (pkg.ern && pkg.ern.message) || {};
82 const config = normalizeConfig_1.default(Object.assign(Object.assign(Object.assign({ apiAuthor: pkg.author, apiDescription: pkg.description, apiVersion: isNewVersion ? newPluginVer : pkg.version, artifactId: pkg.artifactId, bridgeVersion: options.bridgeVersion ||
83 pkg.peerDependencies['react-native-electrode-bridge'], packageName: pkgName }, extra), options), { name: extra && extra.apiName
84 ? extra.apiName
85 : extra && extra.moduleName
86 ? extra.moduleName
87 : pkgName }));
88 yield cleanGenerated();
89 // Regenerate package.json
90 ern_core_1.fileUtils.writeFile(path_1.default.join(process.cwd(), Constants_1.PKG_FILE), generateProject_1.generatePackageJson(config));
91 // Regenerate .flowconfig file
92 ern_core_1.fileUtils.writeFile(path_1.default.join(process.cwd(), Constants_1.FLOW_CONFIG_FILE), generateProject_1.generateFlowConfig());
93 yield generateProject_1.generateSwagger(config, process.cwd());
94 ern_core_1.log.info('== API generation complete !');
95 isNewVersion
96 ? yield publish(yield readPackage())
97 : ern_core_1.log.info('O.K, make sure you bump the version and NPM publish if needed.');
98 });
99}
100exports.regenerateCode = regenerateCode;
101function cleanGenerated(outFolder = process.cwd()) {
102 return __awaiter(this, void 0, void 0, function* () {
103 const pkg = yield validateApiNameAndGetPackageJson('This is not a properly named API directory. Naming convention is react-native-{name}-api');
104 ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, 'javascript'));
105 ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, 'swift'));
106 ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, 'android'));
107 ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, 'IOS'));
108 ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, Constants_1.FLOW_CONFIG_FILE));
109 ern_core_1.shell.rm('-rf', path_1.default.join(outFolder, Constants_1.PKG_FILE));
110 return pkg;
111 });
112}
113exports.cleanGenerated = cleanGenerated;
114function validateApiNameAndGetPackageJson(message) {
115 return __awaiter(this, void 0, void 0, function* () {
116 const pkg = yield readPackage();
117 if (yield !ern_core_1.utils.isDependencyApi(pkg.name)) {
118 throw new Error(message);
119 }
120 return pkg;
121 });
122}
123function readPackage() {
124 return __awaiter(this, void 0, void 0, function* () {
125 return ern_core_1.fileUtils.readJSON(path_1.default.join(process.cwd(), Constants_1.PKG_FILE));
126 });
127}
128const nextVersion = (curVersion, userPluginVer) => {
129 switch (userPluginVer.toLowerCase()) {
130 case 'same':
131 case 'no':
132 case 'q':
133 case 'quit':
134 case 'n':
135 return curVersion;
136 default: {
137 try {
138 // If valid return
139 if (semver_1.default.valid(userPluginVer) != null) {
140 return userPluginVer;
141 }
142 const ret = semver_1.default.inc(curVersion, userPluginVer);
143 if (ret) {
144 return ret;
145 }
146 }
147 catch (e) {
148 ern_core_1.log.info(`not a valid version: ${userPluginVer}`);
149 }
150 }
151 }
152};
153function _promptForPluginVersion(curVersion) {
154 return __awaiter(this, void 0, void 0, function* () {
155 const { userPluginVer } = yield inquirer_1.default.prompt([
156 {
157 message: `Current Plugin Version is ${curVersion}. Type the new plugin version (<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease | same)?`,
158 name: 'userPluginVer',
159 type: 'input',
160 },
161 ]);
162 const ret = nextVersion(curVersion, userPluginVer);
163 if (ret == null) {
164 ern_core_1.log.info('Enter valid version number. For more details visit https://github.com/npm/node-semver');
165 return _promptForPluginVersion(curVersion);
166 }
167 return ret;
168 });
169}
170function _checkDependencyVersion(pkg, targetDependencies) {
171 return __awaiter(this, void 0, void 0, function* () {
172 const pluginDependency = pkg.peerDependencies || {};
173 const targetNativeDependenciesMap = _constructTargetNativeDependenciesMap(targetDependencies);
174 for (const key of Object.keys(pluginDependency)) {
175 if (targetNativeDependenciesMap.has(key) &&
176 pluginDependency[key] !== targetNativeDependenciesMap.get(key)) {
177 const answer = yield _promptForMissMatchOfSupportedPlugins(targetNativeDependenciesMap.get(key), key);
178 pluginDependency[key] = answer.userPluginVer
179 ? answer.userPluginVer
180 : targetNativeDependenciesMap.get(key);
181 }
182 }
183 });
184}
185function _constructTargetNativeDependenciesMap(targetDependencies) {
186 return new Map(targetDependencies.map(curVal => {
187 const dependencyString = curVal.toString();
188 const idx = dependencyString.lastIndexOf('@'); // logic for scoped dependency
189 return [
190 dependencyString.substring(0, idx),
191 dependencyString.substring(idx + 1),
192 ];
193 }));
194}
195function _promptForMissMatchOfSupportedPlugins(curVersion, pluginName) {
196 return inquirer_1.default.prompt([
197 {
198 message: `Type new plugin version for ${pluginName}. Press Enter to use the default '${curVersion}'.`,
199 name: 'userPluginVer',
200 type: 'input',
201 },
202 ]);
203}
204function publish({ version }) {
205 return __awaiter(this, void 0, void 0, function* () {
206 const answers = yield inquirer_1.default.prompt([
207 {
208 message: `Would you like to NPM publish version [${version}] of this API ?`,
209 name: 'confirmNpmPublish',
210 type: 'confirm',
211 },
212 ]);
213 if (answers.confirmNpmPublish) {
214 yield npmPublish();
215 }
216 });
217}
218function npmPublish() {
219 return __awaiter(this, void 0, void 0, function* () {
220 return execp('npm publish');
221 });
222}
223exports.default = {
224 cleanGenerated,
225 generateApi,
226 regenerateCode,
227};
228//# sourceMappingURL=apigen.js.map
\No newline at end of file