@scalebun/cli 0.1.0 → 1.0.1
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/bin/scalebun.js +2 -2
- package/lib/api/client.d.ts +2 -0
- package/lib/api/client.d.ts.map +1 -1
- package/lib/api/client.js +14 -0
- package/lib/api/client.js.map +1 -1
- package/lib/commands/ci-init.d.ts +0 -6
- package/lib/commands/ci-init.d.ts.map +1 -1
- package/lib/commands/ci-init.js +182 -47
- package/lib/commands/ci-init.js.map +1 -1
- package/lib/commands/doctor.d.ts +3 -0
- package/lib/commands/doctor.d.ts.map +1 -0
- package/lib/commands/doctor.js +243 -0
- package/lib/commands/doctor.js.map +1 -0
- package/lib/commands/login.d.ts +16 -4
- package/lib/commands/login.d.ts.map +1 -1
- package/lib/commands/login.js +83 -25
- package/lib/commands/login.js.map +1 -1
- package/lib/commands/ota-keys.d.ts +11 -0
- package/lib/commands/ota-keys.d.ts.map +1 -0
- package/lib/commands/ota-keys.js +199 -0
- package/lib/commands/ota-keys.js.map +1 -0
- package/lib/commands/ota-publish.d.ts.map +1 -1
- package/lib/commands/ota-publish.js +154 -34
- package/lib/commands/ota-publish.js.map +1 -1
- package/lib/commands/ota-rollout.d.ts +3 -0
- package/lib/commands/ota-rollout.d.ts.map +1 -0
- package/lib/commands/ota-rollout.js +235 -0
- package/lib/commands/ota-rollout.js.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -1
- package/lib/utils/bundle.d.ts +53 -0
- package/lib/utils/bundle.d.ts.map +1 -1
- package/lib/utils/bundle.js +199 -14
- package/lib/utils/bundle.js.map +1 -1
- package/lib/utils/ui.js +6 -6
- package/package.json +33 -33
package/lib/utils/bundle.d.ts
CHANGED
|
@@ -21,11 +21,53 @@ export interface BundleOptions {
|
|
|
21
21
|
hermes?: boolean;
|
|
22
22
|
/** If true, generate a sourcemap alongside the bundle. */
|
|
23
23
|
sourcemap?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Identity marker to compile into the bundle. Injected into the JS source
|
|
26
|
+
* BEFORE hermesc runs — Hermes bytecode is a binary format, so text cannot be
|
|
27
|
+
* prepended after compilation without corrupting the file.
|
|
28
|
+
*
|
|
29
|
+
* At runtime the SDK reads `globalThis.__SCALEBUN_OTA_ID__` and compares it
|
|
30
|
+
* against the slot it believes is active. That comparison is the only way to
|
|
31
|
+
* prove from JS that the bundle we installed is the bundle actually running —
|
|
32
|
+
* which catches a host app that never wired `getJSBundleFile()`, and the
|
|
33
|
+
* bridgeless runtimes below RN 0.76.1 that ignore it entirely.
|
|
34
|
+
*/
|
|
35
|
+
identityToken?: string;
|
|
24
36
|
}
|
|
25
37
|
export interface BundleResult {
|
|
26
38
|
bundlePath: string;
|
|
27
39
|
assetsPath: string;
|
|
40
|
+
/** True when the artifact really is Hermes bytecode (verified from the header). */
|
|
41
|
+
hermesCompiled: boolean;
|
|
42
|
+
/** HBC format version read from the compiled header, or null for plain JS. */
|
|
43
|
+
hermesBytecodeVersion: number | null;
|
|
28
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Read the HBC format version straight out of the compiled file header.
|
|
47
|
+
*
|
|
48
|
+
* Parsed from the artifact rather than from `hermesc --version` output, because
|
|
49
|
+
* the header is what the device's VM actually compares against — and its format
|
|
50
|
+
* is stable, whereas the CLI's version banner is not.
|
|
51
|
+
*
|
|
52
|
+
* Returns null when the file is not Hermes bytecode.
|
|
53
|
+
*/
|
|
54
|
+
export declare function readHermesBytecodeVersion(filePath: string): number | null;
|
|
55
|
+
/**
|
|
56
|
+
* Locate the `hermesc` binary that ships inside React Native.
|
|
57
|
+
*
|
|
58
|
+
* `hermesc` is NOT an npm package — `npx hermesc` fails with
|
|
59
|
+
* "No versions available for hermesc" on every project, which meant `--hermes`
|
|
60
|
+
* silently degraded to a plain JS bundle every single time it was used. React
|
|
61
|
+
* Native ships a prebuilt binary per host platform under `sdks/hermesc/`.
|
|
62
|
+
*
|
|
63
|
+
* Using the copy inside the project's own `react-native` is also the correct
|
|
64
|
+
* choice for a second reason: it is the compiler matched to the Hermes runtime
|
|
65
|
+
* in that app's binary. Compiling with any other hermesc is what produces
|
|
66
|
+
* "Wrong bytecode version. Expected 96 but got 98" on device.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveHermesc(cwd?: string): string | null;
|
|
69
|
+
/** React Native version of the project being published, from its node_modules. */
|
|
70
|
+
export declare function detectProjectRnVersion(cwd?: string): string | null;
|
|
29
71
|
/**
|
|
30
72
|
* Shell out to `npx react-native bundle` to produce a JS bundle.
|
|
31
73
|
*
|
|
@@ -33,5 +75,16 @@ export interface BundleResult {
|
|
|
33
75
|
* The native runtime detects the format from magic bytes (\x1f\x\xbc —
|
|
34
76
|
* Hermes bytecode header), so the same .jsbundle extension works for both.
|
|
35
77
|
*/
|
|
78
|
+
/**
|
|
79
|
+
* True when this project is an Expo app.
|
|
80
|
+
*
|
|
81
|
+
* Expo projects do not ship `@react-native-community/cli`, so `npx react-native
|
|
82
|
+
* bundle` fails outright with a "react-native depends on
|
|
83
|
+
* @react-native-community/cli" error. Expo's equivalent is `expo export:embed`,
|
|
84
|
+
* which takes the same flags and produces the same artifact. Detecting this is
|
|
85
|
+
* not a nicety — without it `ota publish` cannot build a bundle in an Expo app
|
|
86
|
+
* at all, which is a large share of the React Native ecosystem.
|
|
87
|
+
*/
|
|
88
|
+
export declare function isExpoProject(cwd?: string): boolean;
|
|
36
89
|
export declare function buildBundle(opts: BundleOptions): BundleResult;
|
|
37
90
|
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/utils/bundle.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,SAAS,GAAG,KAAK,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/utils/bundle.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,SAAS,GAAG,KAAK,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,cAAc,EAAE,OAAO,CAAC;IACxB,8EAA8E;IAC9E,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAQD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBzE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAkBzE;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CASjF;AAED;;;;;;GAMG;AACH;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAelE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CA0J7D"}
|
package/lib/utils/bundle.js
CHANGED
|
@@ -33,11 +33,91 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.readHermesBytecodeVersion = readHermesBytecodeVersion;
|
|
37
|
+
exports.resolveHermesc = resolveHermesc;
|
|
38
|
+
exports.detectProjectRnVersion = detectProjectRnVersion;
|
|
39
|
+
exports.isExpoProject = isExpoProject;
|
|
36
40
|
exports.buildBundle = buildBundle;
|
|
37
41
|
const childProcess = __importStar(require("child_process"));
|
|
38
42
|
const fs = __importStar(require("fs"));
|
|
39
43
|
const path = __importStar(require("path"));
|
|
40
44
|
const os = __importStar(require("os"));
|
|
45
|
+
/**
|
|
46
|
+
* Hermes bytecode file magic, little-endian on disk.
|
|
47
|
+
* Source: `const uint64_t MAGIC = 0x1F1903C103BC1FC6` in Hermes.
|
|
48
|
+
*/
|
|
49
|
+
const HBC_MAGIC = Buffer.from([0xc6, 0x1f, 0xbc, 0x03, 0xc1, 0x03, 0x19, 0x1f]);
|
|
50
|
+
/**
|
|
51
|
+
* Read the HBC format version straight out of the compiled file header.
|
|
52
|
+
*
|
|
53
|
+
* Parsed from the artifact rather than from `hermesc --version` output, because
|
|
54
|
+
* the header is what the device's VM actually compares against — and its format
|
|
55
|
+
* is stable, whereas the CLI's version banner is not.
|
|
56
|
+
*
|
|
57
|
+
* Returns null when the file is not Hermes bytecode.
|
|
58
|
+
*/
|
|
59
|
+
function readHermesBytecodeVersion(filePath) {
|
|
60
|
+
let fd;
|
|
61
|
+
try {
|
|
62
|
+
fd = fs.openSync(filePath, 'r');
|
|
63
|
+
const header = Buffer.alloc(12);
|
|
64
|
+
const read = fs.readSync(fd, header, 0, 12, 0);
|
|
65
|
+
if (read < 12)
|
|
66
|
+
return null;
|
|
67
|
+
if (!header.subarray(0, 8).equals(HBC_MAGIC))
|
|
68
|
+
return null;
|
|
69
|
+
return header.readUInt32LE(8);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
if (fd !== undefined) {
|
|
76
|
+
try {
|
|
77
|
+
fs.closeSync(fd);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
/* ignore */
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Locate the `hermesc` binary that ships inside React Native.
|
|
87
|
+
*
|
|
88
|
+
* `hermesc` is NOT an npm package — `npx hermesc` fails with
|
|
89
|
+
* "No versions available for hermesc" on every project, which meant `--hermes`
|
|
90
|
+
* silently degraded to a plain JS bundle every single time it was used. React
|
|
91
|
+
* Native ships a prebuilt binary per host platform under `sdks/hermesc/`.
|
|
92
|
+
*
|
|
93
|
+
* Using the copy inside the project's own `react-native` is also the correct
|
|
94
|
+
* choice for a second reason: it is the compiler matched to the Hermes runtime
|
|
95
|
+
* in that app's binary. Compiling with any other hermesc is what produces
|
|
96
|
+
* "Wrong bytecode version. Expected 96 but got 98" on device.
|
|
97
|
+
*/
|
|
98
|
+
function resolveHermesc(cwd = process.cwd()) {
|
|
99
|
+
const dir = process.platform === 'win32'
|
|
100
|
+
? 'win64-bin'
|
|
101
|
+
: process.platform === 'darwin'
|
|
102
|
+
? 'osx-bin'
|
|
103
|
+
: 'linux64-bin';
|
|
104
|
+
const bin = process.platform === 'win32' ? 'hermesc.exe' : 'hermesc';
|
|
105
|
+
const candidate = path.join(cwd, 'node_modules', 'react-native', 'sdks', 'hermesc', dir, bin);
|
|
106
|
+
return fs.existsSync(candidate) ? candidate : null;
|
|
107
|
+
}
|
|
108
|
+
/** React Native version of the project being published, from its node_modules. */
|
|
109
|
+
function detectProjectRnVersion(cwd = process.cwd()) {
|
|
110
|
+
try {
|
|
111
|
+
const pkgPath = path.join(cwd, 'node_modules', 'react-native', 'package.json');
|
|
112
|
+
if (!fs.existsSync(pkgPath))
|
|
113
|
+
return null;
|
|
114
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
115
|
+
return typeof pkg.version === 'string' ? pkg.version : null;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
41
121
|
/**
|
|
42
122
|
* Shell out to `npx react-native bundle` to produce a JS bundle.
|
|
43
123
|
*
|
|
@@ -45,23 +125,49 @@ const os = __importStar(require("os"));
|
|
|
45
125
|
* The native runtime detects the format from magic bytes (\x1f\x\xbc —
|
|
46
126
|
* Hermes bytecode header), so the same .jsbundle extension works for both.
|
|
47
127
|
*/
|
|
128
|
+
/**
|
|
129
|
+
* True when this project is an Expo app.
|
|
130
|
+
*
|
|
131
|
+
* Expo projects do not ship `@react-native-community/cli`, so `npx react-native
|
|
132
|
+
* bundle` fails outright with a "react-native depends on
|
|
133
|
+
* @react-native-community/cli" error. Expo's equivalent is `expo export:embed`,
|
|
134
|
+
* which takes the same flags and produces the same artifact. Detecting this is
|
|
135
|
+
* not a nicety — without it `ota publish` cannot build a bundle in an Expo app
|
|
136
|
+
* at all, which is a large share of the React Native ecosystem.
|
|
137
|
+
*/
|
|
138
|
+
function isExpoProject(cwd = process.cwd()) {
|
|
139
|
+
try {
|
|
140
|
+
if (fs.existsSync(path.join(cwd, 'node_modules', 'expo', 'package.json'))) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
const pkgPath = path.join(cwd, 'package.json');
|
|
144
|
+
if (!fs.existsSync(pkgPath))
|
|
145
|
+
return false;
|
|
146
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
147
|
+
return Boolean(pkg.dependencies?.expo ?? pkg.devDependencies?.expo);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
48
153
|
function buildBundle(opts) {
|
|
49
154
|
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'scalebun-bundle-'));
|
|
50
155
|
const bundlePath = path.join(tmpDir, 'bundle.jsbundle');
|
|
51
156
|
const assetsPath = path.join(tmpDir, 'assets');
|
|
52
157
|
fs.mkdirSync(assetsPath, { recursive: true });
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
'
|
|
59
|
-
'
|
|
60
|
-
|
|
158
|
+
// `expo export:embed` is the Expo-side equivalent of `react-native bundle`
|
|
159
|
+
// and accepts the same flags. Both emit a plain JS bundle; Hermes compilation
|
|
160
|
+
// is a separate step below in either case.
|
|
161
|
+
const expo = isExpoProject();
|
|
162
|
+
const args = expo
|
|
163
|
+
? ['expo', 'export:embed']
|
|
164
|
+
: ['react-native', 'bundle'];
|
|
165
|
+
args.push('--platform', opts.platform, '--dev', String(opts.dev), '--entry-file', opts.entryFile, '--bundle-output', bundlePath, '--assets-dest', assetsPath);
|
|
61
166
|
// Sprint 8: Generate sourcemap if requested
|
|
62
167
|
if (opts.sourcemap) {
|
|
63
168
|
args.push('--sourcemap-output', bundlePath + '.map');
|
|
64
169
|
}
|
|
170
|
+
console.log(` Detected ${expo ? 'Expo' : 'bare React Native'} project`);
|
|
65
171
|
console.log(` Running: npx ${args.join(' ')}`);
|
|
66
172
|
const result = childProcess.spawnSync('npx', args, {
|
|
67
173
|
stdio: 'inherit',
|
|
@@ -69,26 +175,105 @@ function buildBundle(opts) {
|
|
|
69
175
|
timeout: 300000, // 5 minutes
|
|
70
176
|
});
|
|
71
177
|
if (result.status !== 0) {
|
|
72
|
-
throw new Error(
|
|
178
|
+
throw new Error(`${expo ? 'expo export:embed' : 'react-native bundle'} failed with exit code ${result.status}`);
|
|
73
179
|
}
|
|
74
180
|
if (!fs.existsSync(bundlePath)) {
|
|
75
181
|
throw new Error(`Bundle file not found at ${bundlePath}`);
|
|
76
182
|
}
|
|
183
|
+
// Identity marker — injected into the JS source, before any Hermes step
|
|
184
|
+
// (after hermesc the artifact is binary and text would corrupt the header).
|
|
185
|
+
//
|
|
186
|
+
// APPENDED, not prepended. Metro has already written the sourcemap by this
|
|
187
|
+
// point, and a prepended line shifts every generated line down by one —
|
|
188
|
+
// silently corrupting the line numbers of every symbolicated stack trace
|
|
189
|
+
// from this bundle. An appended statement adds no mappings and moves none;
|
|
190
|
+
// it still executes during bundle evaluation, and the SDK reads the global
|
|
191
|
+
// at init(), long after evaluation completes.
|
|
192
|
+
if (opts.identityToken) {
|
|
193
|
+
const marker = `\nglobalThis.__SCALEBUN_OTA_ID__=${JSON.stringify(opts.identityToken)};\n`;
|
|
194
|
+
fs.appendFileSync(bundlePath, marker, 'utf-8');
|
|
195
|
+
}
|
|
77
196
|
// Hermes bytecode compilation (opt-in)
|
|
78
197
|
if (opts.hermes) {
|
|
79
198
|
console.log(' Compiling to Hermes bytecode…');
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
199
|
+
// Compile to a sibling path, then rename. hermesc reading and writing the
|
|
200
|
+
// same path in one invocation is not guaranteed to be safe, and a truncated
|
|
201
|
+
// in-place write would produce a bundle that hashes fine and never loads.
|
|
202
|
+
const hbcPath = bundlePath + '.hbc';
|
|
203
|
+
const hermesc = resolveHermesc();
|
|
204
|
+
if (!hermesc) {
|
|
205
|
+
console.warn(' ⚠️ hermesc not found under node_modules/react-native/sdks/hermesc — ' +
|
|
206
|
+
'shipping plain JS bundle.');
|
|
207
|
+
}
|
|
208
|
+
// Output is CAPTURED, not inherited. hermesc emits one warning per
|
|
209
|
+
// undeclared global per module ("the variable Buffer was not declared…"),
|
|
210
|
+
// and each warning quotes the offending source line — which in a minified
|
|
211
|
+
// bundle is a single line of 100KB+. Two consequences shaped this code:
|
|
212
|
+
// 1. Inherited stdio drowned the publish summary in megabytes of noise.
|
|
213
|
+
// 2. spawnSync's DEFAULT maxBuffer is 1MB; the quoted warnings blow past
|
|
214
|
+
// it, Node kills hermesc (ENOBUFS), and `--hermes` silently degrades
|
|
215
|
+
// to plain JS — the same bug as `npx hermesc`, via a different door.
|
|
216
|
+
// Hit live on the very first publish after the capture change.
|
|
217
|
+
const hermescResult = hermesc
|
|
218
|
+
? childProcess.spawnSync(hermesc, ['-emit-binary', '-out', hbcPath, bundlePath], {
|
|
219
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
220
|
+
shell: false,
|
|
221
|
+
timeout: 120000,
|
|
222
|
+
encoding: 'utf-8',
|
|
223
|
+
maxBuffer: 256 * 1024 * 1024,
|
|
224
|
+
})
|
|
225
|
+
: { status: 1 };
|
|
226
|
+
if (hermesc && hermescResult.status === 0) {
|
|
227
|
+
const warnings = `${hermescResult.stdout ?? ''}${hermescResult.stderr ?? ''}`
|
|
228
|
+
.split('\n')
|
|
229
|
+
.filter((l) => l.includes('warning:')).length;
|
|
230
|
+
if (warnings > 0) {
|
|
231
|
+
console.log(` (${warnings} hermesc warnings suppressed — expected for RN bundles)`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (hermescResult.status !== 0 || !fs.existsSync(hbcPath)) {
|
|
235
|
+
if (hermesc) {
|
|
236
|
+
console.warn(` ⚠️ hermesc failed (exit ${hermescResult.status}` +
|
|
237
|
+
`${hermescResult.error ? `, ${hermescResult.error.message}` : ''}) — shipping plain JS bundle`);
|
|
238
|
+
// Only lines that carry the error itself, each clipped: a quoted
|
|
239
|
+
// minified source line is 100KB of noise per line.
|
|
240
|
+
const errLines = `${hermescResult.stderr ?? ''}`
|
|
241
|
+
.split('\n')
|
|
242
|
+
.filter((l) => l.includes('error:'))
|
|
243
|
+
.slice(0, 5)
|
|
244
|
+
.map((l) => (l.length > 200 ? l.slice(0, 200) + '…' : l));
|
|
245
|
+
for (const l of errLines)
|
|
246
|
+
console.warn(` ${l}`);
|
|
247
|
+
}
|
|
248
|
+
try {
|
|
249
|
+
if (fs.existsSync(hbcPath))
|
|
250
|
+
fs.unlinkSync(hbcPath);
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
/* ignore */
|
|
254
|
+
}
|
|
84
255
|
}
|
|
85
256
|
else {
|
|
257
|
+
fs.renameSync(hbcPath, bundlePath);
|
|
86
258
|
console.log(' ✅ Hermes bytecode compiled');
|
|
87
259
|
}
|
|
88
260
|
}
|
|
89
261
|
else {
|
|
90
262
|
console.log(' ℹ️ Shipping plain JS (no hermesc). Use --hermes for bytecode compilation.');
|
|
91
263
|
}
|
|
92
|
-
|
|
264
|
+
// Read the format back off the artifact rather than trusting the flag. When
|
|
265
|
+
// hermesc fails we fall back to plain JS, and recording `hermes: true` anyway
|
|
266
|
+
// would tell the backend to gate devices on a bytecode version this bundle
|
|
267
|
+
// does not have.
|
|
268
|
+
const hermesBytecodeVersion = readHermesBytecodeVersion(bundlePath);
|
|
269
|
+
if (opts.hermes && hermesBytecodeVersion === null) {
|
|
270
|
+
console.warn(' ⚠️ Artifact is not Hermes bytecode — recording it as plain JS.');
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
bundlePath,
|
|
274
|
+
assetsPath,
|
|
275
|
+
hermesCompiled: hermesBytecodeVersion !== null,
|
|
276
|
+
hermesBytecodeVersion,
|
|
277
|
+
};
|
|
93
278
|
}
|
|
94
279
|
//# sourceMappingURL=bundle.js.map
|
package/lib/utils/bundle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/utils/bundle.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/utils/bundle.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/ui.js
CHANGED
|
@@ -9,12 +9,12 @@ exports.renderCommands = renderCommands;
|
|
|
9
9
|
const chalk_1 = __importDefault(require("chalk"));
|
|
10
10
|
const credentials_1 = require("./credentials");
|
|
11
11
|
function renderBanner() {
|
|
12
|
-
const logo = `
|
|
13
|
-
${chalk_1.default.magenta('███████╗')} ${chalk_1.default.magenta('██████╗')} ${chalk_1.default.magenta('██╗ ██╗')} ${chalk_1.default.magenta('██╗')} ${chalk_1.default.magenta('███████╗')} ${chalk_1.default.magenta('██████╗')} ${chalk_1.default.magenta('██╗ ██╗')} ${chalk_1.default.magenta('███╗ ██╗')}
|
|
14
|
-
${chalk_1.default.magenta('██╔════╝')} ${chalk_1.default.magenta('██╔════╝')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('██║')} ${chalk_1.default.magenta('██╔════╝')} ${chalk_1.default.magenta('██╔══██╗')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('████╗ ██║')}
|
|
15
|
-
${chalk_1.default.magenta('███████╗')} ${chalk_1.default.magenta('██║')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('██║')} ${chalk_1.default.magenta('█████╗')} ${chalk_1.default.magenta('██████╔╝')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('██╔██╗ ██║')}
|
|
16
|
-
${chalk_1.default.magenta('╚════██║')} ${chalk_1.default.magenta('██║')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('██║')} ${chalk_1.default.magenta('██╔══╝')} ${chalk_1.default.magenta('██╔══██╗')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('██║╚██╗██║')}
|
|
17
|
-
${chalk_1.default.magenta('███████║')} ${chalk_1.default.magenta('╚██████╗')} ${chalk_1.default.magenta('╚██████╔╝')} ${chalk_1.default.magenta('███████╗')} ${chalk_1.default.magenta('███████╗')} ${chalk_1.default.magenta('██████╔╝')} ${chalk_1.default.magenta('╚██████╔╝')} ${chalk_1.default.magenta('██║ ╚████║')}
|
|
12
|
+
const logo = `
|
|
13
|
+
${chalk_1.default.magenta('███████╗')} ${chalk_1.default.magenta('██████╗')} ${chalk_1.default.magenta('██╗ ██╗')} ${chalk_1.default.magenta('██╗')} ${chalk_1.default.magenta('███████╗')} ${chalk_1.default.magenta('██████╗')} ${chalk_1.default.magenta('██╗ ██╗')} ${chalk_1.default.magenta('███╗ ██╗')}
|
|
14
|
+
${chalk_1.default.magenta('██╔════╝')} ${chalk_1.default.magenta('██╔════╝')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('██║')} ${chalk_1.default.magenta('██╔════╝')} ${chalk_1.default.magenta('██╔══██╗')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('████╗ ██║')}
|
|
15
|
+
${chalk_1.default.magenta('███████╗')} ${chalk_1.default.magenta('██║')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('██║')} ${chalk_1.default.magenta('█████╗')} ${chalk_1.default.magenta('██████╔╝')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('██╔██╗ ██║')}
|
|
16
|
+
${chalk_1.default.magenta('╚════██║')} ${chalk_1.default.magenta('██║')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('██║')} ${chalk_1.default.magenta('██╔══╝')} ${chalk_1.default.magenta('██╔══██╗')} ${chalk_1.default.magenta('██║ ██║')} ${chalk_1.default.magenta('██║╚██╗██║')}
|
|
17
|
+
${chalk_1.default.magenta('███████║')} ${chalk_1.default.magenta('╚██████╗')} ${chalk_1.default.magenta('╚██████╔╝')} ${chalk_1.default.magenta('███████╗')} ${chalk_1.default.magenta('███████╗')} ${chalk_1.default.magenta('██████╔╝')} ${chalk_1.default.magenta('╚██████╔╝')} ${chalk_1.default.magenta('██║ ╚████║')}
|
|
18
18
|
`;
|
|
19
19
|
console.log(logo);
|
|
20
20
|
console.log(chalk_1.default.bold.cyan(' ⚡ Scalebun CLI') + chalk_1.default.dim(' v0.1.0 — Enterprise OTA Update & Telemetry Control Plane\n'));
|
package/package.json
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@scalebun/cli",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"description": "Scalebun CLI — OTA bundle publishing and management",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"bin": {
|
|
7
|
-
"scalebun": "./bin/scalebun.js"
|
|
8
|
-
},
|
|
9
|
-
"main": "./lib/index.js",
|
|
10
|
-
"types": "./lib/index.d.ts",
|
|
11
|
-
"files": [
|
|
12
|
-
"bin/",
|
|
13
|
-
"lib/"
|
|
14
|
-
],
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
}
|
|
33
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@scalebun/cli",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Scalebun CLI — OTA bundle publishing and management",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"bin": {
|
|
7
|
+
"scalebun": "./bin/scalebun.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./lib/index.js",
|
|
10
|
+
"types": "./lib/index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"bin/",
|
|
13
|
+
"lib/"
|
|
14
|
+
],
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"commander": "^12.0.0",
|
|
17
|
+
"chalk": "^4.1.2",
|
|
18
|
+
"ora": "^5.4.1"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"typescript": "^5.4.0",
|
|
22
|
+
"@types/node": "^20.0.0"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18.0.0"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc",
|
|
29
|
+
"dev": "tsc --watch",
|
|
30
|
+
"typecheck": "tsc --noEmit",
|
|
31
|
+
"clean": "rm -rf lib"
|
|
32
|
+
}
|
|
33
|
+
}
|