@scalebun/cli 1.0.1 → 1.6.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.
Files changed (52) hide show
  1. package/lib/api/client.d.ts +6 -0
  2. package/lib/api/client.d.ts.map +1 -1
  3. package/lib/api/client.js +56 -2
  4. package/lib/api/client.js.map +1 -1
  5. package/lib/commands/ci-init.d.ts.map +1 -1
  6. package/lib/commands/ci-init.js +10 -1
  7. package/lib/commands/ci-init.js.map +1 -1
  8. package/lib/commands/doctor.d.ts +5 -0
  9. package/lib/commands/doctor.d.ts.map +1 -1
  10. package/lib/commands/doctor.js +11 -2
  11. package/lib/commands/doctor.js.map +1 -1
  12. package/lib/commands/login.d.ts +12 -0
  13. package/lib/commands/login.d.ts.map +1 -1
  14. package/lib/commands/login.js +112 -89
  15. package/lib/commands/login.js.map +1 -1
  16. package/lib/commands/ota-bundle.d.ts.map +1 -1
  17. package/lib/commands/ota-bundle.js +2 -0
  18. package/lib/commands/ota-bundle.js.map +1 -1
  19. package/lib/commands/ota-delete-bundle.d.ts +8 -0
  20. package/lib/commands/ota-delete-bundle.d.ts.map +1 -1
  21. package/lib/commands/ota-delete-bundle.js +60 -0
  22. package/lib/commands/ota-delete-bundle.js.map +1 -1
  23. package/lib/commands/ota-keys.d.ts +3 -0
  24. package/lib/commands/ota-keys.d.ts.map +1 -1
  25. package/lib/commands/ota-keys.js +1 -0
  26. package/lib/commands/ota-keys.js.map +1 -1
  27. package/lib/commands/ota-publish.d.ts +10 -0
  28. package/lib/commands/ota-publish.d.ts.map +1 -1
  29. package/lib/commands/ota-publish.js +108 -11
  30. package/lib/commands/ota-publish.js.map +1 -1
  31. package/lib/commands/quickstart.d.ts +4 -0
  32. package/lib/commands/quickstart.d.ts.map +1 -0
  33. package/lib/commands/quickstart.js +274 -0
  34. package/lib/commands/quickstart.js.map +1 -0
  35. package/lib/index.js +9 -1
  36. package/lib/index.js.map +1 -1
  37. package/lib/utils/bundle.d.ts +33 -0
  38. package/lib/utils/bundle.d.ts.map +1 -1
  39. package/lib/utils/bundle.js +62 -17
  40. package/lib/utils/bundle.js.map +1 -1
  41. package/lib/utils/credentials.d.ts +12 -1
  42. package/lib/utils/credentials.d.ts.map +1 -1
  43. package/lib/utils/credentials.js +40 -1
  44. package/lib/utils/credentials.js.map +1 -1
  45. package/lib/utils/transportSecurity.d.ts +36 -0
  46. package/lib/utils/transportSecurity.d.ts.map +1 -0
  47. package/lib/utils/transportSecurity.js +74 -0
  48. package/lib/utils/transportSecurity.js.map +1 -0
  49. package/lib/utils/ui.d.ts.map +1 -1
  50. package/lib/utils/ui.js +20 -8
  51. package/lib/utils/ui.js.map +1 -1
  52. package/package.json +1 -1
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerAppsCommand = registerAppsCommand;
40
+ exports.registerQuickstartCommand = registerQuickstartCommand;
41
+ const crypto = __importStar(require("crypto"));
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const readline = __importStar(require("readline"));
45
+ const chalk_1 = __importDefault(require("chalk"));
46
+ const credentials_1 = require("../utils/credentials");
47
+ const client_1 = require("../api/client");
48
+ const login_1 = require("./login");
49
+ const doctor_1 = require("./doctor");
50
+ const ota_keys_1 = require("./ota-keys");
51
+ /** client key with the middle masked — enough to recognize, useless to steal. */
52
+ function maskKey(key) {
53
+ return key.length <= 16 ? key : `${key.slice(0, 12)}…${key.slice(-4)}`;
54
+ }
55
+ /** Every app the account can see, flattened for listing/selection. */
56
+ async function fetchAllApps(client) {
57
+ const orgs = await client.get('/organizations');
58
+ const entries = [];
59
+ for (const org of orgs ?? []) {
60
+ const projects = await client.get(`/organizations/${org.id}/projects`);
61
+ for (const p of projects ?? []) {
62
+ const detail = await client.get(`/organizations/${org.id}/projects/${p.id}`);
63
+ for (const app of detail?.apps ?? []) {
64
+ entries.push({ orgId: org.id, orgName: org.name, projectName: p.name, app });
65
+ }
66
+ }
67
+ }
68
+ return entries;
69
+ }
70
+ function registerAppsCommand(program) {
71
+ program
72
+ .command('apps')
73
+ .description('List every app you can publish to, with the IDs the other commands need')
74
+ .option('--keys', 'Also show each app\'s environments and SDK client keys (masked)')
75
+ .action(async (opts) => {
76
+ const creds = (0, credentials_1.readCredentials)();
77
+ if (!creds) {
78
+ console.error('❌ Not logged in. Run `scalebun login` first.');
79
+ process.exit(1);
80
+ }
81
+ const client = new client_1.ApiClient(creds);
82
+ let entries;
83
+ try {
84
+ entries = await fetchAllApps(client);
85
+ }
86
+ catch (err) {
87
+ console.error(`❌ Could not list apps: ${err.message}`);
88
+ process.exit(1);
89
+ return;
90
+ }
91
+ if (!entries.length) {
92
+ console.log('\nNo apps yet. Create one in the dashboard (it takes a minute), then re-run this.\n');
93
+ return;
94
+ }
95
+ console.log('');
96
+ let lastGroup = '';
97
+ for (const e of entries) {
98
+ const group = `${e.orgName} / ${e.projectName}`;
99
+ if (group !== lastGroup) {
100
+ console.log(chalk_1.default.bold(` ${group}`));
101
+ lastGroup = group;
102
+ }
103
+ console.log(` • ${e.app.name.padEnd(24)} ${chalk_1.default.dim(e.app.platform ?? '?')} app-id: ${chalk_1.default.cyan(e.app.id)}`);
104
+ if (opts.keys) {
105
+ try {
106
+ const envs = await client.get(`/apps/${e.app.id}/environments`);
107
+ for (const env of envs ?? []) {
108
+ const keys = await client.get(`/environments/${env.id}/sdk-keys`);
109
+ const active = (keys ?? []).filter((k) => k.status === 'active');
110
+ const label = `${env.name}${env.type ? ` (${env.type})` : ''}`;
111
+ if (!active.length) {
112
+ console.log(` ${label}: ${chalk_1.default.dim('no active client key')}`);
113
+ }
114
+ for (const k of active) {
115
+ console.log(` ${label}: ${chalk_1.default.green(maskKey(k.clientKey))} ${chalk_1.default.dim(k.name ?? '')}`);
116
+ }
117
+ }
118
+ }
119
+ catch {
120
+ console.log(chalk_1.default.dim(' (could not load environments/keys)'));
121
+ }
122
+ }
123
+ }
124
+ console.log('');
125
+ console.log(chalk_1.default.dim(' Next: scalebun ota publish --app-id <id> --channel production --platform android'));
126
+ console.log('');
127
+ });
128
+ }
129
+ function registerQuickstartCommand(program) {
130
+ program
131
+ .command('quickstart')
132
+ .description('Guided walkthrough: login → pick your app → keys → health check → first release')
133
+ .option('--app-id <id>', 'Skip app selection and use this app')
134
+ .action(async (opts) => {
135
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
136
+ const ask = (q) => new Promise((r) => rl.question(q, r));
137
+ const step = (n, title) => console.log(chalk_1.default.bold.cyan(`\n── Step ${n}/6 · ${title} ${'─'.repeat(Math.max(1, 44 - title.length))}`));
138
+ try {
139
+ console.log(chalk_1.default.bold('\n⚡ Scalebun quickstart — from zero to your first OTA update.\n'));
140
+ console.log(chalk_1.default.dim(' Everything below runs against your real account. Ctrl+C any time.'));
141
+ // ── 1. Login ────────────────────────────────────────────────────────
142
+ step(1, 'Sign in');
143
+ let creds = (0, credentials_1.readCredentials)();
144
+ if (creds) {
145
+ try {
146
+ const me = await new client_1.ApiClient(creds).get('/auth/me');
147
+ console.log(`✅ Already signed in as ${me.email} (${creds.apiUrl})`);
148
+ }
149
+ catch {
150
+ console.log('⚠️ Stored token no longer works — signing in again.');
151
+ creds = null;
152
+ }
153
+ }
154
+ if (!creds) {
155
+ await (0, login_1.runLogin)({ expiresDays: '90' });
156
+ creds = (0, credentials_1.readCredentials)();
157
+ if (!creds)
158
+ process.exit(1);
159
+ }
160
+ const client = new client_1.ApiClient(creds);
161
+ // ── 2. Pick the app ─────────────────────────────────────────────────
162
+ step(2, 'Pick your app');
163
+ let appId = opts.appId ?? null;
164
+ let appLabel = appId ?? '';
165
+ if (!appId) {
166
+ const entries = await fetchAllApps(client);
167
+ if (!entries.length) {
168
+ console.log('❌ Your account has no apps yet.');
169
+ console.log(' Create one in the dashboard (Organization → Project → App), then re-run quickstart.');
170
+ process.exit(1);
171
+ }
172
+ if (entries.length === 1) {
173
+ appId = entries[0].app.id;
174
+ appLabel = entries[0].app.name;
175
+ console.log(`✅ Using your only app: ${appLabel} (${appId})`);
176
+ }
177
+ else {
178
+ entries.forEach((e, i) => console.log(` ${i + 1}. ${e.orgName} / ${e.projectName} / ${chalk_1.default.bold(e.app.name)} ${chalk_1.default.dim(e.app.id)}`));
179
+ const n = parseInt(await ask('\nWhich app? [1]: '), 10) || 1;
180
+ const chosen = entries[Math.min(Math.max(n, 1), entries.length) - 1];
181
+ appId = chosen.app.id;
182
+ appLabel = chosen.app.name;
183
+ console.log(`✅ ${chosen.app.name} (${appId})`);
184
+ }
185
+ }
186
+ // ── 3. SDK client key ───────────────────────────────────────────────
187
+ step(3, 'SDK client key');
188
+ console.log(chalk_1.default.dim(' The client key is what your app ships with — it scopes every SDK call to this app.'));
189
+ let clientKeyForSnippet = null;
190
+ try {
191
+ const envs = await client.get(`/apps/${appId}/environments`);
192
+ for (const env of envs ?? []) {
193
+ const keys = await client.get(`/environments/${env.id}/sdk-keys`);
194
+ const active = (keys ?? []).filter((k) => k.status === 'active');
195
+ console.log(` ${env.name}: ${active.length ? active.map((k) => maskKey(k.clientKey)).join(', ') : chalk_1.default.dim('no active key')}`);
196
+ if (active.length && !clientKeyForSnippet)
197
+ clientKeyForSnippet = active[0].clientKey;
198
+ }
199
+ if (!clientKeyForSnippet && envs?.length) {
200
+ const yn = (await ask('\n No active client key. Create one now? [Y/n]: ')).trim().toLowerCase();
201
+ if (yn !== 'n') {
202
+ const made = await client.post(`/environments/${envs[0].id}/sdk-keys`, {
203
+ name: 'quickstart key',
204
+ });
205
+ clientKeyForSnippet = made.clientKey;
206
+ console.log(` 🔑 Created: ${made.clientKey}`);
207
+ if (made.secretKey) {
208
+ console.log(chalk_1.default.yellow(` Secret key (shown ONCE, store it now): ${made.secretKey}`));
209
+ }
210
+ }
211
+ }
212
+ }
213
+ catch (err) {
214
+ console.log(` ⚠️ Could not read keys (${err.message}) — grab the client key from the dashboard instead.`);
215
+ }
216
+ console.log('\n Wire the SDK in your app entry point:\n');
217
+ console.log(chalk_1.default.green(' import { ScaleBunProvider } from \'@scalebun/react-native\';\n'));
218
+ console.log(chalk_1.default.green(' <ScaleBunProvider config={{'));
219
+ console.log(chalk_1.default.green(` clientKey: '${clientKeyForSnippet ?? '<your client key>'}',`));
220
+ console.log(chalk_1.default.green(' }}>'));
221
+ console.log(chalk_1.default.green(' <App />'));
222
+ console.log(chalk_1.default.green(' </ScaleBunProvider>'));
223
+ // ── 4. Bundle signing key ───────────────────────────────────────────
224
+ step(4, 'Bundle signing (recommended)');
225
+ const keyPath = path.resolve('.scalebun', 'ota-signing-key.pem');
226
+ if (fs.existsSync(keyPath)) {
227
+ console.log(`✅ Signing key already present: ${keyPath}`);
228
+ }
229
+ else {
230
+ const yn = (await ask(' No signing key found. Generate + register one now? [Y/n]: ')).trim().toLowerCase();
231
+ if (yn !== 'n') {
232
+ const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');
233
+ fs.mkdirSync(path.dirname(keyPath), { recursive: true });
234
+ fs.writeFileSync(keyPath, privateKey.export({ type: 'pkcs8', format: 'pem' }), { mode: 0o600 });
235
+ const publicHex = (0, ota_keys_1.rawPublicKeyHex)(publicKey);
236
+ await client.post(`/saas/apps/${appId}/ota/signing-keys`, {
237
+ publicKey: publicHex,
238
+ name: `quickstart ${new Date().toISOString().slice(0, 10)}`,
239
+ });
240
+ console.log(` 🔏 Key generated (${keyPath}) and public half registered.`);
241
+ console.log(chalk_1.default.yellow(' Add `.scalebun/` to .gitignore — the private key must never be committed.'));
242
+ console.log(` Pin it in the app for end-to-end authenticity: ota: { publicSigningKey: '${publicHex}' }`);
243
+ }
244
+ else {
245
+ console.log(chalk_1.default.dim(' Skipped — bundles will ship on SHA-256 integrity alone.'));
246
+ }
247
+ }
248
+ // ── 5. Project health ───────────────────────────────────────────────
249
+ step(5, 'Project health check');
250
+ console.log(chalk_1.default.dim(' Running `scalebun doctor` on the current directory…'));
251
+ await (0, doctor_1.runDoctor)(); // exits on blocking failures, same as the standalone command
252
+ // ── 6. First release ────────────────────────────────────────────────
253
+ step(6, 'Ship your first update');
254
+ console.log(' From your app\'s directory:\n');
255
+ console.log(chalk_1.default.green(` scalebun ota publish --app-id ${appId} --channel production --platform android \\`));
256
+ console.log(chalk_1.default.green(' --release-note "First OTA release"'));
257
+ console.log('\n Then manage it:\n');
258
+ console.log(` ${chalk_1.default.cyan('scalebun ota releases')} --app-id ${appId} ${chalk_1.default.dim('# live state per channel')}`);
259
+ console.log(` ${chalk_1.default.cyan('scalebun ota rollout')} --app-id ${appId} --percent 10 ${chalk_1.default.dim('# staged rollout')}`);
260
+ console.log(` ${chalk_1.default.cyan('scalebun ota pause')} --app-id ${appId} ${chalk_1.default.dim('# stop new deliveries')}`);
261
+ console.log(` ${chalk_1.default.cyan('scalebun ota rollback')} --app-id ${appId} ${chalk_1.default.dim('# revert every device')}`);
262
+ console.log(` ${chalk_1.default.cyan('scalebun ci init')} ${chalk_1.default.dim('# generate a CI workflow (GitHub/GitLab)')}`);
263
+ console.log(`\n Dashboard: releases, adoption and rollback analytics live under ${chalk_1.default.bold('OTA')} for ${chalk_1.default.bold(appLabel || appId)}.\n`);
264
+ }
265
+ catch (err) {
266
+ console.error(`\n❌ Quickstart stopped: ${err?.message ?? err}`);
267
+ process.exit(1);
268
+ }
269
+ finally {
270
+ rl.close();
271
+ }
272
+ });
273
+ }
274
+ //# sourceMappingURL=quickstart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickstart.js","sourceRoot":"","sources":["../../src/commands/quickstart.ts"],"names":[],"mappings":"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"}
package/lib/index.js CHANGED
@@ -12,12 +12,18 @@ const ota_rollout_1 = require("./commands/ota-rollout");
12
12
  const launch_1 = require("./commands/launch");
