@extension.dev/deploy 0.2.1 → 0.2.3

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/README.md CHANGED
@@ -67,44 +67,44 @@ Run `extension-deploy --help` for the full list of flags.
67
67
 
68
68
  ### Global flags
69
69
 
70
- | Flag | Description |
71
- | --- | --- |
70
+ | Flag | Description |
71
+ | ----------- | ------------------------------------------------------------- |
72
72
  | `--dry-run` | Verify auth and validate ZIPs without uploading or publishing |
73
- | `--help` | Show the help message |
73
+ | `--help` | Show the help message |
74
74
 
75
75
  ### Chrome Web Store
76
76
 
77
- | Flag | Env var | Description |
78
- | --- | --- | --- |
79
- | `--chrome-zip <path>` | `CHROME_ZIP` | Path to the extension ZIP file |
80
- | `--chrome-extension-id <id>` | `CHROME_EXTENSION_ID` | Chrome Web Store extension ID |
81
- | `--chrome-client-id <id>` | `CHROME_CLIENT_ID` | OAuth2 client ID |
82
- | `--chrome-client-secret <secret>` | `CHROME_CLIENT_SECRET` | OAuth2 client secret |
83
- | `--chrome-refresh-token <token>` | `CHROME_REFRESH_TOKEN` | OAuth2 refresh token |
84
- | `--chrome-publish-target <target>` | `CHROME_PUBLISH_TARGET` | `"default"` or `"trustedTesters"` |
85
- | `--chrome-deploy-percentage <n>` | `CHROME_DEPLOY_PERCENTAGE` | Staged rollout percentage (1-100) |
86
- | `--chrome-review-exemption` | `CHROME_REVIEW_EXEMPTION` | Request expedited review |
87
- | `--chrome-skip-submit-review` | `CHROME_SKIP_SUBMIT_REVIEW` | Upload only, skip publish step |
77
+ | Flag | Env var | Description |
78
+ | ---------------------------------- | --------------------------- | --------------------------------- |
79
+ | `--chrome-zip <path>` | `CHROME_ZIP` | Path to the extension ZIP file |
80
+ | `--chrome-extension-id <id>` | `CHROME_EXTENSION_ID` | Chrome Web Store extension ID |
81
+ | `--chrome-client-id <id>` | `CHROME_CLIENT_ID` | OAuth2 client ID |
82
+ | `--chrome-client-secret <secret>` | `CHROME_CLIENT_SECRET` | OAuth2 client secret |
83
+ | `--chrome-refresh-token <token>` | `CHROME_REFRESH_TOKEN` | OAuth2 refresh token |
84
+ | `--chrome-publish-target <target>` | `CHROME_PUBLISH_TARGET` | `"default"` or `"trustedTesters"` |
85
+ | `--chrome-deploy-percentage <n>` | `CHROME_DEPLOY_PERCENTAGE` | Staged rollout percentage (1-100) |
86
+ | `--chrome-review-exemption` | `CHROME_REVIEW_EXEMPTION` | Request expedited review |
87
+ | `--chrome-skip-submit-review` | `CHROME_SKIP_SUBMIT_REVIEW` | Upload only, skip publish step |
88
88
 
89
89
  ### Firefox AMO
90
90
 
91
- | Flag | Env var | Description |
92
- | --- | --- | --- |
93
- | `--firefox-zip <path>` | `FIREFOX_ZIP` | Path to the extension ZIP file |
94
- | `--firefox-sources-zip <path>` | `FIREFOX_SOURCES_ZIP` | Path to sources ZIP (optional, for review) |
95
- | `--firefox-extension-id <id>` | `FIREFOX_EXTENSION_ID` | Addon GUID (`{uuid}`) or email-style ID |
96
- | `--firefox-jwt-issuer <issuer>` | `FIREFOX_JWT_ISSUER` | AMO JWT issuer (API key) |
97
- | `--firefox-jwt-secret <secret>` | `FIREFOX_JWT_SECRET` | AMO JWT secret |
98
- | `--firefox-channel <channel>` | `FIREFOX_CHANNEL` | `"listed"` or `"unlisted"` |
91
+ | Flag | Env var | Description |
92
+ | ------------------------------- | ---------------------- | ------------------------------------------ |
93
+ | `--firefox-zip <path>` | `FIREFOX_ZIP` | Path to the extension ZIP file |
94
+ | `--firefox-sources-zip <path>` | `FIREFOX_SOURCES_ZIP` | Path to sources ZIP (optional, for review) |
95
+ | `--firefox-extension-id <id>` | `FIREFOX_EXTENSION_ID` | Addon GUID (`{uuid}`) or email-style ID |
96
+ | `--firefox-jwt-issuer <issuer>` | `FIREFOX_JWT_ISSUER` | AMO JWT issuer (API key) |
97
+ | `--firefox-jwt-secret <secret>` | `FIREFOX_JWT_SECRET` | AMO JWT secret |
98
+ | `--firefox-channel <channel>` | `FIREFOX_CHANNEL` | `"listed"` or `"unlisted"` |
99
99
 
