react-native-update-cli 2.7.0 → 2.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/cli.json +1 -0
  2. package/lib/api.js +3 -0
  3. package/lib/esm/api..mjs +183 -0
  4. package/lib/esm/app..mjs +130 -0
  5. package/lib/esm/bundle..mjs +823 -0
  6. package/lib/esm/exports..mjs +11 -0
  7. package/lib/esm/index..mjs +122 -0
  8. package/lib/esm/install..mjs +18 -0
  9. package/lib/esm/locales/en..mjs +131 -0
  10. package/lib/esm/locales/zh..mjs +130 -0
  11. package/lib/esm/module-manager..mjs +109 -0
  12. package/lib/esm/modules/app-module..mjs +213 -0
  13. package/lib/esm/modules/bundle-module..mjs +178 -0
  14. package/lib/esm/modules/index..mjs +17 -0
  15. package/lib/esm/modules/package-module..mjs +6 -0
  16. package/lib/esm/modules/user-module..mjs +351 -0
  17. package/lib/esm/modules/version-module..mjs +6 -0
  18. package/lib/esm/package..mjs +316 -0
  19. package/lib/esm/provider..mjs +293 -0
  20. package/lib/esm/types..mjs +1 -0
  21. package/lib/esm/user..mjs +36 -0
  22. package/lib/esm/utils/add-gitignore..mjs +32 -0
  23. package/lib/esm/utils/app-info-parser/aab..mjs +215 -0
  24. package/lib/esm/utils/app-info-parser/apk..mjs +75 -0
  25. package/lib/esm/utils/app-info-parser/app..mjs +3 -0
  26. package/lib/esm/utils/app-info-parser/index..mjs +44 -0
  27. package/lib/esm/utils/app-info-parser/ipa..mjs +73 -0
  28. package/lib/esm/utils/app-info-parser/resource-finder..mjs +401 -0
  29. package/lib/esm/utils/app-info-parser/utils..mjs +121 -0
  30. package/lib/esm/utils/app-info-parser/xml-parser/binary..mjs +569 -0
  31. package/lib/esm/utils/app-info-parser/xml-parser/manifest..mjs +200 -0
  32. package/lib/esm/utils/app-info-parser/zip..mjs +65 -0
  33. package/lib/esm/utils/check-lockfile..mjs +78 -0
  34. package/lib/esm/utils/check-plugin..mjs +25 -0
  35. package/lib/esm/utils/constants..mjs +19 -0
  36. package/lib/esm/utils/dep-versions..mjs +33 -0
  37. package/lib/esm/utils/git..mjs +43 -0
  38. package/lib/esm/utils/http-helper..mjs +70 -0
  39. package/lib/esm/utils/i18n..mjs +23 -0
  40. package/lib/esm/utils/index..mjs +316 -0
  41. package/lib/esm/utils/latest-version/cli..mjs +294 -0
  42. package/lib/esm/utils/latest-version/index..mjs +238 -0
  43. package/lib/esm/utils/plugin-config..mjs +23 -0
  44. package/lib/esm/versions..mjs +290 -0
  45. package/lib/package.js +1 -1
  46. package/package.json +19 -2
  47. package/src/api.ts +3 -0
  48. package/src/package.ts +1 -1
