1 | "use strict";
|
2 | var __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 | };
|
11 | var __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 | };
|
18 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
19 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
20 | };
|
21 | Object.defineProperty(exports, "__esModule", { value: true });
|
22 | const generateProject_1 = __importStar(require("./generateProject"));
|
23 | const normalizeConfig_1 = __importDefault(require("./normalizeConfig"));
|
24 | const fs_1 = __importDefault(require("fs"));
|
25 | const path_1 = __importDefault(require("path"));
|
26 | const semver_1 = __importDefault(require("semver"));
|
27 | const Constants_1 = require("./Constants");
|
28 | const ern_core_1 = require("ern-core");
|
29 | const inquirer_1 = __importDefault(require("inquirer"));
|
30 | const { execp } = ern_core_1.childProcess;
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | function 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 |
|
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 | }
|
52 | exports.generateApi = generateApi;
|
53 |
|
54 |
|
55 |
|
56 |
|
57 | function 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 |
|
90 | ern_core_1.fileUtils.writeFile(path_1.default.join(process.cwd(), Constants_1.PKG_FILE), generateProject_1.generatePackageJson(config));
|
91 |
|
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 | }
|
100 | exports.regenerateCode = regenerateCode;
|
101 | function 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 | }
|
113 | exports.cleanGenerated = cleanGenerated;
|
114 | function 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 | }
|
123 | function 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 | }
|
128 | const 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 |
|
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 | };
|
153 | function _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 | }
|
170 | function _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 | }
|
185 | function _constructTargetNativeDependenciesMap(targetDependencies) {
|
186 | return new Map(targetDependencies.map(curVal => {
|
187 | const dependencyString = curVal.toString();
|
188 | const idx = dependencyString.lastIndexOf('@');
|
189 | return [
|
190 | dependencyString.substring(0, idx),
|
191 | dependencyString.substring(idx + 1),
|
192 | ];
|
193 | }));
|
194 | }
|
195 | function _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 | }
|
204 | function 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 | }
|
218 | function npmPublish() {
|
219 | return __awaiter(this, void 0, void 0, function* () {
|
220 | return execp('npm publish');
|
221 | });
|
222 | }
|
223 | exports.default = {
|
224 | cleanGenerated,
|
225 | generateApi,
|
226 | regenerateCode,
|
227 | };
|
228 |
|
\ | No newline at end of file |