100
100
  ### Edge Partner Center
101
101
 
102
- | Flag | Env var | Description |
103
- | --- | --- | --- |
104
- | `--edge-zip <path>` | `EDGE_ZIP` | Path to the extension ZIP file |
105
- | `--edge-product-id <id>` | `EDGE_PRODUCT_ID` | Partner Center product ID |
106
- | `--edge-client-id <id>` | `EDGE_CLIENT_ID` | Partner Center client ID |
107
- | `--edge-api-key <key>` | `EDGE_API_KEY` | Partner Center API key (v1.1) |
102
+ | Flag | Env var | Description |
103
+ | --------------------------- | ------------------------- | ------------------------------ |
104
+ | `--edge-zip <path>` | `EDGE_ZIP` | Path to the extension ZIP file |
105
+ | `--edge-product-id <id>` | `EDGE_PRODUCT_ID` | Partner Center product ID |
106
+ | `--edge-client-id <id>` | `EDGE_CLIENT_ID` | Partner Center client ID |
107
+ | `--edge-api-key <key>` | `EDGE_API_KEY` | Partner Center API key (v1.1) |
108
108
  | `--edge-skip-submit-review` | `EDGE_SKIP_SUBMIT_REVIEW` | Upload only, skip publish step |
109
109
 
110
110
  ### Environment variables
@@ -169,30 +169,30 @@ Deploys to all configured stores in parallel. Only stores with a config object a
169
169
 
170
170
  **`DeployConfig`**
171
171
 
172
- | Field | Type | Required | Description |
173
- | --- | --- | --- | --- |
174
- | `dryRun` | `boolean` | No | Verify auth without uploading. Default `false` |
175
- | `chrome` | `ChromeOptions` | No | Chrome Web Store config |
176
- | `firefox` | `FirefoxOptions` | No | Firefox AMO config |
177
- | `edge` | `EdgeOptions` | No | Edge Partner Center config |
172
+ | Field | Type | Required | Description |
173
+ | --------- | ---------------- | -------- | ---------------------------------------------- |
174
+ | `dryRun` | `boolean` | No | Verify auth without uploading. Default `false` |
175
+ | `chrome` | `ChromeOptions` | No | Chrome Web Store config |
176
+ | `firefox` | `FirefoxOptions` | No | Firefox AMO config |
177
+ | `edge` | `EdgeOptions` | No | Edge Partner Center config |
178
178
 
179
179
  **`DeployResult`**
180
180
 
181
- | Field | Type | Description |
182
- | --- | --- | --- |
183
- | `dryRun` | `boolean` | Whether this was a dry run |
184
- | `success` | `boolean` | `true` if all stores succeeded |
185
- | `stores` | `StoreResult[]` | Per-store results |
181
+ | Field | Type | Description |
182
+ | --------- | --------------- | ------------------------------ |
183
+ | `dryRun` | `boolean` | Whether this was a dry run |
184
+ | `success` | `boolean` | `true` if all stores succeeded |
185
+ | `stores` | `StoreResult[]` | Per-store results |
186
186
 
187
187
  **`StoreResult`**
188
188
 
189
- | Field | Type | Description |
190
- | --- | --- | --- |
191
- | `store` | `"chrome" \| "firefox" \| "edge"` | Store identifier |
192
- | `success` | `boolean` | Whether submission succeeded |
193
- | `status` | `"dry_run" \| "submitted" \| "uploaded" \| "failed"` | Result status |
194
- | `error` | `string?` | Error message on failure |
195
- | `duration` | `number` | Duration in milliseconds |
189
+ | Field | Type | Description |
190
+ | ---------- | ---------------------------------------------------- | ---------------------------- |
191
+ | `store` | `"chrome" \| "firefox" \| "edge"` | Store identifier |
192
+ | `success` | `boolean` | Whether submission succeeded |
193
+ | `status` | `"dry_run" \| "submitted" \| "uploaded" \| "failed"` | Result status |
194
+ | `error` | `string?` | Error message on failure |
195
+ | `duration` | `number` | Duration in milliseconds |
196
196
 
197
197
  ### Validation schemas
198
198
 
