@illumiarq/lumis 1.1.4 → 1.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.
Files changed (47) hide show
  1. package/dist/cli.js +80 -5
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/app/cache-workflows.d.ts +7 -0
  4. package/dist/commands/app/cache-workflows.d.ts.map +1 -0
  5. package/dist/commands/app/cache-workflows.js +134 -0
  6. package/dist/commands/app/cache-workflows.js.map +1 -0
  7. package/dist/commands/app/command-runtime.d.ts +11 -0
  8. package/dist/commands/app/command-runtime.d.ts.map +1 -0
  9. package/dist/commands/app/command-runtime.js +41 -0
  10. package/dist/commands/app/command-runtime.js.map +1 -0
  11. package/dist/commands/app/config-cache.d.ts +3 -0
  12. package/dist/commands/app/config-cache.d.ts.map +1 -0
  13. package/dist/commands/app/config-cache.js +75 -0
  14. package/dist/commands/app/config-cache.js.map +1 -0
  15. package/dist/commands/app/config-publish.d.ts +2 -0
  16. package/dist/commands/app/config-publish.d.ts.map +1 -0
  17. package/dist/commands/app/config-publish.js +68 -0
  18. package/dist/commands/app/config-publish.js.map +1 -0
  19. package/dist/commands/app/config-stubs.d.ts +3 -0
  20. package/dist/commands/app/config-stubs.d.ts.map +1 -0
  21. package/dist/commands/app/config-stubs.js +154 -0
  22. package/dist/commands/app/config-stubs.js.map +1 -0
  23. package/dist/commands/app/database.d.ts +3 -0
  24. package/dist/commands/app/database.d.ts.map +1 -0
  25. package/dist/commands/app/database.js +219 -0
  26. package/dist/commands/app/database.js.map +1 -0
  27. package/dist/commands/app/docs.d.ts +7 -0
  28. package/dist/commands/app/docs.d.ts.map +1 -0
  29. package/dist/commands/app/docs.js +59 -0
  30. package/dist/commands/app/docs.js.map +1 -0
  31. package/dist/commands/app/routes.d.ts +5 -0
  32. package/dist/commands/app/routes.d.ts.map +1 -0
  33. package/dist/commands/app/routes.js +91 -0
  34. package/dist/commands/app/routes.js.map +1 -0
  35. package/dist/commands/app/security.d.ts +3 -0
  36. package/dist/commands/app/security.d.ts.map +1 -0
  37. package/dist/commands/app/security.js +15 -0
  38. package/dist/commands/app/security.js.map +1 -0
  39. package/dist/commands/app/worker-schedule.d.ts +5 -0
  40. package/dist/commands/app/worker-schedule.d.ts.map +1 -0
  41. package/dist/commands/app/worker-schedule.js +94 -0
  42. package/dist/commands/app/worker-schedule.js.map +1 -0
  43. package/dist/commands/app-commands.d.ts +7 -15
  44. package/dist/commands/app-commands.d.ts.map +1 -1
  45. package/dist/commands/app-commands.js +12 -642
  46. package/dist/commands/app-commands.js.map +1 -1
  47. package/package.json +2 -2
