@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,199 @@
|
|
|
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.scaffoldCommand = void 0;
|
|
40
|
+
const fs = __importStar(require("node:fs"));
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
43
|
+
const constants_1 = require("../../lib/constants");
|
|
44
|
+
const logger_1 = require("../../lib/logger");
|
|
45
|
+
const ui_1 = require("../../lib/ui");
|
|
46
|
+
const en_1 = require("../../lang/en");
|
|
47
|
+
const command_handler_1 = require("../../lib/command-handler");
|
|
48
|
+
const errors_1 = require("../../lib/errors");
|
|
49
|
+
const json_output_1 = require("../../lib/json-output");
|
|
50
|
+
const container_1 = require("../../container");
|
|
51
|
+
const templates_1 = require("../../templates");
|
|
52
|
+
function formatFileTree(filePaths) {
|
|
53
|
+
// Build tree structure
|
|
54
|
+
const tree = {};
|
|
55
|
+
for (const fp of filePaths) {
|
|
56
|
+
const parts = fp.split('/');
|
|
57
|
+
let node = tree;
|
|
58
|
+
for (const part of parts) {
|
|
59
|
+
node[part] = node[part] || {};
|
|
60
|
+
node = node[part];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const lines = [];
|
|
64
|
+
function render(node, prefix) {
|
|
65
|
+
const entries = Object.keys(node).sort((a, b) => {
|
|
66
|
+
// Directories (non-empty children) first, then files
|
|
67
|
+
const aIsDir = Object.keys(node[a] ?? {}).length > 0;
|
|
68
|
+
const bIsDir = Object.keys(node[b] ?? {}).length > 0;
|
|
69
|
+
if (aIsDir !== bIsDir)
|
|
70
|
+
return aIsDir ? -1 : 1;
|
|
71
|
+
return a.localeCompare(b);
|
|
72
|
+
});
|
|
73
|
+
entries.forEach((name, i) => {
|
|
74
|
+
const isLast = i === entries.length - 1;
|
|
75
|
+
const connector = isLast ? '└── ' : '├── ';
|
|
76
|
+
const children = node[name] ?? {};
|
|
77
|
+
const isDir = Object.keys(children).length > 0;
|
|
78
|
+
lines.push(`${prefix}${connector}${name}${isDir ? '/' : ''}`);
|
|
79
|
+
if (isDir) {
|
|
80
|
+
render(children, prefix + (isLast ? ' ' : '│ '));
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
render(tree, ' ');
|
|
85
|
+
return lines.join('\n');
|
|
86
|
+
}
|
|
87
|
+
exports.scaffoldCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
|
|
88
|
+
// Refuse to scaffold inside an existing project — app-config.json in cwd
|
|
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 });
|
|
101
|
+
const result = await container_1.appService.resolveAppCredentials(appId);
|
|
102
|
+
spinner.stop();
|
|
103
|
+
const appDetails = result?.app ?? null;
|
|
104
|
+
if (result) {
|
|
105
|
+
if (result.diffs.length > 0) {
|
|
106
|
+
(0, logger_1.logWarn)(`Local credentials for app ${appId} differ from server (${result.diffs.join(', ')}). Updating local cache.`);
|
|
107
|
+
}
|
|
108
|
+
container_1.appService.syncAppCredentials(appId, result.app);
|
|
109
|
+
}
|
|
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
|
+
const serverRedirectUrls = appDetails?.redirect_uris ?? [];
|
|
117
|
+
const redirectUrls = serverRedirectUrls.length > 0 ? serverRedirectUrls : [constants_1.DEFAULT_REDIRECT_URI];
|
|
118
|
+
const localhostUri = redirectUrls.find((url) => url.startsWith('http://localhost') || url.startsWith('http://127.0.0.1'));
|
|
119
|
+
const redirectUri = localhostUri || constants_1.DEFAULT_REDIRECT_URI;
|
|
120
|
+
// Prompt for output directory — default to app name slugified for filesystem
|
|
121
|
+
const slug = (appDetails?.name || 'my-app')
|
|
122
|
+
.toLowerCase()
|
|
123
|
+
.replaceAll(/[^a-z0-9]+/g, '-')
|
|
124
|
+
.replace(/^-|-$/g, '') || 'my-app';
|
|
125
|
+
const defaultDir = `./${slug}`;
|
|
126
|
+
const { outputDir } = await inquirer_1.default.prompt([
|
|
127
|
+
{
|
|
128
|
+
type: 'input',
|
|
129
|
+
name: 'outputDir',
|
|
130
|
+
message: en_1.messages.APP_SCAFFOLD_DIR_PROMPT,
|
|
131
|
+
default: defaultDir,
|
|
132
|
+
},
|
|
133
|
+
]);
|
|
134
|
+
const targetDir = path.resolve(outputDir);
|
|
135
|
+
// Handle existing directory
|
|
136
|
+
let mergeOnly = false;
|
|
137
|
+
if (fs.existsSync(targetDir)) {
|
|
138
|
+
const { action } = await inquirer_1.default.prompt([
|
|
139
|
+
{
|
|
140
|
+
type: 'list',
|
|
141
|
+
name: 'action',
|
|
142
|
+
message: en_1.messages.APP_SCAFFOLD_DIR_EXISTS,
|
|
143
|
+
choices: [
|
|
144
|
+
{ name: 'Overwrite existing files', value: 'overwrite' },
|
|
145
|
+
{ name: 'Merge (keep existing, add missing)', value: 'merge' },
|
|
146
|
+
{ name: 'Choose a different path', value: 'new' },
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
]);
|
|
150
|
+
if (action === 'new') {
|
|
151
|
+
return (0, exports.scaffoldCommand)({ ...options, appId });
|
|
152
|
+
}
|
|
153
|
+
if (action === 'merge') {
|
|
154
|
+
mergeOnly = true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const rawAppName = appDetails?.name || path.basename(targetDir);
|
|
158
|
+
// Sanitize app name: strip characters that could break JSON or template injection
|
|
159
|
+
const appName = rawAppName.replaceAll(/["\\\n\r\t]/g, '').trim() || 'my-app';
|
|
160
|
+
const scopes = appDetails?.scopes ?? ['all'];
|
|
161
|
+
const vars = {
|
|
162
|
+
'{{APP_NAME}}': appName,
|
|
163
|
+
'{{APP_SLUG}}': slug,
|
|
164
|
+
'{{APP_ID}}': String(appId),
|
|
165
|
+
'{{CLIENT_ID}}': clientId,
|
|
166
|
+
'{{CLIENT_SECRET}}': clientSecret,
|
|
167
|
+
'{{REDIRECT_URI}}': redirectUri,
|
|
168
|
+
'{{REDIRECT_URLS_JSON}}': JSON.stringify(redirectUrls),
|
|
169
|
+
'{{SCOPES_JSON}}': JSON.stringify(scopes),
|
|
170
|
+
'{{OAUTH_BASE}}': constants_1.OAUTH_BASE,
|
|
171
|
+
'{{OAUTH_REALM}}': constants_1.OAUTH_REALM,
|
|
172
|
+
};
|
|
173
|
+
// Create directory structure
|
|
174
|
+
fs.mkdirSync(path.join(targetDir, 'src', 'oauth'), { recursive: true });
|
|
175
|
+
// Load all templates from .tmpl files with variable substitution
|
|
176
|
+
const files = (0, templates_1.loadAllTemplates)(vars);
|
|
177
|
+
let written = 0;
|
|
178
|
+
for (const file of files) {
|
|
179
|
+
const filePath = path.join(targetDir, file.name);
|
|
180
|
+
// Ensure parent directory exists for nested files
|
|
181
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
182
|
+
if (mergeOnly && fs.existsSync(filePath))
|
|
183
|
+
continue;
|
|
184
|
+
// Write .env.local with restricted permissions to protect secrets
|
|
185
|
+
const writeOptions = file.name.endsWith('.env.local') ? { mode: 0o600 } : {};
|
|
186
|
+
fs.writeFileSync(filePath, file.content, { encoding: 'utf-8', ...writeOptions });
|
|
187
|
+
written++;
|
|
188
|
+
}
|
|
189
|
+
if (options.json) {
|
|
190
|
+
(0, json_output_1.jsonOutput)({ scaffolded: written, directory: targetDir });
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
(0, logger_1.logSuccess)(en_1.messages.APP_SCAFFOLD_SUCCESS(written));
|
|
194
|
+
(0, logger_1.logInfo)(formatFileTree(files.map((f) => f.name)));
|
|
195
|
+
// Show next steps
|
|
196
|
+
const relativeDir = path.relative(process.cwd(), targetDir) || '.';
|
|
197
|
+
(0, ui_1.printBox)(en_1.messages.APP_SCAFFOLD_NEXT_STEPS_TITLE, en_1.messages.APP_SCAFFOLD_NEXT_STEPS_LINES(relativeDir));
|
|
198
|
+
});
|
|
199
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/commands/app/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/app/start.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,YAAY;cACK,MAAM;WAAS,MAAM;mBA0FlD,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.startCommand = void 0;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const node_child_process_1 = require("node:child_process");
|
|
40
|
+
const logger_1 = require("../../lib/logger");
|
|
41
|
+
const errors_1 = require("../../lib/errors");
|
|
42
|
+
const en_1 = require("../../lang/en");
|
|
43
|
+
const command_handler_1 = require("../../lib/command-handler");
|
|
44
|
+
const port_1 = require("../../lib/port");
|
|
45
|
+
const constants_1 = require("../../lib/constants");
|
|
46
|
+
const config_1 = require("../../lib/config");
|
|
47
|
+
/**
|
|
48
|
+
* Feature registry — maps feature names to their entry files.
|
|
49
|
+
* Add new features here as they are added to the scaffold.
|
|
50
|
+
*/
|
|
51
|
+
const FEATURES = {
|
|
52
|
+
oauth: {
|
|
53
|
+
entry: 'src/oauth/server.js',
|
|
54
|
+
description: 'Local OAuth test server',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
exports.startCommand = (0, command_handler_1.withCommandHandler)(async (options) => {
|
|
58
|
+
const { feature } = options;
|
|
59
|
+
if (!feature) {
|
|
60
|
+
const available = Object.entries(FEATURES)
|
|
61
|
+
.map(([name, f]) => ` ${name} ${f.description}`)
|
|
62
|
+
.join('\n');
|
|
63
|
+
throw new errors_1.CliError(en_1.messages.APP_START_MISSING_FEATURE(available));
|
|
64
|
+
}
|
|
65
|
+
const featureConfig = FEATURES[feature];
|
|
66
|
+
if (!featureConfig) {
|
|
67
|
+
const available = Object.keys(FEATURES).join(', ');
|
|
68
|
+
throw new errors_1.CliError(en_1.messages.APP_START_UNKNOWN_FEATURE(feature, available));
|
|
69
|
+
}
|
|
70
|
+
const entryFile = path.resolve(featureConfig.entry);
|
|
71
|
+
if (!fs.existsSync(entryFile)) {
|
|
72
|
+
throw new errors_1.CliError(en_1.messages.APP_START_FEATURE_NOT_FOUND(featureConfig.entry));
|
|
73
|
+
}
|
|
74
|
+
// Check for node_modules inside the feature directory — package.json
|
|
75
|
+
// is scoped per feature, so dependencies are installed alongside the entry.
|
|
76
|
+
const featureDir = path.dirname(featureConfig.entry);
|
|
77
|
+
if (!fs.existsSync(path.resolve(featureDir, 'node_modules'))) {
|
|
78
|
+
throw new errors_1.CliError(en_1.messages.APP_START_NO_DEPS(featureDir));
|
|
79
|
+
}
|
|
80
|
+
// Derive port: explicit --port flag > redirect URI from app-config.json > DEFAULT_PORT
|
|
81
|
+
let port = constants_1.DEFAULT_PORT;
|
|
82
|
+
if (options.port) {
|
|
83
|
+
port = options.port;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const config = (0, config_1.readProjectConfig)();
|
|
87
|
+
const redirectUrl = config?.auth?.redirectUrls?.[0];
|
|
88
|
+
if (redirectUrl) {
|
|
89
|
+
try {
|
|
90
|
+
const parsed = new URL(redirectUrl);
|
|
91
|
+
if (parsed.port)
|
|
92
|
+
port = Number(parsed.port);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// invalid redirect URL — fall back to default
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Check port availability before spawning
|
|
100
|
+
if (!(await (0, port_1.isPortAvailable)(port))) {
|
|
101
|
+
throw new errors_1.CliError(options.port
|
|
102
|
+
? en_1.messages.APP_START_CUSTOM_PORT_IN_USE(port)
|
|
103
|
+
: en_1.messages.APP_START_PORT_IN_USE(port));
|
|
104
|
+
}
|
|
105
|
+
(0, logger_1.logInfo)(`\n Starting ${feature}...`);
|
|
106
|
+
// Spawn the feature server using the current Node.js executable
|
|
107
|
+
const child = (0, node_child_process_1.spawn)(process.execPath, [entryFile], {
|
|
108
|
+
stdio: 'inherit',
|
|
109
|
+
env: { ...process.env, PORT: String(port) },
|
|
110
|
+
});
|
|
111
|
+
// Forward signals for clean shutdown — use prependListener so child
|
|
112
|
+
// is killed before the global SIGINT/SIGTERM handlers in bin/index.ts
|
|
113
|
+
// call process.exit().
|
|
114
|
+
const onSignal = (signal) => {
|
|
115
|
+
child.kill(signal);
|
|
116
|
+
};
|
|
117
|
+
process.prependListener('SIGINT', onSignal);
|
|
118
|
+
process.prependListener('SIGTERM', onSignal);
|
|
119
|
+
await new Promise((resolve, reject) => {
|
|
120
|
+
child.on('close', (code) => {
|
|
121
|
+
process.removeListener('SIGINT', onSignal);
|
|
122
|
+
process.removeListener('SIGTERM', onSignal);
|
|
123
|
+
if (code && code !== 0) {
|
|
124
|
+
reject(new errors_1.CliError(en_1.messages.APP_START_EXITED(feature, code)));
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
(0, logger_1.logInfo)(`\n ${en_1.messages.APP_START_STOPPED}\n`);
|
|
128
|
+
resolve();
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
child.on('error', (err) => {
|
|
132
|
+
process.removeListener('SIGINT', onSignal);
|
|
133
|
+
process.removeListener('SIGTERM', onSignal);
|
|
134
|
+
reject(new errors_1.CliError(en_1.messages.APP_START_FAILED(feature, err.message)));
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/app/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/commands/app/test.ts"],"names":[],"mappings":"AAoSA,eAAO,MAAM,WAAW;WACG,MAAM;YAAU,MAAM;WAAS,OAAO;mBA+RhE,CAAC"}
|