@getbrevo/cli 0.0.1-alpha.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 +13 -0
- package/LICENSE +21 -0
- package/README.md +182 -0
- package/dist/api/client.d.ts +23 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +186 -0
- package/dist/api/client.js.map +1 -0
- package/dist/bin/index.d.ts +3 -0
- package/dist/bin/index.d.ts.map +1 -0
- package/dist/bin/index.js +179 -0
- package/dist/bin/index.js.map +1 -0
- package/dist/commands/app/create.d.ts +7 -0
- package/dist/commands/app/create.d.ts.map +1 -0
- package/dist/commands/app/create.js +261 -0
- package/dist/commands/app/create.js.map +1 -0
- package/dist/commands/app/credentials.d.ts +6 -0
- package/dist/commands/app/credentials.d.ts.map +1 -0
- package/dist/commands/app/credentials.js +106 -0
- package/dist/commands/app/credentials.js.map +1 -0
- package/dist/commands/app/delete.d.ts +6 -0
- package/dist/commands/app/delete.d.ts.map +1 -0
- package/dist/commands/app/delete.js +146 -0
- package/dist/commands/app/delete.js.map +1 -0
- package/dist/commands/app/list.d.ts +4 -0
- package/dist/commands/app/list.d.ts.map +1 -0
- package/dist/commands/app/list.js +46 -0
- package/dist/commands/app/list.js.map +1 -0
- package/dist/commands/app/scaffold.d.ts +5 -0
- package/dist/commands/app/scaffold.d.ts.map +1 -0
- package/dist/commands/app/scaffold.js +199 -0
- package/dist/commands/app/scaffold.js.map +1 -0
- package/dist/commands/app/start.d.ts +5 -0
- package/dist/commands/app/start.d.ts.map +1 -0
- package/dist/commands/app/start.js +138 -0
- package/dist/commands/app/start.js.map +1 -0
- package/dist/commands/app/test.d.ts +6 -0
- package/dist/commands/app/test.d.ts.map +1 -0
- package/dist/commands/app/test.js +495 -0
- package/dist/commands/app/test.js.map +1 -0
- package/dist/commands/app/update.d.ts +2 -0
- package/dist/commands/app/update.d.ts.map +1 -0
- package/dist/commands/app/update.js +324 -0
- package/dist/commands/app/update.js.map +1 -0
- package/dist/commands/definitions.d.ts +4 -0
- package/dist/commands/definitions.d.ts.map +1 -0
- package/dist/commands/definitions.js +197 -0
- package/dist/commands/definitions.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +90 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +219 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +5 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +54 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/whoami.d.ts +4 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +74 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/container.d.ts +7 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +28 -0
- package/dist/container.js.map +1 -0
- package/dist/lang/en.d.ts +110 -0
- package/dist/lang/en.d.ts.map +1 -0
- package/dist/lang/en.js +133 -0
- package/dist/lang/en.js.map +1 -0
- package/dist/lib/abort.d.ts +3 -0
- package/dist/lib/abort.d.ts.map +1 -0
- package/dist/lib/abort.js +30 -0
- package/dist/lib/abort.js.map +1 -0
- package/dist/lib/auth-guard.d.ts +3 -0
- package/dist/lib/auth-guard.d.ts.map +1 -0
- package/dist/lib/auth-guard.js +25 -0
- package/dist/lib/auth-guard.js.map +1 -0
- package/dist/lib/browser.d.ts +2 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +16 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/command-handler.d.ts +10 -0
- package/dist/lib/command-handler.d.ts.map +1 -0
- package/dist/lib/command-handler.js +16 -0
- package/dist/lib/command-handler.js.map +1 -0
- package/dist/lib/command-registry.d.ts +28 -0
- package/dist/lib/command-registry.d.ts.map +1 -0
- package/dist/lib/command-registry.js +54 -0
- package/dist/lib/command-registry.js.map +1 -0
- package/dist/lib/config.d.ts +76 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +314 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +35 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +97 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/errors.d.ts +30 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +66 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/exit-codes.d.ts +9 -0
- package/dist/lib/exit-codes.d.ts.map +1 -0
- package/dist/lib/exit-codes.js +12 -0
- package/dist/lib/exit-codes.js.map +1 -0
- package/dist/lib/hidden-input.d.ts +2 -0
- package/dist/lib/hidden-input.d.ts.map +1 -0
- package/dist/lib/hidden-input.js +78 -0
- package/dist/lib/hidden-input.js.map +1 -0
- package/dist/lib/json-output.d.ts +6 -0
- package/dist/lib/json-output.d.ts.map +1 -0
- package/dist/lib/json-output.js +11 -0
- package/dist/lib/json-output.js.map +1 -0
- package/dist/lib/logger.d.ts +11 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +87 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/port.d.ts +12 -0
- package/dist/lib/port.d.ts.map +1 -0
- package/dist/lib/port.js +79 -0
- package/dist/lib/port.js.map +1 -0
- package/dist/lib/ui.d.ts +14 -0
- package/dist/lib/ui.d.ts.map +1 -0
- package/dist/lib/ui.js +75 -0
- package/dist/lib/ui.js.map +1 -0
- package/dist/lib/validators.d.ts +32 -0
- package/dist/lib/validators.d.ts.map +1 -0
- package/dist/lib/validators.js +96 -0
- package/dist/lib/validators.js.map +1 -0
- package/dist/services/account.d.ts +8 -0
- package/dist/services/account.d.ts.map +1 -0
- package/dist/services/account.js +15 -0
- package/dist/services/account.js.map +1 -0
- package/dist/services/app.d.ts +35 -0
- package/dist/services/app.d.ts.map +1 -0
- package/dist/services/app.js +117 -0
- package/dist/services/app.js.map +1 -0
- package/dist/services/browser-auth.d.ts +15 -0
- package/dist/services/browser-auth.d.ts.map +1 -0
- package/dist/services/browser-auth.js +187 -0
- package/dist/services/browser-auth.js.map +1 -0
- package/dist/services/normalize-app-id.d.ts +12 -0
- package/dist/services/normalize-app-id.d.ts.map +1 -0
- package/dist/services/normalize-app-id.js +38 -0
- package/dist/services/normalize-app-id.js.map +1 -0
- package/dist/services/oauth-refresh.d.ts +14 -0
- package/dist/services/oauth-refresh.d.ts.map +1 -0
- package/dist/services/oauth-refresh.js +70 -0
- package/dist/services/oauth-refresh.js.map +1 -0
- package/dist/templates/files/AGENTS.md.tmpl +41 -0
- package/dist/templates/files/CLAUDE.md.tmpl +50 -0
- package/dist/templates/files/README.md.tmpl +77 -0
- package/dist/templates/files/app-config.json.tmpl +23 -0
- package/dist/templates/files/gitignore.tmpl +9 -0
- package/dist/templates/files/src/oauth/.env.example.tmpl +13 -0
- package/dist/templates/files/src/oauth/.env.local.tmpl +10 -0
- package/dist/templates/files/src/oauth/handler.js.tmpl +203 -0
- package/dist/templates/files/src/oauth/package.json.tmpl +15 -0
- package/dist/templates/files/src/oauth/server.js.tmpl +226 -0
- package/dist/templates/files/src/oauth/token-store.js.tmpl +39 -0
- package/dist/templates/index.d.ts +36 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +105 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.updateCommand = void 0;
|
|
40
|
+
const fs = __importStar(require("node:fs"));
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
const logger_1 = require("../../lib/logger");
|
|
43
|
+
const en_1 = require("../../lang/en");
|
|
44
|
+
const command_handler_1 = require("../../lib/command-handler");
|
|
45
|
+
const json_output_1 = require("../../lib/json-output");
|
|
46
|
+
const errors_1 = require("../../lib/errors");
|
|
47
|
+
const container_1 = require("../../container");
|
|
48
|
+
const ui_1 = require("../../lib/ui");
|
|
49
|
+
const config_1 = require("../../lib/config");
|
|
50
|
+
const validators_1 = require("../../lib/validators");
|
|
51
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
52
|
+
exports.updateCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
|
|
53
|
+
const config = (0, config_1.readProjectConfig)();
|
|
54
|
+
const hasFlags = !!(options.name !== undefined ||
|
|
55
|
+
(options.redirectUrl && options.redirectUrl.length > 0));
|
|
56
|
+
// Validate --name if provided (even empty strings)
|
|
57
|
+
if (options.name !== undefined) {
|
|
58
|
+
const nameCheck = (0, validators_1.validateAppName)(options.name);
|
|
59
|
+
if (nameCheck !== true)
|
|
60
|
+
throw new errors_1.CliError(nameCheck);
|
|
61
|
+
}
|
|
62
|
+
// readProjectConfig normalizes appId (trim + coerce finite numbers, reject
|
|
63
|
+
// empty) so `config.appId` is a guaranteed non-empty string whenever `config`
|
|
64
|
+
// is non-null.
|
|
65
|
+
const configAppId = config?.appId;
|
|
66
|
+
const configAppIdValid = !!configAppId;
|
|
67
|
+
// app-config.json is only usable when it describes the app being updated.
|
|
68
|
+
// When --app-id differs from config.appId, the local file belongs to a
|
|
69
|
+
// different app and must not be used as the update payload or merge base.
|
|
70
|
+
const configMatches = configAppIdValid && (!options.appId || options.appId === configAppId);
|
|
71
|
+
// No flags and no usable config: emit a specific error.
|
|
72
|
+
if (!hasFlags && !configMatches) {
|
|
73
|
+
// File exists but appId is empty/invalid — surface that over a
|
|
74
|
+
// mismatch error, which would otherwise quote a garbage configAppId.
|
|
75
|
+
if (config != null && !configAppIdValid) {
|
|
76
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_INVALID_APP_ID);
|
|
77
|
+
}
|
|
78
|
+
if (config != null && options.appId && options.appId !== configAppId) {
|
|
79
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_APP_ID_MISMATCH(options.appId, configAppId));
|
|
80
|
+
}
|
|
81
|
+
const configExists = fs.existsSync(path.resolve(process.cwd(), 'app-config.json'));
|
|
82
|
+
if (configExists) {
|
|
83
|
+
// File exists but readProjectConfig returned null — invalid JSON or missing appId
|
|
84
|
+
let raw;
|
|
85
|
+
try {
|
|
86
|
+
raw = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), 'app-config.json'), 'utf-8'));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_INVALID_JSON);
|
|
90
|
+
}
|
|
91
|
+
if (!raw ||
|
|
92
|
+
typeof raw !== 'object' ||
|
|
93
|
+
!('appId' in raw) ||
|
|
94
|
+
!raw.appId) {
|
|
95
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_MISSING_APP_ID);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_NOTHING_TO_UPDATE);
|
|
99
|
+
}
|
|
100
|
+
// Resolve appId: flag > config
|
|
101
|
+
let appId;
|
|
102
|
+
if (options.appId) {
|
|
103
|
+
appId = options.appId;
|
|
104
|
+
}
|
|
105
|
+
else if (configAppIdValid) {
|
|
106
|
+
appId = configAppId;
|
|
107
|
+
}
|
|
108
|
+
else if (config) {
|
|
109
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_INVALID_APP_ID);
|
|
110
|
+
}
|
|
111
|
+
if (!appId) {
|
|
112
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_NO_APP_RESOLVED);
|
|
113
|
+
}
|
|
114
|
+
// Write back only when config describes the app being updated.
|
|
115
|
+
const shouldWriteBack = configMatches;
|
|
116
|
+
// No flags provided: push full config from app-config.json.
|
|
117
|
+
// (config is guaranteed non-null here — the !hasFlags && !config case is handled above)
|
|
118
|
+
if (!hasFlags) {
|
|
119
|
+
const redirectUrls = config.auth?.redirectUrls;
|
|
120
|
+
if (!redirectUrls || redirectUrls.length === 0) {
|
|
121
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_NO_REDIRECT_URLS);
|
|
122
|
+
}
|
|
123
|
+
validateRedirectUrls(redirectUrls);
|
|
124
|
+
if (!options.json) {
|
|
125
|
+
// Fail fast before the network fetch when we'd have nowhere to show the diff.
|
|
126
|
+
if (!options.yes && !process.stdin.isTTY) {
|
|
127
|
+
throw new errors_1.CliError('Cannot prompt for confirmation in non-interactive mode. Use --yes or --json to skip.');
|
|
128
|
+
}
|
|
129
|
+
// Fetch current remote state so the summary can show deltas vs. what the
|
|
130
|
+
// push will apply. Hard-fail on fetch error — the user asked for a diff.
|
|
131
|
+
const remote = await fetchExistingApp(appId, options.json);
|
|
132
|
+
renderUpdateSummary({
|
|
133
|
+
appId,
|
|
134
|
+
currentName: remote.name,
|
|
135
|
+
nextName: config.appName,
|
|
136
|
+
currentUrls: remote.redirect_uris ?? [],
|
|
137
|
+
nextUrls: redirectUrls,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (!options.json && !options.yes) {
|
|
141
|
+
const { confirmed } = await inquirer_1.default.prompt([
|
|
142
|
+
{
|
|
143
|
+
type: 'confirm',
|
|
144
|
+
name: 'confirmed',
|
|
145
|
+
message: en_1.messages.APP_UPDATE_CONFIRM,
|
|
146
|
+
default: true,
|
|
147
|
+
},
|
|
148
|
+
]);
|
|
149
|
+
if (!confirmed) {
|
|
150
|
+
(0, logger_1.logInfo)(`\n ${en_1.messages.APP_UPDATE_CANCELLED}\n`);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const spinner = (0, ui_1.createSpinner)('Updating app...', { silent: options.json });
|
|
155
|
+
await container_1.appService.updateApp(appId, {
|
|
156
|
+
name: config.appName,
|
|
157
|
+
redirect_uris: redirectUrls,
|
|
158
|
+
});
|
|
159
|
+
spinner.stop();
|
|
160
|
+
if (options.json) {
|
|
161
|
+
(0, json_output_1.jsonOutput)({ app_id: appId, name: config.appName, redirect_uris: redirectUrls });
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
(0, logger_1.logSuccess)(en_1.messages.APP_UPDATE_SUCCESS);
|
|
165
|
+
if (config.appName) {
|
|
166
|
+
(0, logger_1.logInfo)(` Name: ${config.appName}`);
|
|
167
|
+
}
|
|
168
|
+
(0, logger_1.logInfo)(` Redirect URLs: ${redirectUrls.join(', ')}`);
|
|
169
|
+
process.stdout.write('\n');
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
// Flags provided: merge with existing values
|
|
173
|
+
let existingName;
|
|
174
|
+
let existingRedirectUrls = [];
|
|
175
|
+
const configRedirectUrls = config?.auth?.redirectUrls;
|
|
176
|
+
const hasUsableConfigRedirectUrls = Array.isArray(configRedirectUrls) && configRedirectUrls.length > 0;
|
|
177
|
+
if (config && shouldWriteBack && hasUsableConfigRedirectUrls) {
|
|
178
|
+
// Use config as baseline only when it can safely preserve redirect URLs
|
|
179
|
+
existingName = config.appName;
|
|
180
|
+
existingRedirectUrls = configRedirectUrls;
|
|
181
|
+
}
|
|
182
|
+
else if (config && shouldWriteBack) {
|
|
183
|
+
// Config matches the app, but missing/empty redirect URLs would otherwise clear
|
|
184
|
+
// remote redirect URIs on a name-only update. Fall back to the API for preservation.
|
|
185
|
+
const app = await fetchExistingApp(appId, options.json);
|
|
186
|
+
existingName = config.appName ?? app.name;
|
|
187
|
+
existingRedirectUrls = app.redirect_uris ?? [];
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const app = await fetchExistingApp(appId, options.json);
|
|
191
|
+
existingName = app.name;
|
|
192
|
+
existingRedirectUrls = app.redirect_uris ?? [];
|
|
193
|
+
}
|
|
194
|
+
// Merge: --name wins, --redirect-url appends (deduplicated)
|
|
195
|
+
const finalName = options.name ?? existingName;
|
|
196
|
+
const appendedUrls = options.redirectUrl ?? [];
|
|
197
|
+
const mergedUrls = [...existingRedirectUrls];
|
|
198
|
+
for (const url of appendedUrls) {
|
|
199
|
+
if (!mergedUrls.includes(url)) {
|
|
200
|
+
mergedUrls.push(url);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const hasRedirectUrlFlag = options.redirectUrl !== undefined;
|
|
204
|
+
if (hasRedirectUrlFlag && mergedUrls.length === 0) {
|
|
205
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_NO_REDIRECT_URLS);
|
|
206
|
+
}
|
|
207
|
+
if (mergedUrls.length > 0) {
|
|
208
|
+
validateRedirectUrls(mergedUrls);
|
|
209
|
+
}
|
|
210
|
+
if (!options.json) {
|
|
211
|
+
renderUpdateSummary({
|
|
212
|
+
appId,
|
|
213
|
+
currentName: existingName,
|
|
214
|
+
nextName: finalName,
|
|
215
|
+
currentUrls: existingRedirectUrls,
|
|
216
|
+
nextUrls: mergedUrls,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
if (!options.json && !options.yes) {
|
|
220
|
+
if (!process.stdin.isTTY) {
|
|
221
|
+
throw new errors_1.CliError('Cannot prompt for confirmation in non-interactive mode. Use --yes or --json to skip.');
|
|
222
|
+
}
|
|
223
|
+
const { confirmed } = await inquirer_1.default.prompt([
|
|
224
|
+
{
|
|
225
|
+
type: 'confirm',
|
|
226
|
+
name: 'confirmed',
|
|
227
|
+
message: en_1.messages.APP_UPDATE_CONFIRM,
|
|
228
|
+
default: true,
|
|
229
|
+
},
|
|
230
|
+
]);
|
|
231
|
+
if (!confirmed) {
|
|
232
|
+
(0, logger_1.logInfo)(`\n ${en_1.messages.APP_UPDATE_CANCELLED}\n`);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const spinner = (0, ui_1.createSpinner)('Updating app...', { silent: options.json });
|
|
237
|
+
await container_1.appService.updateApp(appId, {
|
|
238
|
+
name: finalName,
|
|
239
|
+
redirect_uris: mergedUrls,
|
|
240
|
+
});
|
|
241
|
+
spinner.stop();
|
|
242
|
+
// Write back to app-config.json if appropriate
|
|
243
|
+
if (shouldWriteBack && config) {
|
|
244
|
+
const updatedConfig = { ...config };
|
|
245
|
+
if (options.name) {
|
|
246
|
+
updatedConfig.appName = options.name;
|
|
247
|
+
}
|
|
248
|
+
updatedConfig.auth = {
|
|
249
|
+
...updatedConfig.auth,
|
|
250
|
+
redirectUrls: mergedUrls,
|
|
251
|
+
};
|
|
252
|
+
(0, config_1.writeProjectConfig)(updatedConfig);
|
|
253
|
+
}
|
|
254
|
+
if (options.json) {
|
|
255
|
+
(0, json_output_1.jsonOutput)({ app_id: appId, name: finalName, redirect_uris: mergedUrls });
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
(0, logger_1.logSuccess)(en_1.messages.APP_UPDATE_SUCCESS);
|
|
259
|
+
if (finalName) {
|
|
260
|
+
(0, logger_1.logInfo)(` Name: ${finalName}`);
|
|
261
|
+
}
|
|
262
|
+
(0, logger_1.logInfo)(` Redirect URLs: ${mergedUrls.length > 0 ? mergedUrls.join(', ') : '(none)'}`);
|
|
263
|
+
if (shouldWriteBack && config) {
|
|
264
|
+
(0, logger_1.logInfo)(' app-config.json updated.');
|
|
265
|
+
}
|
|
266
|
+
process.stdout.write('\n');
|
|
267
|
+
});
|
|
268
|
+
async function fetchExistingApp(appId, silent) {
|
|
269
|
+
const spinner = (0, ui_1.createSpinner)('Fetching app...', { silent });
|
|
270
|
+
let app;
|
|
271
|
+
try {
|
|
272
|
+
app = await container_1.appService.fetchApp(appId);
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
spinner.stop();
|
|
276
|
+
}
|
|
277
|
+
if (!app) {
|
|
278
|
+
throw new errors_1.CliError(`App ${appId} not found.`);
|
|
279
|
+
}
|
|
280
|
+
return app;
|
|
281
|
+
}
|
|
282
|
+
function renderUpdateSummary(params) {
|
|
283
|
+
const { appId, currentName, nextName, currentUrls, nextUrls } = params;
|
|
284
|
+
const currentSet = new Set(currentUrls);
|
|
285
|
+
const nextSet = new Set(nextUrls);
|
|
286
|
+
const addedSet = new Set(nextUrls.filter((u) => !currentSet.has(u)));
|
|
287
|
+
const removed = currentUrls.filter((u) => !nextSet.has(u));
|
|
288
|
+
(0, logger_1.logInfo)('');
|
|
289
|
+
(0, logger_1.logInfo)(` ${en_1.messages.APP_UPDATE_SUMMARY}`);
|
|
290
|
+
(0, logger_1.logInfo)(` App ID: ${appId}`);
|
|
291
|
+
if (nextName) {
|
|
292
|
+
if (currentName && currentName !== nextName) {
|
|
293
|
+
(0, logger_1.logInfo)(` Name: ${currentName} → ${nextName}`);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
(0, logger_1.logInfo)(` Name: ${nextName}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const lines = [
|
|
300
|
+
...nextUrls.map((u) => (addedSet.has(u) ? `${u} (new)` : u)),
|
|
301
|
+
...removed.map((u) => `${u} (removed)`),
|
|
302
|
+
];
|
|
303
|
+
lines.forEach((line, i) => {
|
|
304
|
+
const prefix = i === 0 ? ' Redirect URLs: ' : ' ';
|
|
305
|
+
(0, logger_1.logInfo)(`${prefix}${line}`);
|
|
306
|
+
});
|
|
307
|
+
(0, logger_1.logInfo)('');
|
|
308
|
+
}
|
|
309
|
+
function validateRedirectUrls(urls) {
|
|
310
|
+
for (const url of urls) {
|
|
311
|
+
try {
|
|
312
|
+
const parsed = new URL(url);
|
|
313
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
314
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_INVALID_REDIRECT_PROTOCOL(url));
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
if (err instanceof errors_1.CliError)
|
|
319
|
+
throw err;
|
|
320
|
+
throw new errors_1.CliError(en_1.messages.APP_UPDATE_INVALID_REDIRECT_URL(url));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/app/update.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8B;AAC9B,gDAAkC;AAClC,6CAAuD;AACvD,sCAAyC;AACzC,+DAA+D;AAC/D,uDAAmD;AACnD,6CAA4C;AAC5C,+CAA6C;AAC7C,qCAA6C;AAC7C,6CAAyE;AAEzE,qDAAuD;AACvD,wDAAgC;AAUnB,QAAA,aAAa,GAAG,IAAA,oCAAkB,EAAC,KAAK,EAAE,OAAsB,EAAiB,EAAE;IAC9F,MAAM,MAAM,GAAG,IAAA,0BAAiB,GAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,CAAC,CAAC,CACjB,OAAO,CAAC,IAAI,KAAK,SAAS;QAC1B,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CACxD,CAAC;IAEF,mDAAmD;IACnD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAA,4BAAe,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YAAE,MAAM,IAAI,iBAAQ,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,2EAA2E;IAC3E,8EAA8E;IAC9E,eAAe;IACf,MAAM,WAAW,GAAG,MAAM,EAAE,KAAK,CAAC;IAClC,MAAM,gBAAgB,GAAG,CAAC,CAAC,WAAW,CAAC;IAEvC,0EAA0E;IAC1E,uEAAuE;IACvE,0EAA0E;IAC1E,MAAM,aAAa,GAAG,gBAAgB,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;IAE5F,wDAAwD;IACxD,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,+DAA+D;QAC/D,qEAAqE;QACrE,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxC,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,yBAAyB,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YACrE,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,0BAA0B,CAAC,OAAO,CAAC,KAAK,EAAE,WAAY,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACnF,IAAI,YAAY,EAAE,CAAC;YACjB,kFAAkF;YAClF,IAAI,GAAY,CAAC;YACjB,IAAI,CAAC;gBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7F,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,uBAAuB,CAAC,CAAC;YACvD,CAAC;YACD,IACE,CAAC,GAAG;gBACJ,OAAO,GAAG,KAAK,QAAQ;gBACvB,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC;gBACjB,CAAE,GAA+B,CAAC,KAAK,EACvC,CAAC;gBACD,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,yBAAyB,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QACD,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,4BAA4B,CAAC,CAAC;IAC5D,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAyB,CAAC;IAC9B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IACxB,CAAC;SAAM,IAAI,gBAAgB,EAAE,CAAC;QAC5B,KAAK,GAAG,WAAW,CAAC;IACtB,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,yBAAyB,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,0BAA0B,CAAC,CAAC;IAC1D,CAAC;IAED,+DAA+D;IAC/D,MAAM,eAAe,GAAG,aAAa,CAAC;IAEtC,4DAA4D;IAC5D,wFAAwF;IACxF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,MAAO,CAAC,IAAI,EAAE,YAAY,CAAC;QAChD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,2BAA2B,CAAC,CAAC;QAC3D,CAAC;QAED,oBAAoB,CAAC,YAAY,CAAC,CAAC;QAEnC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,8EAA8E;YAC9E,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACzC,MAAM,IAAI,iBAAQ,CAChB,sFAAsF,CACvF,CAAC;YACJ,CAAC;YACD,yEAAyE;YACzE,yEAAyE;YACzE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3D,mBAAmB,CAAC;gBAClB,KAAK;gBACL,WAAW,EAAE,MAAM,CAAC,IAAI;gBACxB,QAAQ,EAAE,MAAO,CAAC,OAAO;gBACzB,WAAW,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE;gBACvC,QAAQ,EAAE,YAAY;aACvB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAClC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBAC1C;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,aAAQ,CAAC,kBAAkB;oBACpC,OAAO,EAAE,IAAI;iBACd;aACF,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAA,gBAAO,EAAC,OAAO,aAAQ,CAAC,oBAAoB,IAAI,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,kBAAa,EAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,sBAAU,CAAC,SAAS,CAAC,KAAK,EAAE;YAChC,IAAI,EAAE,MAAO,CAAC,OAAO;YACrB,aAAa,EAAE,YAAY;SAC5B,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAA,wBAAU,EAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAO,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QAED,IAAA,mBAAU,EAAC,aAAQ,CAAC,kBAAkB,CAAC,CAAC;QACxC,IAAI,MAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAA,gBAAO,EAAC,oBAAoB,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,IAAA,gBAAO,EAAC,oBAAoB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,6CAA6C;IAC7C,IAAI,YAAgC,CAAC;IACrC,IAAI,oBAAoB,GAAa,EAAE,CAAC;IAExC,MAAM,kBAAkB,GAAG,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC;IACtD,MAAM,2BAA2B,GAC/B,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;IAErE,IAAI,MAAM,IAAI,eAAe,IAAI,2BAA2B,EAAE,CAAC;QAC7D,wEAAwE;QACxE,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,oBAAoB,GAAG,kBAAkB,CAAC;IAC5C,CAAC;SAAM,IAAI,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,gFAAgF;QAChF,qFAAqF;QACrF,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,YAAY,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC;QAC1C,oBAAoB,GAAG,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;QACxB,oBAAoB,GAAG,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,4DAA4D;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC;IAE7D,IAAI,kBAAkB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,2BAA2B,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,mBAAmB,CAAC;YAClB,KAAK;YACL,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,oBAAoB;YACjC,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,iBAAQ,CAChB,sFAAsF,CACvF,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YAC1C;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,aAAQ,CAAC,kBAAkB;gBACpC,OAAO,EAAE,IAAI;aACd;SACF,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAA,gBAAO,EAAC,OAAO,aAAQ,CAAC,oBAAoB,IAAI,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,kBAAa,EAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3E,MAAM,sBAAU,CAAC,SAAS,CAAC,KAAK,EAAE;QAChC,IAAI,EAAE,SAAS;QACf,aAAa,EAAE,UAAU;KAC1B,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,+CAA+C;IAC/C,IAAI,eAAe,IAAI,MAAM,EAAE,CAAC;QAC9B,MAAM,aAAa,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,aAAa,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;QACvC,CAAC;QACD,aAAa,CAAC,IAAI,GAAG;YACnB,GAAG,aAAa,CAAC,IAAI;YACrB,YAAY,EAAE,UAAU;SACzB,CAAC;QACF,IAAA,2BAAkB,EAAC,aAAa,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAA,wBAAU,EAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,IAAA,mBAAU,EAAC,aAAQ,CAAC,kBAAkB,CAAC,CAAC;IACxC,IAAI,SAAS,EAAE,CAAC;QACd,IAAA,gBAAO,EAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAA,gBAAO,EAAC,oBAAoB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxF,IAAI,eAAe,IAAI,MAAM,EAAE,CAAC;QAC9B,IAAA,gBAAO,EAAC,4BAA4B,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,MAA2B;IACxE,MAAM,OAAO,GAAG,IAAA,kBAAa,EAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,GAAoB,CAAC;IACzB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,sBAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,iBAAQ,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,MAM5B;IACC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACvE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,IAAA,gBAAO,EAAC,EAAE,CAAC,CAAC;IACZ,IAAA,gBAAO,EAAC,KAAK,aAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC5C,IAAA,gBAAO,EAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC;IACrC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,WAAW,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC5C,IAAA,gBAAO,EAAC,oBAAoB,WAAW,MAAM,QAAQ,EAAE,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,IAAA,gBAAO,EAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG;QACZ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC;KACxC,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACnE,IAAA,gBAAO,EAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,IAAA,gBAAO,EAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAc;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAChE,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,oCAAoC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,iBAAQ;gBAAE,MAAM,GAAG,CAAC;YACvC,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,+BAA+B,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/commands/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAevF,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EA8B/C,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,yBA4J7B,CAAC"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
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 start_1 = require("./app/start");
|
|
16
|
+
exports.topLevelCommands = [
|
|
17
|
+
{
|
|
18
|
+
name: 'login',
|
|
19
|
+
description: 'Authenticate with your Brevo account',
|
|
20
|
+
options: [
|
|
21
|
+
{ flags: '--browser', description: 'Force browser-based login' },
|
|
22
|
+
{ flags: '--json', description: 'Output as JSON' },
|
|
23
|
+
],
|
|
24
|
+
examples: ['brevo login', 'brevo login --browser', 'BREVO_API_KEY=xkeysib-... brevo login'],
|
|
25
|
+
handler: (opts) => (0, login_1.loginCommand)({
|
|
26
|
+
browser: Boolean(opts.browser),
|
|
27
|
+
json: Boolean(opts.json),
|
|
28
|
+
}),
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'logout',
|
|
32
|
+
description: 'Clear stored credentials',
|
|
33
|
+
options: [
|
|
34
|
+
{ flags: '--force', description: 'Skip confirmation (for CI)' },
|
|
35
|
+
{ flags: '--json', description: 'Output as JSON' },
|
|
36
|
+
],
|
|
37
|
+
handler: (opts) => (0, logout_1.logoutCommand)({ force: Boolean(opts.force), json: Boolean(opts.json) }),
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'whoami',
|
|
41
|
+
description: 'Show current authenticated user',
|
|
42
|
+
options: [{ flags: '--json', description: 'Output as JSON' }],
|
|
43
|
+
handler: (opts) => (0, whoami_1.whoamiCommand)({ json: Boolean(opts.json) }),
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
exports.appCommandGroup = {
|
|
47
|
+
name: 'app',
|
|
48
|
+
description: 'Manage OAuth applications',
|
|
49
|
+
commands: [
|
|
50
|
+
{
|
|
51
|
+
name: 'init',
|
|
52
|
+
description: 'Quick setup — login, create app, and scaffold in one go',
|
|
53
|
+
examples: ['brevo app init'],
|
|
54
|
+
handler: () => (0, init_1.initCommand)({}),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'create',
|
|
58
|
+
description: 'Create a new OAuth app',
|
|
59
|
+
examples: [
|
|
60
|
+
'brevo app create',
|
|
61
|
+
'brevo app create --name "My App" --distribution private',
|
|
62
|
+
'brevo app create --name "My App" --distribution private --redirect-uri http://localhost:3000/callback',
|
|
63
|
+
'brevo app create --name "My App" --distribution private --redirect-uri http://localhost:3000/callback --redirect-uri https://myapp.com/callback --json',
|
|
64
|
+
],
|
|
65
|
+
options: [
|
|
66
|
+
{ flags: '--name <name>', description: 'App name' },
|
|
67
|
+
{ flags: '--distribution <type>', description: 'Distribution type (private|public)' },
|
|
68
|
+
{
|
|
69
|
+
flags: '--redirect-uri <url>',
|
|
70
|
+
description: 'Redirect URI (repeatable)',
|
|
71
|
+
parser: validators_1.collectUrls,
|
|
72
|
+
},
|
|
73
|
+
{ flags: '--json', description: 'Output as JSON' },
|
|
74
|
+
],
|
|
75
|
+
handler: (opts) => (0, create_1.createCommand)({
|
|
76
|
+
name: opts.name,
|
|
77
|
+
distribution: opts.distribution,
|
|
78
|
+
redirectUri: opts.redirectUri,
|
|
79
|
+
json: Boolean(opts.json),
|
|
80
|
+
}),
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'list',
|
|
84
|
+
description: 'List all apps in your account',
|
|
85
|
+
examples: ['brevo app list', 'brevo app list --json'],
|
|
86
|
+
options: [{ flags: '--json', description: 'Output as JSON' }],
|
|
87
|
+
handler: (opts) => (0, list_1.listCommand)({ json: Boolean(opts.json) }),
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'credentials',
|
|
91
|
+
description: 'Show client ID and secret for an app',
|
|
92
|
+
examples: [
|
|
93
|
+
'brevo app credentials --app-id 42',
|
|
94
|
+
'brevo app credentials --app-id 42 --reveal-secret --json',
|
|
95
|
+
],
|
|
96
|
+
options: [
|
|
97
|
+
{
|
|
98
|
+
flags: '--app-id <id>',
|
|
99
|
+
description: 'App ID',
|
|
100
|
+
parser: (v) => (0, validators_1.parseAppId)(v),
|
|
101
|
+
},
|
|
102
|
+
{ flags: '--reveal-secret', description: 'Show the client secret' },
|
|
103
|
+
{ flags: '--json', description: 'Output as JSON' },
|
|
104
|
+
],
|
|
105
|
+
handler: (opts) => (0, credentials_1.credentialsCommand)({
|
|
106
|
+
appId: opts.appId,
|
|
107
|
+
revealSecret: Boolean(opts.revealSecret),
|
|
108
|
+
json: Boolean(opts.json),
|
|
109
|
+
}),
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'update',
|
|
113
|
+
description: 'Update an app name or redirect URLs',
|
|
114
|
+
examples: [
|
|
115
|
+
'brevo app update',
|
|
116
|
+
'brevo app update --name "My New Name"',
|
|
117
|
+
'brevo app update --redirect-url https://myapp.com/callback',
|
|
118
|
+
'brevo app update --name "My App" --redirect-url https://myapp.com/callback',
|
|
119
|
+
'brevo app update --app-id 42 --name "My App"',
|
|
120
|
+
'brevo app update --app-id 42 --redirect-url https://myapp.com/callback --json',
|
|
121
|
+
],
|
|
122
|
+
options: [
|
|
123
|
+
{
|
|
124
|
+
flags: '--app-id <id>',
|
|
125
|
+
description: 'App ID (uses app-config.json if omitted)',
|
|
126
|
+
parser: (v) => (0, validators_1.parseAppId)(v),
|
|
127
|
+
},
|
|
128
|
+
{ flags: '--name <name>', description: 'New app name' },
|
|
129
|
+
{
|
|
130
|
+
flags: '--redirect-url <url>',
|
|
131
|
+
description: 'Redirect URL to append (repeatable)',
|
|
132
|
+
parser: validators_1.collectUrls,
|
|
133
|
+
},
|
|
134
|
+
{ flags: '--yes', description: 'Skip confirmation prompt' },
|
|
135
|
+
{ flags: '--json', description: 'Output as JSON' },
|
|
136
|
+
],
|
|
137
|
+
handler: (opts) => (0, update_1.updateCommand)({
|
|
138
|
+
appId: opts.appId,
|
|
139
|
+
name: opts.name,
|
|
140
|
+
redirectUrl: opts.redirectUrl,
|
|
141
|
+
yes: Boolean(opts.yes),
|
|
142
|
+
json: Boolean(opts.json),
|
|
143
|
+
}),
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: 'delete',
|
|
147
|
+
description: 'Delete an app',
|
|
148
|
+
examples: ['brevo app delete --app-id 42', 'brevo app delete --app-id 42 --force'],
|
|
149
|
+
options: [
|
|
150
|
+
{
|
|
151
|
+
flags: '--app-id <id>',
|
|
152
|
+
description: 'App ID',
|
|
153
|
+
parser: (v) => (0, validators_1.parseAppId)(v),
|
|
154
|
+
},
|
|
155
|
+
{ flags: '--force', description: 'Skip confirmation (for CI)' },
|
|
156
|
+
{ flags: '--json', description: 'Output as JSON' },
|
|
157
|
+
],
|
|
158
|
+
handler: (opts) => (0, delete_1.deleteCommand)({
|
|
159
|
+
appId: opts.appId,
|
|
160
|
+
force: Boolean(opts.force),
|
|
161
|
+
json: Boolean(opts.json),
|
|
162
|
+
}),
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: 'scaffold',
|
|
166
|
+
description: 'Generate starter code for an app',
|
|
167
|
+
examples: ['brevo app scaffold', 'brevo app scaffold --app-id 42'],
|
|
168
|
+
options: [
|
|
169
|
+
{
|
|
170
|
+
flags: '--app-id <id>',
|
|
171
|
+
description: 'App ID',
|
|
172
|
+
parser: (v) => (0, validators_1.parseAppId)(v),
|
|
173
|
+
},
|
|
174
|
+
{ flags: '--json', description: 'Output as JSON' },
|
|
175
|
+
],
|
|
176
|
+
handler: (opts) => (0, scaffold_1.scaffoldCommand)({ appId: opts.appId, json: Boolean(opts.json) }),
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: 'start',
|
|
180
|
+
description: 'Run a scaffolded feature locally',
|
|
181
|
+
arguments: [{ name: '[feature]', description: 'Feature to start (e.g. oauth)' }],
|
|
182
|
+
examples: ['brevo app start oauth', 'brevo app start oauth --port 3000'],
|
|
183
|
+
options: [
|
|
184
|
+
{
|
|
185
|
+
flags: '--port <port>',
|
|
186
|
+
description: 'Server port (default: 3009)',
|
|
187
|
+
parser: (v) => (0, validators_1.parsePositiveInt)(v, '--port'),
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
handler: (opts, feature) => (0, start_1.startCommand)({
|
|
191
|
+
feature: feature,
|
|
192
|
+
port: opts.port,
|
|
193
|
+
}),
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
};
|
|
197
|
+
//# sourceMappingURL=definitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/commands/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,WAAW,kDAmFvB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
exports.initCommand = (0, command_handler_1.withCommandHandler)(async (_options) => {
|
|
19
|
+
process.stdout.write(`\n ${en_1.messages.INIT_WELCOME}\n`);
|
|
20
|
+
process.stdout.write(' ──────────────────────────────────────\n\n');
|
|
21
|
+
// Step 1: Login
|
|
22
|
+
if ((0, config_1.isAuthenticated)()) {
|
|
23
|
+
(0, logger_1.logSuccess)(en_1.messages.INIT_ALREADY_LOGGED_IN);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
(0, logger_1.logInfo)(en_1.messages.INIT_STEP_LOGIN);
|
|
27
|
+
await (0, login_1.loginCommand)({ suppressNextSteps: true });
|
|
28
|
+
if (!(0, config_1.isAuthenticated)()) {
|
|
29
|
+
throw new errors_1.CliError('Login failed.');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Step 2: Check local app-config.json for existing app
|
|
33
|
+
process.stdout.write('\n');
|
|
34
|
+
const projectConfig = (0, config_1.readProjectConfig)();
|
|
35
|
+
if (projectConfig?.appId) {
|
|
36
|
+
const configAppId = typeof projectConfig.appId === 'string' ? projectConfig.appId.trim() : '';
|
|
37
|
+
const linkedName = projectConfig.appName || configAppId;
|
|
38
|
+
// Verify app still exists on the server
|
|
39
|
+
let appExists = false;
|
|
40
|
+
if (configAppId) {
|
|
41
|
+
const spinner = (0, ui_1.createSpinner)('Verifying app...');
|
|
42
|
+
try {
|
|
43
|
+
const app = await container_1.appService.fetchApp(configAppId);
|
|
44
|
+
appExists = app !== null;
|
|
45
|
+
spinner.stop();
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
spinner.stop();
|
|
49
|
+
// API error — treat as not found
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (!appExists) {
|
|
53
|
+
(0, logger_1.logWarn)(`App "${linkedName}" (from app-config.json) no longer exists on the server. It may have been deleted.`);
|
|
54
|
+
(0, logger_1.logInfo)(en_1.messages.INIT_STEP_CREATE);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
(0, logger_1.logSuccess)(en_1.messages.INIT_APP_LINKED(linkedName));
|
|
58
|
+
const { action } = await inquirer_1.default.prompt([
|
|
59
|
+
{
|
|
60
|
+
type: 'list',
|
|
61
|
+
name: 'action',
|
|
62
|
+
message: en_1.messages.INIT_APP_ACTION,
|
|
63
|
+
choices: [
|
|
64
|
+
{ name: 'Scaffold this app', value: 'scaffold' },
|
|
65
|
+
{ name: 'Create a new app', value: 'create' },
|
|
66
|
+
{ name: "Skip — I'm all set", value: 'skip' },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
]);
|
|
70
|
+
if (action === 'skip') {
|
|
71
|
+
(0, logger_1.logInfo)(`\n ${en_1.messages.INIT_DONE}\n`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (action === 'scaffold') {
|
|
75
|
+
process.stdout.write('\n');
|
|
76
|
+
await (0, scaffold_1.scaffoldCommand)({ appId: configAppId });
|
|
77
|
+
(0, logger_1.logInfo)(`\n ${en_1.messages.INIT_DONE}\n`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// action === 'create' — fall through
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
(0, logger_1.logInfo)(en_1.messages.INIT_STEP_CREATE);
|
|
85
|
+
}
|
|
86
|
+
process.stdout.write('\n');
|
|
87
|
+
await (0, create_1.createCommand)({});
|
|
88
|
+
(0, logger_1.logInfo)(`\n ${en_1.messages.INIT_DONE}\n`);
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=init.js.map
|