@@ -230,10 +230,10 @@ import {
230
230
 
231
231
  ## Exit codes
232
232
 
233
- | Code | Meaning |
234
- | --- | --- |
235
- | `0` | All configured stores succeeded |
236
- | `1` | One or more stores failed, or a validation/config error occurred |
233
+ | Code | Meaning |
234
+ | ---- | ---------------------------------------------------------------- |
235
+ | `0` | All configured stores succeeded |
236
+ | `1` | One or more stores failed, or a validation/config error occurred |
237
237
 
238
238
  ## Local development
239
239
 
package/dist/module.js CHANGED
@@ -211,15 +211,34 @@ function formatBytes(bytes) {
211
211
  if (bytes < 1048576) return `${(bytes / 1024).toFixed(1)} KB`;
212
212
  return `${(bytes / 1048576).toFixed(2)} MB`;
213
213
  }
214
- function log(store, message) {
215
- const tag = `[${store}]`;
216
- console.log(`${tag} ${message}`);
214
+ const external_pintor_namespaceObject = require("pintor");
215
+ var external_pintor_default = /*#__PURE__*/ __webpack_require__.n(external_pintor_namespaceObject);
216
+ const colors = external_pintor_default();
217
+ function getLoggingPrefix(type) {
218
+ if ("error" === type) return colors.red("ERROR");
219
+ if ("warn" === type) return colors.brightYellow("\u23F5\u23F5\u23F5");
220
+ if ("info" === type) return colors.gray("\u23F5\u23F5\u23F5");
221
+ return colors.green("\u23F5\u23F5\u23F5");
217
222
  }
218
- function logDryStep(store, step, details) {
219
- const tag = `[${store}] DRY RUN`;
220
- console.log(`${tag} \u{2192} ${step}`);
223
+ function scopeTag(scope) {
224
+ return colors.blue(scope);
225
+ }
226
+ function labelLine(key, value) {
227
+ return ` ${colors.gray(key.toUpperCase())} ${colors.underline(String(value))}`;
228
+ }
229
+ function log(scope, message) {
230
+ console.log(`${getLoggingPrefix("info")} ${scopeTag(scope)} ${message}`);
231
+ }
232
+ function logSuccess(scope, message) {
233
+ console.log(`${getLoggingPrefix("success")} ${scopeTag(scope)} ${message}`);
234
+ }
235
+ function logError(scope, message) {
236
+ console.error(`${getLoggingPrefix("error")} ${scopeTag(scope)} ${message}`);
237
+ }
238
+ function logDryStep(scope, step, details) {
239
+ console.log(`${getLoggingPrefix("info")} ${scopeTag(scope)} ${colors.gray("DRY RUN")} ${step}`);
221
240
  if (details) {
222
- for (const [key, value] of Object.entries(details))if (null != value) console.log(`${tag} ${key}: ${value}`);
241
+ for (const [key, value] of Object.entries(details))if (null != value) console.log(labelLine(key, value));
223
242
  }
224
243
  }
225
244
  const CWS_OAUTH_URL = "https://oauth2.googleapis.com/token";
@@ -684,31 +703,21 @@ async function verifyEdgeCredentials(params) {
684
703
  message: "Credentials verified. Provide a Product ID to also verify extension ownership."
685
704
  };
686
705
  }
687
- const res = await fetch(`${EDGE_API_BASE}/${encodeURIComponent(params.productId)}/submissions/draft`, {
706
+ const SENTINEL_OP = "00000000-0000-0000-0000-000000000000";
707
+ const res = await fetch(`${EDGE_API_BASE}/${encodeURIComponent(params.productId)}/submissions/draft/package/operations/${SENTINEL_OP}`, {
688
708
  headers
689
709
  });
690
710
  if (401 === res.status) return {
691
711
  ok: false,
692
- message: "Unauthorized. Verify your API credentials are correct."
712
+ message: "Unauthorized. Verify your Client ID and API Key are correct (Partner Center \u2192 Publish API)."
693
713
  };
694
- if (403 === res.status) {
695
- const body = await res.text().catch(()=>"");
696
- if (/product not found|not found/i.test(body)) return {
697
- ok: false,
698
- message: "Product ID not found or not owned by this account. Verify the GUID matches your Partner Center extension."
699
- };
700
- return {
701
- ok: false,
702
- message: "Invalid credentials. Verify your Client ID and API Key are correct."
703
- };
704
- }
705
- if (200 === res.status) return {
706
- ok: true,
707
- message: "Credentials and Product ID verified. Draft submission exists."
714
+ if (403 === res.status) return {
715
+ ok: false,
716
+ message: "Forbidden. The Product ID may not be owned by this account, or these credentials lack access to it."
708
717
  };
709
- if (404 === res.status) return {
718
+ if (404 === res.status || 200 === res.status) return {
710
719
  ok: true,
711
- message: "Credentials and Product ID verified. Ready to submit."
720
+ message: "Credentials verified. Ready to submit."
712
721
  };
713
722
  return {
714
723
  ok: false,
@@ -757,8 +766,9 @@ async function deploy(config) {
757
766
  });
758
767
  }
759
768
  if (0 === jobs.length) throw new Error("No stores configured. Provide at least one store to deploy to.\n\nEach store is activated by providing its ZIP path:\n Chrome: --chrome-zip <path> or CHROME_ZIP=<path>\n Firefox: --firefox-zip <path> or FIREFOX_ZIP=<path>\n Edge: --edge-zip <path> or EDGE_ZIP=<path>\n\nRun extension-deploy --help for all options, or create a .env.submit file.");
760
- if (dryRun) console.log("\n[deploy] Dry run enabled \u2014 will verify auth without uploading\n");
761
- else console.log("\n[deploy] Deploying extension\n");
769
+ console.log("");
770
+ dryRun ? log("deploy", "Dry run enabled \u2014 will verify auth without uploading") : log("deploy", "Deploying extension...");
771
+ console.log("");
762
772
  const settled = await Promise.allSettled(jobs.map(async ({ key, run })=>{
763
773
  const start = Date.now();
764
774
  try {
@@ -789,11 +799,15 @@ async function deploy(config) {
789
799
  duration: 0
790
800
  });
791
801
  const success = stores.every((s)=>s.success);
792
- console.log("\n--- Deploy Summary ---");
802
+ console.log("");
803
+ log("deploy", "Summary");
793
804
  for (const s of stores){
794
- const icon = s.success ? "OK" : "FAIL";
795
- console.log(` ${icon} ${s.store} (${s.status}, ${s.duration}ms)`);
796
- if (s.error) console.error(` ${s.error}`);
805
+ const line = `${colors.gray(s.store)} ${colors.underline(s.status)} ` + colors.gray(`(${s.duration}ms)`);
806
+ if (s.success) logSuccess("deploy", line);
807
+ else {
808
+ logError("deploy", line);
809
+ if (s.error) console.error(` ${colors.red(s.error)}`);
810
+ }
797
811
  }
798
812
  console.log("");
799
813
  return {
@@ -963,7 +977,7 @@ const CHROME_SCOPE = "https://www.googleapis.com/auth/chromewebstore";
963
977
  async function runInit(deps, options = {}) {
964
978
  const { io } = deps;
965
979
  io.log("");
966
- io.log("extension-deploy init \u2014 set up store credentials");
980
+ io.log(`${colors.green("\u23F5\u23F5\u23F5")} ${colors.blue("init")} ${colors.underline("extension-deploy \u2014 set up store credentials")}`);
967
981
  io.log("");
968
982
  io.log("This wizard walks you through creating credentials for each store and");
969
983
  io.log("writes them to a .env.submit file. Press Ctrl+C at any time to abort.");
@@ -978,7 +992,7 @@ async function runInit(deps, options = {}) {
978
992
  const verified = {};
979
993
  for (const store of stores){
980
994
  io.log("");
981
- io.log(`=== ${labelFor(store)} ===`);
995
+ io.log(colors.underline(colors.blue(labelFor(store))));
982
996
  io.log("");
983
997
  if ("chrome" === store) {
984
998
  const creds = await collectChromeCredentials(deps);
@@ -1035,9 +1049,9 @@ async function runInit(deps, options = {}) {
1035
1049
  }
1036
1050
  if (wrote) {
1037
1051
  io.log("");
1038
- io.log(`Wrote ${envPath}`);
1052
+ io.log(`${colors.green("\u23F5\u23F5\u23F5")} ${colors.blue("init")} Wrote ${colors.underline(envPath)}`);
1039
1053
  io.log("");
1040
- io.log("Next steps:");
1054
+ io.log(colors.gray("Next steps:"));
1041
1055
  io.log(" - Add .env.submit to .gitignore if it isn't already (it contains secrets).");
1042
1056
  io.log(" - Run `extension-deploy --dry-run` to sanity-check the full submit flow.");
1043
1057
  io.log("");
@@ -1176,8 +1190,8 @@ function normalizeVerify(result) {
1176
1190
  };
1177
1191
  }
1178
1192
  function logVerify(io, store, record) {
1179
- const marker = record.ok ? "[ok]" : "[fail]";
1180
- io.log(` ${marker} verify ${store}: ${record.message}`);
1193
+ const marker = record.ok ? `[${colors.green("ok")}]` : `[${colors.red("fail")}]`;
1194
+ io.log(` ${marker} verify ${colors.blue(store)}: ${record.message}`);
1181
1195
  }
1182
1196
  function resolveEnvPath(cwd, outputPath) {
1183
1197
  const target = outputPath ?? ".env.submit";
@@ -1421,19 +1435,23 @@ async function main() {
1421
1435
  if (flags.outputJson) writeJsonOutput(flags.outputJson, result);
1422
1436
  if (!result.success) process.exit(1);
1423
1437
  } catch (err) {
1424
- console.error(err instanceof Error ? err.message : err);
1438
+ logError("deploy", err instanceof Error ? err.message : String(err));
1425
1439
  process.exit(1);
1426
1440
  }
1427
1441
  }
1428
1442
  async function runWatch(flags) {
1429
1443
  const store = flags.watchStore;
1430
1444
  if (!store) {
1431
- console.error("watch: one of --chrome, --firefox, or --edge must be provided.");
1445
+ logError("watch", "One of --chrome, --firefox, or --edge must be provided.");
1432
1446
  process.exit(2);
1433
1447
  }
1434
1448
  const onEvent = (event)=>{
1435
- const line = `[watch:${event.store}] ${event.status}${event.nativeStatus ? ` (${event.nativeStatus})` : ""}${event.message ? ` \u{2014} ${event.message}` : ""}`;
1436
- console.log(line);
1449
+ const parts = [
1450
+ colors.underline(event.status)
1451
+ ];
1452
+ if (event.nativeStatus) parts.push(colors.gray(`(${event.nativeStatus})`));
1453
+ if (event.message) parts.push(`\u{2014} ${event.message}`);
1454
+ log(event.store, parts.join(" "));
1437
1455
  };
1438
1456
  const pollIntervalMs = (flags.watchInterval ?? 60) * 1000;
1439
1457
  const timeoutMs = (flags.watchTimeout ?? 3600) * 1000;
@@ -1468,7 +1486,7 @@ async function runWatch(flags) {
1468
1486
  onEvent
1469
1487
  });
1470
1488
  } catch (err) {
1471
- console.error(err instanceof Error ? err.message : err);
1489
+ logError("watch", err instanceof Error ? err.message : String(err));
1472
1490
  process.exit(1);
1473
1491
  }
1474
1492
  if (flags.outputJson) writeJsonOutput(flags.outputJson, terminal);
@@ -1499,7 +1517,7 @@ async function runInitCommand(flags) {
1499
1517
  force: flags.initForce
1500
1518
  });
1501
1519
  } catch (err) {
1502
- console.error(err instanceof Error ? err.message : err);
1520
+ logError("deploy", err instanceof Error ? err.message : String(err));
1503
1521
  process.exit(1);
1504
1522
  } finally{
1505
1523
  io.dispose();
package/dist/module.mjs CHANGED
@@ -2,6 +2,7 @@ import external_node_fs_default from "node:fs";
2
2
  import external_node_path_default from "node:path";
3
3
  import { z } from "zod";
4
4
  import promises_default from "node:fs/promises";
5
+ import external_pintor_default from "pintor";
5
6
  import external_node_crypto_default from "node:crypto";
6
7
  import external_node_readline_default from "node:readline";
7
8
  const chromeOptionsSchema = z.object({
@@ -157,15 +158,32 @@ function formatBytes(bytes) {
157
158
  if (bytes < 1048576) return `${(bytes / 1024).toFixed(1)} KB`;
158
159
  return `${(bytes / 1048576).toFixed(2)} MB`;
159
160
  }
160
- function log(store, message) {
161
- const tag = `[${store}]`;
162
- console.log(`${tag} ${message}`);
161
+ const colors = external_pintor_default;
162
+ function getLoggingPrefix(type) {
163
+ if ("error" === type) return colors.red("ERROR");
164
+ if ("warn" === type) return colors.brightYellow("\u23F5\u23F5\u23F5");
165
+ if ("info" === type) return colors.gray("\u23F5\u23F5\u23F5");
166
+ return colors.green("\u23F5\u23F5\u23F5");
163
167
  }
164
- function logDryStep(store, step, details) {
165
- const tag = `[${store}] DRY RUN`;
166
- console.log(`${tag} \u{2192} ${step}`);
168
+ function scopeTag(scope) {
169
+ return colors.blue(scope);
170
+ }
171
+ function labelLine(key, value) {
172
+ return ` ${colors.gray(key.toUpperCase())} ${colors.underline(String(value))}`;
173
+ }
174
+ function log(scope, message) {
175
+ console.log(`${getLoggingPrefix("info")} ${scopeTag(scope)} ${message}`);
176
+ }
177
+ function logSuccess(scope, message) {
178
+ console.log(`${getLoggingPrefix("success")} ${scopeTag(scope)} ${message}`);
179
+ }
180
+ function logError(scope, message) {
181
+ console.error(`${getLoggingPrefix("error")} ${scopeTag(scope)} ${message}`);
182
+ }
183
+ function logDryStep(scope, step, details) {
184
+ console.log(`${getLoggingPrefix("info")} ${scopeTag(scope)} ${colors.gray("DRY RUN")} ${step}`);
167
185
  if (details) {
168
- for (const [key, value] of Object.entries(details))if (null != value) console.log(`${tag} ${key}: ${value}`);
186
+ for (const [key, value] of Object.entries(details))if (null != value) console.log(labelLine(key, value));
169
187
  }
170
188
  }
171
189
  const CWS_OAUTH_URL = "https://oauth2.googleapis.com/token";
@@ -628,31 +646,21 @@ async function verifyEdgeCredentials(params) {
628
646
  message: "Credentials verified. Provide a Product ID to also verify extension ownership."
629
647
  };
630
648
  }
631
- const res = await fetch(`${EDGE_API_BASE}/${encodeURIComponent(params.productId)}/submissions/draft`, {
649
+ const SENTINEL_OP = "00000000-0000-0000-0000-000000000000";
650
+ const res = await fetch(`${EDGE_API_BASE}/${encodeURIComponent(params.productId)}/submissions/draft/package/operations/${SENTINEL_OP}`, {
632
651
  headers
633
652
  });
634
653
  if (401 === res.status) return {
635
654
  ok: false,
636
- message: "Unauthorized. Verify your API credentials are correct."
655
+ message: "Unauthorized. Verify your Client ID and API Key are correct (Partner Center \u2192 Publish API)."
637
656
  };
638
- if (403 === res.status) {
639
- const body = await res.text().catch(()=>"");
640
- if (/product not found|not found/i.test(body)) return {
641
- ok: false,
642
- message: "Product ID not found or not owned by this account. Verify the GUID matches your Partner Center extension."
643
- };
644
- return {
645
- ok: false,
646
- message: "Invalid credentials. Verify your Client ID and API Key are correct."
647
- };
648
- }
649
- if (200 === res.status) return {
650
- ok: true,
651
- message: "Credentials and Product ID verified. Draft submission exists."
657
+ if (403 === res.status) return {
658
+ ok: false,
659
+ message: "Forbidden. The Product ID may not be owned by this account, or these credentials lack access to it."
652
660
  };
653
- if (404 === res.status) return {
661
+ if (404 === res.status || 200 === res.status) return {
654
662
  ok: true,
655
- message: "Credentials and Product ID verified. Ready to submit."
663
+ message: "Credentials verified. Ready to submit."
656
664
  };
657
665
  return {
658
666
  ok: false,
@@ -701,8 +709,9 @@ async function deploy(config) {
701
709
  });
702
710
  }
703
711
  if (0 === jobs.length) throw new Error("No stores configured. Provide at least one store to deploy to.\n\nEach store is activated by providing its ZIP path:\n Chrome: --chrome-zip <path> or CHROME_ZIP=<path>\n Firefox: --firefox-zip <path> or FIREFOX_ZIP=<path>\n Edge: --edge-zip <path> or EDGE_ZIP=<path>\n\nRun extension-deploy --help for all options, or create a .env.submit file.");
704
- if (dryRun) console.log("\n[deploy] Dry run enabled \u2014 will verify auth without uploading\n");
705
- else console.log("\n[deploy] Deploying extension\n");
712
+ console.log("");
713
+ dryRun ? log("deploy", "Dry run enabled \u2014 will verify auth without uploading") : log("deploy", "Deploying extension...");
714
+ console.log("");
706
715
  const settled = await Promise.allSettled(jobs.map(async ({ key, run })=>{
707
716
  const start = Date.now();
708
717
  try {
@@ -733,11 +742,15 @@ async function deploy(config) {
733
742
  duration: 0
734
743
  });
735
744
  const success = stores.every((s)=>s.success);
736
- console.log("\n--- Deploy Summary ---");
745
+ console.log("");
746
+ log("deploy", "Summary");
737
747
  for (const s of stores){
738
- const icon = s.success ? "OK" : "FAIL";
739
- console.log(` ${icon} ${s.store} (${s.status}, ${s.duration}ms)`);
740
- if (s.error) console.error(` ${s.error}`);
748
+ const line = `${colors.gray(s.store)} ${colors.underline(s.status)} ` + colors.gray(`(${s.duration}ms)`);
749
+ if (s.success) logSuccess("deploy", line);
750
+ else {
751
+ logError("deploy", line);
752
+ if (s.error) console.error(` ${colors.red(s.error)}`);
753
+ }
741
754
  }
742
755
  console.log("");
743
756
  return {
@@ -907,7 +920,7 @@ const CHROME_SCOPE = "https://www.googleapis.com/auth/chromewebstore";
907
920
  async function runInit(deps, options = {}) {
908
921
  const { io } = deps;
909
922
  io.log("");
910
- io.log("extension-deploy init \u2014 set up store credentials");
923
+ io.log(`${colors.green("\u23F5\u23F5\u23F5")} ${colors.blue("init")} ${colors.underline("extension-deploy \u2014 set up store credentials")}`);
911
924
  io.log("");
912
925
  io.log("This wizard walks you through creating credentials for each store and");
913
926
  io.log("writes them to a .env.submit file. Press Ctrl+C at any time to abort.");
@@ -922,7 +935,7 @@ async function runInit(deps, options = {}) {
922
935
  const verified = {};
923
936
  for (const store of stores){
924
937
  io.log("");
925
- io.log(`=== ${labelFor(store)} ===`);
938
+ io.log(colors.underline(colors.blue(labelFor(store))));
926
939
  io.log("");
927
940
  if ("chrome" === store) {
928
941
  const creds = await collectChromeCredentials(deps);
@@ -979,9 +992,9 @@ async function runInit(deps, options = {}) {
979
992
  }
980
993
  if (wrote) {
981
994
  io.log("");
982
- io.log(`Wrote ${envPath}`);
995
+ io.log(`${colors.green("\u23F5\u23F5\u23F5")} ${colors.blue("init")} Wrote ${colors.underline(envPath)}`);
983
996
  io.log("");
984
- io.log("Next steps:");
997
+ io.log(colors.gray("Next steps:"));
985
998
  io.log(" - Add .env.submit to .gitignore if it isn't already (it contains secrets).");
986
999
  io.log(" - Run `extension-deploy --dry-run` to sanity-check the full submit flow.");
987
1000
  io.log("");
@@ -1120,8 +1133,8 @@ function normalizeVerify(result) {
1120
1133
  };
1121
1134
  }
1122
1135
  function logVerify(io, store, record) {
1123
- const marker = record.ok ? "[ok]" : "[fail]";
1124
- io.log(` ${marker} verify ${store}: ${record.message}`);
1136
+ const marker = record.ok ? `[${colors.green("ok")}]` : `[${colors.red("fail")}]`;
1137
+ io.log(` ${marker} verify ${colors.blue(store)}: ${record.message}`);
1125
1138
  }
1126
1139
  function resolveEnvPath(cwd, outputPath) {
1127
1140
  const target = outputPath ?? ".env.submit";
@@ -1363,19 +1376,23 @@ async function main() {
1363
1376
  if (flags.outputJson) writeJsonOutput(flags.outputJson, result);
1364
1377
  if (!result.success) process.exit(1);
1365
1378
  } catch (err) {
1366
- console.error(err instanceof Error ? err.message : err);
1379
+ logError("deploy", err instanceof Error ? err.message : String(err));
1367
1380
  process.exit(1);
1368
1381
  }
1369
1382
  }
1370
1383
  async function runWatch(flags) {
1371
1384
  const store = flags.watchStore;
1372
1385
  if (!store) {
1373
- console.error("watch: one of --chrome, --firefox, or --edge must be provided.");
1386
+ logError("watch", "One of --chrome, --firefox, or --edge must be provided.");
1374
1387
  process.exit(2);
1375
1388
  }
1376
1389
  const onEvent = (event)=>{
1377
- const line = `[watch:${event.store}] ${event.status}${event.nativeStatus ? ` (${event.nativeStatus})` : ""}${event.message ? ` \u{2014} ${event.message}` : ""}`;
1378
- console.log(line);
1390
+ const parts = [
1391
+ colors.underline(event.status)
1392
+ ];
1393
+ if (event.nativeStatus) parts.push(colors.gray(`(${event.nativeStatus})`));
1394
+ if (event.message) parts.push(`\u{2014} ${event.message}`);
1395
+ log(event.store, parts.join(" "));
1379
1396
  };
1380
1397
  const pollIntervalMs = (flags.watchInterval ?? 60) * 1000;
1381
1398
  const timeoutMs = (flags.watchTimeout ?? 3600) * 1000;
@@ -1410,7 +1427,7 @@ async function runWatch(flags) {
1410
1427
  onEvent
1411
1428
  });
1412
1429
  } catch (err) {
1413
- console.error(err instanceof Error ? err.message : err);
1430
+ logError("watch", err instanceof Error ? err.message : String(err));
1414
1431
  process.exit(1);
1415
1432
  }
1416
1433
  if (flags.outputJson) writeJsonOutput(flags.outputJson, terminal);
@@ -1441,7 +1458,7 @@ async function runInitCommand(flags) {
1441
1458
  force: flags.initForce
1442
1459
  });
1443
1460
  } catch (err) {
1444
- console.error(err instanceof Error ? err.message : err);
1461
+ logError("deploy", err instanceof Error ? err.message : String(err));
1445
1462
  process.exit(1);
1446
1463
  } finally{
1447
1464
  io.dispose();
@@ -1 +1 @@
1
- {"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../src/chrome.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAa7C,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAID,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA+ED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,oBAAoB,CAAC,CA2D/B;AAID,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;CACpC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAa5B;AAID,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkD9B"}
1
+ {"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../src/chrome.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAW7C,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAID,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA+ED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,oBAAoB,CAAC,CA2D/B;AAID,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;CACpC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAa5B;AAID,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkD9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAsFzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiE3D;AAiCD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC1C"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAuFzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiE3D;AAiCD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC1C"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAEhE,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,GACvB,YAAY,CAiDd;AA2CD,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmB/C;AAiBD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,OAAO,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IACrC,8CAA8C;IAC9C,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,4EAA4E;IAC5E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,sBAAsB,EAAE,OAAO,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,cAAc,EAAE,OAAO,CAAC;IACxB,2DAA2D;IAC3D,SAAS,EAAE,OAAO,CAAC;CACpB"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAEhE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,YAAY,CAiEpE;AAuCD,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmB/C;AAiBD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,OAAO,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IACrC,8CAA8C;IAC9C,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,4EAA4E;IAC5E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,sBAAsB,EAAE,OAAO,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,cAAc,EAAE,OAAO,CAAC;IACxB,2DAA2D;IAC3D,SAAS,EAAE,OAAO,CAAC;CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAyB,MAAM,SAAS,CAAC;AAMjF,wBAAsB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAiGxE"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EAGb,MAAM,SAAS,CAAC;AAOjB,wBAAsB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA0GxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../../src/edge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAW3C,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAID,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC9C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AA2ED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,kBAAkB,CAAC,CAqD7B;AAID,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAKtC;AAID,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwE5B"}
1
+ {"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../../src/edge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAW3C,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAID,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC9C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AA2ED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,kBAAkB,CAAC,CAqD7B;AAID,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAKtC;AAID,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8D5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,14 @@
1
1
  import type { StoreKey } from "../types";
2
- export declare function log(store: StoreKey, message: string): void;
3
- export declare function logDryRun(store: StoreKey, message: string): void;
4
- export declare function logDryStep(store: StoreKey, step: string, details?: Record<string, unknown>): void;
5
- export declare function logError(store: StoreKey, message: string): void;
2
+ type ColorFn = (text: string) => string;
3
+ type ColorName = "red" | "blue" | "gray" | "green" | "yellow" | "brightYellow" | "underline";
4
+ declare const colors: Record<ColorName, ColorFn>;
5
+ export type LogScope = StoreKey | "deploy" | "watch";
6
+ export declare function log(scope: LogScope, message: string): void;
7
+ export declare function logSuccess(scope: LogScope, message: string): void;
8
+ export declare function logWarn(scope: LogScope, message: string): void;
9
+ export declare function logError(scope: LogScope, message: string): void;
10
+ export declare function logDryRun(scope: LogScope, message: string): void;
11
+ export declare function logDryStep(scope: LogScope, step: string, details?: Record<string, unknown>): void;
12
+ export declare function logLabelLine(key: string, value: unknown): string;
13
+ export { colors };
6
14
  //# sourceMappingURL=log.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../src/utils/log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAG1D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI,CASN;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAG/D"}
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../src/utils/log.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,KAAK,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AACxC,KAAK,SAAS,GACV,KAAK,GACL,MAAM,GACN,MAAM,GACN,OAAO,GACP,QAAQ,GACR,cAAc,GACd,WAAW,CAAC;AAEhB,QAAA,MAAM,MAAM,EAAwB,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAE/D,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAiBrD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIhE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI,CAUN;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhE;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAY,UAAU,EAAe,MAAM,SAAS,CAAC;AAajE,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAcD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,UAAU,CAAC,CAqCrB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAErB;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAcD,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,UAAU,CAAC,CA2BrB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAErB;AAID,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAYD,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,UAAU,CAAC,CA2BrB;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAMrB"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAY,UAAU,EAAe,MAAM,SAAS,CAAC;AAajE,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAYD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,UAAU,CAAC,CAqCrB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAErB;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAgBD,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,UAAU,CAAC,CA2BrB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAErB;AAID,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAUD,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,UAAU,CAAC,CA2BrB;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAMrB"}
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "ci",
14
14
  "automation"
15
15
  ],
16
- "version": "0.2.1",
16
+ "version": "0.2.3",
17
17
  "repository": {
18
18
  "type": "git",
19
19
  "url": "git+https://github.com/extensiondev/deploy.git"
@@ -24,7 +24,7 @@
24
24
  "homepage": "https://github.com/extensiondev/deploy#readme",
25
25
  "license": "MIT",
26
26
  "engines": {
27
- "node": ">=18"
27
+ "node": ">=20.18"
28
28
  },
29
29
  "packageManager": "pnpm@10.19.0",
30
30
  "exports": {
@@ -60,6 +60,7 @@
60
60
  "access": "public"
61
61
  },
62
62
  "dependencies": {
63
+ "pintor": "0.3.0",
63
64
  "zod": "^3.25.76"
64
65
  },
65
66
  "devDependencies": {