@scalebun/cli 1.10.2 → 1.11.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 (95) hide show
  1. package/lib/commands/ci-init.d.ts.map +1 -1
  2. package/lib/commands/ci-init.js +80 -2
  3. package/lib/commands/ci-init.js.map +1 -1
  4. package/lib/commands/doctor.d.ts.map +1 -1
  5. package/lib/commands/doctor.js +148 -3
  6. package/lib/commands/doctor.js.map +1 -1
  7. package/lib/commands/link.d.ts +16 -0
  8. package/lib/commands/link.d.ts.map +1 -0
  9. package/lib/commands/link.js +164 -0
  10. package/lib/commands/link.js.map +1 -0
  11. package/lib/commands/login.d.ts.map +1 -1
  12. package/lib/commands/login.js +29 -7
  13. package/lib/commands/login.js.map +1 -1
  14. package/lib/commands/ota-bundle.d.ts +15 -2
  15. package/lib/commands/ota-bundle.d.ts.map +1 -1
  16. package/lib/commands/ota-bundle.js +142 -12
  17. package/lib/commands/ota-bundle.js.map +1 -1
  18. package/lib/commands/ota-channels.d.ts.map +1 -1
  19. package/lib/commands/ota-channels.js +213 -21
  20. package/lib/commands/ota-channels.js.map +1 -1
  21. package/lib/commands/ota-inspect.d.ts +3 -0
  22. package/lib/commands/ota-inspect.d.ts.map +1 -0
  23. package/lib/commands/ota-inspect.js +258 -0
  24. package/lib/commands/ota-inspect.js.map +1 -0
  25. package/lib/commands/ota-keys.d.ts +18 -0
  26. package/lib/commands/ota-keys.d.ts.map +1 -1
  27. package/lib/commands/ota-keys.js +149 -4
  28. package/lib/commands/ota-keys.js.map +1 -1
  29. package/lib/commands/ota-promote.d.ts +3 -0
  30. package/lib/commands/ota-promote.d.ts.map +1 -0
  31. package/lib/commands/ota-promote.js +194 -0
  32. package/lib/commands/ota-promote.js.map +1 -0
  33. package/lib/commands/ota-publish.d.ts.map +1 -1
  34. package/lib/commands/ota-publish.js +108 -38
  35. package/lib/commands/ota-publish.js.map +1 -1
  36. package/lib/commands/ota-rollout.d.ts.map +1 -1
  37. package/lib/commands/ota-rollout.js +201 -171
  38. package/lib/commands/ota-rollout.js.map +1 -1
  39. package/lib/commands/quickstart.d.ts.map +1 -1
  40. package/lib/commands/quickstart.js +110 -8
  41. package/lib/commands/quickstart.js.map +1 -1
  42. package/lib/commands/shell.d.ts +28 -0
  43. package/lib/commands/shell.d.ts.map +1 -0
  44. package/lib/commands/shell.js +512 -0
  45. package/lib/commands/shell.js.map +1 -0
  46. package/lib/index.js +140 -4
  47. package/lib/index.js.map +1 -1
  48. package/lib/ui/menu.d.ts +109 -0
  49. package/lib/ui/menu.d.ts.map +1 -0
  50. package/lib/ui/menu.js +314 -0
  51. package/lib/ui/menu.js.map +1 -0
  52. package/lib/utils/bundle.d.ts.map +1 -1
  53. package/lib/utils/bundle.js +7 -1
  54. package/lib/utils/bundle.js.map +1 -1
  55. package/lib/utils/context.d.ts +88 -0
  56. package/lib/utils/context.d.ts.map +1 -0
  57. package/lib/utils/context.js +247 -0
  58. package/lib/utils/context.js.map +1 -0
  59. package/lib/utils/credentials.d.ts +16 -0
  60. package/lib/utils/credentials.d.ts.map +1 -1
  61. package/lib/utils/credentials.js +14 -3
  62. package/lib/utils/credentials.js.map +1 -1
  63. package/lib/utils/guide.d.ts +63 -0
  64. package/lib/utils/guide.d.ts.map +1 -0
  65. package/lib/utils/guide.js +189 -0
  66. package/lib/utils/guide.js.map +1 -0
  67. package/lib/utils/output.d.ts +96 -0
  68. package/lib/utils/output.d.ts.map +1 -0
  69. package/lib/utils/output.js +135 -0
  70. package/lib/utils/output.js.map +1 -0
  71. package/lib/utils/prompt.d.ts +80 -6
  72. package/lib/utils/prompt.d.ts.map +1 -1
  73. package/lib/utils/prompt.js +184 -20
  74. package/lib/utils/prompt.js.map +1 -1
  75. package/lib/utils/provenance.d.ts +30 -0
  76. package/lib/utils/provenance.d.ts.map +1 -0
  77. package/lib/utils/provenance.js +157 -0
  78. package/lib/utils/provenance.js.map +1 -0
  79. package/lib/utils/resolve.d.ts +81 -0
  80. package/lib/utils/resolve.d.ts.map +1 -0
  81. package/lib/utils/resolve.js +139 -0
  82. package/lib/utils/resolve.js.map +1 -0
  83. package/lib/utils/sdkBin.d.ts +18 -0
  84. package/lib/utils/sdkBin.d.ts.map +1 -0
  85. package/lib/utils/sdkBin.js +76 -0
  86. package/lib/utils/sdkBin.js.map +1 -0
  87. package/lib/utils/ui.d.ts +10 -1
  88. package/lib/utils/ui.d.ts.map +1 -1
  89. package/lib/utils/ui.js +18 -57
  90. package/lib/utils/ui.js.map +1 -1
  91. package/lib/utils/validate.d.ts +62 -0
  92. package/lib/utils/validate.d.ts.map +1 -0
  93. package/lib/utils/validate.js +189 -0
  94. package/lib/utils/validate.js.map +1 -0
  95. package/package.json +3 -2
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.registerLoginCommand = registerLoginCommand;
4
7
  exports.runLogin = runLogin;