@@ -0,0 +1,154 @@
1
+ export const CONFIG_STUBS = {
2
+ mail: `import { env } from '../bootstrap/env.js';
3
+
4
+ const mail = {
5
+ driver: env.MAIL_DRIVER ?? 'stub',
6
+
7
+ smtp: {
8
+ host: env.SMTP_HOST ?? 'localhost',
9
+ port: Number(env.SMTP_PORT ?? 1025),
10
+ secure: env.SMTP_SECURE === 'true',
11
+ user: env.SMTP_USER,
12
+ pass: env.SMTP_PASS,
13
+ },
14
+
15
+ resend: {
16
+ apiKey: env.RESEND_API_KEY ?? '',
17
+ },
18
+
19
+ from: {
20
+ address: env.MAIL_FROM_ADDRESS ?? 'hello@example.com',
21
+ name: env.MAIL_FROM_NAME ?? 'Example App',
22
+ },
23
+ } as const;
24
+
25
+ export default mail;
26
+ `,
27
+ queue: `import { env } from '../bootstrap/env.js';
28
+
29
+ const queue = {
30
+ driver: env.QUEUE_DRIVER ?? 'stub',
31
+
32
+ bullmq: {
33
+ connection: {
34
+ host: env.REDIS_HOST ?? '127.0.0.1',
35
+ port: Number(env.REDIS_PORT ?? 6379),
36
+ },
37
+ defaultQueue: 'default',
38
+ concurrency: Number(env.QUEUE_CONCURRENCY ?? 5),
39
+ },
40
+ } as const;
41
+
42
+ export default queue;
43
+ `,
44
+ cache: `import { env } from '../bootstrap/env.js';
45
+
46
+ const cache = {
47
+ driver: env.CACHE_DRIVER ?? 'memory',
48
+
49
+ ttl: Number(env.CACHE_TTL ?? 3600),
50
+
51
+ redis: {
52
+ host: env.REDIS_HOST ?? '127.0.0.1',
53
+ port: Number(env.REDIS_PORT ?? 6379),
54
+ password: env.REDIS_PASSWORD,
55
+ db: Number(env.REDIS_DB ?? 0),
56
+ keyPrefix: env.CACHE_PREFIX ?? 'cache:',
57
+ },
58
+ } as const;
59
+
60
+ export default cache;
61
+ `,
62
+ storage: `import { env } from '../bootstrap/env.js';
63
+
64
+ const storage = {
65
+ disks: {
66
+ default: {
67
+ driver: env.STORAGE_DRIVER ?? 'local',
68
+ root: env.STORAGE_ROOT ?? 'storage/app',
69
+ },
70
+
71
+ s3: {
72
+ driver: 's3' as const,
73
+ bucket: env.AWS_BUCKET ?? '',
74
+ region: env.AWS_REGION ?? 'us-east-1',
75
+ endpoint: env.AWS_ENDPOINT,
76
+ accessKeyId: env.AWS_ACCESS_KEY_ID ?? '',
77
+ secretAccessKey: env.AWS_SECRET_ACCESS_KEY ?? '',
78
+ },
79
+ },
80
+ } as const;
81
+
82
+ export default storage;
83
+ `,
84
+ session: `import { env } from '../bootstrap/env.js';
85
+
86
+ const session = {
87
+ driver: env.SESSION_DRIVER ?? 'cookie',
88
+ secret: env.SESSION_SECRET ?? 'change-me-in-production',
89
+ ttl: Number(env.SESSION_TTL ?? 86400),
90
+ cookieName: 'lumiarq_session',
91
+ secure: env.NODE_ENV === 'production',
92
+ sameSite: 'lax' as const,
93
+ } as const;
94
+
95
+ export default session;
96
+ `,
97
+ security: `import { env } from '../bootstrap/env.js';
98
+
99
+ const security = {
100
+ jwtSecret: env.JWT_SECRET ?? 'change-me-in-production',
101
+ jwtTtl: Number(env.JWT_TTL ?? 3600),
102
+
103
+ cors: {
104
+ allowOrigins: (env.CORS_ORIGINS ?? '*').split(',').map((s) => s.trim()),
105
+ allowMethods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
106
+ allowHeaders: ['Content-Type', 'Authorization'],
107
+ maxAge: 86400,
108
+ },
109
+
110
+ rateLimit: {
111
+ max: Number(env.RATE_LIMIT_MAX ?? 100),
112
+ windowMs: Number(env.RATE_LIMIT_WINDOW ?? 60000),
113
+ },
114
+ } as const;
115
+
116
+ export default security;
117
+ `,
118
+ logging: `import { env } from '../bootstrap/env.js';
119
+
120
+ const logging = {
121
+ level: (env.LOG_LEVEL ?? 'info') as 'debug' | 'info' | 'warn' | 'error',
122
+ driver: (env.LOG_DRIVER ?? 'console') as 'console' | 'traze',
123
+
124
+ traze: {
125
+ endpoint: env.TRAZE_ENDPOINT ?? '',
126
+ apiKey: env.TRAZE_API_KEY ?? '',
127
+ service: env.TRAZE_SERVICE ?? 'lumiarq-app',
128
+ },
129
+ } as const;
130
+
131
+ export default logging;
132
+ `,
133
+ auth: `import { env } from '../bootstrap/env.js';
134
+
135
+ const auth = {
136
+ guard: (env.AUTH_GUARD ?? 'jwt') as 'jwt' | 'session',
137
+ secret: env.JWT_SECRET ?? 'change-me-in-production',
138
+
139
+ jwt: {
140
+ ttl: Number(env.JWT_TTL ?? 3600),
141
+ refreshTtl: Number(env.JWT_REFRESH_TTL ?? 604800),
142
+ algorithm: 'HS256' as const,
143
+ },
144
+
145
+ password: {
146
+ rounds: Number(env.BCRYPT_ROUNDS ?? 12),
147
+ },
148
+ } as const;
149
+
150
+ export default auth;
151
+ `,
152
+ };
153
+ export const KNOWN_CONFIG_NAMES = Object.keys(CONFIG_STUBS);
154
+ //# sourceMappingURL=config-stubs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-stubs.js","sourceRoot":"","sources":["../../../src/commands/app/config-stubs.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;CAwBP;IAEC,KAAK,EAAE;;;;;;;;;;;;;;;;CAgBR;IAEC,KAAK,EAAE;;;;;;;;;;;;;;;;;CAiBR;IAEC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;CAqBV;IAEC,OAAO,EAAE;;;;;;;;;;;;CAYV;IAEC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;CAoBX;IAEC,OAAO,EAAE;;;;;;;;;;;;;;CAcV;IAEC,IAAI,EAAE;;;;;;;;;;;;;;;;;;CAkBP;CACA,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function pingDatabaseConnection(cwd?: string): Promise<number>;
2
+ export declare function runDatabaseCommand(commandName: string, args: string[], cwd?: string): Promise<number>;
3
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/commands/app/database.ts"],"names":[],"mappings":"AA6FA,wBAAsB,sBAAsB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiEjF;AAoCD,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAkEjB"}
@@ -0,0 +1,219 @@
1
+ import { closeSync, existsSync, mkdirSync, openSync } from 'node:fs';
2
+ import { dirname, relative, resolve, join } from 'node:path';
3
+ import net from 'node:net';
4
+ import { ui, writeError, writeLine } from '../../console.js';
5
+ import { readPackageJson, runBridge, runPnpm } from './command-runtime.js';
6
+ function readDatabaseConfig(cwd) {
7
+ const result = runBridge(['config:show', cwd, 'database'], cwd);
8
+ if (result.status !== 0) {
9
+ return {
10
+ defaultConnection: 'unknown',
11
+ connection: null,
12
+ error: result.stderr.trim() || 'Unable to resolve config/database.ts',
13
+ };
14
+ }
15
+ try {
16
+ const parsed = JSON.parse(result.stdout);
17
+ const defaultConnection = parsed.config?.default ?? 'unknown';
18
+ const connection = parsed.config?.connections?.[defaultConnection] ?? null;
19
+ if (!connection) {
20
+ return {
21
+ defaultConnection,
22
+ connection: null,
23
+ error: `Connection '${defaultConnection}' not found in database config`,
24
+ };
25
+ }
26
+ return { defaultConnection, connection };
27
+ }
28
+ catch {
29
+ return {
30
+ defaultConnection: 'unknown',
31
+ connection: null,
32
+ error: 'Could not parse resolved database config output',
33
+ };
34
+ }
35
+ }
36
+ function toNumber(value, fallback) {
37
+ const asNumber = typeof value === 'number' ? value : Number(value);
38
+ return Number.isFinite(asNumber) ? asNumber : fallback;
39
+ }
40
+ async function pingPostgres(host, port, timeoutMs = 3000) {
41
+ return new Promise((resolvePromise) => {
42
+ const socket = net.createConnection({ host, port });
43
+ let settled = false;
44
+ const finish = (ok, message) => {
45
+ if (settled)
46
+ return;
47
+ settled = true;
48
+ socket.destroy();
49
+ resolvePromise({ ok, message });
50
+ };
51
+ socket.setTimeout(timeoutMs);
52
+ socket.on('connect', () => finish(true, `TCP connection established to ${host}:${port}`));
53
+ socket.on('timeout', () => finish(false, `Timed out connecting to ${host}:${port}`));
54
+ socket.on('error', (error) => {
55
+ finish(false, `${error.code ?? 'ERROR'}: ${error.message}`);
56
+ });
57
+ });
58
+ }
59
+ function pingSqlite(url, cwd) {
60
+ if (!url) {
61
+ return { ok: false, message: 'SQLite url is empty in database config' };
62
+ }
63
+ const resolvedPath = url.startsWith('file:') ? resolve(cwd, url.replace(/^file:/, '')) : resolve(cwd, url);
64
+ try {
65
+ mkdirSync(dirname(resolvedPath), { recursive: true });
66
+ const handle = openSync(resolvedPath, 'a');
67
+ closeSync(handle);
68
+ return { ok: true, message: `SQLite file is accessible at ${relative(cwd, resolvedPath)}` };
69
+ }
70
+ catch (error) {
71
+ const message = error instanceof Error ? error.message : 'Unknown file access error';
72
+ return { ok: false, message };
73
+ }
74
+ }
75
+ export async function pingDatabaseConnection(cwd = process.cwd()) {
76
+ writeLine();
77
+ writeLine(ui.section('DB Ping'));
78
+ const configState = readDatabaseConfig(cwd);
79
+ if (!configState.connection) {
80
+ writeError(ui.fail(configState.error ?? 'Database configuration is invalid.'));
81
+ writeLine();
82
+ return 1;
83
+ }
84
+ const driver = String(configState.connection.driver ?? configState.defaultConnection ?? 'unknown');
85
+ writeLine(` ${ui.bullet(`Driver: ${driver}`)}`);
86
+ if (driver === 'postgres') {
87
+ const host = String(configState.connection.host ?? '').trim();
88
+ const port = toNumber(configState.connection.port, 5432);
89
+ const database = String(configState.connection.database ?? '').trim();
90
+ const username = String(configState.connection.username ?? '').trim();
91
+ const diagnostics = [];
92
+ if (!host)
93
+ diagnostics.push('host is missing');
94
+ if (!database)
95
+ diagnostics.push('database name is missing');
96
+ if (!username)
97
+ diagnostics.push('username is missing');
98
+ if (diagnostics.length > 0) {
99
+ writeError(ui.fail('Postgres configuration is incomplete:'));
100
+ for (const diagnostic of diagnostics) {
101
+ writeError(` - ${diagnostic}`);
102
+ }
103
+ writeLine();
104
+ return 1;
105
+ }
106
+ const ping = await pingPostgres(host, port);
107
+ if (!ping.ok) {
108
+ writeError(ui.fail(`Connection failed: ${ping.message}`));
109
+ writeLine(` ${ui.dim('Diagnosis: check DB_HOST/DB_PORT, network access, and postgres service status.')}`);
110
+ writeLine();
111
+ return 1;
112
+ }
113
+ writeLine(` ${ui.ok(ping.message)}`);
114
+ writeLine(` ${ui.dim('Authentication was not validated by this ping; it checks network reachability.')}`);
115
+ writeLine();
116
+ return 0;
117
+ }
118
+ if (driver === 'sqlite') {
119
+ const url = String(configState.connection.url ?? '').trim();
120
+ const ping = pingSqlite(url, cwd);
121
+ if (!ping.ok) {
122
+ writeError(ui.fail(`Connection failed: ${ping.message}`));
123
+ writeLine(` ${ui.dim('Diagnosis: verify DATABASE_URL/DB_CONNECTION points to a writable sqlite file path.')}`);
124
+ writeLine();
125
+ return 1;
126
+ }
127
+ writeLine(` ${ui.ok(ping.message)}`);
128
+ writeLine();
129
+ return 0;
130
+ }
131
+ writeError(ui.fail(`Unsupported database driver '${driver}' for db:ping.`));
132
+ writeLine();
133
+ return 1;
134
+ }
135
+ function runDatabaseSeed(args, cwd) {
136
+ const packageJson = readPackageJson(cwd);
137
+ if (packageJson.scripts?.['db:seed']) {
138
+ return runPnpm(['run', 'db:seed', ...args], cwd);
139
+ }
140
+ const candidates = [
141
+ join(cwd, 'src', 'shared', 'database', 'seeds', 'index.ts'),
142
+ join(cwd, 'database', 'seeds', 'index.ts'),
143
+ join(cwd, 'seeds', 'index.ts'),
144
+ ];
145
+ const seedFile = candidates.find((f) => existsSync(f));
146
+ if (!seedFile) {
147
+ writeError(ui.fail('No seed file found. Create src/shared/database/seeds/index.ts or add a db:seed script to package.json.'));
148
+ return 1;
149
+ }
150
+ writeLine();
151
+ writeLine(ui.section('DB Seed'));
152
+ writeLine(` ${ui.bullet(`Running ${relative(cwd, seedFile)}...`)}`);
153
+ const status = runPnpm(['exec', 'tsx', seedFile, ...args], cwd);
154
+ if (status === 0) {
155
+ writeLine(` ${ui.ok('Seed complete.')}`);
156
+ }
157
+ writeLine();
158
+ return status;
159
+ }
160
+ export async function runDatabaseCommand(commandName, args, cwd = process.cwd()) {
161
+ const packageJson = readPackageJson(cwd);
162
+ if (packageJson.scripts?.[commandName]) {
163
+ return runPnpm(['run', commandName, ...args], cwd);
164
+ }
165
+ if (commandName === 'db:generate') {
166
+ return runPnpm(['exec', 'drizzle-kit', 'generate', ...args], cwd);
167
+ }
168
+ if (commandName === 'db:migrate') {
169
+ return runPnpm(['exec', 'drizzle-kit', 'migrate', ...args], cwd);
170
+ }
171
+ if (commandName === 'db:studio') {
172
+ return runPnpm(['exec', 'drizzle-kit', 'studio', ...args], cwd);
173
+ }
174
+ if (commandName === 'db:seed') {
175
+ return runDatabaseSeed(args, cwd);
176
+ }
177
+ if (commandName === 'db:ping') {
178
+ return pingDatabaseConnection(cwd);
179
+ }
180
+ if (commandName === 'db:fresh') {
181
+ writeLine();
182
+ writeLine(ui.section('DB Fresh'));
183
+ writeLine(` ${ui.bullet('Pushing schema (--force)...')}`);
184
+ const pushStatus = runPnpm(['exec', 'drizzle-kit', 'push', '--force', ...args], cwd, 'pipe');
185
+ if (pushStatus !== 0)
186
+ return pushStatus;
187
+ writeLine(` ${ui.bullet('Running migrations...')}`);
188
+ const migrateStatus = runPnpm(['exec', 'drizzle-kit', 'migrate'], cwd, 'pipe');
189
+ if (migrateStatus !== 0)
190
+ return migrateStatus;
191
+ writeLine(` ${ui.bullet('Running seeds...')}`);
192
+ const seedStatus = runDatabaseSeed([], cwd);
193
+ if (seedStatus !== 0)
194
+ return seedStatus;
195
+ writeLine(` ${ui.ok('Database refreshed.')}`);
196
+ writeLine();
197
+ return 0;
198
+ }
199
+ if (commandName === 'db:reset') {
200
+ writeLine();
201
+ writeLine(ui.section('DB Reset'));
202
+ writeLine(` ${ui.bullet('Dropping all tables (drizzle-kit drop)...')}`);
203
+ const dropStatus = runPnpm(['exec', 'drizzle-kit', 'drop', '--force'], cwd, 'pipe');
204
+ if (dropStatus !== 0) {
205
+ writeLine(` ${ui.warn('drizzle-kit drop failed - trying push --force to reset schema...')}`);
206
+ runPnpm(['exec', 'drizzle-kit', 'push', '--force'], cwd, 'pipe');
207
+ }
208
+ writeLine(` ${ui.bullet('Running migrations...')}`);
209
+ const migrateStatus = runPnpm(['exec', 'drizzle-kit', 'migrate'], cwd, 'pipe');
210
+ if (migrateStatus !== 0)
211
+ return migrateStatus;
212
+ writeLine(` ${ui.ok('Database reset.')}`);
213
+ writeLine();
214
+ return 0;
215
+ }
216
+ writeError(ui.fail(`No handler configured for ${commandName}. Add a package.json script named ${commandName}.`));
217
+ return 1;
218
+ }
219
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/commands/app/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function parseFrontmatter(raw: string): {
2
+ data: Record<string, unknown>;
3
+ body: string;
4
+ };
5
+ export declare function walkMarkdownFiles(dir: string, bucket?: string[]): string[];
6
+ export declare function findDocsRoots(cwd: string): string[];
7
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../src/commands/app/docs.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA+B7F;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAkB9E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAOnD"}
@@ -0,0 +1,59 @@
1
+ import { existsSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export function parseFrontmatter(raw) {
4
+ if (!raw.startsWith('---\n')) {
5
+ return { data: {}, body: raw };
6
+ }
7
+ const end = raw.indexOf('\n---\n', 4);
8
+ if (end === -1) {
9
+ return { data: {}, body: raw };
10
+ }
11
+ const header = raw.slice(4, end);
12
+ const body = raw.slice(end + 5);
13
+ const data = {};
14
+ for (const line of header.split(/\r?\n/g)) {
15
+ const separatorIndex = line.indexOf(':');
16
+ if (separatorIndex <= 0)
17
+ continue;
18
+ const key = line.slice(0, separatorIndex).trim();
19
+ const rawValue = line.slice(separatorIndex + 1).trim();
20
+ if (rawValue === 'true') {
21
+ data[key] = true;
22
+ }
23
+ else if (rawValue === 'false') {
24
+ data[key] = false;
25
+ }
26
+ else if (/^\d+$/.test(rawValue)) {
27
+ data[key] = Number(rawValue);
28
+ }
29
+ else {
30
+ data[key] = rawValue.replace(/^"|"$/g, '');
31
+ }
32
+ }
33
+ return { data, body };
34
+ }
35
+ export function walkMarkdownFiles(dir, bucket = []) {
36
+ if (!existsSync(dir)) {
37
+ return bucket;
38
+ }
39
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
40
+ const fullPath = join(dir, entry.name);
41
+ if (entry.isDirectory()) {
42
+ walkMarkdownFiles(fullPath, bucket);
43
+ continue;
44
+ }
45
+ if (entry.name.endsWith('.md')) {
46
+ bucket.push(fullPath);
47
+ }
48
+ }
49
+ return bucket;
50
+ }
51
+ export function findDocsRoots(cwd) {
52
+ return [
53
+ join(cwd, 'content', 'docs'),
54
+ join(cwd, 'src', 'content', 'docs'),
55
+ join(cwd, 'src', 'shared', 'database', 'content', 'docs'),
56
+ join(cwd, 'storage', 'docs-cache'),
57
+ ].filter((candidate, index, all) => existsSync(candidate) && all.indexOf(candidate) === index);
58
+ }
59
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/commands/app/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function cacheRoutes(cwd?: string): number;
2
+ export declare function clearRouteCache(cwd?: string): number;
3
+ export declare function listRoutes(cwd?: string): number;
4
+ export declare function checkRoutes(cwd?: string): number;
5
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/commands/app/routes.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,CAAC,GAAG,SAAgB,GAAG,MAAM,CAmDvD;AAED,wBAAgB,eAAe,CAAC,GAAG,SAAgB,GAAG,MAAM,CAW3D;AAED,wBAAgB,UAAU,CAAC,GAAG,SAAgB,GAAG,MAAM,CAyBtD;AAED,wBAAgB,WAAW,CAAC,GAAG,SAAgB,GAAG,MAAM,CAavD"}
@@ -0,0 +1,91 @@
1
+ import { existsSync, mkdirSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join, relative } from 'node:path';
3
+ import { ui, writeError, writeLine } from '../../console.js';
4
+ import { runBridge } from './command-runtime.js';
5
+ export function cacheRoutes(cwd = process.cwd()) {
6
+ const routesRoot = join(cwd, 'src', 'modules');
7
+ if (!existsSync(routesRoot)) {
8
+ writeError(ui.fail('No src/modules directory found.'));
9
+ return 1;
10
+ }
11
+ const discovered = [];
12
+ const stack = [routesRoot];
13
+ while (stack.length > 0) {
14
+ const current = stack.pop();
15
+ if (!current)
16
+ continue;
17
+ for (const entry of readdirSync(current, { withFileTypes: true })) {
18
+ const fullPath = join(current, entry.name);
19
+ if (entry.isDirectory()) {
20
+ stack.push(fullPath);
21
+ continue;
22
+ }
23
+ if (/\/http\/routes\/.+\.(ts|js)$/.test(fullPath)) {
24
+ discovered.push(fullPath);
25
+ }
26
+ }
27
+ }
28
+ discovered.sort((left, right) => left.localeCompare(right));
29
+ const loaderPath = join(cwd, 'storage', 'framework', 'cache', 'routes.loader.ts');
30
+ mkdirSync(dirname(loaderPath), { recursive: true });
31
+ const importLines = discovered.map((filePath) => {
32
+ const relativeImport = relative(join(cwd, 'storage', 'framework', 'cache'), filePath).replaceAll('\\', '/');
33
+ return `import '../../../${relativeImport.replace(/^\.\.\//, '')}'`;
34
+ });
35
+ const content = [
36
+ '// storage/framework/cache/routes.loader.ts',
37
+ '// Auto-generated by `lumis route:cache` - do not edit manually.',
38
+ '// Commit this file; re-run `lumis route:cache` whenever routes change.',
39
+ '',
40
+ ...importLines.map((line) => `${line};`),
41
+ '',
42
+ ].join('\n');
43
+ writeFileSync(loaderPath, content, 'utf8');
44
+ writeLine();
45
+ writeLine(ui.section('Route Cache'));
46
+ writeLine(` ${ui.ok(`Cached ${discovered.length} route files`)}`);
47
+ writeLine(` ${ui.bullet(relative(cwd, loaderPath))}`);
48
+ writeLine();
49
+ return 0;
50
+ }
51
+ export function clearRouteCache(cwd = process.cwd()) {
52
+ const loaderPath = join(cwd, 'storage', 'framework', 'cache', 'routes.loader.ts');
53
+ if (existsSync(loaderPath)) {
54
+ rmSync(loaderPath, { force: true });
55
+ }
56
+ writeLine();
57
+ writeLine(ui.section('Route Clear'));
58
+ writeLine(` ${ui.ok(`Removed ${relative(cwd, loaderPath)}`)}`);
59
+ writeLine();
60
+ return 0;
61
+ }
62
+ export function listRoutes(cwd = process.cwd()) {
63
+ const result = runBridge(['route:list', cwd], cwd);
64
+ if (result.status !== 0) {
65
+ writeError(ui.fail(result.stderr.trim() || 'Route listing failed.'));
66
+ return result.status;
67
+ }
68
+ const parsed = JSON.parse(result.stdout);
69
+ writeLine();
70
+ writeLine(ui.section(`Routes (${parsed.routes.length})`));
71
+ for (const route of parsed.routes) {
72
+ const meta = [route.name || '-', route.render || '-', route.middleware.join(', ') || '-'].join(' · ');
73
+ writeLine(` ${ui.cyan(route.method.padEnd(6, ' '))} ${route.path} ${ui.dim(meta)}`);
74
+ }
75
+ writeLine();
76
+ return 0;
77
+ }
78
+ export function checkRoutes(cwd = process.cwd()) {
79
+ const result = runBridge(['route:check', cwd], cwd);
80
+ if (result.status !== 0) {
81
+ writeError(ui.fail(result.stderr.trim() || 'Route check failed.'));
82
+ return result.status;
83
+ }
84
+ const parsed = JSON.parse(result.stdout);
85
+ writeLine();
86
+ writeLine(ui.section('Route Check'));
87
+ writeLine(` ${ui.ok(`${parsed.routes.length} routes validated`)}`);
88
+ writeLine();
89
+ return 0;
90
+ }
91
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/commands/app/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function resolvePathWithinRoot(root: string, targetPath: string): string;
2
+ export declare function ensureParentDir(filePath: string): void;
3
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/commands/app/security.ts"],"names":[],"mappings":"AAGA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAU9E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEtD"}
@@ -0,0 +1,15 @@
1
+ import { dirname, isAbsolute, relative, resolve } from 'node:path';
2
+ import { mkdirSync } from 'node:fs';
3
+ export function resolvePathWithinRoot(root, targetPath) {
4
+ const resolvedRoot = resolve(root);
5
+ const resolvedTarget = resolve(resolvedRoot, targetPath);
6
+ const rel = relative(resolvedRoot, resolvedTarget);
7
+ if (rel.startsWith('..') || isAbsolute(rel)) {
8
+ throw new Error(`Refusing to write outside project root: ${targetPath}`);
9
+ }
10
+ return resolvedTarget;
11
+ }
12
+ export function ensureParentDir(filePath) {
13
+ mkdirSync(dirname(filePath), { recursive: true });
14
+ }
15
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/commands/app/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,UAAkB;IACpE,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAEnD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function workerStart(dev?: boolean, cwd?: string): number;
2
+ export declare function workerList(cwd?: string): number;
3
+ export declare function scheduleList(cwd?: string): number;
4
+ export declare function scheduleRun(jobName: string, cwd?: string): number;
5
+ //# sourceMappingURL=worker-schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-schedule.d.ts","sourceRoot":"","sources":["../../../src/commands/app/worker-schedule.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,CAAC,GAAG,UAAQ,EAAE,GAAG,SAAgB,GAAG,MAAM,CA2BpE;AAED,wBAAgB,UAAU,CAAC,GAAG,SAAgB,GAAG,MAAM,CA+BtD;AAED,wBAAgB,YAAY,CAAC,GAAG,SAAgB,GAAG,MAAM,CA2BxD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAgB,GAAG,MAAM,CAmBxE"}