@celsian/vura-cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,473 @@
1
+ /**
2
+ * `vura dev` — Start the local development server.
3
+ *
4
+ * Uses Vite under the hood with @celsian/vura-vite-plugin for:
5
+ * - API route hot-reloading (CelsianJS-compatible req/reply)
6
+ * - Server-mode page rendering (SSR with getServerData)
7
+ * - Task management endpoints (/__tasks/*)
8
+ * - File-based routing with automatic route scanning
9
+ * - TypeScript compilation via Vite's esbuild transform
10
+ *
11
+ * Usage:
12
+ * vura dev — Start dev server on port 3000
13
+ * vura dev --port 8080 — Start on custom port
14
+ */
15
+ import { buildManifest, matchRoute, compileRoutes, compilePageRoutes, matchPageRoute, getLogger, builtinRenderToString, wrapDocument, escapeHtml, parseNodeBody, executeWithHooks, finalizeNodeHandlerResult, createHookRegistry, validateRequest, reportError, formatErrorResponse, HttpError, getMimeType, } from '@celsian/vura-core';
16
+ export function parseDevOptions(args, projectRoot = process.cwd()) {
17
+ const portArg = args.find((_, i) => args[i - 1] === '--port');
18
+ const hostArg = args.find((_, i) => args[i - 1] === '--host');
19
+ return {
20
+ port: portArg ? parseInt(portArg, 10) : 3000,
21
+ host: hostArg || '127.0.0.1',
22
+ projectRoot,
23
+ };
24
+ }
25
+ export function isLanDevHost(host) {
26
+ return host === '0.0.0.0' || host === '::' || (!['127.0.0.1', 'localhost', '::1'].includes(host));
27
+ }
28
+ function normalizeSocketRemoteAddress(remoteAddress) {
29
+ const addr = remoteAddress || '';
30
+ return addr.startsWith('::ffff:') ? addr.slice(7) : addr;
31
+ }
32
+ export function isTaskAdminRequestAuthorized(headers, remoteAddress, env = process.env) {
33
+ const taskSecret = (env.THEN_TASK_SECRET || '').trim();
34
+ const authHeader = headers.authorization;
35
+ const authorization = Array.isArray(authHeader) ? authHeader[0] : authHeader;
36
+ if (taskSecret && authorization === `Bearer ${taskSecret}`)
37
+ return true;
38
+ const nodeEnv = (env.NODE_ENV || '').toLowerCase();
39
+ const isExplicitNonProduction = nodeEnv === 'development' || nodeEnv === 'dev' || nodeEnv === 'test';
40
+ const normalizedRemoteAddr = normalizeSocketRemoteAddress(remoteAddress);
41
+ const isLocal = normalizedRemoteAddr === '127.0.0.1' || normalizedRemoteAddr === '::1';
42
+ return !taskSecret && isExplicitNonProduction && isLocal;
43
+ }
44
+ /**
45
+ * Load .env files into process.env without overriding existing values.
46
+ * Priority order: .env.local > .env.{NODE_ENV} > .env
47
+ * (earlier files take precedence — later files don't override)
48
+ */
49
+ async function loadEnvFiles(projectRoot) {
50
+ const { readFile: rf } = await import('node:fs/promises');
51
+ const { join: pjoin } = await import('node:path');
52
+ const nodeEnv = process.env.NODE_ENV || 'development';
53
+ const envFiles = ['.env.local', `.env.${nodeEnv}`, '.env'];
54
+ for (const envFile of envFiles) {
55
+ try {
56
+ const content = await rf(pjoin(projectRoot, envFile), 'utf-8');
57
+ for (const line of content.split('\n')) {
58
+ const trimmed = line.trim();
59
+ if (!trimmed || trimmed.startsWith('#'))
60
+ continue;
61
+ const eqIndex = trimmed.indexOf('=');
62
+ if (eqIndex === -1)
63
+ continue;
64
+ const key = trimmed.slice(0, eqIndex).trim();
65
+ let value = trimmed.slice(eqIndex + 1).trim();
66
+ // Strip surrounding quotes
67
+ if ((value.startsWith('"') && value.endsWith('"')) ||
68
+ (value.startsWith("'") && value.endsWith("'"))) {
69
+ value = value.slice(1, -1);
70
+ }
71
+ // Don't override existing env vars (earlier files take precedence)
72
+ if (process.env[key] === undefined) {
73
+ process.env[key] = value;
74
+ }
75
+ }
76
+ }
77
+ catch {
78
+ // File doesn't exist — skip silently
79
+ }
80
+ }
81
+ }
82
+ export async function devCommand(args) {
83
+ const opts = parseDevOptions(args);
84
+ console.log('\n vura dev\n');
85
+ // Load .env files (.env.local > .env.{NODE_ENV} > .env)
86
+ await loadEnvFiles(opts.projectRoot);
87
+ // Scan routes for initial info
88
+ const manifest = await buildManifest(opts.projectRoot);
89
+ console.log(` Found ${manifest.api.length} API routes, ${manifest.pages.length} pages`);
90
+ // Try to use Vite with our plugin
91
+ try {
92
+ const vite = await import('vite');
93
+ // @ts-ignore — resolved at runtime via workspace link
94
+ const pluginMod = await import('@celsian/vura-vite-plugin');
95
+ const thenPlugin = pluginMod.thenPlugin ?? pluginMod.default;
96
+ const server = await vite.createServer({
97
+ root: opts.projectRoot,
98
+ server: {
99
+ port: opts.port,
100
+ host: opts.host,
101
+ },
102
+ plugins: [
103
+ thenPlugin({ root: opts.projectRoot }),
104
+ ],
105
+ });
106
+ await server.listen();
107
+ server.printUrls();
108
+ if (isLanDevHost(opts.host)) {
109
+ console.warn(` [vura] Dev server exposed on ${opts.host}. Only use --host for trusted LAN testing.`);
110
+ }
111
+ console.log();
112
+ // Print route table
113
+ printRouteTable(manifest);
114
+ }
115
+ catch (err) {
116
+ // Vite not available — fall back to standalone Node server
117
+ if (err.code === 'ERR_MODULE_NOT_FOUND' || err.message?.includes('Cannot find')) {
118
+ console.log(' Vite not found, starting standalone dev server...\n');
119
+ await startStandaloneServer(manifest, opts);
120
+ }
121
+ else {
122
+ throw err;
123
+ }
124
+ }
125
+ }
126
+ function printRouteTable(manifest) {
127
+ console.log(' API Routes:');
128
+ for (const route of manifest.api) {
129
+ const methods = route.methods.join(', ');
130
+ const icon = route.kind === 'serverless' ? 'λ' : route.kind === 'hot' ? '●' : '⏳';
131
+ console.log(` ${icon} ${methods.padEnd(18)} ${route.urlPattern}`);
132
+ }
133
+ if (manifest.pages.length > 0) {
134
+ console.log(' Pages:');
135
+ for (const page of manifest.pages) {
136
+ const icon = page.mode === 'static' ? '◆' : page.mode === 'server' ? '◈' : page.mode === 'client' ? '◇' : '⬡';
137
+ console.log(` ${icon} ${page.mode.padEnd(18)} ${page.urlPattern}`);
138
+ }
139
+ }
140
+ console.log();
141
+ }
142
+ /**
143
+ * Standalone dev server without Vite — for backend-only projects (CelsianJS).
144
+ * Uses Node's built-in HTTP server with file watching.
145
+ */
146
+ async function startStandaloneServer(manifest, opts) {
147
+ const { createServer } = await import('node:http');
148
+ const { watch } = await import('node:fs');
149
+ const { readFile: readFileAsync, writeFile: writeFileAsync, mkdir: mkdirAsync } = await import('node:fs/promises');
150
+ const { join, resolve } = await import('node:path');
151
+ const { pathToFileURL } = await import('node:url');
152
+ const { build: esbuild } = await import('esbuild');
153
+ const tmpDir = join(opts.projectRoot, 'node_modules', '.then-dev-cache');
154
+ await mkdirAsync(tmpDir, { recursive: true });
155
+ // Determine JSX import source
156
+ let jsxImportSource = '@celsian/vura-core';
157
+ try {
158
+ // @ts-ignore — optional dependency
159
+ await import('what-framework/jsx-runtime');
160
+ jsxImportSource = 'what-framework';
161
+ }
162
+ catch { }
163
+ async function loadHandler(filePath) {
164
+ const absPath = resolve(opts.projectRoot, filePath);
165
+ const isPage = filePath.endsWith('.tsx') || filePath.endsWith('.jsx');
166
+ const result = await esbuild({
167
+ entryPoints: [absPath],
168
+ bundle: true,
169
+ format: 'esm',
170
+ target: 'es2022',
171
+ platform: 'node',
172
+ write: false,
173
+ outfile: 'handler.mjs',
174
+ ...(isPage ? { jsx: 'automatic', jsxImportSource } : {}),
175
+ });
176
+ const hash = Date.now().toString(36);
177
+ const outPath = join(tmpDir, `${filePath.replace(/[/\\:]/g, '_')}_${hash}.mjs`);
178
+ await writeFileAsync(outPath, result.outputFiles[0].text);
179
+ return import(pathToFileURL(outPath).href);
180
+ }
181
+ const logger = getLogger();
182
+ // Hook registry for the dev server — routes can register hooks via exports
183
+ const hookRegistry = createHookRegistry();
184
+ hookRegistry.setLogger(logger);
185
+ // Pre-compile route regexes at startup — recompiled only on file change
186
+ let compiledRoutes = compileRoutes(manifest.api);
187
+ // In dev mode, compile ALL page routes — not just server/hybrid.
188
+ // Static and client pages also need on-the-fly SSR rendering during development
189
+ // because there's no Vite to serve them as static assets.
190
+ let compiledPages = compilePageRoutes(manifest.pages);
191
+ const server = createServer(async (req, res) => {
192
+ const url = new URL(req.url ?? '/', `http://${req.headers.host}`);
193
+ const method = (req.method ?? 'GET').toUpperCase();
194
+ const reqCtx = logger.requestStart(method, url.pathname);
195
+ const log = logger.child(reqCtx.requestId);
196
+ // Track response to log at end
197
+ res.on("finish", () => {
198
+ logger.requestEnd(reqCtx, res.statusCode);
199
+ });
200
+ // CORS headers are opt-in for dev mode; no wildcard CORS by default.
201
+ const corsOrigin = process.env.THEN_CORS_ORIGIN;
202
+ if (corsOrigin) {
203
+ res.setHeader('Access-Control-Allow-Origin', corsOrigin);
204
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS');
205
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
206
+ res.setHeader('Access-Control-Max-Age', '86400');
207
+ }
208
+ // Handle CORS preflight
209
+ if (method === 'OPTIONS') {
210
+ res.writeHead(204);
211
+ res.end();
212
+ return;
213
+ }
214
+ // Static file serving from public/ directory
215
+ if (method === 'GET' || method === 'HEAD') {
216
+ const publicDir = join(opts.projectRoot, 'public');
217
+ const safePath = url.pathname.replace(/\.\./g, ''); // basic traversal guard
218
+ const staticPath = join(publicDir, safePath);
219
+ // Only serve if path is within publicDir (prevent traversal)
220
+ const { normalize: normPath, resolve: resolvePath } = await import('node:path');
221
+ const normalizedStatic = normPath(resolvePath(staticPath));
222
+ const normalizedPublic = normPath(resolvePath(publicDir));
223
+ if (normalizedStatic.startsWith(normalizedPublic + '/') || normalizedStatic === normalizedPublic) {
224
+ try {
225
+ const { stat: statAsync } = await import('node:fs/promises');
226
+ const fileStat = await statAsync(normalizedStatic);
227
+ if (fileStat.isFile()) {
228
+ const { createReadStream } = await import('node:fs');
229
+ const contentType = getMimeType(normalizedStatic);
230
+ res.writeHead(200, {
231
+ 'Content-Type': contentType,
232
+ 'Content-Length': fileStat.size.toString(),
233
+ 'Cache-Control': 'no-cache',
234
+ });
235
+ if (method === 'HEAD') {
236
+ res.end();
237
+ return;
238
+ }
239
+ const stream = createReadStream(normalizedStatic);
240
+ stream.pipe(res);
241
+ stream.on('error', () => { if (!res.writableEnded)
242
+ res.end(); });
243
+ return;
244
+ }
245
+ }
246
+ catch {
247
+ // File doesn't exist — fall through to route matching
248
+ }
249
+ }
250
+ }
251
+ // Health check
252
+ if (url.pathname === '/__health') {
253
+ res.writeHead(200, { 'Content-Type': 'application/json' });
254
+ res.end(JSON.stringify({ ok: true, framework: 'Vura', mode: 'dev' }));
255
+ return;
256
+ }
257
+ // Task management endpoints
258
+ if (url.pathname.startsWith('/__tasks')) {
259
+ if (!isTaskAdminRequestAuthorized(req.headers, req.socket?.remoteAddress)) {
260
+ res.writeHead(403, { 'Content-Type': 'application/json' });
261
+ res.end(JSON.stringify({ error: 'Forbidden' }));
262
+ return;
263
+ }
264
+ }
265
+ if (url.pathname === '/__tasks' && method === 'GET') {
266
+ const taskRoutes = manifest.api.filter(r => r.kind === 'task');
267
+ res.writeHead(200, { 'Content-Type': 'application/json' });
268
+ res.end(JSON.stringify({
269
+ tasks: taskRoutes.map(r => ({ name: r.urlPattern, config: r.config })),
270
+ }));
271
+ return;
272
+ }
273
+ if (url.pathname.startsWith('/__tasks/') && method === 'POST') {
274
+ const taskName = url.pathname.slice('/__tasks/'.length);
275
+ const taskRoutes = manifest.api.filter(r => r.kind === 'task');
276
+ const taskRoute = taskRoutes.find(r => r.urlPattern.replace(/^\/api\//, '').replace(/\//g, '.') === taskName);
277
+ if (!taskRoute) {
278
+ res.writeHead(404, { 'Content-Type': 'application/json' });
279
+ res.end(JSON.stringify({ error: 'Task not found: ' + taskName }));
280
+ return;
281
+ }
282
+ try {
283
+ const mod = await loadHandler(taskRoute.filePath);
284
+ const body = await parseNodeBody(req);
285
+ const result = await mod.POST({
286
+ taskId: String(Date.now()),
287
+ input: body?.input,
288
+ attempt: 1,
289
+ });
290
+ res.writeHead(200, { 'Content-Type': 'application/json' });
291
+ res.end(JSON.stringify({ status: 'completed', result }));
292
+ }
293
+ catch (err) {
294
+ reportError(err instanceof Error ? err : new Error(String(err.message)), { method, path: url.pathname, requestId: reqCtx.requestId }, logger);
295
+ res.writeHead(500, { 'Content-Type': 'application/json' });
296
+ res.end(JSON.stringify({ error: err.message }));
297
+ }
298
+ return;
299
+ }
300
+ // Route info
301
+ if (url.pathname === '/' && manifest.pages.length === 0) {
302
+ res.writeHead(200, { 'Content-Type': 'application/json' });
303
+ res.end(JSON.stringify({
304
+ framework: 'Vura',
305
+ mode: 'dev',
306
+ routes: manifest.api.map(r => r.methods.map(m => `${m} ${r.urlPattern}`)).flat(),
307
+ }));
308
+ return;
309
+ }
310
+ // Try API route matching (uses pre-compiled regexes)
311
+ const match = matchRoute(compiledRoutes, method, url.pathname);
312
+ if (match) {
313
+ const mod = await loadHandler(match.route.filePath);
314
+ const handlerFn = mod[method];
315
+ if (typeof handlerFn !== 'function') {
316
+ res.writeHead(405, { 'Content-Type': 'application/json' });
317
+ res.end(JSON.stringify({ error: `Method ${method} not exported` }));
318
+ return;
319
+ }
320
+ const body = await parseNodeBody(req);
321
+ const cReq = {
322
+ method,
323
+ url: url.pathname,
324
+ headers: req.headers,
325
+ params: match.params,
326
+ query: Object.fromEntries(url.searchParams.entries()),
327
+ body,
328
+ parsedBody: body,
329
+ };
330
+ let statusCode = 200;
331
+ const headers = { 'content-type': 'application/json' };
332
+ const cReply = {
333
+ status(code) { statusCode = code; return cReply; },
334
+ header(name, value) { headers[name] = value; return cReply; },
335
+ json(data) {
336
+ res.writeHead(statusCode, headers);
337
+ res.end(JSON.stringify(data));
338
+ return null;
339
+ },
340
+ send(data) {
341
+ res.writeHead(statusCode, headers);
342
+ res.end(data);
343
+ return null;
344
+ },
345
+ redirect(url, status) {
346
+ res.writeHead(status || 302, { 'location': url });
347
+ res.end('Redirecting to ' + url);
348
+ return null;
349
+ },
350
+ };
351
+ // Extract route-level hooks if the module exports them
352
+ const routeHooks = mod.hooks;
353
+ // Validate request if route exports a schema
354
+ if (mod.schema) {
355
+ const validationError = validateRequest(cReq, mod.schema);
356
+ if (validationError) {
357
+ res.writeHead(validationError.statusCode, { 'content-type': 'application/json' });
358
+ res.end(JSON.stringify(validationError.body));
359
+ return;
360
+ }
361
+ }
362
+ // Execute handler with full hook lifecycle
363
+ const result = await executeWithHooks(hookRegistry, cReq, cReply, async () => {
364
+ return handlerFn(cReq, cReply);
365
+ }, routeHooks);
366
+ // If hooks/handler errored and response wasn't sent, send structured error
367
+ if (result.hadError && !res.writableEnded) {
368
+ const error = new HttpError(result.statusCode, 'HANDLER_ERROR', 'Internal Server Error');
369
+ const { statusCode: errStatus, body: errBody } = formatErrorResponse(error, 'development');
370
+ reportError(error, { method, path: url.pathname, requestId: reqCtx.requestId }, logger);
371
+ res.writeHead(errStatus, { 'content-type': 'application/json' });
372
+ res.end(JSON.stringify(errBody));
373
+ }
374
+ if (!result.hadError) {
375
+ await finalizeNodeHandlerResult(result.result, res, { statusCode, headers });
376
+ }
377
+ return;
378
+ }
379
+ // Try server-mode page matching (uses shared compilePageRoutes/matchPageRoute)
380
+ if (method === 'GET' && !/\.\w+$/.test(url.pathname)) {
381
+ const pageMatch = matchPageRoute(compiledPages, url.pathname);
382
+ if (pageMatch) {
383
+ try {
384
+ const mod = await loadHandler(pageMatch.page.filePath);
385
+ const Component = mod.default;
386
+ const pageConfig = mod.page ?? {};
387
+ if (typeof Component === 'function') {
388
+ let serverData = {};
389
+ if (typeof mod.getServerData === 'function') {
390
+ serverData = await mod.getServerData({
391
+ params: pageMatch.params,
392
+ url: url.pathname,
393
+ query: Object.fromEntries(url.searchParams.entries()),
394
+ });
395
+ }
396
+ let vnode = Component({ ...serverData, params: pageMatch.params });
397
+ // Wrap in layout chain if layouts are defined (outermost first)
398
+ if (pageMatch.page.layouts && pageMatch.page.layouts.length > 0) {
399
+ // Load layouts innermost-last, wrap from inside out
400
+ for (let li = pageMatch.page.layouts.length - 1; li >= 0; li--) {
401
+ const layoutMod = await loadHandler(pageMatch.page.layouts[li]);
402
+ const LayoutComponent = layoutMod.default;
403
+ if (typeof LayoutComponent === 'function') {
404
+ vnode = LayoutComponent({ children: vnode, params: pageMatch.params });
405
+ }
406
+ }
407
+ }
408
+ const bodyHtml = builtinRenderToString(vnode);
409
+ const html = wrapDocument(bodyHtml, {
410
+ title: pageConfig.title ?? 'Vura App',
411
+ meta: pageConfig.meta ?? [],
412
+ styles: pageConfig.styles ?? [],
413
+ scripts: pageConfig.scripts ?? [],
414
+ head: pageConfig.head ?? '',
415
+ });
416
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
417
+ res.end(html);
418
+ return;
419
+ }
420
+ }
421
+ catch (err) {
422
+ const error = err instanceof Error ? err : new Error(String(err));
423
+ reportError(error, { method: 'GET', path: url.pathname, requestId: reqCtx.requestId }, logger);
424
+ log.error(`page render error ${url.pathname}`, { error: err.message });
425
+ if (!res.writableEnded) {
426
+ res.writeHead(500, { 'Content-Type': 'text/html' });
427
+ res.end(`<h1>500 — Server Error</h1><pre>${escapeHtml(err.message)}</pre>`);
428
+ }
429
+ return;
430
+ }
431
+ }
432
+ }
433
+ // 404
434
+ res.writeHead(404, { 'Content-Type': 'application/json' });
435
+ res.end(JSON.stringify({ error: 'Not Found', path: url.pathname }));
436
+ });
437
+ // Watch for file changes and re-scan manifest
438
+ const apiDir = join(opts.projectRoot, 'src', 'api');
439
+ const pagesDir = join(opts.projectRoot, 'src', 'pages');
440
+ const watchDirs = [apiDir, pagesDir];
441
+ for (const dir of watchDirs) {
442
+ try {
443
+ const watcher = watch(dir, { recursive: true }, async (event, filename) => {
444
+ const prefix = dir === apiDir ? 'src/api' : 'src/pages';
445
+ console.log(` [vura] ${event}: ${prefix}/${filename} — re-scanning routes`);
446
+ const { buildManifest: rescan, compileRoutes: recompile, compilePageRoutes: recompilePages } = await import('@celsian/vura-core');
447
+ manifest = await rescan(opts.projectRoot);
448
+ compiledRoutes = recompile(manifest.api);
449
+ compiledPages = recompilePages(manifest.pages);
450
+ });
451
+ process.on('SIGINT', () => { watcher.close(); process.exit(0); });
452
+ }
453
+ catch {
454
+ // Watch may fail if directory doesn't exist yet
455
+ }
456
+ }
457
+ server.listen(opts.port, opts.host, () => {
458
+ console.log(` Server listening on http://${opts.host}:${opts.port}\n`);
459
+ // Warn once at startup when the user explicitly exposes the dev server beyond loopback.
460
+ if (isLanDevHost(opts.host)) {
461
+ console.warn(` [vura] Dev server exposed on ${opts.host}. Only use --host for trusted LAN testing.`);
462
+ }
463
+ printRouteTable(manifest);
464
+ });
465
+ // Keep process alive
466
+ await new Promise(() => { });
467
+ }
468
+ // All rendering, matching, parsing, and escaping utilities are now imported
469
+ // from @celsian/vura-core — no local copies needed. See:
470
+ // builtinRenderToString, wrapDocument, escapeHtml — from static-render.ts
471
+ // compilePageRoutes, matchPageRoute — from match.ts
472
+ // parseNodeBody — from body-parser.ts
473
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `vura manifest` — Print the route manifest for debugging.
3
+ *
4
+ * Scans the project's src/api/ and src/pages/ directories
5
+ * and outputs the discovered routes with their kinds and methods.
6
+ */
7
+ export declare function manifestCommand(args: string[]): Promise<void>;
8
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/commands/manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCnE"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `vura manifest` — Print the route manifest for debugging.
3
+ *
4
+ * Scans the project's src/api/ and src/pages/ directories
5
+ * and outputs the discovered routes with their kinds and methods.
6
+ */
7
+ import { buildManifest } from '@celsian/vura-core';
8
+ import { loadConfig } from '../config-loader.js';
9
+ export async function manifestCommand(args) {
10
+ const projectRoot = process.cwd();
11
+ const config = await loadConfig(projectRoot);
12
+ console.log('\n Scanning routes...\n');
13
+ const manifest = await buildManifest(config.root ?? projectRoot);
14
+ // API routes
15
+ if (manifest.api.length > 0) {
16
+ console.log(' API Routes:');
17
+ for (const route of manifest.api) {
18
+ const methods = route.methods.join(', ');
19
+ console.log(` ${route.kind.padEnd(12)} ${methods.padEnd(20)} ${route.urlPattern}`);
20
+ }
21
+ console.log();
22
+ }
23
+ else {
24
+ console.log(' No API routes found in src/api/\n');
25
+ }
26
+ // Pages
27
+ if (manifest.pages.length > 0) {
28
+ console.log(' Pages:');
29
+ for (const page of manifest.pages) {
30
+ console.log(` ${page.mode.padEnd(12)} ${page.urlPattern}`);
31
+ }
32
+ console.log();
33
+ }
34
+ else {
35
+ console.log(' No pages found in src/pages/\n');
36
+ }
37
+ console.log(` Total: ${manifest.api.length} API routes, ${manifest.pages.length} pages`);
38
+ console.log(` Timestamp: ${manifest.timestamp}\n`);
39
+ // JSON output if --json flag
40
+ if (args.includes('--json')) {
41
+ console.log(JSON.stringify(manifest, null, 2));
42
+ }
43
+ }
44
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/commands/manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAc;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC;IAEjE,aAAa;IACb,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED,QAAQ;IACR,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,GAAG,CAAC,MAAM,gBAAgB,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC;IAEpD,6BAA6B;IAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Load vura.config.js from the project root.
3
+ *
4
+ * Supports:
5
+ * - vura.config.js (JavaScript)
6
+ * - vura.config.mjs (ESM)
7
+ * - vura.config.ts (TypeScript, only when the current runtime can import it)
8
+ *
9
+ * Falls back to default config if no file exists.
10
+ */
11
+ import type { ThenConfig } from '@celsian/vura-core';
12
+ export declare function loadConfig(projectRoot: string): Promise<ThenConfig>;
13
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../src/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA4BzE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Load vura.config.js from the project root.
3
+ *
4
+ * Supports:
5
+ * - vura.config.js (JavaScript)
6
+ * - vura.config.mjs (ESM)
7
+ * - vura.config.ts (TypeScript, only when the current runtime can import it)
8
+ *
9
+ * Falls back to default config if no file exists.
10
+ */
11
+ import { existsSync } from 'node:fs';
12
+ import { join, resolve } from 'node:path';
13
+ import { pathToFileURL } from 'node:url';
14
+ const CONFIG_FILES = ['vura.config.js', 'vura.config.mjs', 'vura.config.ts'];
15
+ export async function loadConfig(projectRoot) {
16
+ const root = resolve(projectRoot);
17
+ for (const filename of CONFIG_FILES) {
18
+ const configPath = join(root, filename);
19
+ if (!existsSync(configPath))
20
+ continue;
21
+ // For .ts files, we need to use a loader or compile first.
22
+ // For now, support .js and .mjs directly. TypeScript support
23
+ // will come via the Vite plugin or tsx loader.
24
+ if (filename.endsWith('.ts')) {
25
+ // Try dynamic import with tsx if available
26
+ try {
27
+ const mod = await import(pathToFileURL(configPath).href);
28
+ return { root, ...normalizeConfig(mod.default ?? mod) };
29
+ }
30
+ catch {
31
+ console.warn(` ⚠ Found ${filename} but could not import it. Using defaults.`);
32
+ console.warn(` Install tsx globally for TypeScript config support.`);
33
+ continue;
34
+ }
35
+ }
36
+ const mod = await import(pathToFileURL(configPath).href);
37
+ return { root, ...normalizeConfig(mod.default ?? mod) };
38
+ }
39
+ // No config file found — return defaults
40
+ return { root };
41
+ }
42
+ function normalizeConfig(raw) {
43
+ if (!raw || typeof raw !== 'object')
44
+ return {};
45
+ return raw;
46
+ }
47
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../src/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,YAAY,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAElC,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAEtC,2DAA2D;QAC3D,6DAA6D;QAC7D,+CAA+C;QAC/C,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,2CAA2C;YAC3C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;gBACzD,OAAO,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,EAAE,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,aAAa,QAAQ,2CAA2C,CAAC,CAAC;gBAC/E,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;gBACxE,SAAS;YACX,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;QACzD,OAAO,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,EAAE,CAAC;IAC1D,CAAC;IAED,yCAAyC;IACzC,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/C,OAAO,GAA0B,CAAC;AACpC,CAAC"}