@scalebun/cli 1.0.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.
@@ -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;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CA+D7D"}
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"}
@@ -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
- const args = [
54
- 'react-native', 'bundle',
55
- '--platform', opts.platform,
56
- '--dev', String(opts.dev),
57
- '--entry-file', opts.entryFile,
58
- '--bundle-output', bundlePath,
59
- '--assets-dest', assetsPath,
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(`react-native bundle failed with exit code ${result.status}`);
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
- const hbcPath = bundlePath; // overwrite in-place same extension
81
- const hermescResult = childProcess.spawnSync('npx', ['hermesc', '-emit-binary', '-out', hbcPath, bundlePath], { stdio: 'inherit', shell: true, timeout: 120000 });
82
- if (hermescResult.status !== 0) {
83
- console.warn(` ⚠️ hermesc failed (exit ${hermescResult.status}) shipping plain JS bundle`);
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
- return { bundlePath, assetsPath };
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
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/utils/bundle.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,kCA+DC;AAzGD,4DAA8C;AAC9C,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAgCzB;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,IAAmB;IAC7C,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE/C,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG;QACX,cAAc,EAAE,QAAQ;QACxB,YAAY,EAAE,IAAI,CAAC,QAAQ;QAC3B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACzB,cAAc,EAAE,IAAI,CAAC,SAAS;QAC9B,iBAAiB,EAAE,UAAU;QAC7B,eAAe,EAAE,UAAU;KAC5B,CAAC;IAEF,4CAA4C;IAC5C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;QACjD,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,MAAO,EAAE,YAAY;KAC/B,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,6CAA6C,MAAM,CAAC,MAAM,EAAE,CAC7D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,uCAAuC;IACvC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,sCAAsC;QAClE,MAAM,aAAa,GAAG,YAAY,CAAC,SAAS,CAC1C,KAAK,EACL,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,EACxD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAO,EAAE,CACpD,CAAC;QAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CACV,8BAA8B,aAAa,CAAC,MAAM,8BAA8B,CACjF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/utils/bundle.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scalebun/cli",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Scalebun CLI — OTA bundle publishing and management",
5
5
  "license": "MIT",
6
6
  "bin": {