@@ -6,6 +9,8 @@ const credentials_1 = require("../utils/credentials");
6
9
  const client_1 = require("../api/client");
7
10
  const transportSecurity_1 = require("../utils/transportSecurity");
8
11
  const prompt_1 = require("../utils/prompt");
12
+ const output_1 = require("../utils/output");
13
+ const chalk_1 = __importDefault(require("chalk"));
9
14
  /**
10
15
  * `scalebun login` — store a durable access token for this machine.
11
16
  *
@@ -73,10 +78,22 @@ async function runLogin(opts) {
73
78
  console.log(`Create one at: ${TOKEN_PAGE}`);
74
79
  console.log('(Settings → Access Tokens → New token → scope: read, write)');
75
80
  console.log('');
76
- token = (await (0, prompt_1.promptHidden)('Access token (scalebun_pat_…): ')).trim();
77
- if (!token) {
78
- console.error('❌ No token entered.');
79
- process.exit(1);
81
+ // Re-ask rather than exit. A paste that did not land — the clipboard was
82
+ // empty, or the terminal swallowed it — is the single most likely reason
83
+ // this prompt comes back blank, and the fix is to paste again, not to
84
+ // re-run the whole command. Three tries, so a non-interactive stdin that
85
+ // returns '' forever cannot spin.
86
+ for (let attempt = 1;; attempt++) {
87
+ token = (await (0, prompt_1.promptHidden)('Access token (scalebun_pat_…): ')).trim();
88
+ if (token)
89
+ break;
90
+ if (attempt >= 3) {
91
+ console.error('❌ No token entered.');
92
+ console.error(` Create one at ${TOKEN_PAGE}, or set SCALEBUN_TOKEN.`);
93
+ process.exit(1);
94
+ }
95
+ console.log(' Nothing pasted — the token is hidden as you type, so a blank line');
96
+ console.log(' usually means the paste did not land. Try again.');
80
97
  }
81
98
  }
82
99
  // Soft format check — warn, don't reject (the token prefix may evolve).
@@ -90,9 +107,14 @@ async function runLogin(opts) {
90
107
  (0, credentials_1.writeCredentials)({ apiUrl, token, email: me.email });
91
108
  console.log(`✅ Logged in as ${me.email} (${me.role ?? 'User'})`);
92
109
  console.log(' Credentials saved to ~/.scalebun/credentials.json');
93
- console.log('\nNext steps:');
94
- console.log(' scalebun doctor # verify your project is OTA-ready');
95
- console.log(' scalebun ota publish --app-id <id> # ship your first update');
110
+ // `--app-id <id>` was load-bearing here before `link` and the resolver
111
+ // existed. Suggesting a command with a placeholder in it is suggesting
112
+ // homework, not a command and `link` is what removes the need for it.
113
+ (0, output_1.printNextSteps)([
114
+ { label: 'Bind this project', argv: ['link'] },
115
+ { label: 'Check it is OTA-ready', argv: ['doctor'] },
116
+ { label: 'Ship your first update', argv: ['ota', 'publish'] },
117
+ ], chalk_1.default.cyan);
96
118
  }
97
119
  catch (err) {
98
120
  console.error(`❌ Login failed: ${err.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;AAiCA,oDAoBC;AAWD,4BAkFC;AAjJD,sDAK8B;AAC9B,0CAA0C;AAC1C,kEAAgE;AAChE,4CAAgE;AAChE,4CAAiD;AACjD,kDAA0B;AAE1B;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,UAAU,GAAG,kDAAkD,CAAC;AAEtE,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CACL,iBAAiB,EACjB,6BAA6B,6BAAe,2CAA2C,CACxF;SACA,MAAM,CAAC,eAAe,EAAE,2DAA2D,CAAC;SACpF,MAAM,CAAC,CAAC,IAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAElD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,GAAG,EAAE;QACX,IAAA,8BAAgB,GAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CACT,iHAAiH,CAClH,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAOD;;;GAGG;AACI,KAAK,UAAU,QAAQ,CAAC,IAAkB;IAC/C,MAAM,QAAQ,GAAG,IAAA,6BAAe,GAAE,CAAC;IAEnC,6EAA6E;IAC7E,MAAM,MAAM,GACV,IAAI,CAAC,MAAM;QACX,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,QAAQ,EAAE,MAAM;QAChB,6BAAe,CAAC;IAElB,2EAA2E;IAC3E,4EAA4E;IAC5E,IAAI,CAAC;QACH,IAAA,sCAAkB,EAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2DAA2D;IAC3D,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAErD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,IAAA,wBAAe,GAAE,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;YACvF,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,yEAAyE;QACzE,yEAAyE;QACzE,sEAAsE;QACtE,yEAAyE;QACzE,kCAAkC;QAClC,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,KAAK,GAAG,CAAC,MAAM,IAAA,qBAAY,EAAC,iCAAiC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACvE,IAAI,KAAK;gBAAE,MAAM;YACjB,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACrC,OAAO,CAAC,KAAK,CAAC,oBAAoB,UAAU,0BAA0B,CAAC,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAkC,UAAU,CAAC,CAAC;QAEzE,IAAA,8BAAgB,EAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI,IAAI,MAAM,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,IAAA,uBAAc,EACZ;YACE,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;YAC9C,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE;YACpD,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE;SAC9D,EACD,eAAK,CAAC,IAAI,CACX,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -1,9 +1,22 @@
1
1
  import { Command } from 'commander';
2
2
  /**
3
- * `scalebun ota bundle` — package a standalone bundle file for Dashboard upload.
3
+ * `scalebun ota bundle build` — package a standalone bundle file for upload.
4
+ *
5
+ * ── Why this is `bundle build` and not `bundle` ────────────────────────────
6
+ *
7
+ * `ota bundles` (plural) lists what is on the server; `ota bundle` (singular)
8
+ * ran Metro and hermesc and wrote a file to disk. Two commands one character
9
+ * apart doing entirely different things is a footgun: reaching for the list
10
+ * and getting a full Hermes compile is a minute of confusion at best, and at
11
+ * worst it happens in a pipeline.
12
+ *
13
+ * Moving the builder under an explicit verb makes bare `ota bundle` print the
14
+ * group's help — which disambiguates instead of guessing. `bundle` is kept as
15
+ * an alias of the group, so nothing that already worked stops working.
4
16
  *
5
17
  * Usage:
6
- * npx scalebun ota bundle --platform android --output ./my-app.bundle
18
+ * npx scalebun ota bundle build --platform android
19
+ * npx scalebun ota bundle build --platform ios --output ./bundles/my-app.bundle
7
20
  */
