@getbrevo/cli 1.0.1 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/README.md +16 -4
- package/agent-context/AGENTS.md +23 -5
- package/agent-context/SKILL.md +23 -3
- package/dist/api/client.d.ts +2 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +50 -36
- package/dist/api/client.js.map +1 -1
- package/dist/bin/index.js +9 -5
- package/dist/bin/index.js.map +1 -1
- package/dist/commands/app/create.d.ts +1 -0
- package/dist/commands/app/create.d.ts.map +1 -1
- package/dist/commands/app/create.js +257 -201
- package/dist/commands/app/create.js.map +1 -1
- package/dist/commands/app/delete.d.ts.map +1 -1
- package/dist/commands/app/delete.js +81 -62
- package/dist/commands/app/delete.js.map +1 -1
- package/dist/commands/app/list.d.ts.map +1 -1
- package/dist/commands/app/list.js +10 -2
- package/dist/commands/app/list.js.map +1 -1
- package/dist/commands/app/scaffold.d.ts.map +1 -1
- package/dist/commands/app/scaffold.js +14 -3
- package/dist/commands/app/scaffold.js.map +1 -1
- package/dist/commands/app/scopes.d.ts +2 -0
- package/dist/commands/app/scopes.d.ts.map +1 -0
- package/dist/commands/app/scopes.js +81 -0
- package/dist/commands/app/scopes.js.map +1 -0
- package/dist/commands/app/start.d.ts.map +1 -1
- package/dist/commands/app/start.js +7 -0
- package/dist/commands/app/start.js.map +1 -1
- package/dist/commands/app/update.d.ts.map +1 -1
- package/dist/commands/app/update.js +305 -189
- package/dist/commands/app/update.js.map +1 -1
- package/dist/commands/definitions.d.ts.map +1 -1
- package/dist/commands/definitions.js +44 -1
- package/dist/commands/definitions.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +15 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +154 -138
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +27 -20
- package/dist/commands/whoami.js.map +1 -1
- package/dist/lang/en.d.ts +43 -3
- package/dist/lang/en.d.ts.map +1 -1
- package/dist/lang/en.js +44 -3
- package/dist/lang/en.js.map +1 -1
- package/dist/lib/auth-guard.d.ts.map +1 -1
- package/dist/lib/auth-guard.js +10 -1
- package/dist/lib/auth-guard.js.map +1 -1
- package/dist/lib/cli-version.d.ts +2 -0
- package/dist/lib/cli-version.d.ts.map +1 -0
- package/dist/lib/cli-version.js +59 -0
- package/dist/lib/cli-version.js.map +1 -0
- package/dist/lib/config.d.ts +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +15 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/constants.d.ts +12 -1
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +26 -2
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +16 -3
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/telemetry.d.ts +9 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +57 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/update-notifier.d.ts.map +1 -1
- package/dist/lib/update-notifier.js +24 -20
- package/dist/lib/update-notifier.js.map +1 -1
- package/dist/lib/validators.d.ts +23 -0
- package/dist/lib/validators.d.ts.map +1 -1
- package/dist/lib/validators.js +75 -0
- package/dist/lib/validators.js.map +1 -1
- package/dist/services/app.d.ts +3 -0
- package/dist/services/app.d.ts.map +1 -1
- package/dist/services/app.js +6 -1
- package/dist/services/app.js.map +1 -1
- package/dist/services/oauth-metadata.d.ts +7 -0
- package/dist/services/oauth-metadata.d.ts.map +1 -0
- package/dist/services/oauth-metadata.js +43 -0
- package/dist/services/oauth-metadata.js.map +1 -0
- package/dist/services/scopes-html.d.ts +3 -0
- package/dist/services/scopes-html.d.ts.map +1 -0
- package/dist/services/scopes-html.js +516 -0
- package/dist/services/scopes-html.js.map +1 -0
- package/dist/services/scopes-web.d.ts +12 -0
- package/dist/services/scopes-web.d.ts.map +1 -0
- package/dist/services/scopes-web.js +95 -0
- package/dist/services/scopes-web.js.map +1 -0
- package/dist/services/skill.js +1 -1
- package/dist/services/skill.js.map +1 -1
- package/dist/skills/index.d.ts +2 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +3 -22
- package/dist/skills/index.js.map +1 -1
- package/dist/templates/files/AGENTS.md.tmpl +1 -1
- package/dist/templates/files/CLAUDE.md.tmpl +1 -1
- package/dist/templates/files/README.md.tmpl +2 -1
- package/dist/templates/files/app-config.json.tmpl +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -2
- package/dist/lib/min-version-check.d.ts +0 -15
- package/dist/lib/min-version-check.d.ts.map +0 -1
- package/dist/lib/min-version-check.js +0 -33
- package/dist/lib/min-version-check.js.map +0 -1
|
@@ -12,6 +12,7 @@ const credentials_1 = require("./app/credentials");
|
|
|
12
12
|
const update_1 = require("./app/update");
|
|
13
13
|
const delete_1 = require("./app/delete");
|
|
14
14
|
const scaffold_1 = require("./app/scaffold");
|
|
15
|
+
const scopes_1 = require("./app/scopes");
|
|
15
16
|
const start_1 = require("./app/start");
|
|
16
17
|
const install_1 = require("./skill/install");
|
|
17
18
|
const uninstall_1 = require("./skill/uninstall");
|
|
@@ -63,6 +64,7 @@ exports.appCommandGroup = {
|
|
|
63
64
|
'brevo app create --name "My App" --distribution private',
|
|
64
65
|
'brevo app create --name "My App" --distribution private --redirect-uri http://localhost:3009/auth/callback',
|
|
65
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',
|
|
66
68
|
],
|
|
67
69
|
options: [
|
|
68
70
|
{ flags: '--name <name>', description: 'App name' },
|
|
@@ -72,12 +74,21 @@ exports.appCommandGroup = {
|
|
|
72
74
|
description: 'Redirect URI (repeatable)',
|
|
73
75
|
parser: validators_1.collectUrls,
|
|
74
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
|
+
},
|
|
75
85
|
{ flags: '--json', description: 'Output as JSON' },
|
|
76
86
|
],
|
|
77
87
|
handler: (opts) => (0, create_1.createCommand)({
|
|
78
88
|
name: opts.name,
|
|
79
89
|
distribution: opts.distribution,
|
|
80
90
|
redirectUri: opts.redirectUri,
|
|
91
|
+
logoUri: opts.logoUri,
|
|
81
92
|
json: Boolean(opts.json),
|
|
82
93
|
}),
|
|
83
94
|
},
|
|
@@ -112,7 +123,7 @@ exports.appCommandGroup = {
|
|
|
112
123
|
},
|
|
113
124
|
{
|
|
114
125
|
name: 'update',
|
|
115
|
-
description: 'Update an app name or
|
|
126
|
+
description: 'Update an app name, redirect URLs, scopes, or logo URL',
|
|
116
127
|
examples: [
|
|
117
128
|
'brevo app update',
|
|
118
129
|
'brevo app update --name "My New Name"',
|
|
@@ -120,6 +131,9 @@ exports.appCommandGroup = {
|
|
|
120
131
|
'brevo app update --name "My App" --redirect-uri https://myapp.com/callback',
|
|
121
132
|
'brevo app update --app-id 42 --name "My App"',
|
|
122
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',
|
|
123
137
|
],
|
|
124
138
|
options: [
|
|
125
139
|
{
|
|
@@ -133,6 +147,19 @@ exports.appCommandGroup = {
|
|
|
133
147
|
description: 'Redirect URI to append (repeatable)',
|
|
134
148
|
parser: validators_1.collectUrls,
|
|
135
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
|
+
},
|
|
136
163
|
{ flags: '--yes', description: 'Skip confirmation prompt' },
|
|
137
164
|
{ flags: '--json', description: 'Output as JSON' },
|
|
138
165
|
],
|
|
@@ -140,6 +167,8 @@ exports.appCommandGroup = {
|
|
|
140
167
|
appId: opts.appId,
|
|
141
168
|
name: opts.name,
|
|
142
169
|
redirectUri: opts.redirectUri,
|
|
170
|
+
logoUri: opts.logoUri,
|
|
171
|
+
scope: opts.scope,
|
|
143
172
|
yes: Boolean(opts.yes),
|
|
144
173
|
json: Boolean(opts.json),
|
|
145
174
|
}),
|
|
@@ -177,6 +206,20 @@ exports.appCommandGroup = {
|
|
|
177
206
|
],
|
|
178
207
|
handler: (opts) => (0, scaffold_1.scaffoldCommand)({ appId: opts.appId, json: Boolean(opts.json) }),
|
|
179
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
|
+
},
|
|
180
223
|
{
|
|
181
224
|
name: 'start',
|
|
182
225
|
description: 'Run a scaffolded feature locally',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/commands/definitions.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/commands/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAqEA,eAAO,MAAM,WAAW,kDAwCvB,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -17,8 +17,21 @@ const scaffold_1 = require("./app/scaffold");
|
|
|
17
17
|
const container_1 = require("../container");
|
|
18
18
|
async function ensureLoggedIn() {
|
|
19
19
|
if ((0, config_1.isAuthenticated)()) {
|
|
20
|
-
|
|
21
|
-
|
|
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
|
+
}
|
|
22
35
|
}
|
|
23
36
|
(0, logger_1.logInfo)(en_1.messages.INIT_STEP_LOGIN);
|
|
24
37
|
await (0, login_1.loginCommand)({ suppressNextSteps: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAgC;AAChC,0CAAmE;AACnE,0CAA6D;AAC7D,kCAA0C;AAC1C,mCAAsC;AACtC,0CAAyC;AACzC,4DAA4D;AAC5D,mCAAuC;AACvC,yCAA6C;AAC7C,6CAAiD;AACjD,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -40,167 +40,161 @@ async function promptApiKey() {
|
|
|
40
40
|
]);
|
|
41
41
|
return key;
|
|
42
42
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (
|
|
49
|
-
process.stdout.write(`\n ${en_1.messages.AUTH_WELCOME}\n`);
|
|
50
|
-
process.stdout.write(' ──────────────────────────────────────\n');
|
|
51
|
-
}
|
|
52
|
-
let apiKey = process.env.BREVO_API_KEY;
|
|
53
|
-
let method;
|
|
54
|
-
// Explicit `--browser` wins over BREVO_API_KEY so users can force the
|
|
55
|
-
// browser flow on machines that have a stale env var. Browser login still
|
|
56
|
-
// needs a TTY (the inquirer prompts after success), so reject early in
|
|
57
|
-
// non-interactive contexts instead of hanging until timeout.
|
|
58
|
-
if (options.browser) {
|
|
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) {
|
|
59
49
|
if (!process.stdin.isTTY) {
|
|
60
50
|
throw new errors_1.CliError(en_1.messages.AUTH_BROWSER_NON_INTERACTIVE);
|
|
61
51
|
}
|
|
62
|
-
|
|
52
|
+
return 'browser';
|
|
63
53
|
}
|
|
64
|
-
|
|
65
|
-
|
|
54
|
+
if (apiKey) {
|
|
55
|
+
return 'api-key';
|
|
66
56
|
}
|
|
67
|
-
|
|
57
|
+
if (!process.stdin.isTTY) {
|
|
68
58
|
throw new errors_1.CliError(en_1.messages.AUTH_BROWSER_NON_INTERACTIVE);
|
|
69
59
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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 };
|
|
84
83
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (
|
|
88
|
-
(
|
|
89
|
-
if (!quiet) {
|
|
90
|
-
process.stdout.write(en_1.messages.AUTH_HINT(constants_1.BREVO_DASHBOARD_API_KEYS_URL, constants_1.BREVO_API_KEY_DOCS_URL));
|
|
91
|
-
}
|
|
92
|
-
apiKey = await promptApiKey();
|
|
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);
|
|
93
88
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (!process.stdin.isTTY) {
|
|
109
|
-
throw err;
|
|
110
|
-
}
|
|
111
|
-
const retryKey = await promptApiKey();
|
|
112
|
-
const retrySpinner = (0, ui_1.createSpinner)('Validating API key...', { silent: quiet });
|
|
113
|
-
try {
|
|
114
|
-
account = await container_1.accountService.validateApiKey(retryKey);
|
|
115
|
-
retrySpinner.stop();
|
|
116
|
-
apiKey = retryKey;
|
|
117
|
-
}
|
|
118
|
-
catch (retryErr) {
|
|
119
|
-
retrySpinner.stop();
|
|
120
|
-
if (retryErr instanceof errors_1.ApiError && retryErr.statusCode === 401) {
|
|
121
|
-
throw new errors_1.CliError(en_1.messages.AUTH_INVALID_KEY, exit_codes_1.EXIT_CODES.AUTH_FAILURE);
|
|
122
|
-
}
|
|
123
|
-
throw retryErr;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
throw err;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
if (!account) {
|
|
131
|
-
throw new errors_1.CliError('Authentication failed.');
|
|
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;
|
|
132
103
|
}
|
|
133
|
-
|
|
134
|
-
(0, config_1.saveCredentials)(apiKey, {
|
|
135
|
-
email: account.email,
|
|
136
|
-
organizationId: account.organization_id,
|
|
137
|
-
userId: account.user_id,
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
if (!quiet)
|
|
142
|
-
(0, logger_1.logInfo)(` ${en_1.messages.AUTH_BROWSER_OPENING}`);
|
|
143
|
-
const tokens = await (0, browser_auth_1.runBrowserLoginFlow)({
|
|
144
|
-
proxyUrl: constants_1.OAUTH_PROXY_URL,
|
|
145
|
-
openBrowser: browser_1.openBrowser,
|
|
146
|
-
onWaiting: (url) => {
|
|
147
|
-
if (quiet)
|
|
148
|
-
return;
|
|
149
|
-
(0, logger_1.logInfo)(` ${en_1.messages.AUTH_BROWSER_FALLBACK_URL(url)}`);
|
|
150
|
-
(0, logger_1.logInfo)(` ${en_1.messages.AUTH_BROWSER_WAITING}`);
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
// Persist tokens before validating /v3/account so transient API failures
|
|
154
|
-
// (5xx, 424, network) don't force the user to redo the OAuth dance. Only
|
|
155
|
-
// a 401 unambiguously means the token itself is bad — see catch below.
|
|
156
|
-
const tokensToStore = {
|
|
157
|
-
accessToken: tokens.accessToken,
|
|
158
|
-
refreshToken: tokens.refreshToken,
|
|
159
|
-
expiresIn: tokens.expiresIn,
|
|
160
|
-
tokenType: tokens.tokenType,
|
|
161
|
-
scope: tokens.scope,
|
|
162
|
-
};
|
|
163
|
-
(0, config_1.saveOauthCredentials)(tokensToStore);
|
|
104
|
+
(0, logger_1.logError)(en_1.messages.AUTH_INVALID_KEY);
|
|
164
105
|
if (!quiet)
|
|
165
|
-
(0, logger_1.
|
|
166
|
-
|
|
167
|
-
try {
|
|
168
|
-
account = await container_1.client.getWithBearer(constants_1.ENDPOINTS.ACCOUNT, tokens.accessToken, tokens.tokenType);
|
|
169
|
-
}
|
|
170
|
-
catch (err) {
|
|
171
|
-
if (err instanceof errors_1.ApiError && err.statusCode === 401) {
|
|
172
|
-
(0, config_1.clearCredentials)();
|
|
173
|
-
}
|
|
106
|
+
(0, logger_1.logInfo)(` ${en_1.messages.AUTH_GET_KEY_URL}`);
|
|
107
|
+
if (!process.stdin.isTTY) {
|
|
174
108
|
throw err;
|
|
175
109
|
}
|
|
176
|
-
|
|
177
|
-
|
|
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));
|
|
178
119
|
}
|
|
179
|
-
|
|
180
|
-
|
|
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)();
|
|
181
171
|
}
|
|
182
|
-
|
|
183
|
-
(0, config_1.saveOauthCredentials)(tokensToStore, {
|
|
184
|
-
email: account.email,
|
|
185
|
-
organizationId: account.organization_id,
|
|
186
|
-
userId: account.user_id,
|
|
187
|
-
});
|
|
172
|
+
throw err;
|
|
188
173
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
return;
|
|
174
|
+
finally {
|
|
175
|
+
spinner.stop();
|
|
192
176
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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() {
|
|
197
189
|
let apps = [];
|
|
198
190
|
const appsSpinner = (0, ui_1.createSpinner)('Checking your apps...');
|
|
199
191
|
try {
|
|
200
192
|
apps = await container_1.appService.fetchAppsList();
|
|
201
|
-
appsSpinner.stop();
|
|
202
193
|
}
|
|
203
194
|
catch {
|
|
195
|
+
// Best-effort: the next-steps box is a nicety — login already succeeded.
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
204
198
|
appsSpinner.stop();
|
|
205
199
|
}
|
|
206
200
|
if (apps.length > 0) {
|
|
@@ -231,5 +225,27 @@ exports.loginCommand = (0, command_handler_1.withCommandHandler)(async (options)
|
|
|
231
225
|
return;
|
|
232
226
|
}
|
|
233
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();
|
|
234
250
|
});
|
|
235
251
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAgC;AAChC,0CAOuB;AACvB,gDAM0B;AAC1B,4CAA6C;AAC7C,0CAA8D;AAC9D,mCAAsC;AACtC,0CAAmD;AACnD,kDAA+C;AAC/C,4DAA4D;AAC5D,yCAA6C;AAC7C,4CAAkE;AAClE,kCAAoD;AACpD,oDAAgD;AAEhD,2DAA+D;AAE/D,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,SAAS,6BAA6B,CAAC,iBAAyB;IAC9D,MAAM,sBAAsB,GAAG,IAAA,0BAAiB,GAAE,CAAC;IACnD,IAAI,sBAAsB,IAAI,sBAAsB,KAAK,iBAAiB,EAAE,CAAC;QAC3E,IAAA,uBAAc,GAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACpC;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,aAAQ,CAAC,mBAAmB;YACrC,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,yBAAyB;SAClF;KACF,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AA0CA,eAAO,MAAM,aAAa;WACC,OAAO;mBAgDjC,CAAC"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -9,6 +9,31 @@ const container_1 = require("../container");
|
|
|
9
9
|
const command_handler_1 = require("../lib/command-handler");
|
|
10
10
|
const json_output_1 = require("../lib/json-output");
|
|
11
11
|
const ui_1 = require("../lib/ui");
|
|
12
|
+
// Check for mismatches between stored credentials and API response
|
|
13
|
+
function findCredentialMismatches(account) {
|
|
14
|
+
const mismatched = [];
|
|
15
|
+
const storedEmail = (0, config_1.getEmail)();
|
|
16
|
+
const storedOrgId = (0, config_1.getOrganizationId)();
|
|
17
|
+
const storedUserId = (0, config_1.getUserId)();
|
|
18
|
+
if (storedEmail && storedEmail !== account.email)
|
|
19
|
+
mismatched.push('email');
|
|
20
|
+
if (storedOrgId && storedOrgId !== account.organization_id)
|
|
21
|
+
mismatched.push('organization');
|
|
22
|
+
if (storedUserId != null && storedUserId !== account.user_id)
|
|
23
|
+
mismatched.push('user id');
|
|
24
|
+
return mismatched;
|
|
25
|
+
}
|
|
26
|
+
function renderAccount(account) {
|
|
27
|
+
const authKind = (0, config_1.getAuthCred)()?.kind;
|
|
28
|
+
let kindLabel = '';
|
|
29
|
+
if (authKind === 'oauth')
|
|
30
|
+
kindLabel = ' (browser login)';
|
|
31
|
+
else if (authKind === 'api-key')
|
|
32
|
+
kindLabel = ' (API key)';
|
|
33
|
+
(0, logger_1.logInfo)(`\n ${en_1.messages.WHOAMI_AUTHENTICATED(account.email, account.companyName || 'N/A')}${kindLabel}\n` +
|
|
34
|
+
` Organization: ${account.organization_id}\n` +
|
|
35
|
+
` User ID: ${account.user_id}\n`);
|
|
36
|
+
}
|
|
12
37
|
exports.whoamiCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
|
|
13
38
|
// No stored key at all
|
|
14
39
|
if (!(0, config_1.isAuthenticated)()) {
|
|
@@ -22,17 +47,7 @@ exports.whoamiCommand = (0, command_handler_1.withCommandHandler)(async (options
|
|
|
22
47
|
try {
|
|
23
48
|
const account = await container_1.accountService.getAccount();
|
|
24
49
|
spinner.stop();
|
|
25
|
-
|
|
26
|
-
const mismatched = [];
|
|
27
|
-
const storedEmail = (0, config_1.getEmail)();
|
|
28
|
-
const storedOrgId = (0, config_1.getOrganizationId)();
|
|
29
|
-
const storedUserId = (0, config_1.getUserId)();
|
|
30
|
-
if (storedEmail && storedEmail !== account.email)
|
|
31
|
-
mismatched.push('email');
|
|
32
|
-
if (storedOrgId && storedOrgId !== account.organization_id)
|
|
33
|
-
mismatched.push('organization');
|
|
34
|
-
if (storedUserId != null && storedUserId !== account.user_id)
|
|
35
|
-
mismatched.push('user id');
|
|
50
|
+
const mismatched = findCredentialMismatches(account);
|
|
36
51
|
if (mismatched.length > 0) {
|
|
37
52
|
if (options.json) {
|
|
38
53
|
(0, json_output_1.jsonOutput)({
|
|
@@ -54,15 +69,7 @@ exports.whoamiCommand = (0, command_handler_1.withCommandHandler)(async (options
|
|
|
54
69
|
});
|
|
55
70
|
}
|
|
56
71
|
else {
|
|
57
|
-
|
|
58
|
-
let kindLabel = '';
|
|
59
|
-
if (authKind === 'oauth')
|
|
60
|
-
kindLabel = ' (browser login)';
|
|
61
|
-
else if (authKind === 'api-key')
|
|
62
|
-
kindLabel = ' (API key)';
|
|
63
|
-
(0, logger_1.logInfo)(`\n ${en_1.messages.WHOAMI_AUTHENTICATED(account.email, account.companyName || 'N/A')}${kindLabel}\n` +
|
|
64
|
-
` Organization: ${account.organization_id}\n` +
|
|
65
|
-
` User ID: ${account.user_id}\n`);
|
|
72
|
+
renderAccount(account);
|
|
66
73
|
}
|
|
67
74
|
}
|
|
68
75
|
catch (err) {
|