@getbrevo/cli 2.0.1 → 2.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 (213) hide show
  1. package/CHANGELOG.md +221 -0
  2. package/README.md +8 -5
  3. package/agent-context/AGENTS.md +59 -15
  4. package/agent-context/SKILL.md +70 -14
  5. package/dist/{templates → bin}/files/AGENTS.md.tmpl +11 -1
  6. package/dist/{templates → bin}/files/CLAUDE.md.tmpl +8 -0
  7. package/dist/{templates → bin}/files/README.md.tmpl +11 -14
  8. package/dist/bin/files/app-config.json.tmpl +16 -0
  9. package/dist/{templates → bin}/files/src/oauth/.env.example.tmpl +8 -0
  10. package/dist/{templates → bin}/files/src/oauth/.env.local.tmpl +2 -0
  11. package/dist/{templates → bin}/files/src/oauth/handler.js.tmpl +49 -7
  12. package/dist/{templates → bin}/files/src/oauth/server.js.tmpl +20 -14
  13. package/dist/{templates → bin}/files/src/oauth/token-store.js.tmpl +19 -0
  14. package/dist/bin/index.js +660 -221
  15. package/dist/bin/index.js.map +7 -1
  16. package/package.json +6 -4
  17. package/dist/api/client.d.ts +0 -25
  18. package/dist/api/client.d.ts.map +0 -1
  19. package/dist/api/client.js +0 -205
  20. package/dist/api/client.js.map +0 -1
  21. package/dist/bin/index.d.ts +0 -3
  22. package/dist/bin/index.d.ts.map +0 -1
  23. package/dist/commands/app/create.d.ts +0 -8
  24. package/dist/commands/app/create.d.ts.map +0 -1
  25. package/dist/commands/app/create.js +0 -325
  26. package/dist/commands/app/create.js.map +0 -1
  27. package/dist/commands/app/credentials.d.ts +0 -6
  28. package/dist/commands/app/credentials.d.ts.map +0 -1
  29. package/dist/commands/app/credentials.js +0 -114
  30. package/dist/commands/app/credentials.js.map +0 -1
  31. package/dist/commands/app/delete.d.ts +0 -6
  32. package/dist/commands/app/delete.d.ts.map +0 -1
  33. package/dist/commands/app/delete.js +0 -167
  34. package/dist/commands/app/delete.js.map +0 -1
  35. package/dist/commands/app/list.d.ts +0 -4
  36. package/dist/commands/app/list.d.ts.map +0 -1
  37. package/dist/commands/app/list.js +0 -71
  38. package/dist/commands/app/list.js.map +0 -1
  39. package/dist/commands/app/scaffold.d.ts +0 -5
  40. package/dist/commands/app/scaffold.d.ts.map +0 -1
  41. package/dist/commands/app/scaffold.js +0 -213
  42. package/dist/commands/app/scaffold.js.map +0 -1
  43. package/dist/commands/app/scopes.d.ts +0 -2
  44. package/dist/commands/app/scopes.d.ts.map +0 -1
  45. package/dist/commands/app/scopes.js +0 -81
  46. package/dist/commands/app/scopes.js.map +0 -1
  47. package/dist/commands/app/start.d.ts +0 -5
  48. package/dist/commands/app/start.d.ts.map +0 -1
  49. package/dist/commands/app/start.js +0 -220
  50. package/dist/commands/app/start.js.map +0 -1
  51. package/dist/commands/app/update.d.ts +0 -2
  52. package/dist/commands/app/update.d.ts.map +0 -1
  53. package/dist/commands/app/update.js +0 -444
  54. package/dist/commands/app/update.js.map +0 -1
  55. package/dist/commands/definitions.d.ts +0 -5
  56. package/dist/commands/definitions.d.ts.map +0 -1
  57. package/dist/commands/definitions.js +0 -262
  58. package/dist/commands/definitions.js.map +0 -1
  59. package/dist/commands/init.d.ts +0 -2
  60. package/dist/commands/init.d.ts.map +0 -1
  61. package/dist/commands/init.js +0 -106
  62. package/dist/commands/init.js.map +0 -1
  63. package/dist/commands/login.d.ts +0 -6
  64. package/dist/commands/login.d.ts.map +0 -1
  65. package/dist/commands/login.js +0 -251
  66. package/dist/commands/login.js.map +0 -1
  67. package/dist/commands/logout.d.ts +0 -5
  68. package/dist/commands/logout.d.ts.map +0 -1
  69. package/dist/commands/logout.js +0 -54
  70. package/dist/commands/logout.js.map +0 -1
  71. package/dist/commands/skill/install.d.ts +0 -4
  72. package/dist/commands/skill/install.d.ts.map +0 -1
  73. package/dist/commands/skill/install.js +0 -29
  74. package/dist/commands/skill/install.js.map +0 -1
  75. package/dist/commands/skill/uninstall.d.ts +0 -4
  76. package/dist/commands/skill/uninstall.d.ts.map +0 -1
  77. package/dist/commands/skill/uninstall.js +0 -23
  78. package/dist/commands/skill/uninstall.js.map +0 -1
  79. package/dist/commands/whoami.d.ts +0 -4
  80. package/dist/commands/whoami.d.ts.map +0 -1
  81. package/dist/commands/whoami.js +0 -85
  82. package/dist/commands/whoami.js.map +0 -1
  83. package/dist/container.d.ts +0 -7
  84. package/dist/container.d.ts.map +0 -1
  85. package/dist/container.js +0 -28
  86. package/dist/container.js.map +0 -1
  87. package/dist/lang/en.d.ts +0 -161
  88. package/dist/lang/en.d.ts.map +0 -1
  89. package/dist/lang/en.js +0 -188
  90. package/dist/lang/en.js.map +0 -1
  91. package/dist/lib/abort.d.ts +0 -3
  92. package/dist/lib/abort.d.ts.map +0 -1
  93. package/dist/lib/abort.js +0 -30
  94. package/dist/lib/abort.js.map +0 -1
  95. package/dist/lib/auth-guard.d.ts +0 -3
  96. package/dist/lib/auth-guard.d.ts.map +0 -1
  97. package/dist/lib/auth-guard.js +0 -47
  98. package/dist/lib/auth-guard.js.map +0 -1
  99. package/dist/lib/browser.d.ts +0 -2
  100. package/dist/lib/browser.d.ts.map +0 -1
  101. package/dist/lib/browser.js +0 -16
  102. package/dist/lib/browser.js.map +0 -1
  103. package/dist/lib/cli-version.d.ts +0 -2
  104. package/dist/lib/cli-version.d.ts.map +0 -1
  105. package/dist/lib/cli-version.js +0 -59
  106. package/dist/lib/cli-version.js.map +0 -1
  107. package/dist/lib/command-handler.d.ts +0 -10
  108. package/dist/lib/command-handler.d.ts.map +0 -1
  109. package/dist/lib/command-handler.js +0 -16
  110. package/dist/lib/command-handler.js.map +0 -1
  111. package/dist/lib/command-registry.d.ts +0 -28
  112. package/dist/lib/command-registry.d.ts.map +0 -1
  113. package/dist/lib/command-registry.js +0 -54
  114. package/dist/lib/command-registry.js.map +0 -1
  115. package/dist/lib/config.d.ts +0 -83
  116. package/dist/lib/config.d.ts.map +0 -1
  117. package/dist/lib/config.js +0 -430
  118. package/dist/lib/config.js.map +0 -1
  119. package/dist/lib/constants.d.ts +0 -48
  120. package/dist/lib/constants.d.ts.map +0 -1
  121. package/dist/lib/constants.js +0 -121
  122. package/dist/lib/constants.js.map +0 -1
  123. package/dist/lib/errors.d.ts +0 -30
  124. package/dist/lib/errors.d.ts.map +0 -1
  125. package/dist/lib/errors.js +0 -66
  126. package/dist/lib/errors.js.map +0 -1
  127. package/dist/lib/exit-codes.d.ts +0 -9
  128. package/dist/lib/exit-codes.d.ts.map +0 -1
  129. package/dist/lib/exit-codes.js +0 -12
  130. package/dist/lib/exit-codes.js.map +0 -1
  131. package/dist/lib/hidden-input.d.ts +0 -2
  132. package/dist/lib/hidden-input.d.ts.map +0 -1
  133. package/dist/lib/hidden-input.js +0 -78
  134. package/dist/lib/hidden-input.js.map +0 -1
  135. package/dist/lib/json-output.d.ts +0 -6
  136. package/dist/lib/json-output.d.ts.map +0 -1
  137. package/dist/lib/json-output.js +0 -11
  138. package/dist/lib/json-output.js.map +0 -1
  139. package/dist/lib/logger.d.ts +0 -11
  140. package/dist/lib/logger.d.ts.map +0 -1
  141. package/dist/lib/logger.js +0 -110
  142. package/dist/lib/logger.js.map +0 -1
  143. package/dist/lib/port.d.ts +0 -25
  144. package/dist/lib/port.d.ts.map +0 -1
  145. package/dist/lib/port.js +0 -103
  146. package/dist/lib/port.js.map +0 -1
  147. package/dist/lib/telemetry.d.ts +0 -9
  148. package/dist/lib/telemetry.d.ts.map +0 -1
  149. package/dist/lib/telemetry.js +0 -57
  150. package/dist/lib/telemetry.js.map +0 -1
  151. package/dist/lib/ui.d.ts +0 -14
  152. package/dist/lib/ui.d.ts.map +0 -1
  153. package/dist/lib/ui.js +0 -75
  154. package/dist/lib/ui.js.map +0 -1
  155. package/dist/lib/update-notifier.d.ts +0 -37
  156. package/dist/lib/update-notifier.d.ts.map +0 -1
  157. package/dist/lib/update-notifier.js +0 -298
  158. package/dist/lib/update-notifier.js.map +0 -1
  159. package/dist/lib/validators.d.ts +0 -55
  160. package/dist/lib/validators.d.ts.map +0 -1
  161. package/dist/lib/validators.js +0 -166
  162. package/dist/lib/validators.js.map +0 -1
  163. package/dist/services/account.d.ts +0 -8
  164. package/dist/services/account.d.ts.map +0 -1
  165. package/dist/services/account.js +0 -15
  166. package/dist/services/account.js.map +0 -1
  167. package/dist/services/app.d.ts +0 -38
  168. package/dist/services/app.d.ts.map +0 -1
  169. package/dist/services/app.js +0 -145
  170. package/dist/services/app.js.map +0 -1
  171. package/dist/services/browser-auth.d.ts +0 -15
  172. package/dist/services/browser-auth.d.ts.map +0 -1
  173. package/dist/services/browser-auth.js +0 -188
  174. package/dist/services/browser-auth.js.map +0 -1
  175. package/dist/services/normalize-app-id.d.ts +0 -12
  176. package/dist/services/normalize-app-id.d.ts.map +0 -1
  177. package/dist/services/normalize-app-id.js +0 -38
  178. package/dist/services/normalize-app-id.js.map +0 -1
  179. package/dist/services/oauth-metadata.d.ts +0 -7
  180. package/dist/services/oauth-metadata.d.ts.map +0 -1
  181. package/dist/services/oauth-metadata.js +0 -43
  182. package/dist/services/oauth-metadata.js.map +0 -1
  183. package/dist/services/oauth-refresh.d.ts +0 -14
  184. package/dist/services/oauth-refresh.d.ts.map +0 -1
  185. package/dist/services/oauth-refresh.js +0 -70
  186. package/dist/services/oauth-refresh.js.map +0 -1
  187. package/dist/services/scopes-html.d.ts +0 -3
  188. package/dist/services/scopes-html.d.ts.map +0 -1
  189. package/dist/services/scopes-html.js +0 -516
  190. package/dist/services/scopes-html.js.map +0 -1
  191. package/dist/services/scopes-web.d.ts +0 -12
  192. package/dist/services/scopes-web.d.ts.map +0 -1
  193. package/dist/services/scopes-web.js +0 -95
  194. package/dist/services/scopes-web.js.map +0 -1
  195. package/dist/services/skill.d.ts +0 -48
  196. package/dist/services/skill.d.ts.map +0 -1
  197. package/dist/services/skill.js +0 -223
  198. package/dist/services/skill.js.map +0 -1
  199. package/dist/skills/index.d.ts +0 -47
  200. package/dist/skills/index.d.ts.map +0 -1
  201. package/dist/skills/index.js +0 -61
  202. package/dist/skills/index.js.map +0 -1
  203. package/dist/templates/files/app-config.json.tmpl +0 -25
  204. package/dist/templates/index.d.ts +0 -36
  205. package/dist/templates/index.d.ts.map +0 -1
  206. package/dist/templates/index.js +0 -105
  207. package/dist/templates/index.js.map +0 -1
  208. package/dist/types.d.ts +0 -32
  209. package/dist/types.d.ts.map +0 -1
  210. package/dist/types.js +0 -3
  211. package/dist/types.js.map +0 -1
  212. /package/dist/{templates → bin}/files/gitignore.tmpl +0 -0
  213. /package/dist/{templates → bin}/files/src/oauth/package.json.tmpl +0 -0
