@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,40 @@
1
+ import type { IterableClient } from "@iterable/api";
2
+ import { z } from "zod";
3
+ export interface CliTransform {
4
+ cliFields: Record<string, z.ZodType>;
5
+ toParam: (values: Record<string, unknown>) => unknown;
6
+ }
7
+ export interface CommandDefinition {
8
+ category: string;
9
+ name: string;
10
+ description: string;
11
+ clientMethod?: keyof IterableClient & string;
12
+ schema: z.ZodType;
13
+ execute: (client: IterableClient, params: Record<string, unknown>) => Promise<unknown>;
14
+ positionalArgs?: string[];
15
+ cliTransforms?: Record<string, CliTransform>;
16
+ examples?: string[];
17
+ isAlias?: boolean;
18
+ }
19
+ export declare function defineCommand<K extends keyof IterableClient, TSchema extends z.ZodType>(def: {
20
+ category: string;
21
+ name: string;
22
+ description: string;
23
+ clientMethod: K & string;
24
+ schema: TSchema;
25
+ execute?: (client: IterableClient, params: z.infer<TSchema>) => Promise<unknown>;
26
+ positionalArgs?: (keyof z.infer<TSchema> & string)[];
27
+ cliTransforms?: Record<string, CliTransform>;
28
+ examples?: string[];
29
+ }): CommandDefinition;
30
+ export declare function defineAlias<TSchema extends z.ZodType>(def: {
31
+ category: string;
32
+ name: string;
33
+ description: string;
34
+ schema: TSchema;
35
+ execute: (client: IterableClient, params: z.infer<TSchema>) => Promise<unknown>;
36
+ positionalArgs?: (keyof z.infer<TSchema> & string)[];
37
+ cliTransforms?: Record<string, CliTransform>;
38
+ examples?: string[];
39
+ }): CommandDefinition;
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;CACvD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,cAAc,GAAG,MAAM,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;IAClB,OAAO,EAAE,CACP,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,cAAc,EAC9B,OAAO,SAAS,CAAC,CAAC,OAAO,EACzB,GAAG,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,CACR,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,iBAAiB,CAYpB;AAED,wBAAgB,WAAW,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,CACP,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,iBAAiB,CAKpB"}
@@ -0,0 +1,15 @@
1
+ export function defineCommand(def) {
2
+ const userExecute = def.execute;
3
+ const execute = userExecute
4
+ ? (client, params) => userExecute(client, params)
5
+ : (client, params) => {
6
+ const method = client[def.clientMethod];
7
+ return method.call(client, params);
8
+ };
9
+ return { ...def, execute };
10
+ }
11
+ export function defineAlias(def) {
12
+ const execute = (client, params) => def.execute(client, params);
13
+ return { ...def, execute, isAlias: true };
14
+ }
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,aAAa,CAG3B,GAaD;IACC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC;IAChC,MAAM,OAAO,GAAiC,WAAW;QACvD,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,MAA0B,CAAC;QACrE,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAEjB,CAAC;YACtB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC,CAAC;IAEN,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,WAAW,CAA4B,GAYtD;IACC,MAAM,OAAO,GAAiC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAC/D,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAA0B,CAAC,CAAC;IAElD,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommandDefinition } from "./types.js";
2
+ export declare const userCommands: CommandDefinition[];
3
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/commands/users.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,eAAO,MAAM,YAAY,EAAE,iBAAiB,EAuG3C,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { BulkUpdateUsersParamsSchema, DeleteUserByEmailParamsSchema, DeleteUserByUserIdParamsSchema, GetSentMessagesParamsSchema, GetUserByEmailParamsSchema, GetUserByIdParamsSchema, UpdateEmailParamsSchema, UpdateUserParamsSchema, UpdateUserSubscriptionsParamsSchema, } from "@iterable/api";
2
+ import { z } from "zod";
3
+ import { defineAlias, defineCommand } from "./types.js";
4
+ export const userCommands = [
5
+ defineAlias({
6
+ category: "users",
7
+ name: "get",
8
+ description: "Get a user by email or userId (auto-detected)",
9
+ schema: z.object({
10
+ identifier: z.string().describe("Email address or userId"),
11
+ }),
12
+ execute: (client, params) => params.identifier.includes("@")
13
+ ? client.getUserByEmail(params.identifier)
14
+ : client.getUserByUserId(params.identifier),
15
+ }),
16
+ defineCommand({
17
+ category: "users",
18
+ name: "get-by-email",
19
+ description: "Get user profile information by email address",
20
+ clientMethod: "getUserByEmail",
21
+ schema: GetUserByEmailParamsSchema,
22
+ execute: (client, params) => client.getUserByEmail(params.email),
23
+ }),
24
+ defineCommand({
25
+ category: "users",
26
+ name: "get-by-userid",
27
+ description: "Get user profile information by user ID",
28
+ clientMethod: "getUserByUserId",
29
+ schema: GetUserByIdParamsSchema,
30
+ execute: (client, params) => client.getUserByUserId(params.userId),
31
+ }),
32
+ defineCommand({
33
+ category: "users",
34
+ name: "update",
35
+ description: "Update user profile information (accepts email OR userId)",
36
+ clientMethod: "updateUser",
37
+ schema: UpdateUserParamsSchema,
38
+ }),
39
+ defineAlias({
40
+ category: "users",
41
+ name: "delete",
42
+ description: "Delete a user by email or userId (auto-detected)",
43
+ schema: z.object({
44
+ identifier: z.string().describe("Email address or userId"),
45
+ }),
46
+ execute: (client, params) => params.identifier.includes("@")
47
+ ? client.deleteUserByEmail(params.identifier)
48
+ : client.deleteUserByUserId(params.identifier),
49
+ }),
50
+ defineCommand({
51
+ category: "users",
52
+ name: "delete-by-email",
53
+ description: "Delete a user by email address (asynchronous)",
54
+ clientMethod: "deleteUserByEmail",
55
+ schema: DeleteUserByEmailParamsSchema,
56
+ execute: (client, params) => client.deleteUserByEmail(params.email),
57
+ }),
58
+ defineCommand({
59
+ category: "users",
60
+ name: "delete-by-userid",
61
+ description: "Delete a user by user ID (asynchronous, deletes all users with same userId)",
62
+ clientMethod: "deleteUserByUserId",
63
+ schema: DeleteUserByUserIdParamsSchema,
64
+ execute: (client, params) => client.deleteUserByUserId(params.userId),
65
+ }),
66
+ defineCommand({
67
+ category: "users",
68
+ name: "update-email",
69
+ description: "Update a user's email address (only for email-based projects)",
70
+ clientMethod: "updateEmail",
71
+ schema: UpdateEmailParamsSchema,
72
+ }),
73
+ defineCommand({
74
+ category: "users",
75
+ name: "update-subscriptions",
76
+ description: "Update user subscriptions (overwrites existing data for any non-null fields specified)",
77
+ clientMethod: "updateUserSubscriptions",
78
+ schema: UpdateUserSubscriptionsParamsSchema,
79
+ }),
80
+ defineCommand({
81
+ category: "users",
82
+ name: "bulk-update",
83
+ description: "Update multiple users at once",
84
+ clientMethod: "bulkUpdateUsers",
85
+ schema: BulkUpdateUsersParamsSchema,
86
+ }),
87
+ defineCommand({
88
+ category: "users",
89
+ name: "get-sent-messages",
90
+ description: "Get messages sent to a specific user with optional filtering",
91
+ clientMethod: "getSentMessages",
92
+ schema: GetSentMessagesParamsSchema,
93
+ }),
94
+ defineCommand({
95
+ category: "users",
96
+ name: "get-fields",
97
+ description: "Get all user profile field definitions and their types",
98
+ clientMethod: "getUserFields",
99
+ schema: z.object({}),
100
+ execute: (client) => client.getUserFields(),
101
+ }),
102
+ ];
103
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/commands/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandDefinition } from "./types.js";
2
+ export declare const webhookCommands: CommandDefinition[];
3
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,eAAO,MAAM,eAAe,EAAE,iBAAiB,EAgB9C,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { UpdateWebhookParamsSchema } from "@iterable/api";
2
+ import { z } from "zod";
3
+ import { defineCommand } from "./types.js";
4
+ export const webhookCommands = [
5
+ defineCommand({
6
+ category: "webhooks",
7
+ name: "list",
8
+ description: "Get all webhooks for the project",
9
+ clientMethod: "getWebhooks",
10
+ schema: z.object({}),
11
+ execute: (client) => client.getWebhooks(),
12
+ }),
13
+ defineCommand({
14
+ category: "webhooks",
15
+ name: "update",
16
+ description: "Update a webhook configuration",
17
+ clientMethod: "updateWebhook",
18
+ schema: UpdateWebhookParamsSchema,
19
+ }),
20
+ ];
21
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAwB;IAClD,aAAa,CAAC;QACZ,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,kCAAkC;QAC/C,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;KAC1C,CAAC;IACF,aAAa,CAAC;QACZ,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gCAAgC;QAC7C,YAAY,EAAE,eAAe;QAC7B,MAAM,EAAE,yBAAyB;KAClC,CAAC;CACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface CliConfig {
2
+ readonly apiKey: string;
3
+ readonly baseUrl: string;
4
+ }
5
+ /**
6
+ * Load configuration.
7
+ *
8
+ * Resolution order:
9
+ * 1. ITERABLE_API_KEY env var (if set, use directly -- enables CI/scripting override)
10
+ * 2. Key manager active key
11
+ * 3. Error with guidance
12
+ */
13
+ export declare function loadCliConfig(): Promise<CliConfig>;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,CA2DxD"}
package/dist/config.js ADDED
@@ -0,0 +1,60 @@
1
+ import { logger } from "@iterable/api";
2
+ import { CliError } from "./errors.js";
3
+ import { getKeyManager } from "./key-manager.js";
4
+ import { isTestEnv } from "./utils/cli-env.js";
5
+ import { COMMAND_NAME } from "./utils/command-info.js";
6
+ import { sanitizeString } from "./utils/sanitize.js";
7
+ /**
8
+ * Load configuration.
9
+ *
10
+ * Resolution order:
11
+ * 1. ITERABLE_API_KEY env var (if set, use directly -- enables CI/scripting override)
12
+ * 2. Key manager active key
13
+ * 3. Error with guidance
14
+ */
15
+ export async function loadCliConfig() {
16
+ const baseUrlFromEnv = process.env.ITERABLE_BASE_URL ?? "https://api.iterable.com";
17
+ if (process.env.ITERABLE_API_KEY) {
18
+ return { apiKey: process.env.ITERABLE_API_KEY, baseUrl: baseUrlFromEnv };
19
+ }
20
+ if (!isTestEnv()) {
21
+ try {
22
+ const keyManager = getKeyManager();
23
+ await keyManager.initialize();
24
+ if (await keyManager.hasKeys()) {
25
+ if (!(await keyManager.hasActiveKey())) {
26
+ throw new CliError(`No active API key. Run "${COMMAND_NAME} keys activate <name>" to activate one, or set ITERABLE_API_KEY environment variable.`, 2);
27
+ }
28
+ const apiKey = await keyManager.getActiveKey();
29
+ if (apiKey) {
30
+ let baseUrl = baseUrlFromEnv;
31
+ const meta = await keyManager.getActiveKeyMetadata();
32
+ if (meta?.baseUrl) {
33
+ baseUrl = meta.baseUrl;
34
+ }
35
+ return { apiKey, baseUrl };
36
+ }
37
+ }
38
+ }
39
+ catch (error) {
40
+ if (error instanceof CliError)
41
+ throw error;
42
+ const errorMessage = error instanceof Error ? error.message : String(error);
43
+ if (errorMessage.includes("Key store not initialized") ||
44
+ errorMessage.includes("No API key found")) {
45
+ logger.debug("No keys in key manager, falling back to error");
46
+ }
47
+ else {
48
+ const sanitizedMessage = sanitizeString(errorMessage);
49
+ logger.error("Unexpected error loading from key manager", {
50
+ error: sanitizedMessage,
51
+ });
52
+ console.error(
53
+ // eslint-disable-line no-console
54
+ "Warning: Failed to load API key from key storage:", sanitizedMessage);
55
+ }
56
+ }
57
+ }
58
+ throw new CliError(`No API key found. Run "${COMMAND_NAME} keys add" to add one, or set ITERABLE_API_KEY environment variable.`, 2);
59
+ }
60
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,cAAc,GAClB,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;IAE9D,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;YACnC,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;YAE9B,IAAI,MAAM,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC/B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;oBACvC,MAAM,IAAI,QAAQ,CAChB,2BAA2B,YAAY,uFAAuF,EAC9H,CAAC,CACF,CAAC;gBACJ,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC/C,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,OAAO,GAAG,cAAc,CAAC;oBAC7B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,oBAAoB,EAAE,CAAC;oBACrD,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;wBAClB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;oBACzB,CAAC;oBACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,YAAY,QAAQ;gBAAE,MAAM,KAAK,CAAC;YAE3C,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzD,IACE,YAAY,CAAC,QAAQ,CAAC,2BAA2B,CAAC;gBAClD,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EACzC,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,MAAM,gBAAgB,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;gBACtD,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE;oBACxD,KAAK,EAAE,gBAAgB;iBACxB,CAAC,CAAC;gBACH,OAAO,CAAC,KAAK;gBACX,iCAAiC;gBACjC,mDAAmD,EACnD,gBAAgB,CACjB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,QAAQ,CAChB,0BAA0B,YAAY,sEAAsE,EAC5G,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare class CliError extends Error {
2
+ readonly exitCode: number;
3
+ constructor(message: string, exitCode?: number);
4
+ }
5
+ export declare class ValidationError extends CliError {
6
+ constructor(message: string);
7
+ }
8
+ export declare class UsageError extends CliError {
9
+ constructor(message: string);
10
+ }
11
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;aAGf,QAAQ,EAAE,MAAM;gBADhC,OAAO,EAAE,MAAM,EACC,QAAQ,GAAE,MAAU;CAKvC;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,UAAW,SAAQ,QAAQ;gBAC1B,OAAO,EAAE,MAAM;CAI5B"}
package/dist/errors.js ADDED
@@ -0,0 +1,21 @@
1
+ export class CliError extends Error {
2
+ exitCode;
3
+ constructor(message, exitCode = 1) {
4
+ super(message);
5
+ this.exitCode = exitCode;
6
+ this.name = "CliError";
7
+ }
8
+ }
9
+ export class ValidationError extends CliError {
10
+ constructor(message) {
11
+ super(message, 2);
12
+ this.name = "ValidationError";
13
+ }
14
+ }
15
+ export class UsageError extends CliError {
16
+ constructor(message) {
17
+ super(message, 2);
18
+ this.name = "UsageError";
19
+ }
20
+ }
21
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IAFlB,YACE,OAAe,EACC,WAAmB,CAAC;QAEpC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,aAAQ,GAAR,QAAQ,CAAY;QAGpC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,QAAQ;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env node
2
+ import { IterableClient } from "@iterable/api";
3
+ import { z } from "zod";
4
+ import { loadCliConfig } from "./config.js";
5
+ import { CliError, UsageError } from "./errors.js";
6
+ import { formatOutput, getDefaultFormat } from "./output.js";
7
+ import { buildParser, parseCommand } from "./parser.js";
8
+ import { findCommand, parseArgs, showCategoryHelp, showGlobalHelp, showVersion, } from "./router.js";
9
+ import { COMMAND_NAME } from "./utils/command-info.js";
10
+ async function main() {
11
+ const parsed = parseArgs(process.argv.slice(2));
12
+ if (parsed.globalFlags.version) {
13
+ showVersion();
14
+ return;
15
+ }
16
+ if (!parsed.category || (parsed.globalFlags.help && !parsed.action)) {
17
+ if (parsed.category) {
18
+ showCategoryHelp(parsed.category);
19
+ }
20
+ else {
21
+ await showGlobalHelp();
22
+ }
23
+ return;
24
+ }
25
+ if (parsed.category === "keys") {
26
+ const { handleKeysCommand } = await import("./keys-cli.js");
27
+ await handleKeysCommand(parsed.action ? [parsed.action, ...parsed.rest] : []);
28
+ return;
29
+ }
30
+ if (!parsed.action) {
31
+ showCategoryHelp(parsed.category);
32
+ return;
33
+ }
34
+ const command = findCommand(parsed.category, parsed.action);
35
+ if (!command) {
36
+ throw new UsageError(`Unknown command: ${parsed.category} ${parsed.action}\nRun '${COMMAND_NAME} ${parsed.category} --help' to see available commands.`);
37
+ }
38
+ if (parsed.globalFlags.help) {
39
+ const built = buildParser(command.schema, `iterable ${parsed.category} ${parsed.action}`, command.positionalArgs, command.cliTransforms);
40
+ try {
41
+ built.showHelp();
42
+ }
43
+ catch {
44
+ // zod-opts calls process.exit on --help
45
+ }
46
+ return;
47
+ }
48
+ const config = await loadCliConfig();
49
+ const client = new IterableClient({
50
+ apiKey: config.apiKey,
51
+ baseUrl: config.baseUrl,
52
+ });
53
+ try {
54
+ const params = await parseCommand(command.schema, `iterable ${parsed.category} ${parsed.action}`, parsed.rest, command.positionalArgs, command.cliTransforms);
55
+ const result = await command.execute(client, params);
56
+ const format = parsed.globalFlags.output ?? getDefaultFormat();
57
+ console.log(formatOutput(result, format, parsed.globalFlags.columns)); // eslint-disable-line no-console
58
+ }
59
+ finally {
60
+ client.destroy();
61
+ }
62
+ }
63
+ main().catch(async (error) => {
64
+ const { IterableApiError, IterableNetworkError, IterableRawError, IterableResponseValidationError, } = await import("@iterable/api");
65
+ /* eslint-disable no-console */
66
+ if (error instanceof CliError) {
67
+ console.error(error.message);
68
+ process.exit(error.exitCode);
69
+ }
70
+ if (error instanceof z.ZodError) {
71
+ const details = error.issues
72
+ .map((i) => `${i.path.join(".")}: ${i.message}`)
73
+ .join(", ");
74
+ console.error(`Validation error: ${details}`);
75
+ process.exit(2);
76
+ }
77
+ if (error instanceof IterableApiError) {
78
+ console.error(`API error (${error.statusCode}): ${error.message}`);
79
+ if (error.endpoint)
80
+ console.error(` Endpoint: ${error.endpoint}`);
81
+ if (error.statusCode === 401) {
82
+ console.error(` Run '${COMMAND_NAME} keys add' to configure your API key`);
83
+ }
84
+ process.exit(1);
85
+ }
86
+ if (error instanceof IterableRawError) {
87
+ console.error(`API error (${error.statusCode}): ${error.message}`);
88
+ if (error.endpoint)
89
+ console.error(` Endpoint: ${error.endpoint}`);
90
+ process.exit(1);
91
+ }
92
+ if (error instanceof IterableResponseValidationError) {
93
+ console.error(`Response validation error (${error.statusCode}): ${error.message}`);
94
+ if (error.endpoint)
95
+ console.error(` Endpoint: ${error.endpoint}`);
96
+ process.exit(1);
97
+ }
98
+ if (error instanceof IterableNetworkError) {
99
+ console.error(`Network error: ${error.message}`);
100
+ process.exit(1);
101
+ }
102
+ /* eslint-enable no-console */
103
+ const msg = error instanceof Error ? error.message : String(error);
104
+ console.error(`Error: ${msg}`); // eslint-disable-line no-console
105
+ process.exit(1);
106
+ });
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}