@@ -0,0 +1,238 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { dirname, join, parse, resolve as pathResolve } from "path";
4
+ import { URL } from "url";
5
+ import { npm, yarn } from "global-dirs";
6
+ import registryAuthToken from "registry-auth-token";
7
+ import getRegistryUrl from "registry-auth-token/registry-url";
8
+ import gt from "semver/functions/gt";
9
+ import maxSatisfying from "semver/ranges/max-satisfying";
10
+ export const ONE_DAY = 1000 * 60 * 60 * 24; // eslint-disable-line @typescript-eslint/naming-convention
11
+ const isPackageJson = (obj)=>{
12
+ return obj.dependencies !== undefined || obj.devDependencies !== undefined || obj.peerDependencies !== undefined;
13
+ };
14
+ const downloadMetadata = (pkgName, options)=>{
15
+ return new Promise((resolve, reject)=>{
16
+ const i = pkgName.indexOf('/');
17
+ const pkgScope = i !== -1 ? pkgName.slice(0, i) : '';
18
+ var _options_registryUrl;
19
+ const registryUrl = (_options_registryUrl = options == null ? void 0 : options.registryUrl) != null ? _options_registryUrl : getRegistryUrl(pkgScope);
20
+ const pkgUrl = new URL(encodeURIComponent(pkgName).replace(/^%40/, '@'), registryUrl);
21
+ let requestOptions = {
22
+ headers: {
23
+ accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'
24
+ },
25
+ host: pkgUrl.hostname,
26
+ path: pkgUrl.pathname,
27
+ port: pkgUrl.port
28
+ };
29
+ const authInfo = registryAuthToken(pkgUrl.toString(), {
30
+ recursive: true
31
+ });
32
+ if (authInfo && requestOptions.headers) {
33
+ requestOptions.headers.authorization = `${authInfo.type} ${authInfo.token}`;
34
+ }
35
+ if (options == null ? void 0 : options.requestOptions) {
36
+ requestOptions = {
37
+ ...requestOptions,
38
+ ...options.requestOptions
39
+ };
40
+ }
41
+ const { get } = require(pkgUrl.protocol === 'https:' ? 'https' : 'http');
42
+ const request = get(requestOptions, (res)=>{
43
+ if (res.statusCode === 200) {
44
+ let rawData = '';
45
+ res.setEncoding('utf8');
46
+ res.on('data', (chunk)=>rawData += chunk);
47
+ res.once('error', (err)=>{
48
+ res.removeAllListeners();
49
+ reject(`Request error (${err.message}): ${pkgUrl}`);
50
+ });
51
+ res.once('end', ()=>{
52
+ res.removeAllListeners();
53
+ try {
54
+ const pkgMetadata = JSON.parse(rawData);
55
+ resolve({
56
+ name: pkgName,
57
+ lastUpdateDate: Date.now(),
58
+ versions: Object.keys(pkgMetadata.versions),
59
+ distTags: pkgMetadata['dist-tags']
60
+ });
61
+ return;
62
+ } catch (err) {
63
+ reject(err);
64
+ return;
65
+ }
66
+ });
67
+ } else {
68
+ res.removeAllListeners();
69
+ res.resume(); // consume response data to free up memory
70
+ reject(`Request error (${res.statusCode}): ${pkgUrl}`);
71
+ return;
72
+ }
73
+ });
74
+ const abort = (error)=>{
75
+ request.destroy();
76
+ reject(error);
77
+ };
78
+ request.once('timeout', ()=>{
79
+ abort(`Request timed out: ${pkgUrl}`);
80
+ });
81
+ request.once('error', (err)=>{
82
+ abort(err);
83
+ });
84
+ request.on('close', ()=>{
85
+ request.removeAllListeners();
86
+ });
87
+ });
88
+ };
89
+ const getCacheDir = (name = '@badisi/latest-version')=>{
90
+ const homeDir = homedir();
91
+ switch(process.platform){
92
+ case 'darwin':
93
+ return join(homeDir, 'Library', 'Caches', name);
94
+ case 'win32':
95
+ var _process_env_LOCALAPPDATA;
96
+ return join((_process_env_LOCALAPPDATA = process.env.LOCALAPPDATA) != null ? _process_env_LOCALAPPDATA : join(homeDir, 'AppData', 'Local'), name, 'Cache');
97
+ default:
98
+ var _process_env_XDG_CACHE_HOME;
99
+ return join((_process_env_XDG_CACHE_HOME = process.env.XDG_CACHE_HOME) != null ? _process_env_XDG_CACHE_HOME : join(homeDir, '.cache'), name);
100
+ }
101
+ };
102
+ const saveMetadataToCache = (pkg)=>{
103
+ const filePath = join(getCacheDir(), `${pkg.name}.json`);
104
+ if (!existsSync(dirname(filePath))) {
105
+ mkdirSync(dirname(filePath), {
106
+ recursive: true
107
+ });
108
+ }
109
+ writeFileSync(filePath, JSON.stringify(pkg));
110
+ };
111
+ const getMetadataFromCache = (pkgName, options)=>{
112
+ var _options_cacheMaxAge;
113
+ const maxAge = (_options_cacheMaxAge = options == null ? void 0 : options.cacheMaxAge) != null ? _options_cacheMaxAge : ONE_DAY;
114
+ if (maxAge !== 0) {
115
+ const pkgCacheFilePath = join(getCacheDir(), `${pkgName}.json`);
116
+ if (existsSync(pkgCacheFilePath)) {
117
+ const pkg = JSON.parse(readFileSync(pkgCacheFilePath).toString());
118
+ if (Date.now() - pkg.lastUpdateDate < maxAge) {
119
+ return pkg;
120
+ }
121
+ }
122
+ }
123
+ return undefined; // invalidates cache
124
+ };
125
+ const getRegistryVersions = async (pkgName, tagOrRange, options)=>{
126
+ let pkgMetadata;
127
+ if (pkgName.length && (options == null ? void 0 : options.useCache)) {
128
+ pkgMetadata = getMetadataFromCache(pkgName, options);
129
+ if (!pkgMetadata) {
130
+ pkgMetadata = await downloadMetadata(pkgName, options);
131
+ saveMetadataToCache(pkgMetadata);
132
+ }
133
+ } else if (pkgName.length) {
134
+ pkgMetadata = await downloadMetadata(pkgName, options);
135
+ }
136
+ const versions = {
137
+ latest: pkgMetadata == null ? void 0 : pkgMetadata.distTags.latest,
138
+ next: pkgMetadata == null ? void 0 : pkgMetadata.distTags.next
139
+ };
140
+ if (tagOrRange && (pkgMetadata == null ? void 0 : pkgMetadata.distTags[tagOrRange])) {
141
+ versions.wanted = pkgMetadata.distTags[tagOrRange];
142
+ } else if (tagOrRange && (pkgMetadata == null ? void 0 : pkgMetadata.versions.length)) {
143
+ var _maxSatisfying;
144
+ versions.wanted = (_maxSatisfying = maxSatisfying(pkgMetadata.versions, tagOrRange)) != null ? _maxSatisfying : undefined;
145
+ }
146
+ return versions;
147
+ };
148
+ const getInstalledVersion = (pkgName, location = 'local')=>{
149
+ try {
150
+ if (location === 'globalNpm') {
151
+ var _require;
152
+ return (_require = require(join(npm.packages, pkgName, 'package.json'))) == null ? void 0 : _require.version;
153
+ } else if (location === 'globalYarn') {
154
+ var _yarnGlobalPkg_dependencies, _require1;
155
+ // Make sure package is globally installed by Yarn
156
+ const yarnGlobalPkg = require(pathResolve(yarn.packages, '..', 'package.json'));
157
+ if (!(yarnGlobalPkg == null ? void 0 : (_yarnGlobalPkg_dependencies = yarnGlobalPkg.dependencies) == null ? void 0 : _yarnGlobalPkg_dependencies[pkgName])) {
158
+ return undefined;
159
+ }
160
+ return (_require1 = require(join(yarn.packages, pkgName, 'package.json'))) == null ? void 0 : _require1.version;
161
+ } else {
162
+ /**
163
+ * Compute the local paths manually as require.resolve() and require.resolve.paths()
164
+ * cannot be trusted anymore.
165
+ * @see https://github.com/nodejs/node/issues/33460
166
+ * @see https://github.com/nodejs/loaders/issues/26
167
+ */ const { root } = parse(process.cwd());
168
+ let path = process.cwd();
169
+ const localPaths = [
170
+ join(path, 'node_modules')
171
+ ];
172
+ while(path !== root){
173
+ path = dirname(path);
174
+ localPaths.push(join(path, 'node_modules'));
175
+ }
176
+ for (const localPath of localPaths){
177
+ const pkgPath = join(localPath, pkgName, 'package.json');
178
+ if (existsSync(pkgPath)) {
179
+ var _require2;
180
+ return (_require2 = require(pkgPath)) == null ? void 0 : _require2.version;
181
+ }
182
+ }
183
+ }
184
+ return undefined;
185
+ } catch (e) {
186
+ return undefined;
187
+ }
188
+ };
189
+ const getInfo = async (pkg, options)=>{
190
+ const i = pkg.lastIndexOf('@');
191
+ let pkgInfo = {
192
+ name: i > 1 ? pkg.slice(0, i) : pkg,
193
+ wantedTagOrRange: i > 1 ? pkg.slice(i + 1) : 'latest',
194
+ updatesAvailable: false
195
+ };
196
+ try {
197
+ pkgInfo = {
198
+ ...pkgInfo,
199
+ local: getInstalledVersion(pkgInfo.name, 'local'),
200
+ globalNpm: getInstalledVersion(pkgInfo.name, 'globalNpm'),
201
+ globalYarn: getInstalledVersion(pkgInfo.name, 'globalYarn'),
202
+ ...await getRegistryVersions(pkgInfo.name, pkgInfo.wantedTagOrRange, options)
203
+ };
204
+ const local = pkgInfo.local && pkgInfo.wanted ? gt(pkgInfo.wanted, pkgInfo.local) ? pkgInfo.wanted : false : false;
205
+ const globalNpm = pkgInfo.globalNpm && pkgInfo.wanted ? gt(pkgInfo.wanted, pkgInfo.globalNpm) ? pkgInfo.wanted : false : false;
206
+ const globalYarn = pkgInfo.globalYarn && pkgInfo.wanted ? gt(pkgInfo.wanted, pkgInfo.globalYarn) ? pkgInfo.wanted : false : false;
207
+ pkgInfo.updatesAvailable = local || globalNpm || globalYarn ? {
208
+ local,
209
+ globalNpm,
210
+ globalYarn
211
+ } : false;
212
+ } catch (err) {
213
+ var _err_message;
214
+ pkgInfo.error = (_err_message = err == null ? void 0 : err.message) != null ? _err_message : err;
215
+ }
216
+ return pkgInfo;
217
+ };
218
+ const latestVersion = async (arg, options)=>{
219
+ const pkgs = [];
220
+ if (typeof arg === 'string') {
221
+ pkgs.push(arg);
222
+ } else if (Array.isArray(arg)) {
223
+ pkgs.push(...arg);
224
+ } else if (isPackageJson(arg)) {
225
+ const addDeps = (deps)=>{
226
+ if (deps) {
227
+ pkgs.push(...Object.keys(deps).map((key)=>`${key}@${deps[key]}`));
228
+ }
229
+ };
230
+ addDeps(arg.dependencies);
231
+ addDeps(arg.devDependencies);
232
+ addDeps(arg.peerDependencies);
233
+ }
234
+ const jobs = await Promise.allSettled(pkgs.map((pkg)=>getInfo(pkg, options)));
235
+ const results = jobs.map((jobResult)=>jobResult.value);
236
+ return typeof arg === 'string' ? results[0] : results;
237
+ };
238
+ export default latestVersion;
@@ -0,0 +1,23 @@
1
+ import fs from "fs-extra";
2
+ export const plugins = [
3
+ {
4
+ name: 'sentry',
5
+ bundleParams: {
6
+ sentry: true,
7
+ sourcemap: true
8
+ },
9
+ detect: async ()=>{
10
+ try {
11
+ await fs.access('ios/sentry.properties');
12
+ return true;
13
+ } catch (e) {
14
+ try {
15
+ await fs.access('android/sentry.properties');
16
+ return true;
17
+ } catch (e) {
18
+ return false;
19
+ }
20
+ }
21
+ }
22
+ }
23
+ ];
@@ -0,0 +1,290 @@
1
+ import { get, getAllPackages, post, put, uploadFile, doDelete } from "./api";
2
+ import { question, saveToLocal } from "./utils";
3
+ import { t } from "./utils/i18n";
4
+ import chalk from "chalk";
5
+ import { satisfies } from "compare-versions";
6
+ import { getPlatform, getSelectedApp } from "./app";
7
+ import { choosePackage } from "./package";
8
+ import { depVersions } from "./utils/dep-versions";
9
+ import { getCommitInfo } from "./utils/git";
10
+ async function showVersion(appId, offset) {
11
+ const { data, count } = await get(`/app/${appId}/version/list`);
12
+ console.log(t('offset', {
13
+ offset
14
+ }));
15
+ for (const version of data){
16
+ var _version_packages;
17
+ const pkgCount = ((_version_packages = version.packages) == null ? void 0 : _version_packages.length) || 0;
18
+ let packageInfo = '';
19
+ if (pkgCount === 0) {
20
+ packageInfo = 'no package';
21
+ } else {
22
+ var _version_packages1;
23
+ packageInfo = (_version_packages1 = version.packages) == null ? void 0 : _version_packages1.slice(0, 3).map((pkg)=>pkg.name).join(', ');
24
+ if (pkgCount > 3) {
25
+ packageInfo += `...and ${pkgCount - 3} more`;
26
+ } else {
27
+ packageInfo = `[${packageInfo}]`;
28
+ }
29
+ }
30
+ console.log(`${version.id}) ${version.hash.slice(0, 8)} ${version.name} ${packageInfo}`);
31
+ }
32
+ return data;
33
+ }
34
+ async function listVersions(appId) {
35
+ let offset = 0;
36
+ while(true){
37
+ await showVersion(appId, offset);
38
+ const cmd = await question('page Up/page Down/Begin/Quit(U/D/B/Q)');
39
+ switch(cmd.toLowerCase()){
40
+ case 'u':
41
+ offset = Math.max(0, offset - 10);
42
+ break;
43
+ case 'd':
44
+ offset += 10;
45
+ break;
46
+ case 'b':
47
+ offset = 0;
48
+ break;
49
+ case 'q':
50
+ return;
51
+ }
52
+ }
53
+ }
54
+ async function chooseVersion(appId) {
55
+ let offset = 0;
56
+ while(true){
57
+ const data = await showVersion(appId, offset);
58
+ const cmd = await question('Enter versionId or page Up/page Down/Begin(U/D/B)');
59
+ switch(cmd.toUpperCase()){
60
+ case 'U':
61
+ offset = Math.max(0, offset - 10);
62
+ break;
63
+ case 'D':
64
+ offset += 10;
65
+ break;
66
+ case 'B':
67
+ offset = 0;
68
+ break;
69
+ default:
70
+ {
71
+ const versionId = Number.parseInt(cmd, 10);
72
+ const v = data.find((version)=>version.id === String(versionId));
73
+ if (v) {
74
+ return v;
75
+ }
76
+ }
77
+ }
78
+ }
79
+ }
80
+ export const bindVersionToPackages = async ({ appId, versionId, pkgs, rollout, dryRun })=>{
81
+ if (dryRun) {
82
+ console.log(chalk.yellow(t('dryRun')));
83
+ }
84
+ if (rollout !== undefined) {
85
+ console.log(`${t('rolloutConfigSet', {
86
+ versions: pkgs.map((pkg)=>pkg.name).join(', '),
87
+ rollout: rollout
88
+ })}`);
89
+ }
90
+ for (const pkg of pkgs){
91
+ if (!dryRun) {
92
+ await post(`/app/${appId}/binding`, {
93
+ versionId,
94
+ rollout,
95
+ packageId: pkg.id
96
+ });
97
+ }
98
+ console.log(`${t('versionBind', {
99
+ version: versionId,
100
+ nativeVersion: pkg.name,
101
+ id: pkg.id
102
+ })}`);
103
+ }
104
+ console.log(t('operationComplete', {
105
+ count: pkgs.length
106
+ }));
107
+ };
108
+ export const versionCommands = {
109
+ publish: async function({ args, options }) {
110
+ const fn = args[0];
111
+ const { name, description, metaInfo } = options;
112
+ if (!fn || !fn.endsWith('.ppk')) {
113
+ throw new Error(t('publishUsage'));
114
+ }
115
+ const platform = await getPlatform(options.platform);
116
+ const { appId } = await getSelectedApp(platform);
117
+ const { hash } = await uploadFile(fn);
118
+ const versionName = name || await question(t('versionNameQuestion')) || t('unnamed');
119
+ const { id } = await post(`/app/${appId}/version/create`, {
120
+ name: versionName,
121
+ hash,
122
+ description: description || await question(t('versionDescriptionQuestion')),
123
+ metaInfo: metaInfo || await question(t('versionMetaInfoQuestion')),
124
+ deps: depVersions,
125
+ commit: await getCommitInfo()
126
+ });
127
+ // TODO local diff
128
+ saveToLocal(fn, `${appId}/ppk/${id}.ppk`);
129
+ console.log(t('packageUploadSuccess', {
130
+ id
131
+ }));
132
+ const { packageId, packageVersion, packageVersionRange, minPackageVersion, maxPackageVersion, rollout, dryRun } = options;
133
+ if (packageId || packageVersion || packageVersionRange || minPackageVersion || maxPackageVersion) {
134
+ await this.update({
135
+ options: {
136
+ versionId: id,
137
+ platform,
138
+ packageId,
139
+ packageVersion,
140
+ packageVersionRange,
141
+ minPackageVersion,
142
+ maxPackageVersion,
143
+ rollout,
144
+ dryRun
145
+ }
146
+ });
147
+ } else {
148
+ const q = await question(t('updateNativePackageQuestion'));
149
+ if (q.toLowerCase() === 'y') {
150
+ await this.update({
151
+ options: {
152
+ versionId: id,
153
+ platform
154
+ }
155
+ });
156
+ }
157
+ }
158
+ return versionName;
159
+ },
160
+ versions: async ({ options })=>{
161
+ const platform = await getPlatform(options.platform);
162
+ const { appId } = await getSelectedApp(platform);
163
+ await listVersions(appId);
164
+ },
165
+ update: async ({ options })=>{
166
+ const platform = await getPlatform(options.platform);
167
+ const appId = options.appId || (await getSelectedApp(platform)).appId;
168
+ let versionId = options.versionId || (await chooseVersion(appId)).id;
169
+ if (versionId === 'null') {
170
+ versionId = undefined;
171
+ }
172
+ let pkgId = options.packageId;
173
+ let pkgVersion = options.packageVersion;
174
+ let minPkgVersion = options.minPackageVersion;
175
+ let maxPkgVersion = options.maxPackageVersion;
176
+ let packageVersionRange = options.packageVersionRange;
177
+ let rollout = undefined;
178
+ if (options.rollout !== undefined) {
179
+ try {
180
+ rollout = Number.parseInt(options.rollout);
181
+ } catch (e) {
182
+ throw new Error(t('rolloutRangeError'));
183
+ }
184
+ if (rollout < 1 || rollout > 100) {
185
+ throw new Error(t('rolloutRangeError'));
186
+ }
187
+ }
188
+ const allPkgs = await getAllPackages(appId);
189
+ if (!allPkgs) {
190
+ throw new Error(t('noPackagesFound', {
191
+ appId
192
+ }));
193
+ }
194
+ let pkgsToBind = [];
195
+ if (minPkgVersion) {
196
+ minPkgVersion = String(minPkgVersion).trim();
197
+ pkgsToBind = allPkgs.filter((pkg)=>satisfies(pkg.name, `>=${minPkgVersion}`));
198
+ if (pkgsToBind.length === 0) {
199
+ throw new Error(t('nativeVersionNotFoundGte', {
200
+ version: minPkgVersion
201
+ }));
202
+ }
203
+ } else if (maxPkgVersion) {
204
+ maxPkgVersion = String(maxPkgVersion).trim();
205
+ pkgsToBind = allPkgs.filter((pkg)=>satisfies(pkg.name, `<=${maxPkgVersion}`));
206
+ if (pkgsToBind.length === 0) {
207
+ throw new Error(t('nativeVersionNotFoundLte', {
208
+ version: maxPkgVersion
209
+ }));
210
+ }
211
+ } else if (pkgVersion) {
212
+ pkgVersion = pkgVersion.trim();
213
+ const pkg = allPkgs.find((pkg)=>pkg.name === pkgVersion);
214
+ if (pkg) {
215
+ pkgsToBind = [
216
+ pkg
217
+ ];
218
+ } else {
219
+ throw new Error(t('nativeVersionNotFoundMatch', {
220
+ version: pkgVersion
221
+ }));
222
+ }
223
+ } else if (packageVersionRange) {
224
+ packageVersionRange = packageVersionRange.trim();
225
+ pkgsToBind = allPkgs.filter((pkg)=>satisfies(pkg.name, packageVersionRange));
226
+ if (pkgsToBind.length === 0) {
227
+ throw new Error(t('nativeVersionNotFoundMatch', {
228
+ version: packageVersionRange
229
+ }));
230
+ }
231
+ } else {
232
+ if (!pkgId) {
233
+ pkgId = (await choosePackage(appId)).id;
234
+ }
235
+ if (!pkgId) {
236
+ throw new Error(t('packageIdRequired'));
237
+ }
238
+ const pkg = allPkgs.find((pkg)=>String(pkg.id) === String(pkgId));
239
+ if (pkg) {
240
+ pkgsToBind = [
241
+ pkg
242
+ ];
243
+ } else {
244
+ throw new Error(t('nativePackageIdNotFound', {
245
+ id: pkgId
246
+ }));
247
+ }
248
+ }
249
+ await bindVersionToPackages({
250
+ appId,
251
+ versionId,
252
+ pkgs: pkgsToBind,
253
+ rollout,
254
+ dryRun: options.dryRun
255
+ });
256
+ },
257
+ updateVersionInfo: async ({ options })=>{
258
+ const platform = await getPlatform(options.platform);
259
+ const { appId } = await getSelectedApp(platform);
260
+ const versionId = options.versionId || (await chooseVersion(appId)).id;
261
+ const updateParams = {};
262
+ if (options.name) updateParams.name = options.name;
263
+ if (options.description) updateParams.description = options.description;
264
+ if (options.metaInfo) updateParams.metaInfo = options.metaInfo;
265
+ await put(`/app/${appId}/version/${versionId}`, updateParams);
266
+ console.log(t('operationSuccess'));
267
+ },
268
+ deleteVersion: async ({ options })=>{
269
+ let appId = options.appId;
270
+ if (!appId) {
271
+ const platform = await getPlatform(options.platform);
272
+ appId = (await getSelectedApp(platform)).appId;
273
+ }
274
+ let versionId = options.versionId;
275
+ if (!versionId) {
276
+ versionId = (await chooseVersion(appId)).id;
277
+ }
278
+ try {
279
+ await doDelete(`/app/${appId}/version/${versionId}`);
280
+ console.log(t('deleteVersionSuccess', {
281
+ versionId
282
+ }));
283
+ } catch (error) {
284
+ throw new Error(t('deleteVersionError', {
285
+ versionId,
286
+ error: error.message
287
+ }));
288
+ }
289
+ }
290
+ };
package/lib/package.js CHANGED
@@ -233,7 +233,7 @@ const packageCommands = {
233
233
  const { id } = await (0, _api.post)(`/app/${appId}/package/create`, {
234
234
  name: versionName,
235
235
  hash,
236
- buildTime,
236
+ buildTime: String(buildTime),
237
237
  deps: _depversions.depVersions,
238
238
  commit: await (0, _git.getCommitInfo)()
239
239
  });
package/package.json CHANGED
@@ -1,15 +1,32 @@
1
1
  {
2
2
  "name": "react-native-update-cli",
3
- "version": "2.7.0",
3
+ "version": "2.7.2",
4
4
  "description": "command line tool for react-native-update (remote updates for react native)",
5
5
  "main": "index.js",
6
+ "exports": {
7
+ ".": {
8
+ "import": "./lib/esm/index.mjs",
9
+ "require": "./lib/index.js"
10
+ },
11
+ "./cli.json": "./cli.json",
12
+ "./package.json": "./package.json",
13
+ "./lib/*": "./lib/*",
14
+ "./src/*": "./src/*",
15
+ "./proto/*": "./proto/*",
16
+ "./*": {
17
+ "import": "./lib/esm/*.mjs",
18
+ "require": "./lib/*.js"
19
+ }
20
+ },
6
21
  "bin": {
7
22
  "pushy": "lib/index.js",
8
23
  "cresc": "lib/index.js"
9
24
  },
10
25
  "files": ["lib", "src", "proto", "cli.json"],
11
26
  "scripts": {
12
- "build": "swc src -d lib --strip-leading-paths",
27
+ "build:cjs": "swc src -d lib --strip-leading-paths",
28
+ "build:esm": "swc src -d lib/esm --strip-leading-paths --out-file-extension .mjs -C module.type=es6",
29
+ "build": "npm run build:cjs && npm run build:esm",
13
30
  "prepublishOnly": "npm run build && chmod +x lib/index.js",
14
31
  "lint": "tsc --noEmit & biome check --write ."
15
32
  },
package/src/api.ts CHANGED
@@ -191,6 +191,9 @@ export async function uploadFile(fn: string, key?: string) {
191
191
  form.append('key', key);
192
192
  }
193
193
  form.append('file', fileStream);
194
+ // form.append('file', fileStream, {
195
+ // contentType: 'application/octet-stream',
196
+ // });
194
197
 
195
198
  const res = await fetch(realUrl, {
196
199
  method: 'POST',
package/src/package.ts CHANGED
@@ -229,7 +229,7 @@ export const packageCommands = {
229
229
  const { id } = await post(`/app/${appId}/package/create`, {
230
230
  name: versionName,
231
231
  hash,
232
- buildTime,
232
+ buildTime: String(buildTime),
233
233
  deps: depVersions,
234
234
  commit: await getCommitInfo(),
235
235
  });