@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.
- package/lib/api/client.d.ts +6 -0
- package/lib/api/client.d.ts.map +1 -1
- package/lib/api/client.js +56 -2
- package/lib/api/client.js.map +1 -1
- package/lib/commands/ci-init.d.ts.map +1 -1
- package/lib/commands/ci-init.js +10 -1
- package/lib/commands/ci-init.js.map +1 -1
- package/lib/commands/doctor.d.ts +5 -0
- package/lib/commands/doctor.d.ts.map +1 -1
- package/lib/commands/doctor.js +11 -2
- package/lib/commands/doctor.js.map +1 -1
- package/lib/commands/login.d.ts +12 -0
- package/lib/commands/login.d.ts.map +1 -1
- package/lib/commands/login.js +112 -89
- package/lib/commands/login.js.map +1 -1
- package/lib/commands/ota-bundle.d.ts.map +1 -1
- package/lib/commands/ota-bundle.js +2 -0
- package/lib/commands/ota-bundle.js.map +1 -1
- package/lib/commands/ota-delete-bundle.d.ts +8 -0
- package/lib/commands/ota-delete-bundle.d.ts.map +1 -1
- package/lib/commands/ota-delete-bundle.js +60 -0
- package/lib/commands/ota-delete-bundle.js.map +1 -1
- package/lib/commands/ota-keys.d.ts +3 -0
- package/lib/commands/ota-keys.d.ts.map +1 -1
- package/lib/commands/ota-keys.js +1 -0
- package/lib/commands/ota-keys.js.map +1 -1
- package/lib/commands/ota-publish.d.ts +10 -0
- package/lib/commands/ota-publish.d.ts.map +1 -1
- package/lib/commands/ota-publish.js +108 -11
- package/lib/commands/ota-publish.js.map +1 -1
- package/lib/commands/quickstart.d.ts +4 -0
- package/lib/commands/quickstart.d.ts.map +1 -0
- package/lib/commands/quickstart.js +274 -0
- package/lib/commands/quickstart.js.map +1 -0
- package/lib/index.js +9 -1
- package/lib/index.js.map +1 -1
- package/lib/utils/bundle.d.ts +33 -0
- package/lib/utils/bundle.d.ts.map +1 -1
- package/lib/utils/bundle.js +62 -17
- package/lib/utils/bundle.js.map +1 -1
- package/lib/utils/credentials.d.ts +12 -1
- package/lib/utils/credentials.d.ts.map +1 -1
- package/lib/utils/credentials.js +40 -1
- package/lib/utils/credentials.js.map +1 -1
- package/lib/utils/transportSecurity.d.ts +36 -0
- package/lib/utils/transportSecurity.d.ts.map +1 -0
- package/lib/utils/transportSecurity.js +74 -0
- package/lib/utils/transportSecurity.js.map +1 -0
- package/lib/utils/ui.d.ts.map +1 -1
- package/lib/utils/ui.js +20 -8
- package/lib/utils/ui.js.map +1 -1
- 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFA,kDA8DC;AAED,8DAoJC;AAzSD,+CAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAC7B,mDAAqC;AACrC,kDAA0B;AAC1B,sDAAoE;AACpE,0CAA0C;AAC1C,mCAAmC;AACnC,qCAAqC;AACrC,yCAA6C;AAmD7C,iFAAiF;AACjF,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,sEAAsE;AACtE,KAAK,UAAU,YAAY,CAAC,MAAiB;IAC3C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAW,gBAAgB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,kBAAkB,GAAG,CAAC,EAAE,WAAW,CACpC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC7B,kBAAkB,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,EAAE,CAC5C,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yEAAyE,CAAC;SACtF,MAAM,CAAC,QAAQ,EAAE,iEAAiE,CAAC;SACnF,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,IAAA,6BAAe,GAAE,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,OAAmB,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,0BAA0B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,qFAAqF,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAChD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;gBACrC,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,GAAG,CACT,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,aAAa,eAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CACrG,CAAC;YACF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAW,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;oBAC1E,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;wBAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAc,iBAAiB,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;wBAC/E,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;wBACjE,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;wBAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;4BACnB,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,KAAK,eAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;wBACvE,CAAC;wBACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;4BACvB,OAAO,CAAC,GAAG,CACT,UAAU,KAAK,KAAK,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CACnF,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC,CAAC;QAC5G,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,iFAAiF,CAAC;SAC9F,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAmB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,KAAa,EAAE,EAAE,CACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5G,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC,CAAC;YAC3F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;YAE/F,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACnB,IAAI,KAAK,GAAG,IAAA,6BAAe,GAAE,CAAC;YAC9B,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,MAAM,IAAI,kBAAS,CAAC,KAAK,CAAC,CAAC,GAAG,CAAoB,UAAU,CAAC,CAAC;oBACzE,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACtE,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;oBACpE,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAA,gBAAQ,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtC,KAAK,GAAG,IAAA,6BAAe,GAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC,KAAK,CAAC,CAAC;YAEpC,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;YACzB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;YAC/B,IAAI,QAAQ,GAAG,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;oBAC/C,OAAO,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC;oBACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,KAAK,KAAK,GAAG,CAAC,CAAC;gBAC/D,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,WAAW,MAAM,eAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CACjG,CACF,CAAC;oBACF,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,oBAAoB,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;oBAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;oBACrE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtB,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YAED,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC,CAAC;YAChH,IAAI,mBAAmB,GAAkB,IAAI,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAW,SAAS,KAAK,eAAe,CAAC,CAAC;gBACvE,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;oBAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAc,iBAAiB,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;oBAC/E,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;oBACjE,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;oBAClI,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,mBAAmB;wBAAE,mBAAmB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACvF,CAAC;gBACD,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;oBACzC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBAClG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;wBACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAY,iBAAiB,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE;4BAChF,IAAI,EAAE,gBAAgB;yBACvB,CAAC,CAAC;wBACH,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC;wBACrC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;wBAChD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;4BACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,6CAA6C,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;wBAC3F,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,CAAC,OAAO,qDAAqD,CAAC,CAAC;YAC/G,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC,CAAC;YAChG,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sBAAsB,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,CAAC,CAAC;YAC/F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAErD,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,8BAA8B,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;YACjE,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC7G,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;oBACf,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;oBACxE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC1G,MAAM,SAAS,GAAG,IAAA,0BAAe,EAAC,SAAS,CAAC,CAAC;oBAC7C,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,mBAAmB,EAAE;wBACxD,SAAS,EAAE,SAAS;wBACpB,IAAI,EAAE,cAAc,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;qBAC5D,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,+BAA+B,CAAC,CAAC;oBAC5E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,8EAA8E,CAAC,CAAC,CAAC;oBAC1G,OAAO,CAAC,GAAG,CAAC,gFAAgF,SAAS,KAAK,CAAC,CAAC;gBAC9G,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;gBACvF,CAAC;YACH,CAAC;YAED,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;YACjF,MAAM,IAAA,kBAAS,GAAE,CAAC,CAAC,6DAA6D;YAEhF,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sCAAsC,KAAK,6CAA6C,CAAC,CAAC,CAAC;YACnH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,aAAa,KAAK,OAAO,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;YACzH,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,cAAc,KAAK,mBAAmB,eAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;YAC7H,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,KAAK,OAAO,eAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACtH,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,aAAa,KAAK,OAAO,eAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACtH,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,eAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,EAAE,CAAC,CAAC;YACrI,OAAO,CAAC,GAAG,CAAC,wEAAwE,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;QACnJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
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(
|
|
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"}
|
package/lib/utils/bundle.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/lib/utils/bundle.js
CHANGED
|
@@ -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
|
-
|
|
205
|
-
|
|
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
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
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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"}
|
|
@@ -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
|
-
/**
|
|
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":"
|
|
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"}
|
package/lib/utils/credentials.js
CHANGED
|
@@ -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
|
-
/**
|
|
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() {
|