@@ -1,262 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.skillCommandGroup = exports.appCommandGroup = exports.topLevelCommands = void 0;
4
- const validators_1 = require("../lib/validators");
5
- const init_1 = require("./init");
6
- const login_1 = require("./login");
7
- const logout_1 = require("./logout");
8
- const whoami_1 = require("./whoami");
9
- const create_1 = require("./app/create");
10
- const list_1 = require("./app/list");
11
- const credentials_1 = require("./app/credentials");
12
- const update_1 = require("./app/update");
13
- const delete_1 = require("./app/delete");
14
- const scaffold_1 = require("./app/scaffold");
15
- const scopes_1 = require("./app/scopes");
16
- const start_1 = require("./app/start");
17
- const install_1 = require("./skill/install");
18
- const uninstall_1 = require("./skill/uninstall");
19
- exports.topLevelCommands = [
20
- {
21
- name: 'login',
22
- description: 'Authenticate with your Brevo account',
23
- options: [
24
- { flags: '--browser', description: 'Force browser-based login' },
25
- { flags: '--json', description: 'Output as JSON' },
26
- ],
27
- examples: ['brevo login', 'brevo login --browser', 'BREVO_API_KEY=xkeysib-... brevo login'],
28
- handler: (opts) => (0, login_1.loginCommand)({
29
- browser: Boolean(opts.browser),
30
- json: Boolean(opts.json),
31
- }),
32
- },
33
- {
34
- name: 'logout',
35
- description: 'Clear stored credentials',
36
- options: [
37
- { flags: '--force', description: 'Skip confirmation (for CI)' },
38
- { flags: '--json', description: 'Output as JSON' },
39
- ],
40
- handler: (opts) => (0, logout_1.logoutCommand)({ force: Boolean(opts.force), json: Boolean(opts.json) }),
41
- },
42
- {
43
- name: 'whoami',
44
- description: 'Show current authenticated user',
45
- options: [{ flags: '--json', description: 'Output as JSON' }],
46
- handler: (opts) => (0, whoami_1.whoamiCommand)({ json: Boolean(opts.json) }),
47
- },
48
- ];
49
- exports.appCommandGroup = {
50
- name: 'app',
51
- description: 'Manage OAuth applications',
52
- commands: [
53
- {
54
- name: 'init',
55
- description: 'Quick setup — login, create app, and scaffold in one go',
56
- examples: ['brevo app init'],
57
- handler: () => (0, init_1.initCommand)({}),
58
- },
59
- {
60
- name: 'create',
61
- description: 'Create a new OAuth app',
62
- examples: [
63
- 'brevo app create',
64
- 'brevo app create --name "My App" --distribution private',
65
- 'brevo app create --name "My App" --distribution private --redirect-uri http://localhost:3009/auth/callback',
66
- 'brevo app create --name "My App" --distribution private --redirect-uri http://localhost:3009/auth/callback --redirect-uri https://myapp.com/callback --json',
67
- 'brevo app create --name "My App" --distribution private --logo-uri https://example.com/logo.png',
68
- ],
69
- options: [
70
- { flags: '--name <name>', description: 'App name' },
71
- { flags: '--distribution <type>', description: 'Distribution type (private|public)' },
72
- {
73
- flags: '--redirect-uri <url>',
74
- description: 'Redirect URI (repeatable)',
75
- parser: validators_1.collectUrls,
76
- },
77
- {
78
- flags: '--logo-uri <url>',
79
- description: 'App logo URL (http or https)',
80
- parser: (v) => {
81
- (0, validators_1.validateUrl)(v, 'logo URL');
82
- return v;
83
- },
84
- },
85
- { flags: '--json', description: 'Output as JSON' },
86
- ],
87
- handler: (opts) => (0, create_1.createCommand)({
88
- name: opts.name,
89
- distribution: opts.distribution,
90
- redirectUri: opts.redirectUri,
91
- logoUri: opts.logoUri,
92
- json: Boolean(opts.json),
93
- }),
94
- },
95
- {
96
- name: 'list',
97
- description: 'List all apps in your account',
98
- examples: ['brevo app list', 'brevo app list --json'],
99
- options: [{ flags: '--json', description: 'Output as JSON' }],
100
- handler: (opts) => (0, list_1.listCommand)({ json: Boolean(opts.json) }),
101
- },
102
- {
103
- name: 'credentials',
104
- description: 'Show client ID and secret for an app',
105
- examples: [
106
- 'brevo app credentials --app-id 42',
107
- 'brevo app credentials --app-id 42 --reveal-secret --json',
108
- ],
109
- options: [
110
- {
111
- flags: '--app-id <id>',
112
- description: 'App ID',
113
- parser: (v) => (0, validators_1.parseAppId)(v),
114
- },
115
- { flags: '--reveal-secret', description: 'Show the client secret' },
116
- { flags: '--json', description: 'Output as JSON' },
117
- ],
118
- handler: (opts) => (0, credentials_1.credentialsCommand)({
119
- appId: opts.appId,
120
- revealSecret: Boolean(opts.revealSecret),
121
- json: Boolean(opts.json),
122
- }),
123
- },
124
- {
125
- name: 'update',
126
- description: 'Update an app name, redirect URLs, scopes, or logo URL',
127
- examples: [
128
- 'brevo app update',
129
- 'brevo app update --name "My New Name"',
130
- 'brevo app update --redirect-uri https://myapp.com/callback',
131
- 'brevo app update --name "My App" --redirect-uri https://myapp.com/callback',
132
- 'brevo app update --app-id 42 --name "My App"',
133
- 'brevo app update --app-id 42 --redirect-uri https://myapp.com/callback --json',
134
- 'brevo app update --logo-uri https://example.com/logo.png',
135
- 'brevo app update --scope crm:write',
136
- 'brevo app update --scope contacts:read --scope crm:write',
137
- ],
138
- options: [
139
- {
140
- flags: '--app-id <id>',
141
- description: 'App ID (uses app-config.json if omitted)',
142
- parser: (v) => (0, validators_1.parseAppId)(v),
143
- },
144
- { flags: '--name <name>', description: 'New app name' },
145
- {
146
- flags: '--redirect-uri <url>',
147
- description: 'Redirect URI to append (repeatable)',
148
- parser: validators_1.collectUrls,
149
- },
150
- {
151
- flags: '--scope <scope>',
152
- description: 'OAuth scope to append (repeatable; comma- or whitespace-separated values are split)',
153
- parser: validators_1.collectScopes,
154
- },
155
- {
156
- flags: '--logo-uri <url>',
157
- description: 'App logo URL (http or https)',
158
- parser: (v) => {
159
- (0, validators_1.validateUrl)(v, 'logo URL');
160
- return v;
161
- },
162
- },
163
- { flags: '--yes', description: 'Skip confirmation prompt' },
164
- { flags: '--json', description: 'Output as JSON' },
165
- ],
166
- handler: (opts) => (0, update_1.updateCommand)({
167
- appId: opts.appId,
168
- name: opts.name,
169
- redirectUri: opts.redirectUri,
170
- logoUri: opts.logoUri,
171
- scope: opts.scope,
172
- yes: Boolean(opts.yes),
173
- json: Boolean(opts.json),
174
- }),
175
- },
176
- {
177
- name: 'delete',
178
- description: 'Delete an app',
179
- examples: ['brevo app delete --app-id 42', 'brevo app delete --app-id 42 --force'],
180
- options: [
181
- {
182
- flags: '--app-id <id>',
183
- description: 'App ID',
184
- parser: (v) => (0, validators_1.parseAppId)(v),
185
- },
186
- { flags: '--force', description: 'Skip confirmation (for CI)' },
187
- { flags: '--json', description: 'Output as JSON' },
188
- ],
189
- handler: (opts) => (0, delete_1.deleteCommand)({
190
- appId: opts.appId,
191
- force: Boolean(opts.force),
192
- json: Boolean(opts.json),
193
- }),
194
- },
195
- {
196
- name: 'scaffold',
197
- description: 'Generate starter code for an app',
198
- examples: ['brevo app scaffold', 'brevo app scaffold --app-id 42'],
199
- options: [
200
- {
201
- flags: '--app-id <id>',
202
- description: 'App ID',
203
- parser: (v) => (0, validators_1.parseAppId)(v),
204
- },
205
- { flags: '--json', description: 'Output as JSON' },
206
- ],
207
- handler: (opts) => (0, scaffold_1.scaffoldCommand)({ appId: opts.appId, json: Boolean(opts.json) }),
208
- },
209
- {
210
- name: 'available-scopes',
211
- description: 'List OAuth scopes supported by the IdP',
212
- examples: [
213
- 'brevo app available-scopes',
214
- 'brevo app available-scopes --web',
215
- 'brevo app available-scopes --json',
216
- ],
217
- options: [
218
- { flags: '--json', description: 'Output as JSON' },
219
- { flags: '--web', description: 'Open the scope catalog in a local browser page' },
220
- ],
221
- handler: (opts) => (0, scopes_1.scopesCommand)({ json: Boolean(opts.json), web: Boolean(opts.web) }),
222
- },
223
- {
224
- name: 'start',
225
- description: 'Run a scaffolded feature locally',
226
- arguments: [{ name: '[feature]', description: 'Feature to start (e.g. oauth)' }],
227
- examples: ['brevo app start oauth', 'brevo app start oauth --port 3000'],
228
- options: [
229
- {
230
- flags: '--port <port>',
231
- description: 'Server port (default: 3009)',
232
- parser: (v) => (0, validators_1.parsePositiveInt)(v, '--port'),
233
- },
234
- ],
235
- handler: (opts, feature) => (0, start_1.startCommand)({
236
- feature: feature,
237
- port: opts.port,
238
- }),
239
- },
240
- ],
241
- };
242
- exports.skillCommandGroup = {
243
- name: 'skill:cli',
244
- description: 'Install the brevo-cli Claude Code skill (Claude only)',
245
- commands: [
246
- {
247
- name: 'install',
248
- description: 'Install the brevo-cli skill into ~/.claude/skills/ (Claude only — other AI tools should read agent-context/AGENTS.md instead)',
249
- examples: ['brevo skill:cli install', 'brevo skill:cli install --json'],
250
- options: [{ flags: '--json', description: 'Output as JSON' }],
251
- handler: (opts) => (0, install_1.installCommand)({ json: Boolean(opts.json) }),
252
- },
253
- {
254
- name: 'uninstall',
255
- description: 'Remove the brevo-cli skill from ~/.claude/skills/ (Claude only)',
256
- examples: ['brevo skill:cli uninstall', 'brevo skill:cli uninstall --json'],
257
- options: [{ flags: '--json', description: 'Output as JSON' }],
258
- handler: (opts) => (0, uninstall_1.uninstallCommand)({ json: Boolean(opts.json) }),
259
- },
260
- ],
261
- };
262
- //# sourceMappingURL=definitions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/commands/definitions.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare const initCommand: (opts: Record<string, unknown>) => Promise<void>;
2
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAqEA,eAAO,MAAM,WAAW,kDAwCvB,CAAC"}
@@ -1,106 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.initCommand = void 0;
7
- const inquirer_1 = __importDefault(require("inquirer"));
8
- const config_1 = require("../lib/config");
9
- const logger_1 = require("../lib/logger");
10
- const ui_1 = require("../lib/ui");
11
- const en_1 = require("../lang/en");
12
- const errors_1 = require("../lib/errors");
13
- const command_handler_1 = require("../lib/command-handler");
14
- const login_1 = require("./login");
15
- const create_1 = require("./app/create");
16
- const scaffold_1 = require("./app/scaffold");
17
- const container_1 = require("../container");
18
- async function ensureLoggedIn() {
19
- if ((0, config_1.isAuthenticated)()) {
20
- // Local creds exist — verify they still work against the backend before
21
- // the user invests time in the init prompts. Without this, init proceeds
22
- // happily and the first real API call (app create) hits a 401 mid-flow.
23
- const spinner = (0, ui_1.createSpinner)('Verifying credentials...');
24
- try {
25
- await container_1.accountService.getAccount();
26
- spinner.stop();
27
- (0, logger_1.logSuccess)(en_1.messages.INIT_ALREADY_LOGGED_IN);
28
- return;
29
- }
30
- catch {
31
- spinner.stop();
32
- (0, logger_1.logWarn)(en_1.messages.AUTH_EXPIRED);
33
- // Fall through to the login flow below.
34
- }
35
- }
36
- (0, logger_1.logInfo)(en_1.messages.INIT_STEP_LOGIN);
37
- await (0, login_1.loginCommand)({ suppressNextSteps: true });
38
- if (!(0, config_1.isAuthenticated)()) {
39
- throw new errors_1.CliError('Login failed.');
40
- }
41
- }
42
- async function appExistsOnServer(appId) {
43
- if (!appId)
44
- return false;
45
- const spinner = (0, ui_1.createSpinner)('Verifying app...');
46
- try {
47
- const app = await container_1.appService.fetchApp(appId);
48
- return app !== null;
49
- }
50
- catch {
51
- return false;
52
- }
53
- finally {
54
- spinner.stop();
55
- }
56
- }
57
- async function promptLinkedAppAction(configAppId, linkedName) {
58
- (0, logger_1.logSuccess)(en_1.messages.INIT_APP_LINKED(linkedName));
59
- const { action } = await inquirer_1.default.prompt([
60
- {
61
- type: 'list',
62
- name: 'action',
63
- message: en_1.messages.INIT_APP_ACTION,
64
- choices: [
65
- { name: 'Scaffold this app', value: 'scaffold' },
66
- { name: 'Create a new app', value: 'create' },
67
- { name: "Skip — I'm all set", value: 'skip' },
68
- ],
69
- },
70
- ]);
71
- return action;
72
- }
73
- exports.initCommand = (0, command_handler_1.withCommandHandler)(async (_options) => {
74
- process.stdout.write(`\n ${en_1.messages.INIT_WELCOME}\n`);
75
- process.stdout.write(' ──────────────────────────────────────\n\n');
76
- await ensureLoggedIn();
77
- process.stdout.write('\n');
78
- const projectConfig = (0, config_1.readProjectConfig)();
79
- const configAppId = typeof projectConfig?.appId === 'string' ? projectConfig.appId.trim() : '';
80
- const linkedName = projectConfig?.appName || configAppId;
81
- if (configAppId && (await appExistsOnServer(configAppId))) {
82
- const action = await promptLinkedAppAction(configAppId, linkedName);
83
- if (action === 'skip') {
84
- (0, logger_1.logInfo)(`\n ${en_1.messages.INIT_DONE}\n`);
85
- return;
86
- }
87
- if (action === 'scaffold') {
88
- process.stdout.write('\n');
89
- await (0, scaffold_1.scaffoldCommand)({ appId: configAppId });
90
- (0, logger_1.logInfo)(`\n ${en_1.messages.INIT_DONE}\n`);
91
- return;
92
- }
93
- // action === 'create' — fall through
94
- }
95
- else if (configAppId) {
96
- (0, logger_1.logWarn)(`App "${linkedName}" (from app-config.json) no longer exists on the server. It may have been deleted.`);
97
- (0, logger_1.logInfo)(en_1.messages.INIT_STEP_CREATE);
98
- }
99
- else {
100
- (0, logger_1.logInfo)(en_1.messages.INIT_STEP_CREATE);
101
- }
102
- process.stdout.write('\n');
103
- await (0, create_1.createCommand)({});
104
- (0, logger_1.logInfo)(`\n ${en_1.messages.INIT_DONE}\n`);
105
- });
106
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- export declare const loginCommand: (opts: {
2
- browser?: boolean;
3
- json?: boolean;
4
- suppressNextSteps?: boolean;
5
- }) => Promise<void>;
6
- //# sourceMappingURL=login.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AA0QA,eAAO,MAAM,YAAY;cAEX,OAAO;WACV,OAAO;wBACM,OAAO;mBA8B9B,CAAC"}
@@ -1,251 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.loginCommand = void 0;
7
- const inquirer_1 = __importDefault(require("inquirer"));
8
- const config_1 = require("../lib/config");
9
- const constants_1 = require("../lib/constants");
10
- const browser_1 = require("../lib/browser");
11
- const logger_1 = require("../lib/logger");
12
- const en_1 = require("../lang/en");
13
- const errors_1 = require("../lib/errors");
14
- const exit_codes_1 = require("../lib/exit-codes");
15
- const command_handler_1 = require("../lib/command-handler");
16
- const create_1 = require("./app/create");
17
- const container_1 = require("../container");
18
- const ui_1 = require("../lib/ui");
19
- const json_output_1 = require("../lib/json-output");
20
- const browser_auth_1 = require("../services/browser-auth");
21
- // On re-login, the cached per-app clientId/clientSecret values belong to apps
22
- // owned by the previously-authenticated organization. A new organization cannot
23
- // see those apps, so keeping the cache risks surfacing stale or wrong-account
24
- // secrets. Same organization → keep the cache to avoid an unnecessary refetch.
25
- function wipeAppsCacheIfAccountChanged(newOrganizationId) {
26
- const previousOrganizationId = (0, config_1.getOrganizationId)();
27
- if (previousOrganizationId && previousOrganizationId !== newOrganizationId) {
28
- (0, config_1.clearAppsCache)();
29
- }
30
- }
31
- async function promptApiKey() {
32
- const { key } = await inquirer_1.default.prompt([
33
- {
34
- type: 'password',
35
- name: 'key',
36
- message: en_1.messages.AUTH_PROMPT_API_KEY,
37
- mask: '*',
38
- validate: (input) => input.trim().length > 0 || 'API key cannot be empty',
39
- },
40
- ]);
41
- return key;
42
- }
43
- // Explicit `--browser` wins over BREVO_API_KEY so users can force the
44
- // browser flow on machines that have a stale env var. Browser login still
45
- // needs a TTY (the inquirer prompts after success), so reject early in
46
- // non-interactive contexts instead of hanging until timeout.
47
- async function resolveLoginMethod(forceBrowser, apiKey) {
48
- if (forceBrowser) {
49
- if (!process.stdin.isTTY) {
50
- throw new errors_1.CliError(en_1.messages.AUTH_BROWSER_NON_INTERACTIVE);
51
- }
52
- return 'browser';
53
- }
54
- if (apiKey) {
55
- return 'api-key';
56
- }
57
- if (!process.stdin.isTTY) {
58
- throw new errors_1.CliError(en_1.messages.AUTH_BROWSER_NON_INTERACTIVE);
59
- }
60
- const { chosen } = await inquirer_1.default.prompt([
61
- {
62
- type: 'list',
63
- name: 'chosen',
64
- message: en_1.messages.AUTH_PROMPT_METHOD,
65
- choices: [
66
- { name: 'Browser (sign in through your browser)', value: 'browser' },
67
- { name: 'API key (paste from your Brevo dashboard)', value: 'api-key' },
68
- ],
69
- default: 'browser',
70
- },
71
- ]);
72
- return chosen;
73
- }
74
- // One interactive retry on a 401: the first paste is easy to fumble. A second
75
- // 401 (or any other error) propagates to the command handler.
76
- async function retryApiKeyValidation(quiet) {
77
- const retryKey = await promptApiKey();
78
- const retrySpinner = (0, ui_1.createSpinner)('Validating API key...', { silent: quiet });
79
- try {
80
- const account = await container_1.accountService.validateApiKey(retryKey);
81
- retrySpinner.stop();
82
- return { account, apiKey: retryKey };
83
- }
84
- catch (retryErr) {
85
- retrySpinner.stop();
86
- if (retryErr instanceof errors_1.ApiError && retryErr.statusCode === 401) {
87
- throw new errors_1.CliError(en_1.messages.AUTH_INVALID_KEY, exit_codes_1.EXIT_CODES.AUTH_FAILURE);
88
- }
89
- throw retryErr;
90
- }
91
- }
92
- async function validateApiKeyWithRetry(apiKey, quiet) {
93
- const spinner = (0, ui_1.createSpinner)('Validating API key...', { silent: quiet });
94
- try {
95
- const account = await container_1.accountService.validateApiKey(apiKey);
96
- spinner.stop();
97
- return { account, apiKey };
98
- }
99
- catch (err) {
100
- spinner.stop();
101
- if (!(err instanceof errors_1.ApiError && err.statusCode === 401)) {
102
- throw err;
103
- }
104
- (0, logger_1.logError)(en_1.messages.AUTH_INVALID_KEY);
105
- if (!quiet)
106
- (0, logger_1.logInfo)(` ${en_1.messages.AUTH_GET_KEY_URL}`);
107
- if (!process.stdin.isTTY) {
108
- throw err;
109
- }
110
- return retryApiKeyValidation(quiet);
111
- }
112
- }
113
- async function loginWithApiKey(envApiKey, quiet) {
114
- let apiKey = envApiKey;
115
- if (!apiKey) {
116
- (0, browser_1.openBrowser)(constants_1.BREVO_DASHBOARD_API_KEYS_URL);
117
- if (!quiet) {
118
- process.stdout.write(en_1.messages.AUTH_HINT(constants_1.BREVO_DASHBOARD_API_KEYS_URL, constants_1.BREVO_API_KEY_DOCS_URL));
119
- }
120
- apiKey = await promptApiKey();
121
- }
122
- if (!apiKey) {
123
- throw new errors_1.CliError('No API key provided.');
124
- }
125
- const validated = await validateApiKeyWithRetry(apiKey, quiet);
126
- if (!validated.account) {
127
- throw new errors_1.CliError('Authentication failed.');
128
- }
129
- wipeAppsCacheIfAccountChanged(validated.account.organization_id);
130
- (0, config_1.saveCredentials)(validated.apiKey, {
131
- email: validated.account.email,
132
- organizationId: validated.account.organization_id,
133
- userId: validated.account.user_id,
134
- });
135
- return validated.account;
136
- }
137
- async function loginWithBrowser(quiet) {
138
- if (!quiet)
139
- (0, logger_1.logInfo)(` ${en_1.messages.AUTH_BROWSER_OPENING}`);
140
- const tokens = await (0, browser_auth_1.runBrowserLoginFlow)({
141
- proxyUrl: constants_1.OAUTH_PROXY_URL,
142
- openBrowser: browser_1.openBrowser,
143
- onWaiting: (url) => {
144
- if (quiet)
145
- return;
146
- (0, logger_1.logInfo)(` ${en_1.messages.AUTH_BROWSER_FALLBACK_URL(url)}`);
147
- (0, logger_1.logInfo)(` ${en_1.messages.AUTH_BROWSER_WAITING}`);
148
- },
149
- });
150
- // Persist tokens before validating /v3/account so transient API failures
151
- // (5xx, 424, network) don't force the user to redo the OAuth dance. Only
152
- // a 401 unambiguously means the token itself is bad — see catch below.
153
- const tokensToStore = {
154
- accessToken: tokens.accessToken,
155
- refreshToken: tokens.refreshToken,
156
- expiresIn: tokens.expiresIn,
157
- tokenType: tokens.tokenType,
158
- scope: tokens.scope,
159
- };
160
- (0, config_1.saveOauthCredentials)(tokensToStore);
161
- if (!quiet)
162
- (0, logger_1.logSuccess)(en_1.messages.AUTH_BROWSER_TOKENS_RECEIVED((0, config_1.getCredentialsPath)()));
163
- const spinner = (0, ui_1.createSpinner)('Finishing login...', { silent: quiet });
164
- let account;
165
- try {
166
- account = await container_1.client.getWithBearer(constants_1.ENDPOINTS.ACCOUNT, tokens.accessToken, tokens.tokenType);
167
- }
168
- catch (err) {
169
- if (err instanceof errors_1.ApiError && err.statusCode === 401) {
170
- (0, config_1.clearCredentials)();
171
- }
172
- throw err;
173
- }
174
- finally {
175
- spinner.stop();
176
- }
177
- if (!account) {
178
- throw new errors_1.CliError('Authentication failed.');
179
- }
180
- wipeAppsCacheIfAccountChanged(account.organization_id);
181
- (0, config_1.saveOauthCredentials)(tokensToStore, {
182
- email: account.email,
183
- organizationId: account.organization_id,
184
- userId: account.user_id,
185
- });
186
- return account;
187
- }
188
- async function showNextSteps() {
189
- let apps = [];
190
- const appsSpinner = (0, ui_1.createSpinner)('Checking your apps...');
191
- try {
192
- apps = await container_1.appService.fetchAppsList();
193
- }
194
- catch {
195
- // Best-effort: the next-steps box is a nicety — login already succeeded.
196
- }
197
- finally {
198
- appsSpinner.stop();
199
- }
200
- if (apps.length > 0) {
201
- (0, ui_1.printBox)("What's next?", [
202
- constants_1.CLI.APP_CREATE,
203
- constants_1.CLI.APP_LIST,
204
- constants_1.CLI.APP_SCAFFOLD(),
205
- constants_1.CLI.APP_CREDENTIALS(),
206
- ]);
207
- return;
208
- }
209
- if (!process.stdin.isTTY) {
210
- (0, logger_1.logInfo)(`\n ${en_1.messages.AUTH_NEXT}\n`);
211
- return;
212
- }
213
- process.stdout.write('\n');
214
- const { shouldCreate } = await inquirer_1.default.prompt([
215
- {
216
- type: 'confirm',
217
- name: 'shouldCreate',
218
- message: en_1.messages.AUTH_CREATE_APP_PROMPT,
219
- default: true,
220
- },
221
- ]);
222
- if (shouldCreate) {
223
- process.stdout.write('\n');
224
- await (0, create_1.createCommand)({});
225
- return;
226
- }
227
- (0, logger_1.logInfo)(`\n ${en_1.messages.AUTH_NEXT}\n`);
228
- }
229
- exports.loginCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
230
- // In --json mode, stdout must be a single JSON document. Suppress the
231
- // welcome banner and every human-oriented log on stdout below; errors
232
- // still go to stderr via logError, which is fine for JSON consumers.
233
- const quiet = !!options.json;
234
- if (!quiet) {
235
- process.stdout.write(`\n ${en_1.messages.AUTH_WELCOME}\n`);
236
- process.stdout.write(' ──────────────────────────────────────\n');
237
- }
238
- const apiKey = process.env.BREVO_API_KEY;
239
- const method = await resolveLoginMethod(options.browser, apiKey);
240
- const account = method === 'api-key' ? await loginWithApiKey(apiKey, quiet) : await loginWithBrowser(quiet);
241
- if (options.json) {
242
- (0, json_output_1.jsonOutput)({ authenticated: true, email: account.email, company: account.companyName });
243
- return;
244
- }
245
- (0, logger_1.logSuccess)(en_1.messages.AUTH_SUCCESS(account.email));
246
- (0, logger_1.logInfo)(en_1.messages.AUTH_SAVED((0, config_1.getCredentialsPath)()));
247
- if (options.suppressNextSteps)
248
- return;
249
- await showNextSteps();
250
- });
251
- //# sourceMappingURL=login.js.map