@getbrevo/cli 1.0.0 → 1.0.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 +38 -0
- package/README.md +24 -49
- package/agent-context/AGENTS.md +61 -9
- package/agent-context/SKILL.md +40 -2
- package/dist/api/client.d.ts +1 -1
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +4 -2
- package/dist/api/client.js.map +1 -1
- package/dist/bin/index.js +26 -16
- package/dist/bin/index.js.map +1 -1
- package/dist/commands/app/create.js +8 -8
- package/dist/commands/app/create.js.map +1 -1
- package/dist/commands/app/credentials.d.ts.map +1 -1
- package/dist/commands/app/credentials.js +73 -71
- package/dist/commands/app/credentials.js.map +1 -1
- package/dist/commands/app/delete.d.ts.map +1 -1
- package/dist/commands/app/delete.js +9 -8
- package/dist/commands/app/delete.js.map +1 -1
- package/dist/commands/app/scaffold.d.ts.map +1 -1
- package/dist/commands/app/scaffold.js +69 -70
- package/dist/commands/app/scaffold.js.map +1 -1
- package/dist/commands/app/start.d.ts.map +1 -1
- package/dist/commands/app/start.js +38 -48
- package/dist/commands/app/start.js.map +1 -1
- package/dist/commands/definitions.d.ts +1 -0
- package/dist/commands/definitions.d.ts.map +1 -1
- package/dist/commands/definitions.js +23 -1
- package/dist/commands/definitions.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +59 -56
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +50 -38
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/skill/install.d.ts +4 -0
- package/dist/commands/skill/install.d.ts.map +1 -0
- package/dist/commands/skill/install.js +29 -0
- package/dist/commands/skill/install.js.map +1 -0
- package/dist/commands/skill/uninstall.d.ts +4 -0
- package/dist/commands/skill/uninstall.d.ts.map +1 -0
- package/dist/commands/skill/uninstall.js +23 -0
- package/dist/commands/skill/uninstall.js.map +1 -0
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +5 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/lang/en.d.ts +7 -0
- package/dist/lang/en.d.ts.map +1 -1
- package/dist/lang/en.js +8 -0
- package/dist/lang/en.js.map +1 -1
- package/dist/lib/auth-guard.d.ts.map +1 -1
- package/dist/lib/auth-guard.js +8 -2
- package/dist/lib/auth-guard.js.map +1 -1
- package/dist/lib/browser.js +4 -4
- package/dist/lib/browser.js.map +1 -1
- package/dist/lib/command-registry.js +1 -1
- package/dist/lib/command-registry.js.map +1 -1
- package/dist/lib/config.d.ts +2 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +26 -6
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/constants.d.ts +2 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +6 -6
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/hidden-input.js +1 -1
- package/dist/lib/hidden-input.js.map +1 -1
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +14 -4
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/update-notifier.d.ts.map +1 -1
- package/dist/lib/update-notifier.js +11 -11
- package/dist/lib/update-notifier.js.map +1 -1
- package/dist/services/browser-auth.js +9 -8
- package/dist/services/browser-auth.js.map +1 -1
- package/dist/services/skill.d.ts +48 -0
- package/dist/services/skill.d.ts.map +1 -0
- package/dist/services/skill.js +223 -0
- package/dist/services/skill.js.map +1 -0
- package/dist/skills/index.d.ts +46 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +80 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/templates/files/AGENTS.md.tmpl +5 -0
- package/dist/templates/files/CLAUDE.md.tmpl +1 -1
- package/dist/templates/files/README.md.tmpl +1 -0
- package/dist/templates/index.js +2 -2
- package/dist/templates/index.js.map +1 -1
- package/package.json +4 -3
|
@@ -13,11 +13,77 @@ const json_output_1 = require("../../lib/json-output");
|
|
|
13
13
|
const container_1 = require("../../container");
|
|
14
14
|
const ui_1 = require("../../lib/ui");
|
|
15
15
|
const config_1 = require("../../lib/config");
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
async function resolveSecretReveal(revealRequested, app) {
|
|
17
|
+
if (!revealRequested) {
|
|
18
|
+
return { display: en_1.messages.CLIENT_SECRET_HIDDEN_HUMAN, revealed: false };
|
|
19
|
+
}
|
|
20
|
+
if (!process.stdin.isTTY) {
|
|
21
|
+
(0, logger_1.logInfo)(' Secret not revealed in non-interactive mode. Use --reveal-secret in a terminal.');
|
|
22
|
+
return { display: en_1.messages.CLIENT_SECRET_HIDDEN_HUMAN, revealed: false };
|
|
23
|
+
}
|
|
24
|
+
const { confirmed } = await inquirer_1.default.prompt([
|
|
25
|
+
{
|
|
26
|
+
type: 'confirm',
|
|
27
|
+
name: 'confirmed',
|
|
28
|
+
message: en_1.messages.APP_CREDENTIALS_REVEAL_CONFIRM,
|
|
29
|
+
default: false,
|
|
30
|
+
},
|
|
31
|
+
]);
|
|
32
|
+
if (confirmed) {
|
|
33
|
+
return {
|
|
34
|
+
display: app.client_secret || en_1.messages.CLIENT_SECRET_NOT_AVAILABLE,
|
|
35
|
+
revealed: true,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return { display: en_1.messages.CLIENT_SECRET_HIDDEN_HUMAN, revealed: false };
|
|
39
|
+
}
|
|
40
|
+
function printCredentialsHuman(app, appId, secretDisplay) {
|
|
41
|
+
(0, logger_1.logInfo)(`\n App name: ${app.name || '—'}`);
|
|
42
|
+
(0, logger_1.logInfo)(` App ID: ${appId}`);
|
|
43
|
+
(0, logger_1.logInfo)(` Client ID: ${app.client_id}`);
|
|
44
|
+
(0, logger_1.logInfo)(` Client secret: ${secretDisplay}`);
|
|
45
|
+
if (app.scopes && app.scopes.length > 0) {
|
|
46
|
+
(0, logger_1.logInfo)(` Scopes: ${app.scopes.join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
(0, logger_1.logInfo)(` Scopes: (none)`);
|
|
50
|
+
}
|
|
51
|
+
if (app.redirect_uris.length > 0) {
|
|
52
|
+
app.redirect_uris.forEach((uri, i) => {
|
|
53
|
+
(0, logger_1.logInfo)(` Redirect URL ${i + 1}: ${uri}`);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
(0, logger_1.logInfo)(` Redirect URLs: (none)`);
|
|
58
|
+
}
|
|
59
|
+
process.stdout.write('\n');
|
|
60
|
+
}
|
|
61
|
+
async function reconcileLocalCache(appId, app, diffs, jsonMode) {
|
|
62
|
+
if (diffs.length === 0) {
|
|
63
|
+
// First-time save (no local cache yet) is silent
|
|
64
|
+
container_1.appService.syncAppCredentials(appId, app);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
(0, logger_1.logWarn)(`Local credentials for app ${appId} differ from server (${diffs.join(', ')}).`);
|
|
68
|
+
if (!process.stdin.isTTY || jsonMode) {
|
|
69
|
+
container_1.appService.syncAppCredentials(appId, app);
|
|
70
|
+
return;
|
|
20
71
|
}
|
|
72
|
+
const { shouldUpdate } = await inquirer_1.default.prompt([
|
|
73
|
+
{
|
|
74
|
+
type: 'confirm',
|
|
75
|
+
name: 'shouldUpdate',
|
|
76
|
+
message: 'Update local credentials to match the server?',
|
|
77
|
+
default: true,
|
|
78
|
+
},
|
|
79
|
+
]);
|
|
80
|
+
if (shouldUpdate) {
|
|
81
|
+
container_1.appService.syncAppCredentials(appId, app);
|
|
82
|
+
(0, logger_1.logInfo)(' Local credentials updated.\n');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.credentialsCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
|
|
86
|
+
const appId = options.appId ?? (await container_1.appService.pickApp(en_1.messages.APP_CREDENTIALS_SELECT));
|
|
21
87
|
const spinner = (0, ui_1.createSpinner)('Fetching credentials...', { silent: options.json });
|
|
22
88
|
const result = await container_1.appService.resolveAppCredentials(appId);
|
|
23
89
|
spinner.stop();
|
|
@@ -27,28 +93,7 @@ exports.credentialsCommand = (0, command_handler_1.withCommandHandler)(async (op
|
|
|
27
93
|
const { app, diffs } = result;
|
|
28
94
|
if (app.name)
|
|
29
95
|
(0, config_1.saveAppName)(appId, app.name);
|
|
30
|
-
|
|
31
|
-
let revealConfirmed = false;
|
|
32
|
-
if (options.revealSecret) {
|
|
33
|
-
if (!process.stdin.isTTY) {
|
|
34
|
-
// Non-interactive: auto-deny reveal to prevent secrets leaking into CI logs
|
|
35
|
-
(0, logger_1.logInfo)(' Secret not revealed in non-interactive mode. Use --reveal-secret in a terminal.');
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
const { confirmed } = await inquirer_1.default.prompt([
|
|
39
|
-
{
|
|
40
|
-
type: 'confirm',
|
|
41
|
-
name: 'confirmed',
|
|
42
|
-
message: en_1.messages.APP_CREDENTIALS_REVEAL_CONFIRM,
|
|
43
|
-
default: false,
|
|
44
|
-
},
|
|
45
|
-
]);
|
|
46
|
-
if (confirmed) {
|
|
47
|
-
revealConfirmed = true;
|
|
48
|
-
secretDisplay = app.client_secret || en_1.messages.CLIENT_SECRET_NOT_AVAILABLE;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
96
|
+
const { display: secretDisplay, revealed: revealConfirmed } = await resolveSecretReveal(options.revealSecret, app);
|
|
52
97
|
if (options.json) {
|
|
53
98
|
(0, json_output_1.jsonOutput)({
|
|
54
99
|
appName: app.name || null,
|
|
@@ -62,51 +107,8 @@ exports.credentialsCommand = (0, command_handler_1.withCommandHandler)(async (op
|
|
|
62
107
|
});
|
|
63
108
|
}
|
|
64
109
|
else {
|
|
65
|
-
(
|
|
66
|
-
(0, logger_1.logInfo)(` App ID: ${appId}`);
|
|
67
|
-
(0, logger_1.logInfo)(` Client ID: ${app.client_id}`);
|
|
68
|
-
(0, logger_1.logInfo)(` Client secret: ${secretDisplay}`);
|
|
69
|
-
if (app.scopes && app.scopes.length > 0) {
|
|
70
|
-
(0, logger_1.logInfo)(` Scopes: ${app.scopes.join(', ')}`);
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
(0, logger_1.logInfo)(` Scopes: (none)`);
|
|
74
|
-
}
|
|
75
|
-
if (app.redirect_uris.length > 0) {
|
|
76
|
-
app.redirect_uris.forEach((uri, i) => {
|
|
77
|
-
(0, logger_1.logInfo)(` Redirect URL ${i + 1}: ${uri}`);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
(0, logger_1.logInfo)(` Redirect URLs: (none)`);
|
|
82
|
-
}
|
|
83
|
-
process.stdout.write('\n');
|
|
84
|
-
}
|
|
85
|
-
// After displaying credentials, warn if local cache differs and prompt to update
|
|
86
|
-
if (diffs.length > 0) {
|
|
87
|
-
(0, logger_1.logWarn)(`Local credentials for app ${appId} differ from server (${diffs.join(', ')}).`);
|
|
88
|
-
if (process.stdin.isTTY && !options.json) {
|
|
89
|
-
const { shouldUpdate } = await inquirer_1.default.prompt([
|
|
90
|
-
{
|
|
91
|
-
type: 'confirm',
|
|
92
|
-
name: 'shouldUpdate',
|
|
93
|
-
message: 'Update local credentials to match the server?',
|
|
94
|
-
default: true,
|
|
95
|
-
},
|
|
96
|
-
]);
|
|
97
|
-
if (shouldUpdate) {
|
|
98
|
-
container_1.appService.syncAppCredentials(appId, app);
|
|
99
|
-
(0, logger_1.logInfo)(' Local credentials updated.\n');
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
// Non-interactive or JSON mode: auto-update silently
|
|
104
|
-
container_1.appService.syncAppCredentials(appId, app);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
// No diffs — still save if this is the first time (no local cache yet)
|
|
109
|
-
container_1.appService.syncAppCredentials(appId, app);
|
|
110
|
+
printCredentialsHuman(app, appId, secretDisplay);
|
|
110
111
|
}
|
|
112
|
+
await reconcileLocalCache(appId, app, diffs, options.json);
|
|
111
113
|
});
|
|
112
114
|
//# sourceMappingURL=credentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/commands/app/credentials.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAgC;AAChC,6CAAoD;AACpD,sCAAyC;AACzC,6CAA4C;AAC5C,+DAA+D;AAC/D,uDAAmD;AACnD,+CAA6C;AAC7C,qCAA6C;AAC7C,6CAA+C;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/commands/app/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/app/delete.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,aAAa;YACE,MAAM;YAAU,OAAO;WAAS,OAAO;
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/app/delete.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,aAAa;YACE,MAAM;YAAU,OAAO;WAAS,OAAO;mBAyFlE,CAAC"}
|
|
@@ -37,9 +37,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.deleteCommand = void 0;
|
|
40
|
-
const fs = __importStar(require("fs"));
|
|
41
|
-
const path = __importStar(require("path"));
|
|
42
|
-
const os = __importStar(require("os"));
|
|
40
|
+
const fs = __importStar(require("node:fs"));
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
const os = __importStar(require("node:os"));
|
|
43
43
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
44
44
|
const logger_1 = require("../../lib/logger");
|
|
45
45
|
const en_1 = require("../../lang/en");
|
|
@@ -109,6 +109,7 @@ exports.deleteCommand = (0, command_handler_1.withCommandHandler)(async (options
|
|
|
109
109
|
await container_1.appService.deleteApp(appId);
|
|
110
110
|
deleteSpinner.stop();
|
|
111
111
|
(0, config_1.deleteAppName)(appId);
|
|
112
|
+
(0, config_1.deleteAppCredentials)(appId);
|
|
112
113
|
if (options.json) {
|
|
113
114
|
(0, json_output_1.jsonOutput)({ deleted: true, appId });
|
|
114
115
|
return;
|
|
@@ -117,7 +118,7 @@ exports.deleteCommand = (0, command_handler_1.withCommandHandler)(async (options
|
|
|
117
118
|
// Offer to delete the local scaffolded project folder if it matches the deleted app
|
|
118
119
|
if (!options.force) {
|
|
119
120
|
const projectConfig = (0, config_1.readProjectConfig)();
|
|
120
|
-
if (projectConfig
|
|
121
|
+
if (projectConfig?.appId === appId) {
|
|
121
122
|
const cwd = process.cwd();
|
|
122
123
|
const { deleteFolder } = await inquirer_1.default.prompt([
|
|
123
124
|
{
|
|
@@ -128,10 +129,7 @@ exports.deleteCommand = (0, command_handler_1.withCommandHandler)(async (options
|
|
|
128
129
|
},
|
|
129
130
|
]);
|
|
130
131
|
if (deleteFolder) {
|
|
131
|
-
if (
|
|
132
|
-
(0, logger_1.logWarn)(en_1.messages.APP_DELETE_FOLDER_FAILED(cwd));
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
132
|
+
if (isSafeToDelete(cwd)) {
|
|
135
133
|
try {
|
|
136
134
|
fs.rmSync(cwd, { recursive: true, force: true });
|
|
137
135
|
(0, logger_1.logSuccess)(en_1.messages.APP_DELETE_FOLDER_SUCCESS(cwd));
|
|
@@ -140,6 +138,9 @@ exports.deleteCommand = (0, command_handler_1.withCommandHandler)(async (options
|
|
|
140
138
|
(0, logger_1.logWarn)(en_1.messages.APP_DELETE_FOLDER_FAILED(cwd));
|
|
141
139
|
}
|
|
142
140
|
}
|
|
141
|
+
else {
|
|
142
|
+
(0, logger_1.logWarn)(en_1.messages.APP_DELETE_FOLDER_FAILED(cwd));
|
|
143
|
+
}
|
|
143
144
|
}
|
|
144
145
|
}
|
|
145
146
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/app/delete.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/app/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/commands/app/scaffold.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/commands/app/scaffold.ts"],"names":[],"mappings":"AAyJA,eAAO,MAAM,eAAe;YACA,MAAM;WAAS,OAAO;mBAgEjD,CAAC"}
|
|
@@ -84,20 +84,8 @@ function formatFileTree(filePaths) {
|
|
|
84
84
|
render(tree, ' ');
|
|
85
85
|
return lines.join('\n');
|
|
86
86
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// means the user is already in a scaffolded project and likely meant to
|
|
90
|
-
// run `brevo app update` instead.
|
|
91
|
-
if (fs.existsSync(path.join(process.cwd(), 'app-config.json'))) {
|
|
92
|
-
throw new errors_1.CliError(en_1.messages.APP_SCAFFOLD_ALREADY_IN_PROJECT);
|
|
93
|
-
}
|
|
94
|
-
let appId = options.appId;
|
|
95
|
-
// Pick app if not specified
|
|
96
|
-
if (!appId) {
|
|
97
|
-
appId = await container_1.appService.pickApp('Select an app:');
|
|
98
|
-
}
|
|
99
|
-
// Fetch app details from API and sync local cache
|
|
100
|
-
const spinner = (0, ui_1.createSpinner)('Fetching app details...', { silent: options.json });
|
|
87
|
+
async function fetchAppContext(appId, silent) {
|
|
88
|
+
const spinner = (0, ui_1.createSpinner)('Fetching app details...', { silent });
|
|
101
89
|
const result = await container_1.appService.resolveAppCredentials(appId);
|
|
102
90
|
spinner.stop();
|
|
103
91
|
const appDetails = result?.app ?? null;
|
|
@@ -107,22 +95,18 @@ exports.scaffoldCommand = (0, command_handler_1.withCommandHandler)(async (optio
|
|
|
107
95
|
}
|
|
108
96
|
container_1.appService.syncAppCredentials(appId, result.app);
|
|
109
97
|
}
|
|
110
|
-
const clientId = appDetails?.client_id || constants_1.PLACEHOLDER_CLIENT_ID;
|
|
111
|
-
const clientSecret = appDetails?.client_secret || 'YOUR_CLIENT_SECRET';
|
|
112
|
-
// Use redirect URLs from the app (set during app create).
|
|
113
|
-
// For the local test server, prefer a localhost URL from the registered
|
|
114
|
-
// list. Fall back to DEFAULT_REDIRECT_URI so the scaffold works out of
|
|
115
|
-
// the box even when only production URLs are registered.
|
|
116
98
|
const serverRedirectUrls = appDetails?.redirect_uris ?? [];
|
|
117
99
|
const redirectUrls = serverRedirectUrls.length > 0 ? serverRedirectUrls : [constants_1.DEFAULT_REDIRECT_URI];
|
|
118
100
|
const localhostUri = redirectUrls.find((url) => url.startsWith('http://localhost') || url.startsWith('http://127.0.0.1'));
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
101
|
+
return {
|
|
102
|
+
appDetails: appDetails,
|
|
103
|
+
clientId: appDetails?.client_id || constants_1.PLACEHOLDER_CLIENT_ID,
|
|
104
|
+
clientSecret: appDetails?.client_secret || 'YOUR_CLIENT_SECRET',
|
|
105
|
+
redirectUrls,
|
|
106
|
+
redirectUri: localhostUri || constants_1.DEFAULT_REDIRECT_URI,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async function resolveTargetDir(defaultDir) {
|
|
126
110
|
const { outputDir } = await inquirer_1.default.prompt([
|
|
127
111
|
{
|
|
128
112
|
type: 'input',
|
|
@@ -132,71 +116,86 @@ exports.scaffoldCommand = (0, command_handler_1.withCommandHandler)(async (optio
|
|
|
132
116
|
},
|
|
133
117
|
]);
|
|
134
118
|
const targetDir = path.resolve(outputDir);
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
119
|
+
if (!fs.existsSync(targetDir)) {
|
|
120
|
+
return { targetDir, mergeOnly: false, chooseAgain: false };
|
|
121
|
+
}
|
|
122
|
+
const { action } = await inquirer_1.default.prompt([
|
|
123
|
+
{
|
|
124
|
+
type: 'list',
|
|
125
|
+
name: 'action',
|
|
126
|
+
message: en_1.messages.APP_SCAFFOLD_DIR_EXISTS,
|
|
127
|
+
choices: [
|
|
128
|
+
{ name: 'Overwrite existing files', value: 'overwrite' },
|
|
129
|
+
{ name: 'Merge (keep existing, add missing)', value: 'merge' },
|
|
130
|
+
{ name: 'Choose a different path', value: 'new' },
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
]);
|
|
134
|
+
return {
|
|
135
|
+
targetDir,
|
|
136
|
+
mergeOnly: action === 'merge',
|
|
137
|
+
chooseAgain: action === 'new',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function writeScaffoldFiles(files, targetDir, mergeOnly) {
|
|
141
|
+
let written = 0;
|
|
142
|
+
for (const file of files) {
|
|
143
|
+
const filePath = path.join(targetDir, file.name);
|
|
144
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
145
|
+
if (mergeOnly && fs.existsSync(filePath))
|
|
146
|
+
continue;
|
|
147
|
+
// Write .env.local with restricted permissions to protect secrets
|
|
148
|
+
const writeOptions = file.name.endsWith('.env.local') ? { mode: 0o600 } : {};
|
|
149
|
+
fs.writeFileSync(filePath, file.content, { encoding: 'utf-8', ...writeOptions });
|
|
150
|
+
written++;
|
|
151
|
+
}
|
|
152
|
+
return written;
|
|
153
|
+
}
|
|
154
|
+
exports.scaffoldCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
|
|
155
|
+
// Refuse to scaffold inside an existing project — app-config.json in cwd
|
|
156
|
+
// means the user is already in a scaffolded project and likely meant to
|
|
157
|
+
// run `brevo app update` instead.
|
|
158
|
+
if (fs.existsSync(path.join(process.cwd(), 'app-config.json'))) {
|
|
159
|
+
throw new errors_1.CliError(en_1.messages.APP_SCAFFOLD_ALREADY_IN_PROJECT);
|
|
156
160
|
}
|
|
157
|
-
const
|
|
158
|
-
|
|
161
|
+
const appId = options.appId ?? (await container_1.appService.pickApp('Select an app:'));
|
|
162
|
+
const ctx = await fetchAppContext(appId, options.json);
|
|
163
|
+
const slug = (ctx.appDetails?.name || 'my-app')
|
|
164
|
+
.toLowerCase()
|
|
165
|
+
.replaceAll(/[^a-z0-9]+/g, '-')
|
|
166
|
+
.replace(/^-|-$/g, '') || 'my-app';
|
|
167
|
+
const { targetDir, mergeOnly, chooseAgain } = await resolveTargetDir(`./${slug}`);
|
|
168
|
+
if (chooseAgain) {
|
|
169
|
+
return (0, exports.scaffoldCommand)({ ...options, appId });
|
|
170
|
+
}
|
|
171
|
+
const rawAppName = ctx.appDetails?.name || path.basename(targetDir);
|
|
159
172
|
const appName = rawAppName.replaceAll(/["\\\n\r\t]/g, '').trim() || 'my-app';
|
|
160
|
-
const scopes = appDetails?.scopes ?? ['all'];
|
|
173
|
+
const scopes = ctx.appDetails?.scopes ?? ['all'];
|
|
161
174
|
const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../../../package.json'), 'utf-8'));
|
|
162
175
|
const cliVersion = pkg.version;
|
|
163
176
|
const vars = {
|
|
164
177
|
'{{APP_NAME}}': appName,
|
|
165
178
|
'{{APP_SLUG}}': slug,
|
|
166
179
|
'{{APP_ID}}': String(appId),
|
|
167
|
-
'{{CLIENT_ID}}': clientId,
|
|
168
|
-
'{{CLIENT_SECRET}}': clientSecret,
|
|
169
|
-
'{{REDIRECT_URI}}': redirectUri,
|
|
170
|
-
'{{REDIRECT_URLS_JSON}}': JSON.stringify(redirectUrls),
|
|
180
|
+
'{{CLIENT_ID}}': ctx.clientId,
|
|
181
|
+
'{{CLIENT_SECRET}}': ctx.clientSecret,
|
|
182
|
+
'{{REDIRECT_URI}}': ctx.redirectUri,
|
|
183
|
+
'{{REDIRECT_URLS_JSON}}': JSON.stringify(ctx.redirectUrls),
|
|
171
184
|
'{{SCOPES_JSON}}': JSON.stringify(scopes),
|
|
172
185
|
'{{OAUTH_BASE}}': constants_1.OAUTH_BASE,
|
|
173
186
|
'{{OAUTH_REALM}}': constants_1.OAUTH_REALM,
|
|
174
187
|
'{{CLI_VERSION}}': cliVersion,
|
|
175
188
|
'{{MIN_CLI_VERSION}}': constants_1.MIN_CLI_VERSION,
|
|
176
189
|
};
|
|
177
|
-
// Create directory structure
|
|
178
190
|
fs.mkdirSync(path.join(targetDir, 'src', 'oauth'), { recursive: true });
|
|
179
|
-
// Load all templates from .tmpl files with variable substitution
|
|
180
191
|
const files = (0, templates_1.loadAllTemplates)(vars);
|
|
181
|
-
|
|
182
|
-
for (const file of files) {
|
|
183
|
-
const filePath = path.join(targetDir, file.name);
|
|
184
|
-
// Ensure parent directory exists for nested files
|
|
185
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
186
|
-
if (mergeOnly && fs.existsSync(filePath))
|
|
187
|
-
continue;
|
|
188
|
-
// Write .env.local with restricted permissions to protect secrets
|
|
189
|
-
const writeOptions = file.name.endsWith('.env.local') ? { mode: 0o600 } : {};
|
|
190
|
-
fs.writeFileSync(filePath, file.content, { encoding: 'utf-8', ...writeOptions });
|
|
191
|
-
written++;
|
|
192
|
-
}
|
|
192
|
+
const written = writeScaffoldFiles(files, targetDir, mergeOnly);
|
|
193
193
|
if (options.json) {
|
|
194
194
|
(0, json_output_1.jsonOutput)({ scaffolded: written, directory: targetDir });
|
|
195
195
|
return;
|
|
196
196
|
}
|
|
197
197
|
(0, logger_1.logSuccess)(en_1.messages.APP_SCAFFOLD_SUCCESS(written));
|
|
198
198
|
(0, logger_1.logInfo)(formatFileTree(files.map((f) => f.name)));
|
|
199
|
-
// Show next steps
|
|
200
199
|
const relativeDir = path.relative(process.cwd(), targetDir) || '.';
|
|
201
200
|
(0, ui_1.printBox)(en_1.messages.APP_SCAFFOLD_NEXT_STEPS_TITLE, en_1.messages.APP_SCAFFOLD_NEXT_STEPS_LINES(relativeDir));
|
|
202
201
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/commands/app/scaffold.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8B;AAC9B,gDAAkC;AAClC,wDAAgC;AAChC,mDAM6B;AAC7B,6CAAgE;AAChE,qCAAuD;AACvD,sCAAyC;AACzC,+DAA+D;AAC/D,6CAA4C;AAC5C,uDAAmD;AACnD,+CAA6C;AAC7C,+CAAmD;AAMnD,SAAS,cAAc,CAAC,SAAmB;IACzC,uBAAuB;IACvB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,SAAS,MAAM,CAAC,IAAc,EAAE,MAAc;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC9C,qDAAqD;YACrD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACrD,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/commands/app/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/app/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/app/start.ts"],"names":[],"mappings":"AA0KA,eAAO,MAAM,YAAY;cACK,MAAM;WAAS,MAAM;mBA4BlD,CAAC"}
|
|
@@ -124,8 +124,7 @@ async function ensureRedirectRegistered(config, port) {
|
|
|
124
124
|
(0, logger_1.logSuccess)(en_1.messages.APP_START_REDIRECT_REGISTERED(newRedirectUrl));
|
|
125
125
|
return newRedirectUrl;
|
|
126
126
|
}
|
|
127
|
-
|
|
128
|
-
const { feature } = options;
|
|
127
|
+
function resolveFeatureEntry(feature) {
|
|
129
128
|
if (!feature) {
|
|
130
129
|
const available = Object.entries(FEATURES)
|
|
131
130
|
.map(([name, f]) => ` ${name} ${f.description}`)
|
|
@@ -141,67 +140,37 @@ exports.startCommand = (0, command_handler_1.withCommandHandler)(async (options)
|
|
|
141
140
|
if (!fs.existsSync(entryFile)) {
|
|
142
141
|
throw new errors_1.CliError(en_1.messages.APP_START_FEATURE_NOT_FOUND(featureConfig.entry));
|
|
143
142
|
}
|
|
144
|
-
// Check for node_modules inside the feature directory — package.json
|
|
145
|
-
// is scoped per feature, so dependencies are installed alongside the entry.
|
|
146
143
|
const featureDir = path.dirname(featureConfig.entry);
|
|
147
144
|
if (!fs.existsSync(path.resolve(featureDir, 'node_modules'))) {
|
|
148
145
|
throw new errors_1.CliError(en_1.messages.APP_START_NO_DEPS(featureDir));
|
|
149
146
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if (
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
if (parsed.port)
|
|
162
|
-
port = Number(parsed.port);
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
// invalid redirect URL — fall back to default
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
// Check port availability before spawning
|
|
170
|
-
if (!(await (0, port_1.isPortAvailable)(port))) {
|
|
171
|
-
throw new errors_1.CliError(options.port
|
|
172
|
-
? en_1.messages.APP_START_CUSTOM_PORT_IN_USE(port)
|
|
173
|
-
: en_1.messages.APP_START_PORT_IN_USE(port));
|
|
147
|
+
return entryFile;
|
|
148
|
+
}
|
|
149
|
+
function resolvePort(config, optionsPort) {
|
|
150
|
+
if (optionsPort)
|
|
151
|
+
return optionsPort;
|
|
152
|
+
const redirectUrl = config?.auth?.redirectUrls?.[0];
|
|
153
|
+
if (!redirectUrl)
|
|
154
|
+
return constants_1.DEFAULT_PORT;
|
|
155
|
+
try {
|
|
156
|
+
const parsed = new URL(redirectUrl);
|
|
157
|
+
return parsed.port ? Number(parsed.port) : constants_1.DEFAULT_PORT;
|
|
174
158
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
// rejected by Brevo at runtime. Skipped when there's no linked app
|
|
178
|
-
// (no appId means we'd have nowhere to push the update).
|
|
179
|
-
let redirectUri;
|
|
180
|
-
if (config?.appId) {
|
|
181
|
-
redirectUri = await ensureRedirectRegistered(config, port);
|
|
159
|
+
catch {
|
|
160
|
+
return constants_1.DEFAULT_PORT;
|
|
182
161
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
// REDIRECT_URI is propagated whenever we have a registered localhost URL
|
|
186
|
-
// on the resolved port — otherwise the child reads the (possibly stale)
|
|
187
|
-
// value from .env.local, which would mismatch when --port overrides the
|
|
188
|
-
// scaffold-time port.
|
|
189
|
-
const childEnv = { ...process.env, PORT: String(port) };
|
|
190
|
-
if (redirectUri)
|
|
191
|
-
childEnv.REDIRECT_URI = redirectUri;
|
|
162
|
+
}
|
|
163
|
+
function runChildProcess(entryFile, childEnv, feature) {
|
|
192
164
|
const child = (0, node_child_process_1.spawn)(process.execPath, [entryFile], {
|
|
193
165
|
stdio: 'inherit',
|
|
194
166
|
env: childEnv,
|
|
195
167
|
});
|
|
196
|
-
// Forward signals for clean shutdown — use prependListener so child
|
|
197
|
-
// is killed before the global SIGINT/SIGTERM handlers in bin/index.ts
|
|
198
|
-
// call process.exit().
|
|
199
168
|
const onSignal = (signal) => {
|
|
200
169
|
child.kill(signal);
|
|
201
170
|
};
|
|
202
171
|
process.prependListener('SIGINT', onSignal);
|
|
203
172
|
process.prependListener('SIGTERM', onSignal);
|
|
204
|
-
|
|
173
|
+
return new Promise((resolve, reject) => {
|
|
205
174
|
child.on('close', (code) => {
|
|
206
175
|
process.removeListener('SIGINT', onSignal);
|
|
207
176
|
process.removeListener('SIGTERM', onSignal);
|
|
@@ -219,5 +188,26 @@ exports.startCommand = (0, command_handler_1.withCommandHandler)(async (options)
|
|
|
219
188
|
reject(new errors_1.CliError(en_1.messages.APP_START_FAILED(feature, err.message)));
|
|
220
189
|
});
|
|
221
190
|
});
|
|
191
|
+
}
|
|
192
|
+
exports.startCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
|
|
193
|
+
const { feature } = options;
|
|
194
|
+
const entryFile = resolveFeatureEntry(feature);
|
|
195
|
+
const config = (0, config_1.readProjectConfig)();
|
|
196
|
+
const port = resolvePort(config, options.port);
|
|
197
|
+
if (!(await (0, port_1.isPortAvailable)(port))) {
|
|
198
|
+
throw new errors_1.CliError(options.port
|
|
199
|
+
? en_1.messages.APP_START_CUSTOM_PORT_IN_USE(port)
|
|
200
|
+
: en_1.messages.APP_START_PORT_IN_USE(port));
|
|
201
|
+
}
|
|
202
|
+
// If the app is linked locally, make sure the resolved port is one of
|
|
203
|
+
// its registered redirect URLs — otherwise the OAuth callback will be
|
|
204
|
+
// rejected by Brevo at runtime. Skipped when there's no linked app
|
|
205
|
+
// (no appId means we'd have nowhere to push the update).
|
|
206
|
+
const redirectUri = config?.appId ? await ensureRedirectRegistered(config, port) : undefined;
|
|
207
|
+
(0, logger_1.logInfo)(`\n Starting ${feature}...`);
|
|
208
|
+
const childEnv = { ...process.env, PORT: String(port) };
|
|
209
|
+
if (redirectUri)
|
|
210
|
+
childEnv.REDIRECT_URI = redirectUri;
|
|
211
|
+
await runChildProcess(entryFile, childEnv, feature);
|
|
222
212
|
});
|
|
223
213
|
//# sourceMappingURL=start.js.map
|