@otakit/cli 1.1.1 → 1.2.0
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.
- package/dist/commands/compatibility.d.ts +3 -0
- package/dist/commands/compatibility.d.ts.map +1 -0
- package/dist/commands/compatibility.js +40 -0
- package/dist/commands/compatibility.js.map +1 -0
- package/dist/commands/config.js +1 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/generate-encryption-key.d.ts +3 -0
- package/dist/commands/generate-encryption-key.d.ts.map +1 -0
- package/dist/commands/generate-encryption-key.js +31 -0
- package/dist/commands/generate-encryption-key.js.map +1 -0
- package/dist/commands/release.d.ts.map +1 -1
- package/dist/commands/release.js +7 -4
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/releases.d.ts.map +1 -1
- package/dist/commands/releases.js +2 -1
- package/dist/commands/releases.js.map +1 -1
- package/dist/commands/upload.d.ts.map +1 -1
- package/dist/commands/upload.js +49 -1
- package/dist/commands/upload.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +1 -4
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +18 -1
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +9 -2
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/capacitor-config.d.ts +1 -1
- package/dist/lib/capacitor-config.d.ts.map +1 -1
- package/dist/lib/capacitor-config.js +63 -21
- package/dist/lib/capacitor-config.js.map +1 -1
- package/dist/lib/compat-check.d.ts +16 -0
- package/dist/lib/compat-check.d.ts.map +1 -0
- package/dist/lib/compat-check.js +26 -0
- package/dist/lib/compat-check.js.map +1 -0
- package/dist/lib/config.d.ts +2 -2
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +8 -16
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/crypto.d.ts +32 -0
- package/dist/lib/crypto.d.ts.map +1 -0
- package/dist/lib/crypto.js +67 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/native-deps.d.ts +42 -0
- package/dist/lib/native-deps.d.ts.map +1 -0
- package/dist/lib/native-deps.js +233 -0
- package/dist/lib/native-deps.js.map +1 -0
- package/dist/lib/upload-workflow.d.ts +12 -0
- package/dist/lib/upload-workflow.d.ts.map +1 -1
- package/dist/lib/upload-workflow.js +51 -7
- package/dist/lib/upload-workflow.js.map +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
3
|
+
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import semver from 'semver';
|
|
5
|
+
import { CliError } from './errors.js';
|
|
6
|
+
const NATIVE_FILE_REGEX = /\.(java|swift|kt|scala)$/;
|
|
7
|
+
const IOS_SOURCE_REGEX = /\.swift$/;
|
|
8
|
+
const ANDROID_SOURCE_REGEX = /\.(java|kt|scala)$/;
|
|
9
|
+
const IOS_CONFIG_REGEX = /(\.podspec|(^|\/)Package\.swift)$/;
|
|
10
|
+
const ANDROID_CONFIG_REGEX = /(^|\/)build\.gradle(\.kts)?$/;
|
|
11
|
+
const SKIPPED_DIRECTORIES = new Set(['node_modules', '.git', 'dist', 'build']);
|
|
12
|
+
export function collectNativePackages(options = {}) {
|
|
13
|
+
const packageJsonPath = resolve(options.packageJsonPath ?? join(process.cwd(), 'package.json'));
|
|
14
|
+
if (!existsSync(packageJsonPath)) {
|
|
15
|
+
throw new CliError(`package.json not found at ${packageJsonPath} (use --package-json).`);
|
|
16
|
+
}
|
|
17
|
+
const nodeModulesPath = resolve(options.nodeModulesPath ?? join(dirname(packageJsonPath), 'node_modules'));
|
|
18
|
+
if (!existsSync(nodeModulesPath)) {
|
|
19
|
+
throw new CliError(`node_modules not found at ${nodeModulesPath} (use --node-modules).`);
|
|
20
|
+
}
|
|
21
|
+
const rootPackage = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
22
|
+
const dependencies = rootPackage.dependencies ?? {};
|
|
23
|
+
const nativePackages = [];
|
|
24
|
+
for (const [name, requestedVersion] of Object.entries(dependencies)) {
|
|
25
|
+
const packageDir = join(nodeModulesPath, ...name.split('/'));
|
|
26
|
+
const packageJson = join(packageDir, 'package.json');
|
|
27
|
+
if (!existsSync(packageJson)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
let installedVersion;
|
|
31
|
+
try {
|
|
32
|
+
const parsed = JSON.parse(readFileSync(packageJson, 'utf-8'));
|
|
33
|
+
if (typeof parsed.version !== 'string' || parsed.version.length === 0) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
installedVersion = parsed.version;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const files = listFilesRecursively(packageDir);
|
|
42
|
+
const relativePaths = files
|
|
43
|
+
.map((file) => relative(packageDir, file).split(sep).join('/'))
|
|
44
|
+
.sort();
|
|
45
|
+
if (!relativePaths.some((path) => NATIVE_FILE_REGEX.test(path))) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const iosChecksum = checksumForPlatform(packageDir, relativePaths, IOS_SOURCE_REGEX, IOS_CONFIG_REGEX);
|
|
49
|
+
const androidChecksum = checksumForPlatform(packageDir, relativePaths, ANDROID_SOURCE_REGEX, ANDROID_CONFIG_REGEX);
|
|
50
|
+
nativePackages.push({
|
|
51
|
+
name,
|
|
52
|
+
version: installedVersion,
|
|
53
|
+
requestedVersion,
|
|
54
|
+
...(iosChecksum ? { iosChecksum } : {}),
|
|
55
|
+
...(androidChecksum ? { androidChecksum } : {}),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return nativePackages.sort((a, b) => a.name.localeCompare(b.name));
|
|
59
|
+
}
|
|
60
|
+
function listFilesRecursively(directory) {
|
|
61
|
+
const files = [];
|
|
62
|
+
const entries = readdirSync(directory, { withFileTypes: true });
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
if (entry.isSymbolicLink()) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const fullPath = join(directory, entry.name);
|
|
68
|
+
if (entry.isDirectory()) {
|
|
69
|
+
if (!SKIPPED_DIRECTORIES.has(entry.name)) {
|
|
70
|
+
files.push(...listFilesRecursively(fullPath));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else if (entry.isFile()) {
|
|
74
|
+
files.push(fullPath);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return files;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* SHA-256 over the platform's sorted native + config files, with each file's
|
|
81
|
+
* relative path mixed into the hash so renames are detected.
|
|
82
|
+
*/
|
|
83
|
+
function checksumForPlatform(packageDir, sortedRelativePaths, sourceRegex, configRegex) {
|
|
84
|
+
const platformPaths = sortedRelativePaths.filter((path) => sourceRegex.test(path) || configRegex.test(path));
|
|
85
|
+
if (platformPaths.length === 0) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
const hash = createHash('sha256');
|
|
89
|
+
for (const path of platformPaths) {
|
|
90
|
+
hash.update(path);
|
|
91
|
+
hash.update('\0');
|
|
92
|
+
hash.update(readFileSync(join(packageDir, path)));
|
|
93
|
+
hash.update('\0');
|
|
94
|
+
}
|
|
95
|
+
return hash.digest('hex');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Compare the local native set against the channel's current bundle.
|
|
99
|
+
*
|
|
100
|
+
* The checksum is the authoritative "native code actually changed" signal;
|
|
101
|
+
* a changed requested-version range that resolves to identical native code
|
|
102
|
+
* is reported as informational only.
|
|
103
|
+
*/
|
|
104
|
+
export function compareNative(local, remote) {
|
|
105
|
+
if (remote === null || remote === undefined) {
|
|
106
|
+
return { status: 'skipped', findings: [] };
|
|
107
|
+
}
|
|
108
|
+
const remoteByName = new Map(remote.map((entry) => [entry.name, entry]));
|
|
109
|
+
const findings = [];
|
|
110
|
+
for (const pkg of local) {
|
|
111
|
+
const remotePkg = remoteByName.get(pkg.name);
|
|
112
|
+
remoteByName.delete(pkg.name);
|
|
113
|
+
if (!remotePkg) {
|
|
114
|
+
findings.push({
|
|
115
|
+
name: pkg.name,
|
|
116
|
+
kind: 'new_plugin',
|
|
117
|
+
incompatible: true,
|
|
118
|
+
localVersion: pkg.version,
|
|
119
|
+
note: 'native plugin not present in the current release',
|
|
120
|
+
});
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
findings.push(compareEntry(pkg, remotePkg));
|
|
124
|
+
}
|
|
125
|
+
for (const remotePkg of remoteByName.values()) {
|
|
126
|
+
findings.push({
|
|
127
|
+
name: remotePkg.name,
|
|
128
|
+
kind: 'removed',
|
|
129
|
+
incompatible: false,
|
|
130
|
+
remoteVersion: remotePkg.version,
|
|
131
|
+
note: 'removed locally (safe to ship OTA)',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const status = findings.some((finding) => finding.incompatible) ? 'incompatible' : 'compatible';
|
|
135
|
+
return { status, findings };
|
|
136
|
+
}
|
|
137
|
+
function compareEntry(local, remote) {
|
|
138
|
+
const base = {
|
|
139
|
+
name: local.name,
|
|
140
|
+
localVersion: local.version,
|
|
141
|
+
remoteVersion: remote.version,
|
|
142
|
+
};
|
|
143
|
+
// Native code added for a platform the baseline never had (e.g. a plugin
|
|
144
|
+
// gains Android sources): devices on that platform need a store build,
|
|
145
|
+
// same as a brand-new plugin. The reverse (remote-only checksum) is a
|
|
146
|
+
// removal and stays compatible.
|
|
147
|
+
const addedPlatforms = [
|
|
148
|
+
['ios', local.iosChecksum, remote.iosChecksum],
|
|
149
|
+
['android', local.androidChecksum, remote.androidChecksum],
|
|
150
|
+
].filter(([, localSum, remoteSum]) => localSum !== undefined && remoteSum === undefined);
|
|
151
|
+
if (addedPlatforms.length > 0) {
|
|
152
|
+
return {
|
|
153
|
+
...base,
|
|
154
|
+
kind: 'native_code_changed',
|
|
155
|
+
incompatible: true,
|
|
156
|
+
note: `native code added for ${addedPlatforms.map(([platform]) => platform).join(' + ')} (not in the current release)`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const comparablePlatforms = [
|
|
160
|
+
[local.iosChecksum, remote.iosChecksum],
|
|
161
|
+
[local.androidChecksum, remote.androidChecksum],
|
|
162
|
+
].filter(([localSum, remoteSum]) => localSum !== undefined && remoteSum !== undefined);
|
|
163
|
+
if (comparablePlatforms.length > 0) {
|
|
164
|
+
const changed = comparablePlatforms.some(([localSum, remoteSum]) => localSum !== remoteSum);
|
|
165
|
+
if (changed) {
|
|
166
|
+
return {
|
|
167
|
+
...base,
|
|
168
|
+
kind: 'native_code_changed',
|
|
169
|
+
incompatible: true,
|
|
170
|
+
note: 'native code differs from the current release',
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
if (local.requestedVersion !== remote.requestedVersion) {
|
|
174
|
+
return {
|
|
175
|
+
...base,
|
|
176
|
+
kind: 'range_changed',
|
|
177
|
+
incompatible: false,
|
|
178
|
+
note: `requested range changed (${remote.requestedVersion ?? '?'} -> ${local.requestedVersion ?? '?'}) but native code is identical`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return { ...base, kind: 'unchanged', incompatible: false };
|
|
182
|
+
}
|
|
183
|
+
// No comparable checksums (older baseline data) — fall back to versions.
|
|
184
|
+
if (!versionsIntersect(local, remote)) {
|
|
185
|
+
return {
|
|
186
|
+
...base,
|
|
187
|
+
kind: 'version_mismatch',
|
|
188
|
+
incompatible: true,
|
|
189
|
+
note: 'installed native versions do not intersect',
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
return { ...base, kind: 'unchanged', incompatible: false };
|
|
193
|
+
}
|
|
194
|
+
function versionsIntersect(local, remote) {
|
|
195
|
+
const localRange = local.requestedVersion ?? local.version;
|
|
196
|
+
const remoteRange = remote.requestedVersion ?? remote.version;
|
|
197
|
+
try {
|
|
198
|
+
return semver.intersects(localRange, remoteRange, { includePrerelease: true });
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return local.version === remote.version;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export function formatCompatibilityReport(result) {
|
|
205
|
+
if (result.status === 'skipped') {
|
|
206
|
+
return 'Compatibility check skipped: the current release has no native package baseline yet.';
|
|
207
|
+
}
|
|
208
|
+
const lines = [];
|
|
209
|
+
const rows = result.findings.map((finding) => [
|
|
210
|
+
finding.incompatible ? 'INCOMPATIBLE' : finding.kind === 'unchanged' ? 'ok' : 'info',
|
|
211
|
+
finding.name,
|
|
212
|
+
finding.localVersion ?? '-',
|
|
213
|
+
finding.remoteVersion ?? '-',
|
|
214
|
+
finding.note ?? finding.kind,
|
|
215
|
+
]);
|
|
216
|
+
const header = ['status', 'package', 'local', 'remote', 'detail'];
|
|
217
|
+
const widths = header.map((title, column) => Math.max(title.length, ...rows.map((row) => row[column].length)));
|
|
218
|
+
const renderRow = (row) => row.map((cell, column) => cell.padEnd(widths[column])).join(' ');
|
|
219
|
+
lines.push(renderRow(header));
|
|
220
|
+
lines.push(widths.map((width) => '-'.repeat(width)).join(' '));
|
|
221
|
+
for (const row of rows) {
|
|
222
|
+
lines.push(renderRow(row));
|
|
223
|
+
}
|
|
224
|
+
if (rows.length === 0) {
|
|
225
|
+
lines.push('(no native packages detected)');
|
|
226
|
+
}
|
|
227
|
+
if (result.status === 'incompatible') {
|
|
228
|
+
lines.push('');
|
|
229
|
+
lines.push('These native changes require a new store build. Bump runtimeVersion and ship a native build before releasing this bundle OTA.');
|
|
230
|
+
}
|
|
231
|
+
return lines.join('\n');
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=native-deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-deps.js","sourceRoot":"","sources":["../../src/lib/native-deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAqBvC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AACrD,MAAM,gBAAgB,GAAG,UAAU,CAAC;AACpC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAClD,MAAM,gBAAgB,GAAG,mCAAmC,CAAC;AAC7D,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAC5D,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/E,MAAM,UAAU,qBAAqB,CAAC,UAAwC,EAAE;IAC9E,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAChG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAAC,6BAA6B,eAAe,wBAAwB,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAC7B,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,cAAc,CAAC,CAC1E,CAAC;IACF,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAAC,6BAA6B,eAAe,wBAAwB,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAEpE,CAAC;IACF,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,IAAI,EAAE,CAAC;IAEpD,MAAM,cAAc,GAAoB,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,IAAI,gBAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAA0B,CAAC;YACvF,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtE,SAAS;YACX,CAAC;YACD,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,KAAK;aACxB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC9D,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAChE,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,mBAAmB,CACrC,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,gBAAgB,CACjB,CAAC;QACF,MAAM,eAAe,GAAG,mBAAmB,CACzC,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,oBAAoB,CACrB,CAAC;QAEF,cAAc,CAAC,IAAI,CAAC;YAClB,IAAI;YACJ,OAAO,EAAE,gBAAgB;YACzB,gBAAgB;YAChB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,UAAkB,EAClB,mBAA6B,EAC7B,WAAmB,EACnB,WAAmB;IAEnB,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,CAC9C,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3D,CAAC;IACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AA0BD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAsB,EACtB,MAA0C;IAE1C,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,GAAG,CAAC,OAAO;gBACzB,IAAI,EAAE,kDAAkD;aACzD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,KAAK;YACnB,aAAa,EAAE,SAAS,CAAC,OAAO;YAChC,IAAI,EAAE,oCAAoC;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC;IAChG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,KAAoB,EAAE,MAAqB;IAC/D,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,KAAK,CAAC,OAAO;QAC3B,aAAa,EAAE,MAAM,CAAC,OAAO;KAC9B,CAAC;IAEF,yEAAyE;IACzE,uEAAuE;IACvE,sEAAsE;IACtE,gCAAgC;IAChC,MAAM,cAAc,GAAG;QACrB,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;QAC9C,CAAC,SAAS,EAAE,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC;KAC3D,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,CAAC,CAAC;IACzF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,GAAG,IAAI;YACP,IAAI,EAAE,qBAAqB;YAC3B,YAAY,EAAE,IAAI;YAClB,IAAI,EAAE,yBAAyB,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,+BAA+B;SACvH,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAoD;QAC3E,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;QACvC,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC;KAChD,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,CAEpF,CAAC;IAEF,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QAC5F,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,qBAAqB;gBAC3B,YAAY,EAAE,IAAI;gBAClB,IAAI,EAAE,8CAA8C;aACrD,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,gBAAgB,KAAK,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACvD,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,eAAe;gBACrB,YAAY,EAAE,KAAK;gBACnB,IAAI,EAAE,4BAA4B,MAAM,CAAC,gBAAgB,IAAI,GAAG,OAAO,KAAK,CAAC,gBAAgB,IAAI,GAAG,gCAAgC;aACrI,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAC7D,CAAC;IAED,yEAAyE;IACzE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,GAAG,IAAI;YACP,IAAI,EAAE,kBAAkB;YACxB,YAAY,EAAE,IAAI;YAClB,IAAI,EAAE,4CAA4C;SACnD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAoB,EAAE,MAAqB;IACpE,MAAM,UAAU,GAAG,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,OAAO,CAAC;IAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,OAAO,CAAC;IAC9D,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAA2B;IACnE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,sFAAsF,CAAC;IAChG,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACpF,OAAO,CAAC,IAAI;QACZ,OAAO,CAAC,YAAY,IAAI,GAAG;QAC3B,OAAO,CAAC,aAAa,IAAI,GAAG;QAC5B,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;KAC7B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAC1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CACjE,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,GAAa,EAAE,EAAE,CAClC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,+HAA+H,CAChI,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ApiClient, Bundle } from './api.js';
|
|
2
|
+
import type { NativePackage } from './native-deps.js';
|
|
2
3
|
export type VersionSource = 'flag' | 'env' | 'auto';
|
|
3
4
|
export type ResolvedVersion = {
|
|
4
5
|
value: string;
|
|
@@ -17,8 +18,19 @@ export type UploadWorkflowOptions = {
|
|
|
17
18
|
version: string;
|
|
18
19
|
runtimeVersion?: string;
|
|
19
20
|
releaseChannel?: string | null;
|
|
21
|
+
nativePackages?: NativePackage[];
|
|
22
|
+
forceImmediate?: boolean;
|
|
23
|
+
encrypt?: boolean;
|
|
20
24
|
onStatus?: (message: string) => void;
|
|
21
25
|
};
|
|
26
|
+
export declare const ENCRYPTION_KEY_ENV = "OTAKIT_ENCRYPTION_KEY";
|
|
27
|
+
/**
|
|
28
|
+
* Resolve the bundle encryption key (KEK).
|
|
29
|
+
*
|
|
30
|
+
* Encryption is on when `--encrypt` is passed or when OTAKIT_ENCRYPTION_KEY
|
|
31
|
+
* is set in the environment; `--encrypt` without the env var is an error.
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveEncryptionKey(encryptFlag: boolean | undefined): Buffer | null;
|
|
22
34
|
export type UploadWorkflowResult = {
|
|
23
35
|
bundle: Bundle;
|
|
24
36
|
releaseChannel?: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-workflow.d.ts","sourceRoot":"","sources":["../../src/lib/upload-workflow.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"upload-workflow.d.ts","sourceRoot":"","sources":["../../src/lib/upload-workflow.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAKlD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAyBtD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,MAAM,CAiBR;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,eAAe,CAAC,CAyB1B;AAkCD,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,SAAS,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAcpF;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA2F/B"}
|
|
@@ -4,6 +4,7 @@ import { execFileSync } from 'node:child_process';
|
|
|
4
4
|
import { randomUUID } from 'node:crypto';
|
|
5
5
|
import { dirname, join, resolve } from 'node:path';
|
|
6
6
|
import { tmpdir } from 'node:os';
|
|
7
|
+
import { encryptFile, parseEncryptionKey } from './crypto.js';
|
|
7
8
|
import { CliError } from './errors.js';
|
|
8
9
|
import { hashFile } from './hash.js';
|
|
9
10
|
import { getCliUserAgent } from './version.js';
|
|
@@ -89,50 +90,93 @@ async function uploadFileToPresignedUrl(filePath, presignedUrl) {
|
|
|
89
90
|
clearTimeout(timeoutId);
|
|
90
91
|
}
|
|
91
92
|
}
|
|
93
|
+
export const ENCRYPTION_KEY_ENV = 'OTAKIT_ENCRYPTION_KEY';
|
|
94
|
+
/**
|
|
95
|
+
* Resolve the bundle encryption key (KEK).
|
|
96
|
+
*
|
|
97
|
+
* Encryption is on when `--encrypt` is passed or when OTAKIT_ENCRYPTION_KEY
|
|
98
|
+
* is set in the environment; `--encrypt` without the env var is an error.
|
|
99
|
+
*/
|
|
100
|
+
export function resolveEncryptionKey(encryptFlag) {
|
|
101
|
+
const raw = process.env[ENCRYPTION_KEY_ENV]?.trim();
|
|
102
|
+
if (encryptFlag && !raw) {
|
|
103
|
+
throw new CliError([
|
|
104
|
+
`--encrypt requires the ${ENCRYPTION_KEY_ENV} environment variable.`,
|
|
105
|
+
'Generate a key with: otakit generate-encryption-key',
|
|
106
|
+
].join('\n'));
|
|
107
|
+
}
|
|
108
|
+
if (!raw) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return parseEncryptionKey(raw);
|
|
112
|
+
}
|
|
92
113
|
export async function runUploadWorkflow(options) {
|
|
93
|
-
const { api, sourcePath, version, runtimeVersion, releaseChannel, onStatus } = options;
|
|
114
|
+
const { api, sourcePath, version, runtimeVersion, releaseChannel, nativePackages, forceImmediate, encrypt, onStatus, } = options;
|
|
94
115
|
validateBundleDirectory(sourcePath);
|
|
116
|
+
const encryptionKey = resolveEncryptionKey(encrypt);
|
|
95
117
|
const tempZipPath = join(tmpdir(), `otakit-${version}-${randomUUID()}.zip`);
|
|
118
|
+
const tempEncPath = `${tempZipPath}.enc`;
|
|
96
119
|
const cleanup = () => {
|
|
97
120
|
try {
|
|
98
121
|
unlinkSync(tempZipPath);
|
|
99
122
|
}
|
|
100
|
-
catch {
|
|
123
|
+
catch {
|
|
124
|
+
// Best-effort cleanup — the temp zip may never have been created.
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
unlinkSync(tempEncPath);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Best-effort cleanup — the encrypted file may never have been created.
|
|
131
|
+
}
|
|
101
132
|
process.exit(1);
|
|
102
133
|
};
|
|
103
134
|
process.on('SIGINT', cleanup);
|
|
104
135
|
try {
|
|
105
136
|
onStatus?.('Creating zip archive...');
|
|
106
137
|
await createZip(sourcePath, tempZipPath);
|
|
138
|
+
let uploadPath = tempZipPath;
|
|
139
|
+
let encryption;
|
|
140
|
+
if (encryptionKey) {
|
|
141
|
+
onStatus?.('Encrypting bundle...');
|
|
142
|
+
encryption = await encryptFile(encryptionKey, tempZipPath, tempEncPath);
|
|
143
|
+
uploadPath = tempEncPath;
|
|
144
|
+
console.warn('\nBundle encryption requires manifest signing to be enabled on the server ' +
|
|
145
|
+
'(hosted default). Without signing, encryption parameters are unauthenticated.');
|
|
146
|
+
console.warn(`Ensure the installed app ships bundleKeys with kid ${encryption.kid}, or devices cannot decrypt this update.\n`);
|
|
147
|
+
}
|
|
107
148
|
onStatus?.('Calculating SHA-256 checksum...');
|
|
108
|
-
const sha256 = await hashFile(
|
|
109
|
-
const
|
|
149
|
+
const sha256 = await hashFile(uploadPath);
|
|
150
|
+
const uploadStat = await stat(uploadPath);
|
|
110
151
|
onStatus?.('Requesting upload URL...');
|
|
111
152
|
const initiated = await api.initiateUpload({
|
|
112
153
|
version,
|
|
113
154
|
runtimeVersion,
|
|
114
|
-
size:
|
|
155
|
+
size: uploadStat.size,
|
|
115
156
|
sha256,
|
|
157
|
+
nativePackages,
|
|
158
|
+
encryption,
|
|
116
159
|
});
|
|
117
160
|
const expiresAt = new Date(initiated.expiresAt);
|
|
118
161
|
if (expiresAt.getTime() - Date.now() < 60_000) {
|
|
119
162
|
throw new CliError('Presigned upload URL has expired or is about to expire. Please retry.');
|
|
120
163
|
}
|
|
121
164
|
onStatus?.('Uploading bundle...');
|
|
122
|
-
await uploadFileToPresignedUrl(
|
|
165
|
+
await uploadFileToPresignedUrl(uploadPath, initiated.presignedUrl);
|
|
123
166
|
onStatus?.('Finalizing...');
|
|
124
167
|
const bundle = await api.finalizeUpload({
|
|
125
168
|
uploadId: initiated.uploadId,
|
|
126
169
|
});
|
|
127
170
|
if (releaseChannel !== undefined) {
|
|
128
171
|
onStatus?.(`Releasing to ${releaseChannel ?? 'base channel'}...`);
|
|
129
|
-
await api.release(releaseChannel, bundle.id);
|
|
172
|
+
await api.release(releaseChannel, bundle.id, { forceImmediate });
|
|
130
173
|
}
|
|
131
174
|
return { bundle, releaseChannel };
|
|
132
175
|
}
|
|
133
176
|
finally {
|
|
134
177
|
process.off('SIGINT', cleanup);
|
|
135
178
|
await removeFileIfExists(tempZipPath);
|
|
179
|
+
await removeFileIfExists(tempEncPath);
|
|
136
180
|
}
|
|
137
181
|
}
|
|
138
182
|
function validateVersion(value, label) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-workflow.js","sourceRoot":"","sources":["../../src/lib/upload-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"upload-workflow.js","sourceRoot":"","sources":["../../src/lib/upload-workflow.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@otakit/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "CLI for uploading and releasing OtaKit OTA bundles",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -36,16 +36,18 @@
|
|
|
36
36
|
"prepublishOnly": "npm run build"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"yazl": "^2.5.1",
|
|
40
39
|
"chalk": "^5.6.2",
|
|
41
40
|
"commander": "^14.0.3",
|
|
42
41
|
"dotenv": "^17.2.3",
|
|
43
|
-
"ora": "^9.1.0"
|
|
42
|
+
"ora": "^9.1.0",
|
|
43
|
+
"semver": "^7.8.5",
|
|
44
|
+
"yazl": "^2.5.1"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
47
|
"@eslint/js": "^9.18.0",
|
|
47
|
-
"@types/yazl": "^2.4.5",
|
|
48
48
|
"@types/node": "^25.2.0",
|
|
49
|
+
"@types/semver": "^7.7.1",
|
|
50
|
+
"@types/yazl": "^2.4.5",
|
|
49
51
|
"eslint": "^9.39.2",
|
|
50
52
|
"typescript": "^5.9.3",
|
|
51
53
|
"typescript-eslint": "^8.32.1"
|