13
13
  const migrate_codepush_1 = require("./commands/migrate-codepush");
14
14
  const ci_init_1 = require("./commands/ci-init");
15
+ const quickstart_1 = require("./commands/quickstart");
15
16
  const ui_1 = require("./utils/ui");
16
17
  const program = new commander_1.Command();
18
+ // Read the version from package.json so it can never drift from the published
19
+ // version. The compiled entry lives at lib/index.js, so ../package.json is the
20
+ // CLI manifest. (Hardcoding it left `scalebun --version` reporting 0.1.0 long
21
+ // after the package had moved on.)
22
+ const { version } = require('../package.json');
17
23
  program
18
24
  .name('scalebun')
19
25
  .description('Scalebun CLI — OTA bundle publishing and management')
20
- .version('0.1.0')
26
+ .version(version)
21
27
  .action(() => {
22
28
  (0, ui_1.renderBanner)();
23
29
  (0, ui_1.renderStatus)();
@@ -27,6 +33,8 @@ program
27
33
  // did not exist — every other command depends on the credentials it writes,
28
34
  // and the documented first step of the CLI was unreachable.
29
35
  (0, login_1.registerLoginCommand)(program);
36
+ (0, quickstart_1.registerQuickstartCommand)(program);
37
+ (0, quickstart_1.registerAppsCommand)(program);
30
38
  (0, doctor_1.registerDoctorCommand)(program);
31
39
  const ota = program.command('ota').description('OTA update management');
32
40
  (0, ota_publish_1.registerOtaPublishCommand)(ota);
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,4CAAwD;AACxD,8CAA0D;AAC1D,wDAAmE;AACnE,sDAAiE;AACjE,0DAAqE;AACrE,oEAA8E;AAC9E,kDAA6D;AAC7D,wDAAoE;AACpE,8CAA0D;AAC1D,kEAA6E;AAC7E,gDAA2D;AAC3D,mCAAwE;AAExE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,GAAG,EAAE;IACX,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,mBAAc,GAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEL,4EAA4E;AAC5E,4EAA4E;AAC5E,4DAA4D;AAC5D,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;AACxE,IAAA,uCAAyB,EAAC,GAAG,CAAC,CAAC;AAC/B,IAAA,qCAAwB,EAAC,GAAG,CAAC,CAAC;AAC9B,IAAA,yCAA0B,EAAC,GAAG,CAAC,CAAC;AAChC,IAAA,kDAA8B,EAAC,GAAG,CAAC,CAAC;AACpC,IAAA,iCAAsB,EAAC,GAAG,CAAC,CAAC;AAC5B,IAAA,wCAA0B,EAAC,GAAG,CAAC,CAAC;AAChC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAC;AACnG,IAAA,iDAA8B,EAAC,OAAO,CAAC,CAAC;AACxC,IAAA,+BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,mBAAc,GAAE,CAAC;AACnB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,4CAAwD;AACxD,8CAA0D;AAC1D,wDAAmE;AACnE,sDAAiE;AACjE,0DAAqE;AACrE,oEAA8E;AAC9E,kDAA6D;AAC7D,wDAAoE;AACpE,8CAA0D;AAC1D,kEAA6E;AAC7E,gDAA2D;AAC3D,sDAAuF;AACvF,mCAAwE;AAExE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,mCAAmC;AACnC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,GAAG,EAAE;IACX,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,mBAAc,GAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEL,4EAA4E;AAC5E,4EAA4E;AAC5E,4DAA4D;AAC5D,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,sCAAyB,EAAC,OAAO,CAAC,CAAC;AACnC,IAAA,gCAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;AACxE,IAAA,uCAAyB,EAAC,GAAG,CAAC,CAAC;AAC/B,IAAA,qCAAwB,EAAC,GAAG,CAAC,CAAC;AAC9B,IAAA,yCAA0B,EAAC,GAAG,CAAC,CAAC;AAChC,IAAA,kDAA8B,EAAC,GAAG,CAAC,CAAC;AACpC,IAAA,iCAAsB,EAAC,GAAG,CAAC,CAAC;AAC5B,IAAA,wCAA0B,EAAC,GAAG,CAAC,CAAC;AAChC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAC;AACnG,IAAA,iDAA8B,EAAC,OAAO,CAAC,CAAC;AACxC,IAAA,+BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,mBAAc,GAAE,CAAC;AACnB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -19,6 +19,23 @@ export interface BundleOptions {
19
19
  * step will be mandatory when the patch engine ships.
20
20
  */
21
21
  hermes?: boolean;
22
+ /**
23
+ * Permit shipping a plain-JS bundle when `--hermes` was asked for but
24
+ * hermesc could not run. Default false: a failed compile is an ERROR.
25
+ *
26
+ * It used to warn and ship the uncompiled bundle, which is a silent
27
+ * downgrade of the artifact — the publish "succeeds" and nothing downstream
28
+ * can tell that what shipped is not what was requested. Two concrete costs:
29
+ * cold start is 20-30% slower for every user on that release, and the delta
30
+ * engine diffs the new bundle against the previous one, so a channel that
31
+ * flips between bytecode and plain JS produces patches with nothing in
32
+ * common and every device falls back to a full download.
33
+ *
34
+ * A broken toolchain should stop the publish, not quietly change what it
35
+ * publishes. The escape hatch stays available for anyone who genuinely
36
+ * wants the uncompiled artifact — it just has to be asked for.
37
+ */
38
+ allowPlainJs?: boolean;
22
39
  /** If true, generate a sourcemap alongside the bundle. */
23
40
  sourcemap?: boolean;
24
41
  /**
@@ -37,6 +54,12 @@ export interface BundleOptions {
37
54
  export interface BundleResult {
38
55
  bundlePath: string;
39
56
  assetsPath: string;
57
+ /**
58
+ * Asset files Metro emitted for this bundle, relative to `assetsPath`.
59
+ * OTA ships the JS artifact only — these resolve from the installed binary,
60
+ * so the list exists to WARN about assets added since the last store build.
61
+ */
62
+ assets: string[];
40
63
  /** True when the artifact really is Hermes bytecode (verified from the header). */
41
64
  hermesCompiled: boolean;
42
65
  /** HBC format version read from the compiled header, or null for plain JS. */
@@ -87,4 +110,14 @@ export declare function detectProjectRnVersion(cwd?: string): string | null;
87
110
  */
88
111
  export declare function isExpoProject(cwd?: string): boolean;
89
112
  export declare function buildBundle(opts: BundleOptions): BundleResult;
113
+ /**
114
+ * Every asset file Metro emitted for this bundle, relative to the assets root.
115
+ *
116
+ * OTA ships ONE artifact: the JS/bytecode bundle. Assets are resolved from what
117
+ * the installed binary already contains, so an image or font added since the
118
+ * last store build is referenced by the new JS and is simply not there — the
119
+ * update installs cleanly and renders a missing image. `ota publish` uses this
120
+ * list to say so out loud rather than discarding the directory in silence.
121
+ */
122
+ export declare function listAssets(root: string): string[];
90
123
  //# 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;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"}
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;;;;;;;;;;;;;;;OAeG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,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;;;;OAIG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,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,CAwK7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBjD"}
@@ -38,6 +38,7 @@ exports.resolveHermesc = resolveHermesc;
38
38
  exports.detectProjectRnVersion = detectProjectRnVersion;
39
39
  exports.isExpoProject = isExpoProject;
40
40
  exports.buildBundle = buildBundle;
41
+ exports.listAssets = listAssets;
41
42
  const childProcess = __importStar(require("child_process"));
42
43
  const fs = __importStar(require("fs"));
43
44
  const path = __importStar(require("path"));
@@ -201,10 +202,8 @@ function buildBundle(opts) {
201
202
  // in-place write would produce a bundle that hashes fine and never loads.
202
203
  const hbcPath = bundlePath + '.hbc';
203
204
  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
- }
205
+ // A missing hermesc is handled with the compile failures below, so that
206
+ // "cannot compile" has exactly one outcome regardless of the reason.
208
207
  // Output is CAPTURED, not inherited. hermesc emits one warning per
209
208
  // undeclared global per module ("the variable Buffer was not declared…"),
210
209
  // and each warning quotes the offending source line — which in a minified
@@ -232,19 +231,19 @@ function buildBundle(opts) {
232
231
  }
233
232
  }
234
233
  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
- }
234
+ // Collect the reason before deciding what to do with it — the same
235
+ // detail is worth printing whether this ends as an error or a warning.
236
+ const reason = hermesc
237
+ ? `hermesc failed (exit ${hermescResult.status}` +
238
+ `${hermescResult.error ? `, ${hermescResult.error.message}` : ''})`
239
+ : 'hermesc not found under node_modules/react-native/sdks/hermesc';
240
+ // Only lines that carry the error itself, each clipped: a quoted
241
+ // minified source line is 100KB of noise per line.
242
+ const errLines = `${hermescResult.stderr ?? ''}`
243
+ .split('\n')
244
+ .filter((l) => l.includes('error:'))
245
+ .slice(0, 5)
246
+ .map((l) => (l.length > 200 ? l.slice(0, 200) + '…' : l));
248
247
  try {
249
248
  if (fs.existsSync(hbcPath))
250
249
  fs.unlinkSync(hbcPath);
@@ -252,6 +251,21 @@ function buildBundle(opts) {
252
251
  catch {
253
252
  /* ignore */
254
253
  }
254
+ if (!opts.allowPlainJs) {
255
+ // STOP. --hermes was explicitly requested; shipping the uncompiled
256
+ // bundle instead would publish a different artifact than the one
257
+ // asked for, and nothing downstream could tell.
258
+ for (const l of errLines)
259
+ console.error(` ${l}`);
260
+ throw new Error(`${reason}.\n` +
261
+ ' --hermes was requested, so this is a hard failure rather than a silent\n' +
262
+ ' downgrade: shipping plain JS would slow every user\'s cold start by\n' +
263
+ ' 20-30% and break delta patching against previous bytecode releases.\n' +
264
+ ' Fix the toolchain, or pass --allow-plain-js to publish uncompiled.');
265
+ }
266
+ console.warn(` ⚠️ ${reason} — shipping plain JS bundle (--allow-plain-js)`);
267
+ for (const l of errLines)
268
+ console.warn(` ${l}`);
255
269
  }
256
270
  else {
257
271
  fs.renameSync(hbcPath, bundlePath);
@@ -272,8 +286,39 @@ function buildBundle(opts) {
272
286
  return {
273
287
  bundlePath,
274
288
  assetsPath,
289
+ assets: listAssets(assetsPath),
275
290
  hermesCompiled: hermesBytecodeVersion !== null,
276
291
  hermesBytecodeVersion,
277
292
  };
278
293
  }
294
+ /**
295
+ * Every asset file Metro emitted for this bundle, relative to the assets root.
296
+ *
297
+ * OTA ships ONE artifact: the JS/bytecode bundle. Assets are resolved from what
298
+ * the installed binary already contains, so an image or font added since the
299
+ * last store build is referenced by the new JS and is simply not there — the
300
+ * update installs cleanly and renders a missing image. `ota publish` uses this
301
+ * list to say so out loud rather than discarding the directory in silence.
302
+ */
303
+ function listAssets(root) {
304
+ const out = [];
305
+ const walk = (dir, prefix) => {
306
+ let entries;
307
+ try {
308
+ entries = fs.readdirSync(dir, { withFileTypes: true });
309
+ }
310
+ catch {
311
+ return; // no assets dir at all is the common, healthy case
312
+ }
313
+ for (const entry of entries) {
314
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
315
+ if (entry.isDirectory())
316
+ walk(path.join(dir, entry.name), rel);
317
+ else
318
+ out.push(rel);
319
+ }
320
+ };
321
+ walk(root, '');
322
+ return out;
323
+ }
279
324
  //# sourceMappingURL=bundle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/utils/bundle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/utils/bundle.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,18 @@ export interface Credentials {
8
8
  * 2. ~/.scalebun/credentials.json (from `scalebun login`)
9
9
  */
10
10
  export declare function readCredentials(): Credentials | null;
11
- /** Store credentials to ~/.scalebun/credentials.json */
11
+ /**
12
+ * Store credentials to ~/.scalebun/credentials.json.
13
+ *
14
+ * The `mode: 0o600` below is real on macOS and Linux and a NO-OP ON WINDOWS —
15
+ * Node cannot express a Windows ACL through a Unix mode, so it silently drops
16
+ * it and the file lands with whatever the parent directory grants. That is how
17
+ * a token ends up readable by every other account on a shared machine while
18
+ * the code looks like it locked the file down. So on Windows the ACL is set
19
+ * explicitly afterwards, and a failure to do so is reported rather than
20
+ * swallowed: the user is entitled to know their token is sitting in a
21
+ * world-readable file.
22
+ */
12
23
  export declare function writeCredentials(creds: Credentials): void;
13
24
  /** Delete stored credentials. */
14
25
  export declare function clearCredentials(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAkBpD;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CASzD;AAED,iCAAiC;AACjC,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAkBpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAUzD;AAgCD,iCAAiC;AACjC,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC"}
@@ -39,6 +39,7 @@ exports.clearCredentials = clearCredentials;
39
39
  const fs = __importStar(require("fs"));
40
40
  const path = __importStar(require("path"));
41
41
  const os = __importStar(require("os"));
42
+ const childProcess = __importStar(require("child_process"));
42
43
  const CREDENTIALS_DIR = path.join(os.homedir(), '.scalebun');
43
44
  const CREDENTIALS_FILE = path.join(CREDENTIALS_DIR, 'credentials.json');
44
45
  /**
@@ -67,12 +68,50 @@ function readCredentials() {
67
68
  return null;
68
69
  }
69
70
  }
70
- /** Store credentials to ~/.scalebun/credentials.json */
71
+ /**
72
+ * Store credentials to ~/.scalebun/credentials.json.
73
+ *
74
+ * The `mode: 0o600` below is real on macOS and Linux and a NO-OP ON WINDOWS —
75
+ * Node cannot express a Windows ACL through a Unix mode, so it silently drops
76
+ * it and the file lands with whatever the parent directory grants. That is how
77
+ * a token ends up readable by every other account on a shared machine while
78
+ * the code looks like it locked the file down. So on Windows the ACL is set
79
+ * explicitly afterwards, and a failure to do so is reported rather than
80
+ * swallowed: the user is entitled to know their token is sitting in a
81
+ * world-readable file.
82
+ */
71
83
  function writeCredentials(creds) {
72
84
  if (!fs.existsSync(CREDENTIALS_DIR)) {
73
85
  fs.mkdirSync(CREDENTIALS_DIR, { recursive: true, mode: 0o700 });
74
86
  }
75
87
  fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2) + '\n', { mode: 0o600 });
88
+ restrictToCurrentUser(CREDENTIALS_FILE);
89
+ }
90
+ /**
91
+ * Windows-only ACL tightening: drop inherited ACEs and grant the current user
92
+ * alone full control. On POSIX the file mode already did this and this is a
93
+ * no-op.
94
+ */
95
+ function restrictToCurrentUser(file) {
96
+ if (process.platform !== 'win32')
97
+ return;
98
+ const user = process.env.USERNAME
99
+ ? `${process.env.USERDOMAIN ? `${process.env.USERDOMAIN}\\` : ''}${process.env.USERNAME}`
100
+ : null;
101
+ if (!user)
102
+ return;
103
+ try {
104
+ // /inheritance:r removes inherited permissions — without it the grant is
105
+ // added ON TOP of whatever the profile directory already allows, which is
106
+ // usually the point being missed.
107
+ childProcess.execFileSync('icacls', [file, '/inheritance:r', '/grant:r', `${user}:F`], { stdio: 'ignore', timeout: 10000 });
108
+ }
109
+ catch {
110
+ console.warn(`⚠️ Could not restrict permissions on ${file}.\n` +
111
+ ' It contains an access token in plaintext and may be readable by other\n' +
112
+ ' accounts on this machine. Fix it with:\n' +
113
+ ` icacls "${file}" /inheritance:r /grant:r "%USERNAME%:F"`);
114
+ }
76
115
  }
77
116
  /** Delete stored credentials. */
78
117
  function clearCredentials() {