8
21
  export declare function registerOtaBundleCommand(ota: Command): void;
9
22
  //# sourceMappingURL=ota-bundle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ota-bundle.d.ts","sourceRoot":"","sources":["../../src/commands/ota-bundle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAwD3D"}
1
+ {"version":3,"file":"ota-bundle.d.ts","sourceRoot":"","sources":["../../src/commands/ota-bundle.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiFpC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkH3D"}
@@ -34,29 +34,117 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.registerOtaBundleCommand = registerOtaBundleCommand;
37
+ const crypto = __importStar(require("crypto"));
37
38
  const fs = __importStar(require("fs"));
38
39
  const path = __importStar(require("path"));
39
40
  const bundle_1 = require("../utils/bundle");
41
+ const validate_1 = require("../utils/validate");
42
+ const ota_keys_1 = require("./ota-keys");
40
43
  /**
41
- * `scalebun ota bundle` package a standalone bundle file for Dashboard upload.
44
+ * Ensure that the bundles folder and its artifacts are ignored by git.
45
+ */
46
+ function ensureBundlesGitIgnored(bundleFilePath) {
47
+ const bundleDir = path.dirname(bundleFilePath);
48
+ if (!fs.existsSync(bundleDir)) {
49
+ fs.mkdirSync(bundleDir, { recursive: true });
50
+ }
51
+ let updatedGitignore = false;
52
+ // 1. Inside the bundles directory itself, create a .gitignore so all files are ignored by default
53
+ const baseDirName = path.basename(bundleDir).toLowerCase();
54
+ if (baseDirName === 'bundles' || baseDirName === 'bundels') {
55
+ const localGitignore = path.join(bundleDir, '.gitignore');
56
+ if (!fs.existsSync(localGitignore)) {
57
+ try {
58
+ fs.writeFileSync(localGitignore, '# Ignore all bundle files in this directory\n*\n!.gitignore\n', 'utf8');
59
+ }
60
+ catch {
61
+ /* ignore */
62
+ }
63
+ }
64
+ }
65
+ // 2. Also ensure root project .gitignore ignores bundles/
66
+ let curr = process.cwd();
67
+ for (let i = 0; i < 5; i++) {
68
+ const gitignorePath = path.join(curr, '.gitignore');
69
+ const isGitRepo = fs.existsSync(path.join(curr, '.git'));
70
+ if (fs.existsSync(gitignorePath) || isGitRepo) {
71
+ const gitignoreTarget = fs.existsSync(gitignorePath) ? gitignorePath : path.join(curr, '.gitignore');
72
+ let content = '';
73
+ try {
74
+ if (fs.existsSync(gitignoreTarget)) {
75
+ content = fs.readFileSync(gitignoreTarget, 'utf8');
76
+ }
77
+ }
78
+ catch {
79
+ content = '';
80
+ }
81
+ // Check if bundles or bundles/ is already ignored
82
+ const lines = content.split(/\r?\n/).map((l) => l.trim());
83
+ const alreadyIgnored = lines.some((l) => l === 'bundles' ||
84
+ l === 'bundles/' ||
85
+ l === '/bundles' ||
86
+ l === '/bundles/' ||
87
+ l === '**/bundles/**' ||
88
+ l === '**/bundles');
89
+ if (!alreadyIgnored) {
90
+ const prefix = content.length > 0 && !content.endsWith('\n') ? '\n' : '';
91
+ const entry = `${prefix}\n# Scalebun OTA bundles\nbundles/\n`;
92
+ try {
93
+ fs.writeFileSync(gitignoreTarget, content + entry, 'utf8');
94
+ updatedGitignore = true;
95
+ }
96
+ catch {
97
+ /* ignore */
98
+ }
99
+ }
100
+ break;
101
+ }
102
+ const parent = path.dirname(curr);
103
+ if (parent === curr)
104
+ break;
105
+ curr = parent;
106
+ }
107
+ return updatedGitignore;
108
+ }
109
+ /**
110
+ * `scalebun ota bundle build` — package a standalone bundle file for upload.
111
+ *
112
+ * ── Why this is `bundle build` and not `bundle` ────────────────────────────
113
+ *
114
+ * `ota bundles` (plural) lists what is on the server; `ota bundle` (singular)
115
+ * ran Metro and hermesc and wrote a file to disk. Two commands one character
116
+ * apart doing entirely different things is a footgun: reaching for the list
117
+ * and getting a full Hermes compile is a minute of confusion at best, and at
118
+ * worst it happens in a pipeline.
119
+ *
120
+ * Moving the builder under an explicit verb makes bare `ota bundle` print the
121
+ * group's help — which disambiguates instead of guessing. `bundle` is kept as
122
+ * an alias of the group, so nothing that already worked stops working.
42
123
  *
43
124
  * Usage:
44
- * npx scalebun ota bundle --platform android --output ./my-app.bundle
125
+ * npx scalebun ota bundle build --platform android
126
+ * npx scalebun ota bundle build --platform ios --output ./bundles/my-app.bundle
45
127
  */
46
128
  function registerOtaBundleCommand(ota) {
47
- ota
129
+ const bundle = ota
48
130
  .command('bundle')
131
+ .description('Build a bundle file locally (see `ota bundles` to list uploaded ones)');
132
+ bundle
133
+ .command('build', { isDefault: false })
49
134
  .description('Build a standalone OTA bundle file for manual upload in the Scalebun Dashboard')
50
135
  .option('--platform <platform>', 'Target platform: android | ios', 'android')
51
136
  .option('--entry-file <path>', 'JS entry file', 'index.js')
52
- .option('--output <path>', 'Output bundle destination path', './index.android.bundle')
53
- .option('--hermes', 'Compile to Hermes bytecode (recommended for production)')
54
- .option('--hermes-disabled', 'Explicitly disable Hermes bytecode compilation')
137
+ .option('--output <path>', 'Output bundle destination path (default: ./bundles/index.<platform>.bundle)')
138
+ .option('--key-dir <path>', 'Directory containing ota-signing-key.pem (default: .scalebun)')
139
+ .option('--hermes', 'Compile to Hermes bytecode (the default — flag kept for compatibility)')
140
+ .option('--hermes-disabled', 'Ship plain JS instead of Hermes bytecode (~20-30% slower cold start)')
55
141
  .option('--allow-plain-js', 'Emit uncompiled JS if hermesc fails, instead of aborting')
56
142
  .option('--sourcemap', 'Generate sourcemap alongside the bundle')
57
143
  .action(async (opts) => {
58
- const platform = opts.platform;
59
- const useHermes = opts.hermesDisabled ? false : opts.hermes;
144
+ const platform = (0, validate_1.checkedEnum)('--platform', opts.platform, ['android', 'ios'], {
145
+ caseInsensitive: true,
146
+ });
147
+ const useHermes = opts.hermesDisabled ? false : true;
60
148
  console.log(`📦 Bundling ${platform} application${useHermes ? ' (Hermes bytecode)' : ''}…`);
61
149
  try {
62
150
  const result = (0, bundle_1.buildBundle)({
@@ -67,21 +155,63 @@ function registerOtaBundleCommand(ota) {
67
155
  allowPlainJs: opts.allowPlainJs ?? false,
68
156
  sourcemap: opts.sourcemap,
69
157
  });
70
- const destPath = path.resolve(opts.output);
158
+ // Resolve destination inside bundles/ by default
159
+ let destPath;
160
+ if (opts.output) {
161
+ const resolved = path.resolve(opts.output);
162
+ if (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {
163
+ destPath = path.join(resolved, `index.${platform}.bundle`);
164
+ }
165
+ else if (opts.output.endsWith('/') || opts.output.endsWith('\\')) {
166
+ destPath = path.join(resolved, `index.${platform}.bundle`);
167
+ }
168
+ else {
169
+ destPath = resolved;
170
+ }
171
+ }
172
+ else {
173
+ destPath = path.resolve('bundles', `index.${platform}.bundle`);
174
+ }
71
175
  const destDir = path.dirname(destPath);
72
176
  if (!fs.existsSync(destDir)) {
73
177
  fs.mkdirSync(destDir, { recursive: true });
74
178
  }
179
+ // Ensure bundles directory is git-ignored
180
+ const gitignoreUpdated = ensureBundlesGitIgnored(destPath);
75
181
  fs.copyFileSync(result.bundlePath, destPath);
182
+ // Compute SHA-256 and sign if private key exists
183
+ const bundleBytes = fs.readFileSync(destPath);
184
+ const sha256 = crypto.createHash('sha256').update(bundleBytes).digest('hex');
185
+ const signature = (0, ota_keys_1.signBundleHash)(sha256, opts.keyDir);
186
+ let sigPath = null;
187
+ if (signature) {
188
+ sigPath = `${destPath}.sig`;
189
+ fs.writeFileSync(sigPath, signature.trim(), 'utf8');
190
+ }
191
+ // If sourcemap was generated, also copy it alongside the bundle in bundles/
192
+ if (opts.sourcemap && result.sourcemapPath && fs.existsSync(result.sourcemapPath)) {
193
+ const mapDest = `${destPath}.map`;
194
+ fs.copyFileSync(result.sourcemapPath, mapDest);
195
+ }
76
196
  const stats = fs.statSync(destPath);
77
197
  const sizeMb = (stats.size / (1024 * 1024)).toFixed(2);
78
- console.log(`\n Bundle successfully created!`);
198
+ console.log(`\n Bundle successfully created!`);
79
199
  console.log(` Output Path: ${destPath}`);
80
200
  console.log(` Size: ${sizeMb} MB (${stats.size} bytes)`);
81
- console.log(`\n👉 You can now drag & drop this file into the Scalebun Dashboard at https://dash.scalebun.com/ota/publish`);
201
+ console.log(` SHA-256: ${sha256}`);
202
+ if (sigPath) {
203
+ console.log(` Signature: ${sigPath} (Signed with local ed25519 key)`);
204
+ }
205
+ else {
206
+ console.log(` Signature: Unsigned (no .scalebun/ota-signing-key.pem found)`);
207
+ }
208
+ if (gitignoreUpdated) {
209
+ console.log(` Git Status: Added 'bundles/' to .gitignore`);
210
+ }
211
+ console.log(`\n💡 You can now drag & drop this file into the Scalebun Dashboard at https://dash.scalebun.com/ota/publish`);
82
212
  }
83
213
  catch (err) {
84
- console.error(`❌ Bundling failed: ${err?.message || err}`);
214
+ console.error(`✖ Bundling failed: ${err?.message || err}`);
85
215
  process.exit(1);
86
216
  }
87
217
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ota-bundle.js","sourceRoot":"","sources":["../../src/commands/ota-bundle.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,4DAwDC;AAnED,uCAAyB;AACzB,2CAA6B;AAE7B,4CAA8C;AAE9C;;;;;GAKG;AACH,SAAgB,wBAAwB,CAAC,GAAY;IACnD,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gFAAgF,CAAC;SAC7F,MAAM,CAAC,uBAAuB,EAAE,gCAAgC,EAAE,SAAS,CAAC;SAC5E,MAAM,CAAC,qBAAqB,EAAE,eAAe,EAAE,UAAU,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,EAAE,wBAAwB,CAAC;SACrF,MAAM,CAAC,UAAU,EAAE,yDAAyD,CAAC;SAC7E,MAAM,CAAC,mBAAmB,EAAE,gDAAgD,CAAC;SAC7E,MAAM,CAAC,kBAAkB,EAAE,0DAA0D,CAAC;SACtF,MAAM,CAAC,aAAa,EAAE,yCAAyC,CAAC;SAChE,MAAM,CACL,KAAK,EAAE,IAQN,EAAE,EAAE;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA6B,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAE5D,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,eAAe,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAE5F,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC;gBACzB,QAAQ;gBACR,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,GAAG,EAAE,KAAK;gBACV,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,KAAK;gBACxC,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YAED,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAEvD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,QAAQ,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,6GAA6G,CAAC,CAAC;QAC7H,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,sBAAsB,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"ota-bundle.js","sourceRoot":"","sources":["../../src/commands/ota-bundle.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ota-channels.d.ts","sourceRoot":"","sources":["../../src/commands/ota-channels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA+B7D"}
1
+ {"version":3,"file":"ota-channels.d.ts","sourceRoot":"","sources":["../../src/commands/ota-channels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsHpC,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA2M7D"}
@@ -1,39 +1,231 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.registerOtaChannelsCommand = registerOtaChannelsCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
4
8
  const credentials_1 = require("../utils/credentials");
5
9
  const client_1 = require("../api/client");
10
+ const resolve_1 = require("../utils/resolve");
11
+ const prompt_1 = require("../utils/prompt");
12
+ const output_1 = require("../utils/output");
13
+ async function loadChannels(api, appId) {
14
+ try {
15
+ const res = await api.get(`/saas/apps/${appId}/ota/channels`);
16
+ return Array.isArray(res) ? res : [];
17
+ }
18
+ catch (err) {
19
+ (0, output_1.failFromError)('Could not list channels', err);
20
+ }
21
+ }
22
+ /**
23
+ * Accept a channel by name OR id.
24
+ *
25
+ * Operators think in names — "production" — and ids appear nowhere in their
26
+ * workflow. The backend already resolves either for bundle lookups, so the CLI
27
+ * matching only ids would be gratuitously stricter than the API.
28
+ */
29
+ function findChannel(channels, nameOrId) {
30
+ return (channels.find((c) => c.id === nameOrId) ||
31
+ channels.find((c) => c.name.toLowerCase() === nameOrId.toLowerCase()));
32
+ }
33
+ function client() {
34
+ const creds = (0, credentials_1.readCredentials)();
35
+ if (!creds)
36
+ (0, output_1.fail)('Not signed in.', ['Run `scalebun login` first.'], output_1.ExitCode.Usage);
37
+ return new client_1.ApiClient(creds);
38
+ }
39
+ /**
40
+ * Which environment a new channel belongs to.
41
+ *
42
+ * Order: an explicit --env (by name or id) > the environment an existing
43
+ * channel already uses > the app's only environment. Fails with the real list
44
+ * rather than a bare 400 when none of those resolve, because "environmentId
45
+ * must be a string" tells the operator nothing they can act on.
46
+ */
47
+ async function resolveEnvironmentId(api, appId, existing, wanted) {
48
+ let environments = [];
49
+ try {
50
+ const paged = await api.get(`/saas/apps/${appId}/ota/channels/paged?page=1&pageSize=1`);
51
+ environments = paged?.environments ?? [];
52
+ }
53
+ catch {
54
+ // Listing is a convenience here; the fallbacks below still work.
55
+ }
56
+ if (wanted) {
57
+ const hit = environments.find((e) => e.id === wanted) ||
58
+ environments.find((e) => e.name.toLowerCase() === wanted.toLowerCase());
59
+ if (hit)
60
+ return hit.id;
61
+ (0, output_1.fail)(`No environment "${wanted}" on this app.`, environments.length
62
+ ? [`Existing: ${environments.map((e) => e.name).join(', ')}`]
63
+ : ['This app has no environments yet — create one in the dashboard.'], output_1.ExitCode.Usage);
64
+ }
65
+ const fromChannel = existing.find((c) => c.environmentId)?.environmentId;
66
+ if (fromChannel)
67
+ return fromChannel;
68
+ if (environments.length === 1)
69
+ return environments[0].id;
70
+ if (environments.length > 1) {
71
+ (0, output_1.fail)('This app has several environments — say which one with --env.', environments.map((e) => ` ${e.name} ${e.id}`), output_1.ExitCode.Usage);
72
+ }
73
+ (0, output_1.fail)('Could not determine which environment this channel belongs to.', ['Pass --env <name>, or create the first channel from the dashboard.'], output_1.ExitCode.Usage);
74
+ }
6
75
  function registerOtaChannelsCommand(ota) {
7
- ota
76
+ const channels = ota
8
77
  .command('channels')
9
- .alias('ota channel list')
10
- .description('List all OTA channels for an app')
11
- .requiredOption('--app-id <id>', 'Scalebun app ID')
78
+ .alias('channel')
79
+ .description('List, create, rename or remove OTA channels');
80
+ // Bare `ota channels` keeps listing, which is what it has always done.
81
+ channels
82
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
83
+ .option('--json', 'Machine-readable output')
12
84
  .action(async (opts) => {
13
- const creds = (0, credentials_1.readCredentials)();
14
- if (!creds) {
15
- console.error('❌ Not logged in. Run `scalebun login` first.');
16
- process.exit(1);
85
+ // A subcommand was given — commander runs that action, not this one.
86
+ if (channels.args.length && channels.commands.some((c) => c.name() === channels.args[0]))
87
+ return;
88
+ const api = client();
89
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
90
+ const rows = await loadChannels(api, appId);
91
+ (0, output_1.emit)(() => {
92
+ console.log('');
93
+ if (!rows.length) {
94
+ console.log(' No channels yet — `scalebun ota publish` creates `default` automatically.\n');
95
+ return;
96
+ }
97
+ for (const c of rows) {
98
+ const env = c.environment?.name ? chalk_1.default.dim(` env ${c.environment.name}`) : '';
99
+ console.log(` ${chalk_1.default.bold(c.name.padEnd(16))}${env}`);
100
+ console.log(chalk_1.default.dim(` ${c.id}`));
101
+ }
102
+ // One channel means every bundle ever built goes straight to
103
+ // production with nowhere to test first. Worth saying out loud.
104
+ if (rows.length === 1) {
105
+ console.log(chalk_1.default.yellow(`\n Only one channel. Everything ships straight to ${rows[0].name} —\n` +
106
+ ' `scalebun ota channels create --name staging` gives you somewhere to test.'));
107
+ }
108
+ console.log('');
109
+ }, { ok: true, count: rows.length, channels: rows });
110
+ });
111
+ // ── create ────────────────────────────────────────────────────────────────
112
+ channels
113
+ .command('create')
114
+ .description('Create a channel')
115
+ .requiredOption('--name <name>', 'Channel name, e.g. staging')
116
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
117
+ .option('--env <nameOrId>', 'Environment to attach it to')
118
+ .option('--json', 'Machine-readable output')
119
+ .action(async (_raw, cmd) => {
120
+ // optsWithGlobals, not the action's own opts. The PARENT `ota channels`
121
+ // also declares --app-id, and commander gives a flag to the first command
122
+ // that declares it — so `ota channels create --app-id X` parsed X onto the
123
+ // parent and handed this action an undefined, which then reported
124
+ // "--app-id is required" with the id sitting right there in the command.
125
+ // Only the env var worked, which is a miserable thing to discover.
126
+ const opts = cmd.optsWithGlobals();
127
+ const api = client();
128
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
129
+ const existing = await loadChannels(api, appId);
130
+ if (findChannel(existing, opts.name)) {
131
+ (0, output_1.fail)(`A channel named "${opts.name}" already exists on this app.`, [], output_1.ExitCode.Usage);
17
132
  }
18
- const client = new client_1.ApiClient(creds);
133
+ // environmentId is REQUIRED by the API and this never sent it, so every
134
+ // `channels create` failed with `400 environmentId must be a string` —
135
+ // the command could not have worked once since it was added.
136
+ //
137
+ // Channels live inside an environment, and an app that already has one
138
+ // channel already has the answer. Reuse it rather than making the user
139
+ // find an id that never appears in their workflow.
140
+ const environmentId = await resolveEnvironmentId(api, appId, existing, opts.env);
141
+ const body = { name: opts.name, environmentId };
142
+ let created;
19
143
  try {
20
- const channels = await client.get(`/saas/apps/${opts.appId}/ota/channels`);
21
- console.log(`\n📋 OTA Channels for App (${opts.appId}):\n`);
22
- if (!channels || channels.length === 0) {
23
- console.log(' (No channels found yet. Running `scalebun ota publish` will automatically create the `default` channel.)');
24
- }
25
- else {
26
- channels.forEach((c) => {
27
- const envName = c.environment?.name ? ` [Env: ${c.environment.name}]` : '';
28
- console.log(` • Name: ${c.name.padEnd(16)} ID: ${c.id}${envName}`);
29
- });
144
+ created = await api.post(`/saas/apps/${appId}/ota/channels`, body);
145
+ }
146
+ catch (err) {
147
+ (0, output_1.failFromError)('Could not create the channel', err);
148
+ }
149
+ (0, output_1.emit)(() => {
150
+ console.log(`\n✅ Created channel ${chalk_1.default.bold(created.name)}`);
151
+ console.log(chalk_1.default.dim(` ${created.id}`));
152
+ (0, output_1.printNextSteps)([
153
+ { label: 'Ship to it', argv: ['ota', 'publish', '--channel', created.name] },
154
+ { label: 'See every channel', argv: ['ota', 'channels'] },
155
+ ], chalk_1.default.cyan);
156
+ }, { ok: true, channel: created });
157
+ });
158
+ // ── rename ────────────────────────────────────────────────────────────────
159
+ channels
160
+ .command('rename')
161
+ .description('Rename a channel (this route had no client anywhere)')
162
+ .requiredOption('--channel <nameOrId>', 'Channel to rename')
163
+ .requiredOption('--name <newName>', 'New name')
164
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
165
+ .option('--json', 'Machine-readable output')
166
+ .action(async (_raw, cmd) => {
167
+ // Same parent-swallow as `create`: --app-id lands on the parent
168
+ // `ota channels`, so read the merged view.
169
+ const opts = cmd.optsWithGlobals();
170
+ const api = client();
171
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
172
+ const rows = await loadChannels(api, appId);
173
+ const target = findChannel(rows, opts.channel);
174
+ if (!target) {
175
+ (0, output_1.fail)(`No channel "${opts.channel}" on this app.`, rows.map((c) => ` ${c.name} ${c.id}`), output_1.ExitCode.Usage);
176
+ }
177
+ try {
178
+ await api.patch(`/saas/apps/${appId}/ota/channels/${target.id}`, { name: opts.name });
179
+ }
180
+ catch (err) {
181
+ (0, output_1.failFromError)('Could not rename the channel', err);
182
+ }
183
+ (0, output_1.emit)(() => console.log(`\n✅ ${chalk_1.default.bold(target.name)} → ${chalk_1.default.bold(opts.name)}\n`), { ok: true, channelId: target.id, from: target.name, to: opts.name });
184
+ });
185
+ // ── remove ────────────────────────────────────────────────────────────────
186
+ channels
187
+ .command('rm')
188
+ .alias('delete')
189
+ .description('Delete a channel — cascades to its bundles and releases')
190
+ .requiredOption('--channel <nameOrId>', 'Channel to delete')
191
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
192
+ .option('--yes', 'Skip the confirmation (required off a TTY)')
193
+ .option('--json', 'Machine-readable output')
194
+ .action(async (_raw, cmd) => {
195
+ // Same parent-swallow as `create`: --app-id lands on the parent
196
+ // `ota channels`, so read the merged view.
197
+ const opts = cmd.optsWithGlobals();
198
+ const api = client();
199
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
200
+ const rows = await loadChannels(api, appId);
201
+ const target = findChannel(rows, opts.channel);
202
+ if (!target) {
203
+ (0, output_1.fail)(`No channel "${opts.channel}" on this app.`, rows.map((c) => ` ${c.name} ${c.id}`), output_1.ExitCode.Usage);
204
+ }
205
+ // This destroys the channel's bundles and releases. Confirming by name
206
+ // rather than y/n is the same bar delete-bundle sets for one bundle.
207
+ if (!opts.yes) {
208
+ if ((0, resolve_1.isNonInteractive)({ nonInteractive: opts.json })) {
209
+ (0, output_1.fail)('Refusing to delete a channel without confirmation.', ['Pass --yes if this is intentional.'], output_1.ExitCode.Usage);
30
210
  }
31
211
  console.log('');
212
+ console.log(chalk_1.default.yellow(`⚠️ Deleting ${chalk_1.default.bold(target.name)} also deletes every bundle and release on it.`));
213
+ const ok = await (0, prompt_1.confirmPhrase)(' Type the channel name to confirm: ', target.name);
214
+ (0, prompt_1.closePrompts)();
215
+ if (!ok) {
216
+ console.log('Cancelled — nothing was deleted.');
217
+ process.exit(output_1.ExitCode.Ok);
218
+ }
219
+ }
220
+ try {
221
+ await api.delete(`/saas/apps/${appId}/ota/channels/${target.id}`);
32
222
  }
33
223
  catch (err) {
34
- console.error(`❌ Failed to list channels: ${err.message}`);
35
- process.exit(1);
224
+ (0, output_1.failFromError)('Could not delete the channel', err, [
225
+ 'Deleting a channel requires an owner or admin role.',
226
+ ]);
36
227
  }
228
+ (0, output_1.emit)(() => console.log(`\n🗑 Deleted channel ${chalk_1.default.bold(target.name)}\n`), { ok: true, channelId: target.id, name: target.name });
37
229
  });
38
230
  }
39
231
  //# sourceMappingURL=ota-channels.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ota-channels.js","sourceRoot":"","sources":["../../src/commands/ota-channels.ts"],"names":[],"mappings":";;AAaA,gEA+BC;AA3CD,sDAAuD;AACvD,0CAA0C;AAW1C,SAAgB,0BAA0B,CAAC,GAAY;IACrD,GAAG;SACA,OAAO,CAAC,UAAU,CAAC;SACnB,KAAK,CAAC,kBAAkB,CAAC;SACzB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,cAAc,CAAC,eAAe,EAAE,iBAAiB,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;QACxC,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;QAED,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgB,cAAc,IAAI,CAAC,KAAK,eAAe,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC;YAC5D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,4GAA4G,CAAC,CAAC;YAC5H,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACrB,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3E,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;gBACtE,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"ota-channels.js","sourceRoot":"","sources":["../../src/commands/ota-channels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerOtaInspectCommands(ota: Command): void;
3
+ //# sourceMappingURL=ota-inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ota-inspect.d.ts","sourceRoot":"","sources":["../../src/commands/ota-inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6GpC,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkN7D"}