@iterable/cli 0.1.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 (140) hide show
  1. package/COMMANDS.md +1574 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +194 -0
  4. package/dist/commands/campaigns.d.ts +3 -0
  5. package/dist/commands/campaigns.d.ts.map +1 -0
  6. package/dist/commands/campaigns.js +106 -0
  7. package/dist/commands/campaigns.js.map +1 -0
  8. package/dist/commands/catalogs.d.ts +3 -0
  9. package/dist/commands/catalogs.d.ts.map +1 -0
  10. package/dist/commands/catalogs.js +99 -0
  11. package/dist/commands/catalogs.js.map +1 -0
  12. package/dist/commands/events.d.ts +3 -0
  13. package/dist/commands/events.d.ts.map +1 -0
  14. package/dist/commands/events.js +33 -0
  15. package/dist/commands/events.js.map +1 -0
  16. package/dist/commands/experiments.d.ts +3 -0
  17. package/dist/commands/experiments.d.ts.map +1 -0
  18. package/dist/commands/experiments.js +33 -0
  19. package/dist/commands/experiments.js.map +1 -0
  20. package/dist/commands/export.d.ts +3 -0
  21. package/dist/commands/export.d.ts.map +1 -0
  22. package/dist/commands/export.js +33 -0
  23. package/dist/commands/export.js.map +1 -0
  24. package/dist/commands/journeys.d.ts +3 -0
  25. package/dist/commands/journeys.d.ts.map +1 -0
  26. package/dist/commands/journeys.js +21 -0
  27. package/dist/commands/journeys.js.map +1 -0
  28. package/dist/commands/lists.d.ts +3 -0
  29. package/dist/commands/lists.d.ts.map +1 -0
  30. package/dist/commands/lists.js +64 -0
  31. package/dist/commands/lists.js.map +1 -0
  32. package/dist/commands/messaging.d.ts +3 -0
  33. package/dist/commands/messaging.d.ts.map +1 -0
  34. package/dist/commands/messaging.js +120 -0
  35. package/dist/commands/messaging.js.map +1 -0
  36. package/dist/commands/registry.d.ts +46 -0
  37. package/dist/commands/registry.d.ts.map +1 -0
  38. package/dist/commands/registry.js +42 -0
  39. package/dist/commands/registry.js.map +1 -0
  40. package/dist/commands/snippets.d.ts +3 -0
  41. package/dist/commands/snippets.d.ts.map +1 -0
  42. package/dist/commands/snippets.js +42 -0
  43. package/dist/commands/snippets.js.map +1 -0
  44. package/dist/commands/subscriptions.d.ts +3 -0
  45. package/dist/commands/subscriptions.d.ts.map +1 -0
  46. package/dist/commands/subscriptions.js +40 -0
  47. package/dist/commands/subscriptions.js.map +1 -0
  48. package/dist/commands/templates.d.ts +3 -0
  49. package/dist/commands/templates.d.ts.map +1 -0
  50. package/dist/commands/templates.js +160 -0
  51. package/dist/commands/templates.js.map +1 -0
  52. package/dist/commands/transforms.d.ts +3 -0
  53. package/dist/commands/transforms.d.ts.map +1 -0
  54. package/dist/commands/transforms.js +24 -0
  55. package/dist/commands/transforms.js.map +1 -0
  56. package/dist/commands/types.d.ts +40 -0
  57. package/dist/commands/types.d.ts.map +1 -0
  58. package/dist/commands/types.js +15 -0
  59. package/dist/commands/types.js.map +1 -0
  60. package/dist/commands/users.d.ts +3 -0
  61. package/dist/commands/users.d.ts.map +1 -0
  62. package/dist/commands/users.js +103 -0
  63. package/dist/commands/users.js.map +1 -0
  64. package/dist/commands/webhooks.d.ts +3 -0
  65. package/dist/commands/webhooks.d.ts.map +1 -0
  66. package/dist/commands/webhooks.js +21 -0
  67. package/dist/commands/webhooks.js.map +1 -0
  68. package/dist/config.d.ts +14 -0
  69. package/dist/config.d.ts.map +1 -0
  70. package/dist/config.js +60 -0
  71. package/dist/config.js.map +1 -0
  72. package/dist/errors.d.ts +11 -0
  73. package/dist/errors.d.ts.map +1 -0
  74. package/dist/errors.js +21 -0
  75. package/dist/errors.js.map +1 -0
  76. package/dist/index.d.ts +3 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +107 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/key-manager.d.ts +280 -0
  81. package/dist/key-manager.d.ts.map +1 -0
  82. package/dist/key-manager.js +989 -0
  83. package/dist/key-manager.js.map +1 -0
  84. package/dist/keys-cli.d.ts +3 -0
  85. package/dist/keys-cli.d.ts.map +1 -0
  86. package/dist/keys-cli.js +396 -0
  87. package/dist/keys-cli.js.map +1 -0
  88. package/dist/output.d.ts +5 -0
  89. package/dist/output.d.ts.map +1 -0
  90. package/dist/output.js +104 -0
  91. package/dist/output.js.map +1 -0
  92. package/dist/parser.d.ts +26 -0
  93. package/dist/parser.d.ts.map +1 -0
  94. package/dist/parser.js +281 -0
  95. package/dist/parser.js.map +1 -0
  96. package/dist/router.d.ts +20 -0
  97. package/dist/router.d.ts.map +1 -0
  98. package/dist/router.js +137 -0
  99. package/dist/router.js.map +1 -0
  100. package/dist/utils/cli-env.d.ts +10 -0
  101. package/dist/utils/cli-env.d.ts.map +1 -0
  102. package/dist/utils/cli-env.js +21 -0
  103. package/dist/utils/cli-env.js.map +1 -0
  104. package/dist/utils/command-info.d.ts +7 -0
  105. package/dist/utils/command-info.d.ts.map +1 -0
  106. package/dist/utils/command-info.js +36 -0
  107. package/dist/utils/command-info.js.map +1 -0
  108. package/dist/utils/detect-background.d.ts +3 -0
  109. package/dist/utils/detect-background.d.ts.map +1 -0
  110. package/dist/utils/detect-background.js +33 -0
  111. package/dist/utils/detect-background.js.map +1 -0
  112. package/dist/utils/endpoint-prompt.d.ts +5 -0
  113. package/dist/utils/endpoint-prompt.d.ts.map +1 -0
  114. package/dist/utils/endpoint-prompt.js +98 -0
  115. package/dist/utils/endpoint-prompt.js.map +1 -0
  116. package/dist/utils/formatting.d.ts +3 -0
  117. package/dist/utils/formatting.d.ts.map +1 -0
  118. package/dist/utils/formatting.js +5 -0
  119. package/dist/utils/formatting.js.map +1 -0
  120. package/dist/utils/password-prompt.d.ts +3 -0
  121. package/dist/utils/password-prompt.d.ts.map +1 -0
  122. package/dist/utils/password-prompt.js +21 -0
  123. package/dist/utils/password-prompt.js.map +1 -0
  124. package/dist/utils/sanitize.d.ts +13 -0
  125. package/dist/utils/sanitize.d.ts.map +1 -0
  126. package/dist/utils/sanitize.js +23 -0
  127. package/dist/utils/sanitize.js.map +1 -0
  128. package/dist/utils/theme.d.ts +11 -0
  129. package/dist/utils/theme.d.ts.map +1 -0
  130. package/dist/utils/theme.js +14 -0
  131. package/dist/utils/theme.js.map +1 -0
  132. package/dist/utils/ui.d.ts +22 -0
  133. package/dist/utils/ui.d.ts.map +1 -0
  134. package/dist/utils/ui.js +107 -0
  135. package/dist/utils/ui.js.map +1 -0
  136. package/dist/utils/url.d.ts +13 -0
  137. package/dist/utils/url.d.ts.map +1 -0
  138. package/dist/utils/url.js +20 -0
  139. package/dist/utils/url.js.map +1 -0
  140. package/package.json +90 -0
@@ -0,0 +1,98 @@
1
+ import chalk from "chalk";
2
+ import inquirer from "inquirer";
3
+ import { isHttpsOrLocalhost, isLocalhostHost } from "./url.js";
4
+ const US_ENDPOINT = "https://api.iterable.com";
5
+ const EU_ENDPOINT = "https://api.eu.iterable.com";
6
+ /** Prompt user to select Iterable region or provide a custom endpoint. */
7
+ export async function promptForIterableBaseUrl(options) {
8
+ const defaultBaseUrl = options?.defaultBaseUrl;
9
+ const allowFlagEmoji = process.platform !== "win32";
10
+ let defaultChoice = "us";
11
+ if (defaultBaseUrl) {
12
+ if (defaultBaseUrl === US_ENDPOINT)
13
+ defaultChoice = "us";
14
+ else if (defaultBaseUrl === EU_ENDPOINT)
15
+ defaultChoice = "eu";
16
+ else
17
+ defaultChoice = "custom";
18
+ }
19
+ const { endpointChoice } = await inquirer.prompt([
20
+ {
21
+ type: "list",
22
+ name: "endpointChoice",
23
+ message: "Select your Iterable region:",
24
+ choices: [
25
+ {
26
+ name: `${allowFlagEmoji ? "🇺🇸 " : ""}US (api.iterable.com)`,
27
+ value: "us",
28
+ short: "US",
29
+ },
30
+ {
31
+ name: `${allowFlagEmoji ? "🇪🇺 " : ""}EU (api.eu.iterable.com)`,
32
+ value: "eu",
33
+ short: "EU",
34
+ },
35
+ {
36
+ name: `${allowFlagEmoji ? "🌍 " : ""}Custom endpoint`,
37
+ value: "custom",
38
+ short: "Custom",
39
+ },
40
+ ],
41
+ default: defaultChoice,
42
+ },
43
+ ]);
44
+ if (endpointChoice === "us")
45
+ return US_ENDPOINT;
46
+ if (endpointChoice === "eu")
47
+ return EU_ENDPOINT;
48
+ const customUrlQuestion = {
49
+ type: "input",
50
+ name: "customUrl",
51
+ message: "Enter custom API endpoint URL:",
52
+ validate: (input) => {
53
+ if (!input)
54
+ return "URL is required";
55
+ try {
56
+ new URL(input);
57
+ return true;
58
+ }
59
+ catch {
60
+ return "Invalid URL format";
61
+ }
62
+ },
63
+ ...(defaultChoice === "custom" && defaultBaseUrl
64
+ ? { default: defaultBaseUrl }
65
+ : {}),
66
+ };
67
+ const { customUrl } = await inquirer.prompt([
68
+ customUrlQuestion,
69
+ ]);
70
+ const url = new URL(customUrl);
71
+ const isIterableDomain = url.hostname === "iterable.com" || url.hostname.endsWith(".iterable.com");
72
+ const isLocalhost = isLocalhostHost(url.hostname);
73
+ if (!isHttpsOrLocalhost(url)) {
74
+ console.error(
75
+ // eslint-disable-line no-console
76
+ chalk.red("HTTP is not allowed for non-local endpoints. Please use HTTPS."));
77
+ throw new Error("insecure-nonlocal");
78
+ }
79
+ if (!isIterableDomain && !isLocalhost) {
80
+ console.log(); // eslint-disable-line no-console
81
+ console.log(
82
+ // eslint-disable-line no-console
83
+ chalk.yellow("You selected a non-Iterable domain. This reduces security assurances and may not be supported."));
84
+ const { confirmCustom } = await inquirer.prompt([
85
+ {
86
+ type: "confirm",
87
+ name: "confirmCustom",
88
+ message: `Proceed with endpoint ${customUrl}?`,
89
+ default: false,
90
+ },
91
+ ]);
92
+ if (!confirmCustom) {
93
+ throw new Error("custom-cancelled");
94
+ }
95
+ }
96
+ return customUrl;
97
+ }
98
+ //# sourceMappingURL=endpoint-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-prompt.js","sourceRoot":"","sources":["../../src/utils/endpoint-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Platform-specific storage description for tips/help text. */
2
+ export declare function getKeyStorageMessage(): string;
3
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
@@ -0,0 +1,5 @@
1
+ /** Platform-specific storage description for tips/help text. */
2
+ export function getKeyStorageMessage() {
3
+ return "Keys are encrypted at rest using platform-specific security (Keychain on macOS, DPAPI on Windows)";
4
+ }
5
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,UAAU,oBAAoB;IAClC,OAAO,mGAAmG,CAAC;AAC7G,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Prompt for API key input with masking and validation */
2
+ export declare function promptForApiKey(promptText: string): Promise<string>;
3
+ //# sourceMappingURL=password-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-prompt.d.ts","sourceRoot":"","sources":["../../src/utils/password-prompt.ts"],"names":[],"mappings":"AAEA,2DAA2D;AAC3D,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBzE"}
@@ -0,0 +1,21 @@
1
+ import inquirer from "inquirer";
2
+ /** Prompt for API key input with masking and validation */
3
+ export async function promptForApiKey(promptText) {
4
+ const { apiKey } = await inquirer.prompt([
5
+ {
6
+ type: "password",
7
+ name: "apiKey",
8
+ message: promptText,
9
+ mask: "*",
10
+ validate: (input) => {
11
+ if (!input)
12
+ return "API key is required";
13
+ if (!/^[a-f0-9]{32}$/.test(input))
14
+ return "API key must be a 32-character lowercase hexadecimal string";
15
+ return true;
16
+ },
17
+ },
18
+ ]);
19
+ return apiKey.trim();
20
+ }
21
+ //# sourceMappingURL=password-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-prompt.js","sourceRoot":"","sources":["../../src/utils/password-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB;IACtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAqB;QAC3D;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK;oBAAE,OAAO,qBAAqB,CAAC;gBACzC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;oBAC/B,OAAO,6DAA6D,CAAC;gBACvE,OAAO,IAAI,CAAC;YACd,CAAC;SACF;KACF,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Sanitization utilities for logging
3
+ *
4
+ * Prevents accidental exposure of Iterable API keys in logs and error messages.
5
+ */
6
+ /**
7
+ * Sanitize a string by replacing Iterable API keys with [REDACTED]
8
+ *
9
+ * @param text - The text to sanitize
10
+ * @returns Sanitized text with API keys replaced
11
+ */
12
+ export declare function sanitizeString(text: string): string;
13
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKnD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Sanitization utilities for logging
3
+ *
4
+ * Prevents accidental exposure of Iterable API keys in logs and error messages.
5
+ */
6
+ // Pattern to match Iterable API keys (32-character lowercase hexadecimal)
7
+ const ITERABLE_API_KEY_PATTERN = /\b[a-f0-9]{32}\b/gi;
8
+ // Pattern to match emails (basic heuristic)
9
+ const EMAIL_PATTERN = /\b[\w.+-]+@[\w.-]+\.[A-Za-z]{2,}\b/g;
10
+ /**
11
+ * Sanitize a string by replacing Iterable API keys with [REDACTED]
12
+ *
13
+ * @param text - The text to sanitize
14
+ * @returns Sanitized text with API keys replaced
15
+ */
16
+ export function sanitizeString(text) {
17
+ if (!text)
18
+ return text;
19
+ return text
20
+ .replace(ITERABLE_API_KEY_PATTERN, "[REDACTED]")
21
+ .replace(EMAIL_PATTERN, "[REDACTED_EMAIL]");
22
+ }
23
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,0EAA0E;AAC1E,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;AACtD,4CAA4C;AAC5C,MAAM,aAAa,GAAG,qCAAqC,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,IAAI;SACR,OAAO,CAAC,wBAAwB,EAAE,YAAY,CAAC;SAC/C,OAAO,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const theme: {
2
+ readonly mode: import("./detect-background.js").BackgroundMode;
3
+ readonly key: import("chalk").ChalkInstance;
4
+ readonly value: import("chalk").ChalkInstance;
5
+ readonly number: import("chalk").ChalkInstance;
6
+ readonly boolean: import("chalk").ChalkInstance;
7
+ readonly muted: import("chalk").ChalkInstance;
8
+ readonly accent: import("chalk").ChalkInstance;
9
+ readonly bold: import("chalk").ChalkInstance;
10
+ };
11
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,KAAK;;;;;;;;;CAUR,CAAC"}
@@ -0,0 +1,14 @@
1
+ import chalk from "chalk";
2
+ import { detectBackground } from "./detect-background.js";
3
+ const mode = detectBackground();
4
+ export const theme = {
5
+ mode,
6
+ key: mode === "dark" ? chalk.hex("#7DD3FC") : chalk.hex("#0369A1"),
7
+ value: mode === "dark" ? chalk.hex("#86EFAC") : chalk.green,
8
+ number: mode === "dark" ? chalk.hex("#FDE68A") : chalk.yellow,
9
+ boolean: mode === "dark" ? chalk.hex("#67E8F9") : chalk.cyan,
10
+ muted: mode === "dark" ? chalk.hex("#E5E7EB") : chalk.dim,
11
+ accent: mode === "dark" ? chalk.hex("#7DD3FC") : chalk.cyan,
12
+ bold: chalk.bold,
13
+ };
14
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;AAEhC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI;IAEJ,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;IAClE,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK;IAC3D,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;IAC7D,OAAO,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;IAC5D,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;IACzD,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;IAC3D,IAAI,EAAE,KAAK,CAAC,IAAI;CACR,CAAC"}
@@ -0,0 +1,22 @@
1
+ import Table from "cli-table3";
2
+ export declare function linkColor(): (s: string) => string;
3
+ export declare const icons: {
4
+ readonly key: "🔑";
5
+ readonly bulb: "💡";
6
+ readonly fire: "🔥";
7
+ };
8
+ export declare function showSuccess(message: string): void;
9
+ export declare function showError(message: string): void;
10
+ export declare function showInfo(message: string): void;
11
+ export declare function showBox(title: string, content: string | string[], options?: {
12
+ icon?: string;
13
+ theme?: "primary" | "success" | "warning" | "error" | "info";
14
+ padding?: number;
15
+ }): void;
16
+ export declare function showSection(title: string, icon?: string): void;
17
+ export declare function createTable(options: {
18
+ head: string[];
19
+ colWidths?: (number | null)[];
20
+ style?: "compact" | "normal" | "spacious";
21
+ }): Table.Table;
22
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,YAAY,CAAC;AAuB/B,wBAAgB,SAAS,IAAI,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAEjD;AAMD,eAAO,MAAM,KAAK;;;;CAIR,CAAC;AAEX,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,IAAI,CAuBN;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAa9D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;CAC3C,GAAG,KAAK,CAAC,KAAK,CAsCd"}
@@ -0,0 +1,107 @@
1
+ /* eslint-disable no-console */
2
+ import boxen from "boxen";
3
+ import chalk from "chalk";
4
+ import Table from "cli-table3";
5
+ import { detectBackground } from "./detect-background.js";
6
+ const THEME = {
7
+ primary: "#5F40D8",
8
+ accent: "#16C5FF",
9
+ success: "#5DB5A1",
10
+ error: "#E64F7C",
11
+ info: "#16C5FF",
12
+ neutralDark: "#111827",
13
+ neutralLighter: "#CBD5E1",
14
+ purpleBright: "#C4B5FD",
15
+ };
16
+ function isDarkBackground() {
17
+ return detectBackground() === "dark";
18
+ }
19
+ function linkHex() {
20
+ return isDarkBackground() ? THEME.accent : "#0EA5E9";
21
+ }
22
+ export function linkColor() {
23
+ return chalk.hex(linkHex());
24
+ }
25
+ function successHex() {
26
+ return isDarkBackground() ? THEME.success : "#166534";
27
+ }
28
+ export const icons = {
29
+ key: "🔑",
30
+ bulb: "💡",
31
+ fire: "🔥",
32
+ };
33
+ export function showSuccess(message) {
34
+ console.log(chalk.hex(successHex())("✔ " + message));
35
+ }
36
+ export function showError(message) {
37
+ console.log(chalk.hex(THEME.error)("✖ " + message));
38
+ }
39
+ export function showInfo(message) {
40
+ console.log(chalk.hex(THEME.info)(" " + message));
41
+ }
42
+ export function showBox(title, content, options = {}) {
43
+ const { icon, theme: boxTheme = "primary", padding = 1 } = options;
44
+ const displayTitle = icon ? `${icon} ${title}` : title;
45
+ const message = Array.isArray(content) ? content.join("\n") : content;
46
+ const borderColorMap = {
47
+ primary: "magenta",
48
+ success: "green",
49
+ warning: "yellow",
50
+ error: "red",
51
+ info: "cyan",
52
+ };
53
+ console.log(boxen(message, {
54
+ title: displayTitle,
55
+ titleAlignment: "center",
56
+ padding,
57
+ margin: { top: 1, bottom: 1 },
58
+ borderStyle: "round",
59
+ borderColor: borderColorMap[boxTheme] ?? "magenta",
60
+ }));
61
+ }
62
+ export function showSection(title, icon) {
63
+ console.log();
64
+ const showIcons = process.env.ITERABLE_UI_ICONS === "true";
65
+ const displayTitle = icon && showIcons ? `${icon} ${title}` : title;
66
+ const dark = isDarkBackground();
67
+ console.log(chalk.bold.hex(dark ? THEME.purpleBright : THEME.primary)(displayTitle));
68
+ console.log(chalk.hex(dark ? THEME.neutralLighter : THEME.neutralDark)("─".repeat(Math.min(displayTitle.length + 2, 60))));
69
+ }
70
+ export function createTable(options) {
71
+ const { head, colWidths, style = "normal" } = options;
72
+ const padding = style === "compact"
73
+ ? { left: 1, right: 1 }
74
+ : style === "spacious"
75
+ ? { left: 2, right: 2 }
76
+ : { left: 1, right: 1 };
77
+ const dark = isDarkBackground();
78
+ const headColorHex = dark ? THEME.accent : THEME.primary;
79
+ return new Table({
80
+ head: head.map((h) => chalk.bold.hex(headColorHex)(h)),
81
+ ...(colWidths && { colWidths }),
82
+ style: {
83
+ head: [],
84
+ border: ["magenta"],
85
+ "padding-left": padding.left,
86
+ "padding-right": padding.right,
87
+ },
88
+ chars: {
89
+ top: "─",
90
+ "top-mid": "┬",
91
+ "top-left": "╭",
92
+ "top-right": "╮",
93
+ bottom: "─",
94
+ "bottom-mid": "┴",
95
+ "bottom-left": "╰",
96
+ "bottom-right": "╯",
97
+ left: "│",
98
+ "left-mid": "├",
99
+ mid: "─",
100
+ "mid-mid": "┼",
101
+ right: "│",
102
+ "right-mid": "┤",
103
+ middle: "│",
104
+ },
105
+ });
106
+ }
107
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * URL-related helpers
3
+ */
4
+ /**
5
+ * Return true if the hostname is a localhost variant.
6
+ * Accepts IPv4/IPv6 loopback and "localhost".
7
+ */
8
+ export declare function isLocalhostHost(hostname: string): boolean;
9
+ /**
10
+ * True if URL uses https, or is localhost over http(s).
11
+ */
12
+ export declare function isHttpsOrLocalhost(url: URL): boolean;
13
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAEpD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * URL-related helpers
3
+ */
4
+ /**
5
+ * Return true if the hostname is a localhost variant.
6
+ * Accepts IPv4/IPv6 loopback and "localhost".
7
+ */
8
+ export function isLocalhostHost(hostname) {
9
+ if (!hostname)
10
+ return false;
11
+ const lower = hostname.toLowerCase();
12
+ return lower === "localhost" || lower === "127.0.0.1" || lower === "::1";
13
+ }
14
+ /**
15
+ * True if URL uses https, or is localhost over http(s).
16
+ */
17
+ export function isHttpsOrLocalhost(url) {
18
+ return url.protocol === "https:" || isLocalhostHost(url.hostname);
19
+ }
20
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,KAAK,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAQ;IACzC,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACpE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@iterable/cli",
3
+ "version": "0.1.0",
4
+ "description": "Command-line interface for the Iterable API",
5
+ "keywords": [
6
+ "iterable",
7
+ "cli",
8
+ "api",
9
+ "command-line"
10
+ ],
11
+ "author": "Greg Methvin",
12
+ "license": "MIT",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/Iterable/cli.git"
16
+ },
17
+ "main": "dist/index.js",
18
+ "types": "dist/index.d.ts",
19
+ "type": "module",
20
+ "bin": {
21
+ "iterable": "dist/index.js"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "COMMANDS.md",
27
+ "LICENSE"
28
+ ],
29
+ "engines": {
30
+ "node": ">=20.0.0"
31
+ },
32
+ "packageManager": "pnpm@10.23.0",
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "pnpm": {
37
+ "minimumReleaseAge": 4320,
38
+ "minimumReleaseAgeExclude": [
39
+ "@iterable/*"
40
+ ]
41
+ },
42
+ "scripts": {
43
+ "build": "pnpm lint:fix && tsc --project tsconfig.build.json && pnpm update-commands && chmod +x dist/index.js",
44
+ "build:clean": "rm -rf dist && pnpm build",
45
+ "build:dev": "tsc --incremental && pnpm update-commands && chmod +x dist/index.js",
46
+ "build:watch": "tsc --incremental --watch",
47
+ "check": "pnpm format:check && tsc --noEmit && eslint \"src/**/*.ts\" \"tests/**/*.ts\" --quiet",
48
+ "dev": "tsx watch src/index.ts",
49
+ "format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" --log-level=warn",
50
+ "format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\" --log-level=warn",
51
+ "lint:fix": "eslint \"src/**/*.ts\" \"tests/**/*.ts\" --fix --quiet",
52
+ "prepublishOnly": "pnpm build",
53
+ "pretest": "pnpm --silent build",
54
+ "start": "node dist/index.js",
55
+ "test": "jest",
56
+ "test:unit": "jest --testPathPatterns=unit",
57
+ "test:integration": "jest --testPathPatterns=integration",
58
+ "test:e2e": "jest --testPathPatterns=e2e",
59
+ "update-commands": "node scripts/update-commands.js"
60
+ },
61
+ "dependencies": {
62
+ "@iterable/api": "0.8.2",
63
+ "@primno/dpapi": "2.0.1",
64
+ "boxen": "^8.0.1",
65
+ "chalk": "5.6.2",
66
+ "cli-table3": "0.6.5",
67
+ "inquirer": "12.10.0",
68
+ "ora": "9.0.0",
69
+ "zod": "4.1.11",
70
+ "zod-opts": "1.0.0"
71
+ },
72
+ "devDependencies": {
73
+ "@eslint/js": "9.39.1",
74
+ "@jest/globals": "30.2.0",
75
+ "@swc/core": "1.15.0",
76
+ "@swc/jest": "0.2.39",
77
+ "@types/inquirer": "9.0.9",
78
+ "@types/jest": "30.0.0",
79
+ "@types/node": "24.10.0",
80
+ "@typescript-eslint/eslint-plugin": "8.46.3",
81
+ "@typescript-eslint/parser": "8.46.3",
82
+ "eslint": "9.39.1",
83
+ "eslint-plugin-simple-import-sort": "12.1.1",
84
+ "jest": "30.2.0",
85
+ "prettier": "3.6.2",
86
+ "tsx": "4.20.6",
87
+ "typescript": "5.9.3"
88
+ },
89
+ "sideEffects": false
90
+ }