express-file-cluster 0.1.6 → 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.
@@ -1,56 +1,36 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
- var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getProtoOf = Object.getPrototypeOf;
8
- var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
- // If the importer is in node compatibility mode or this is not an ESM
19
- // file that has been converted to a CommonJS file using a Babel-
20
- // compatible transform (i.e. "__esModule" has not been set), then set
21
- // "default" to the CommonJS "module.exports" for node compatibility.
22
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
- mod
24
- ));
2
+ "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
3
+
4
+ var _chunkMQNVNOH5cjs = require('../chunk-MQNVNOH5.cjs');
25
5
 
26
6
  // src/cli/index.ts
27
- var import_commander6 = require("commander");
7
+ var _commander = require('commander');
28
8
 
29
9
  // src/cli/commands/start.ts
30
- var import_commander = require("commander");
31
- var import_node_child_process = require("child_process");
32
- var import_node_path = __toESM(require("path"), 1);
33
- var import_node_fs = __toESM(require("fs"), 1);
34
- var import_chalk = __toESM(require("chalk"), 1);
10
+
11
+ var _child_process = require('child_process');
12
+ var _path = require('path'); var _path2 = _interopRequireDefault(_path);
13
+ var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);
14
+ var _picocolors = require('picocolors'); var _picocolors2 = _interopRequireDefault(_picocolors);
35
15
  function startCommand() {
36
- const cmd = new import_commander.Command("start");
16
+ const cmd = new (0, _commander.Command)("start");
37
17
  cmd.argument("<mode>", "dev | prod").description("Start the EFC server").action((mode) => {
38
18
  if (mode === "dev") {
39
19
  startDev();
40
20
  } else if (mode === "prod") {
41
21
  startProd();
42
22
  } else {
43
- console.error(import_chalk.default.red(`Unknown mode: ${mode}. Use 'dev' or 'prod'.`));
23
+ console.error(_picocolors2.default.red(`Unknown mode: ${mode}. Use 'dev' or 'prod'.`));
44
24
  process.exit(1);
45
25
  }
46
26
  });
47
27
  return cmd;
48
28
  }
49
29
  function parseDotenv(cwd) {
50
- const envFile = import_node_path.default.join(cwd, ".env");
51
- if (!import_node_fs.default.existsSync(envFile)) return {};
30
+ const envFile = _path2.default.join(cwd, ".env");
31
+ if (!_fs2.default.existsSync(envFile)) return {};
52
32
  const vars = {};
53
- for (const line of import_node_fs.default.readFileSync(envFile, "utf8").split("\n")) {
33
+ for (const line of _fs2.default.readFileSync(envFile, "utf8").split("\n")) {
54
34
  const trimmed = line.trim();
55
35
  if (!trimmed || trimmed.startsWith("#")) continue;
56
36
  const eq = trimmed.indexOf("=");
@@ -64,52 +44,52 @@ function parseDotenv(cwd) {
64
44
  function startDev() {
65
45
  const entry = resolveEntry();
66
46
  if (!entry) {
67
- console.error(import_chalk.default.red("[EFC] Could not find entry point. Expected src/index.ts or index.ts"));
47
+ console.error(_picocolors2.default.red("[EFC] Could not find entry point. Expected src/index.ts or index.ts"));
68
48
  process.exit(1);
69
49
  }
70
- console.log(import_chalk.default.cyan("[EFC] Starting development server\u2026"));
71
- console.log(import_chalk.default.dim(` Entry: ${entry}`));
50
+ console.log(_picocolors2.default.cyan("[EFC] Starting development server\u2026"));
51
+ console.log(_picocolors2.default.dim(` Entry: ${entry}`));
72
52
  const cwd = process.cwd();
73
- const localTsx = import_node_path.default.join(cwd, "node_modules", ".bin", "tsx");
74
- const tsx = import_node_fs.default.existsSync(localTsx) ? localTsx : "tsx";
53
+ const localTsx = _path2.default.join(cwd, "node_modules", ".bin", "tsx");
54
+ const tsx = _fs2.default.existsSync(localTsx) ? localTsx : "tsx";
75
55
  const env = { ...parseDotenv(cwd), ...process.env, NODE_ENV: "development" };
76
- const child = (0, import_node_child_process.spawn)(tsx, ["watch", entry], { stdio: "inherit", env });
77
- child.on("exit", (code) => process.exit(code ?? 0));
56
+ const child = _child_process.spawn.call(void 0, tsx, ["watch", "--include", "src", entry], { stdio: "inherit", env });
57
+ child.on("exit", (code) => process.exit(_nullishCoalesce(code, () => ( 0))));
78
58
  }
79
59
  function startProd() {
80
60
  const cwd = process.cwd();
81
- const distEntry = import_node_path.default.join(cwd, "dist", "index.js");
82
- if (!import_node_fs.default.existsSync(distEntry)) {
83
- console.error(import_chalk.default.red("[EFC] dist/index.js not found. Run `efc build prod` first."));
61
+ const distEntry = _path2.default.join(cwd, "dist", "index.js");
62
+ if (!_fs2.default.existsSync(distEntry)) {
63
+ console.error(_picocolors2.default.red("[EFC] dist/index.js not found. Run `efc build prod` first."));
84
64
  process.exit(1);
85
65
  }
86
- console.log(import_chalk.default.cyan("[EFC] Starting production server\u2026"));
87
- const child = (0, import_node_child_process.spawn)("node", [distEntry], {
66
+ console.log(_picocolors2.default.cyan("[EFC] Starting production server\u2026"));
67
+ const child = _child_process.spawn.call(void 0, "node", [distEntry], {
88
68
  stdio: "inherit",
89
69
  env: { ...process.env, NODE_ENV: "production" }
90
70
  });
91
- child.on("exit", (code) => process.exit(code ?? 0));
71
+ child.on("exit", (code) => process.exit(_nullishCoalesce(code, () => ( 0))));
92
72
  }
93
73
  function resolveEntry() {
94
74
  const cwd = process.cwd();
95
75
  const candidates = [
96
- import_node_path.default.join(cwd, "src", "index.ts"),
97
- import_node_path.default.join(cwd, "index.ts"),
98
- import_node_path.default.join(cwd, "src", "index.js"),
99
- import_node_path.default.join(cwd, "index.js")
76
+ _path2.default.join(cwd, "src", "index.ts"),
77
+ _path2.default.join(cwd, "index.ts"),
78
+ _path2.default.join(cwd, "src", "index.js"),
79
+ _path2.default.join(cwd, "index.js")
100
80
  ];
101
- return candidates.find((f) => import_node_fs.default.existsSync(f)) ?? null;
81
+ return _nullishCoalesce(candidates.find((f) => _fs2.default.existsSync(f)), () => ( null));
102
82
  }
103
83
 
104
84
  // src/cli/commands/build.ts
105
- var import_commander2 = require("commander");
106
- var import_node_child_process2 = require("child_process");
107
- var import_chalk2 = __toESM(require("chalk"), 1);
85
+
86
+
87
+
108
88
  function buildCommand() {
109
- const cmd = new import_commander2.Command("build");
89
+ const cmd = new (0, _commander.Command)("build");
110
90
  cmd.argument("<mode>", "prod").description("Build the application for production").action((mode) => {
111
91
  if (mode !== "prod") {
112
- console.error(import_chalk2.default.red(`Unknown build mode: ${mode}. Use 'prod'.`));
92
+ console.error(_picocolors2.default.red(`Unknown build mode: ${mode}. Use 'prod'.`));
113
93
  process.exit(1);
114
94
  }
115
95
  buildProd();
@@ -117,71 +97,71 @@ function buildCommand() {
117
97
  return cmd;
118
98
  }
119
99
  function buildProd() {
120
- console.log(import_chalk2.default.cyan("[EFC] Building for production\u2026"));
121
- const tsc = (0, import_node_child_process2.spawn)("npx", ["tsc", "--noEmit"], { stdio: "inherit" });
100
+ console.log(_picocolors2.default.cyan("[EFC] Building for production\u2026"));
101
+ const tsc = _child_process.spawn.call(void 0, "npx", ["tsc", "--noEmit"], { stdio: "inherit" });
122
102
  tsc.on("exit", (code) => {
123
103
  if (code !== 0) {
124
- console.error(import_chalk2.default.red("[EFC] TypeScript errors found. Fix them before building."));
104
+ console.error(_picocolors2.default.red("[EFC] TypeScript errors found. Fix them before building."));
125
105
  process.exit(1);
126
106
  }
127
- const tsup = (0, import_node_child_process2.spawn)("npx", ["tsup"], { stdio: "inherit" });
107
+ const tsup = _child_process.spawn.call(void 0, "npx", ["tsup"], { stdio: "inherit" });
128
108
  tsup.on("exit", (tsupCode) => {
129
109
  if (tsupCode === 0) {
130
- console.log(import_chalk2.default.green("[EFC] Build complete \u2192 dist/"));
110
+ console.log(_picocolors2.default.green("[EFC] Build complete \u2192 dist/"));
131
111
  } else {
132
- process.exit(tsupCode ?? 1);
112
+ process.exit(_nullishCoalesce(tsupCode, () => ( 1)));
133
113
  }
134
114
  });
135
115
  });
136
116
  }
137
117
 
138
118
  // src/cli/commands/run.ts
139
- var import_commander3 = require("commander");
140
- var import_node_child_process3 = require("child_process");
141
- var import_chalk3 = __toESM(require("chalk"), 1);
119
+
120
+
121
+
142
122
  function runCommand() {
143
- const cmd = new import_commander3.Command("run");
123
+ const cmd = new (0, _commander.Command)("run");
144
124
  cmd.argument("<runner>", "tests").description("Run EFC sub-commands (tests)").allowUnknownOption().action((runner) => {
145
125
  if (runner === "tests") {
146
126
  runTests(cmd.args.slice(1));
147
127
  } else {
148
- console.error(import_chalk3.default.red(`Unknown runner: ${runner}. Use 'tests'.`));
128
+ console.error(_picocolors2.default.red(`Unknown runner: ${runner}. Use 'tests'.`));
149
129
  process.exit(1);
150
130
  }
151
131
  });
152
132
  return cmd;
153
133
  }
154
134
  function runTests(extraArgs) {
155
- console.log(import_chalk3.default.cyan("[EFC] Running tests via Vitest\u2026"));
156
- const child = (0, import_node_child_process3.spawn)("npx", ["vitest", "run", ...extraArgs], { stdio: "inherit" });
157
- child.on("exit", (code) => process.exit(code ?? 0));
135
+ console.log(_picocolors2.default.cyan("[EFC] Running tests via Vitest\u2026"));
136
+ const child = _child_process.spawn.call(void 0, "npx", ["vitest", "run", ...extraArgs], { stdio: "inherit" });
137
+ child.on("exit", (code) => process.exit(_nullishCoalesce(code, () => ( 0))));
158
138
  }
159
139
 
160
140
  // src/cli/commands/generate.ts
161
- var import_commander4 = require("commander");
162
- var import_node_fs2 = __toESM(require("fs"), 1);
163
- var import_node_path2 = __toESM(require("path"), 1);
164
- var import_chalk4 = __toESM(require("chalk"), 1);
141
+
142
+
143
+
144
+
165
145
  function generateCommand() {
166
- const cmd = new import_commander4.Command("generate").alias("g").description("Scaffold EFC modules");
146
+ const cmd = new (0, _commander.Command)("generate").alias("g").description("Scaffold EFC modules");
167
147
  cmd.command("route <routePath>").description("Scaffold a route module, e.g. users/[id]").action((routePath) => generateRoute(routePath));
168
148
  cmd.command("task <name>").description("Scaffold a background task module").action((name) => generateTask(name));
169
149
  cmd.command("middleware <name>").description("Scaffold a middleware module").action((name) => generateMiddleware(name));
170
150
  return cmd;
171
151
  }
172
152
  function writeFile(filePath, content) {
173
- const dir = import_node_path2.default.dirname(filePath);
174
- import_node_fs2.default.mkdirSync(dir, { recursive: true });
175
- if (import_node_fs2.default.existsSync(filePath)) {
176
- console.error(import_chalk4.default.red(`File already exists: ${filePath}`));
153
+ const dir = _path2.default.dirname(filePath);
154
+ _fs2.default.mkdirSync(dir, { recursive: true });
155
+ if (_fs2.default.existsSync(filePath)) {
156
+ console.error(_picocolors2.default.red(`File already exists: ${filePath}`));
177
157
  process.exit(1);
178
158
  }
179
- import_node_fs2.default.writeFileSync(filePath, content, "utf8");
180
- console.log(import_chalk4.default.green(` created ${import_node_path2.default.relative(process.cwd(), filePath)}`));
159
+ _fs2.default.writeFileSync(filePath, content, "utf8");
160
+ console.log(_picocolors2.default.green(` created ${_path2.default.relative(process.cwd(), filePath)}`));
181
161
  }
182
162
  function generateRoute(routePath) {
183
163
  const cwd = process.cwd();
184
- const filePath = import_node_path2.default.join(cwd, "src", "api", `${routePath}.ts`);
164
+ const filePath = _path2.default.join(cwd, "src", "api", `${routePath}.ts`);
185
165
  const content = `import type { Request, Response } from 'express';
186
166
 
187
167
  export const GET = async (req: Request, res: Response) => {
@@ -193,11 +173,11 @@ export const POST = async (req: Request, res: Response) => {
193
173
  };
194
174
  `;
195
175
  writeFile(filePath, content);
196
- console.log(import_chalk4.default.cyan(`[EFC] Route scaffolded`));
176
+ console.log(_picocolors2.default.cyan(`[EFC] Route scaffolded`));
197
177
  }
198
178
  function generateTask(name) {
199
179
  const cwd = process.cwd();
200
- const filePath = import_node_path2.default.join(cwd, "src", "tasks", `${name}.ts`);
180
+ const filePath = _path2.default.join(cwd, "src", "tasks", `${name}.ts`);
201
181
  const content = `import { defineTask } from 'express-file-cluster/tasks';
202
182
 
203
183
  interface ${name}Payload {
@@ -210,11 +190,11 @@ export default defineTask<${name}Payload>(async (payload) => {
210
190
  });
211
191
  `;
212
192
  writeFile(filePath, content);
213
- console.log(import_chalk4.default.cyan(`[EFC] Task scaffolded`));
193
+ console.log(_picocolors2.default.cyan(`[EFC] Task scaffolded`));
214
194
  }
215
195
  function generateMiddleware(name) {
216
196
  const cwd = process.cwd();
217
- const filePath = import_node_path2.default.join(cwd, "src", "middlewares", `${name}.ts`);
197
+ const filePath = _path2.default.join(cwd, "src", "middlewares", `${name}.ts`);
218
198
  const content = `import type { Request, Response, NextFunction } from 'express';
219
199
 
220
200
  export function ${name}(req: Request, res: Response, next: NextFunction): void {
@@ -223,122 +203,76 @@ export function ${name}(req: Request, res: Response, next: NextFunction): void {
223
203
  }
224
204
  `;
225
205
  writeFile(filePath, content);
226
- console.log(import_chalk4.default.cyan(`[EFC] Middleware scaffolded`));
206
+ console.log(_picocolors2.default.cyan(`[EFC] Middleware scaffolded`));
227
207
  }
228
208
 
229
209
  // src/cli/commands/diagnostics.ts
230
- var import_commander5 = require("commander");
231
210
 
232
- // src/router/scan.ts
233
- var import_node_fs3 = __toESM(require("fs"), 1);
234
- var import_node_path3 = __toESM(require("path"), 1);
235
- var ROUTE_FILE_RE = /\.(ts|js|mts|mjs|cts|cjs)$/;
236
- var DYNAMIC_SEGMENT_RE = /\[([^\]]+)\]/g;
237
- function filePathToUrlPath(relativePath) {
238
- let p = relativePath.replace(ROUTE_FILE_RE, "");
239
- p = p.replace(/\/index$/, "");
240
- p = p.replace(DYNAMIC_SEGMENT_RE, ":$1");
241
- return p === "" ? "/" : p.startsWith("/") ? p : `/${p}`;
242
- }
243
- function extractParams(relativePath) {
244
- const params = [];
245
- let match;
246
- const re = new RegExp(DYNAMIC_SEGMENT_RE.source, "g");
247
- while ((match = re.exec(relativePath)) !== null) {
248
- if (match[1]) params.push(match[1]);
249
- }
250
- return params;
251
- }
252
- function scanDir(dir, base = dir) {
253
- if (!import_node_fs3.default.existsSync(dir)) return [];
254
- const entries = [];
255
- const items = import_node_fs3.default.readdirSync(dir, { withFileTypes: true });
256
- for (const item of items) {
257
- const fullPath = import_node_path3.default.join(dir, item.name);
258
- if (item.isDirectory()) {
259
- entries.push(...scanDir(fullPath, base));
260
- } else if (ROUTE_FILE_RE.test(item.name)) {
261
- const relative = "/" + import_node_path3.default.relative(base, fullPath).replace(/\\/g, "/");
262
- entries.push({
263
- urlPath: filePathToUrlPath(relative),
264
- filePath: fullPath,
265
- params: extractParams(relative)
266
- });
267
- }
268
- }
269
- return entries.sort((a, b) => {
270
- const aDynamic = a.urlPath.includes(":") ? 1 : 0;
271
- const bDynamic = b.urlPath.includes(":") ? 1 : 0;
272
- return aDynamic - bDynamic || a.urlPath.localeCompare(b.urlPath);
273
- });
274
- }
275
211
 
276
- // src/cli/commands/diagnostics.ts
277
- var import_node_path4 = __toESM(require("path"), 1);
278
- var import_node_fs4 = __toESM(require("fs"), 1);
279
- var import_chalk5 = __toESM(require("chalk"), 1);
212
+
213
+
280
214
  function diagnosticsCommands() {
281
215
  return [routesCommand(), tasksCommand(), doctorCommand()];
282
216
  }
283
217
  function routesCommand() {
284
- return new import_commander5.Command("routes").description("Print the resolved route table").action(() => {
218
+ return new (0, _commander.Command)("routes").description("Print the resolved route table").action(() => {
285
219
  const apiDir = resolveApiDir();
286
220
  if (!apiDir) {
287
- console.error(import_chalk5.default.red("[EFC] Could not find apiDir (expected src/api)"));
221
+ console.error(_picocolors2.default.red("[EFC] Could not find apiDir (expected src/api)"));
288
222
  process.exit(1);
289
223
  }
290
- const routes = scanDir(apiDir);
224
+ const routes = _chunkMQNVNOH5cjs.scanDir.call(void 0, apiDir);
291
225
  if (routes.length === 0) {
292
- console.log(import_chalk5.default.yellow("No routes found."));
226
+ console.log(_picocolors2.default.yellow("No routes found."));
293
227
  return;
294
228
  }
295
- console.log(import_chalk5.default.bold("\n Route Table\n"));
296
- console.log(import_chalk5.default.dim(" " + "\u2500".repeat(60)));
229
+ console.log(_picocolors2.default.bold("\n Route Table\n"));
230
+ console.log(_picocolors2.default.dim(" " + "\u2500".repeat(60)));
297
231
  for (const route of routes) {
298
- const rel = import_node_path4.default.relative(process.cwd(), route.filePath);
299
- console.log(` ${import_chalk5.default.cyan(route.urlPath.padEnd(35))} ${import_chalk5.default.dim(rel)}`);
232
+ const rel = _path2.default.relative(process.cwd(), route.filePath);
233
+ console.log(` ${_picocolors2.default.cyan(route.urlPath.padEnd(35))} ${_picocolors2.default.dim(rel)}`);
300
234
  }
301
- console.log(import_chalk5.default.dim(" " + "\u2500".repeat(60)));
302
- console.log(import_chalk5.default.dim(`
235
+ console.log(_picocolors2.default.dim(" " + "\u2500".repeat(60)));
236
+ console.log(_picocolors2.default.dim(`
303
237
  ${routes.length} route(s) found
304
238
  `));
305
239
  });
306
240
  }
307
241
  function tasksCommand() {
308
- return new import_commander5.Command("tasks").description("List registered background tasks").action(() => {
242
+ return new (0, _commander.Command)("tasks").description("List registered background tasks").action(() => {
309
243
  const tasksDir = resolveTasksDir();
310
- if (!tasksDir || !import_node_fs4.default.existsSync(tasksDir)) {
311
- console.log(import_chalk5.default.yellow("No tasks directory found."));
244
+ if (!tasksDir || !_fs2.default.existsSync(tasksDir)) {
245
+ console.log(_picocolors2.default.yellow("No tasks directory found."));
312
246
  return;
313
247
  }
314
- const files = import_node_fs4.default.readdirSync(tasksDir).filter((f) => /\.(ts|js)$/.test(f));
248
+ const files = _fs2.default.readdirSync(tasksDir).filter((f) => /\.(ts|js)$/.test(f));
315
249
  if (files.length === 0) {
316
- console.log(import_chalk5.default.yellow("No tasks found."));
250
+ console.log(_picocolors2.default.yellow("No tasks found."));
317
251
  return;
318
252
  }
319
- console.log(import_chalk5.default.bold("\n Background Tasks\n"));
253
+ console.log(_picocolors2.default.bold("\n Background Tasks\n"));
320
254
  for (const file of files) {
321
- console.log(` ${import_chalk5.default.cyan(import_node_path4.default.basename(file, import_node_path4.default.extname(file)))}`);
255
+ console.log(` ${_picocolors2.default.cyan(_path2.default.basename(file, _path2.default.extname(file)))}`);
322
256
  }
323
257
  console.log();
324
258
  });
325
259
  }
326
260
  function doctorCommand() {
327
- return new import_commander5.Command("doctor").description("Validate config, env vars, and project setup").action(() => {
261
+ return new (0, _commander.Command)("doctor").description("Validate config, env vars, and project setup").action(() => {
328
262
  const cwd = process.cwd();
329
263
  const checks = [
330
264
  {
331
265
  label: "package.json exists",
332
- ok: import_node_fs4.default.existsSync(import_node_path4.default.join(cwd, "package.json"))
266
+ ok: _fs2.default.existsSync(_path2.default.join(cwd, "package.json"))
333
267
  },
334
268
  {
335
269
  label: "tsconfig.json exists",
336
- ok: import_node_fs4.default.existsSync(import_node_path4.default.join(cwd, "tsconfig.json")),
270
+ ok: _fs2.default.existsSync(_path2.default.join(cwd, "tsconfig.json")),
337
271
  hint: "Run `tsc --init` to create one"
338
272
  },
339
273
  {
340
274
  label: "src/api directory exists",
341
- ok: import_node_fs4.default.existsSync(import_node_path4.default.join(cwd, "src", "api")),
275
+ ok: _fs2.default.existsSync(_path2.default.join(cwd, "src", "api")),
342
276
  hint: "Create src/api/ and add route files"
343
277
  },
344
278
  {
@@ -352,38 +286,38 @@ function doctorCommand() {
352
286
  hint: "Add JWT_SECRET to .env (generate: openssl rand -hex 64)"
353
287
  }
354
288
  ];
355
- console.log(import_chalk5.default.bold("\n EFC Doctor\n"));
289
+ console.log(_picocolors2.default.bold("\n EFC Doctor\n"));
356
290
  let allOk = true;
357
291
  for (const check of checks) {
358
- const icon = check.ok ? import_chalk5.default.green("\u2713") : import_chalk5.default.red("\u2717");
292
+ const icon = check.ok ? _picocolors2.default.green("\u2713") : _picocolors2.default.red("\u2717");
359
293
  console.log(` ${icon} ${check.label}`);
360
294
  if (!check.ok) {
361
295
  allOk = false;
362
- if (check.hint) console.log(import_chalk5.default.dim(` \u2192 ${check.hint}`));
296
+ if (check.hint) console.log(_picocolors2.default.dim(` \u2192 ${check.hint}`));
363
297
  }
364
298
  }
365
299
  console.log();
366
300
  if (allOk) {
367
- console.log(import_chalk5.default.green(" All checks passed!\n"));
301
+ console.log(_picocolors2.default.green(" All checks passed!\n"));
368
302
  } else {
369
- console.log(import_chalk5.default.yellow(" Some checks failed. Fix the issues above.\n"));
303
+ console.log(_picocolors2.default.yellow(" Some checks failed. Fix the issues above.\n"));
370
304
  process.exit(1);
371
305
  }
372
306
  });
373
307
  }
374
308
  function resolveApiDir() {
375
309
  const cwd = process.cwd();
376
- const candidates = [import_node_path4.default.join(cwd, "src", "api"), import_node_path4.default.join(cwd, "api")];
377
- return candidates.find((d) => import_node_fs4.default.existsSync(d)) ?? null;
310
+ const candidates = [_path2.default.join(cwd, "src", "api"), _path2.default.join(cwd, "api")];
311
+ return _nullishCoalesce(candidates.find((d) => _fs2.default.existsSync(d)), () => ( null));
378
312
  }
379
313
  function resolveTasksDir() {
380
314
  const cwd = process.cwd();
381
- const candidates = [import_node_path4.default.join(cwd, "src", "tasks"), import_node_path4.default.join(cwd, "tasks")];
382
- return candidates.find((d) => import_node_fs4.default.existsSync(d)) ?? null;
315
+ const candidates = [_path2.default.join(cwd, "src", "tasks"), _path2.default.join(cwd, "tasks")];
316
+ return _nullishCoalesce(candidates.find((d) => _fs2.default.existsSync(d)), () => ( null));
383
317
  }
384
318
 
385
319
  // src/cli/index.ts
386
- var program = new import_commander6.Command("efc").description("Express File Cluster CLI").version("0.1.0");
320
+ var program = new (0, _commander.Command)("efc").description("Express File Cluster CLI").version("0.1.0");
387
321
  program.addCommand(startCommand());
388
322
  program.addCommand(buildCommand());
389
323
  program.addCommand(runCommand());
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/start.ts","../../src/cli/commands/build.ts","../../src/cli/commands/run.ts","../../src/cli/commands/generate.ts","../../src/cli/commands/diagnostics.ts","../../src/router/scan.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { startCommand } from './commands/start.js';\nimport { buildCommand } from './commands/build.js';\nimport { runCommand } from './commands/run.js';\nimport { generateCommand } from './commands/generate.js';\nimport { diagnosticsCommands } from './commands/diagnostics.js';\n\nconst program = new Command('efc')\n .description('Express File Cluster CLI')\n .version('0.1.0');\n\nprogram.addCommand(startCommand());\nprogram.addCommand(buildCommand());\nprogram.addCommand(runCommand());\nprogram.addCommand(generateCommand());\n\nfor (const cmd of diagnosticsCommands()) {\n program.addCommand(cmd);\n}\n\nprogram.parse(process.argv);\n","import { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport chalk from 'chalk';\n\nexport function startCommand(): Command {\n const cmd = new Command('start');\n\n cmd\n .argument('<mode>', 'dev | prod')\n .description('Start the EFC server')\n .action((mode: string) => {\n if (mode === 'dev') {\n startDev();\n } else if (mode === 'prod') {\n startProd();\n } else {\n console.error(chalk.red(`Unknown mode: ${mode}. Use 'dev' or 'prod'.`));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nfunction parseDotenv(cwd: string): Record<string, string> {\n const envFile = path.join(cwd, '.env');\n if (!fs.existsSync(envFile)) return {};\n const vars: Record<string, string> = {};\n for (const line of fs.readFileSync(envFile, 'utf8').split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eq = trimmed.indexOf('=');\n if (eq === -1) continue;\n const key = trimmed.slice(0, eq).trim();\n const raw = trimmed.slice(eq + 1).trim();\n vars[key] = raw.replace(/^(['\"])(.*)\\1$/, '$2');\n }\n return vars;\n}\n\nfunction startDev(): void {\n const entry = resolveEntry();\n if (!entry) {\n console.error(chalk.red('[EFC] Could not find entry point. Expected src/index.ts or index.ts'));\n process.exit(1);\n }\n\n console.log(chalk.cyan('[EFC] Starting development server…'));\n console.log(chalk.dim(` Entry: ${entry}`));\n\n const cwd = process.cwd();\n const localTsx = path.join(cwd, 'node_modules', '.bin', 'tsx');\n const tsx = fs.existsSync(localTsx) ? localTsx : 'tsx';\n\n // .env values are base; existing process.env takes precedence (same as dotenv default)\n const env: NodeJS.ProcessEnv = { ...parseDotenv(cwd), ...process.env, NODE_ENV: 'development' };\n\n const child = spawn(tsx, ['watch', entry], { stdio: 'inherit', env });\n child.on('exit', (code) => process.exit(code ?? 0));\n}\n\nfunction startProd(): void {\n const cwd = process.cwd();\n const distEntry = path.join(cwd, 'dist', 'index.js');\n\n if (!fs.existsSync(distEntry)) {\n console.error(chalk.red('[EFC] dist/index.js not found. Run `efc build prod` first.'));\n process.exit(1);\n }\n\n console.log(chalk.cyan('[EFC] Starting production server…'));\n\n // Production env comes exclusively from process.env — no .env file loading.\n // Platforms (Docker, Kubernetes, Railway, Heroku, etc.) inject vars directly.\n const child = spawn('node', [distEntry], {\n stdio: 'inherit',\n env: { ...process.env, NODE_ENV: 'production' },\n });\n child.on('exit', (code) => process.exit(code ?? 0));\n}\n\nfunction resolveEntry(): string | null {\n const cwd = process.cwd();\n const candidates = [\n path.join(cwd, 'src', 'index.ts'),\n path.join(cwd, 'index.ts'),\n path.join(cwd, 'src', 'index.js'),\n path.join(cwd, 'index.js'),\n ];\n return candidates.find((f) => fs.existsSync(f)) ?? null;\n}\n","import { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport chalk from 'chalk';\n\nexport function buildCommand(): Command {\n const cmd = new Command('build');\n\n cmd\n .argument('<mode>', 'prod')\n .description('Build the application for production')\n .action((mode: string) => {\n if (mode !== 'prod') {\n console.error(chalk.red(`Unknown build mode: ${mode}. Use 'prod'.`));\n process.exit(1);\n }\n buildProd();\n });\n\n return cmd;\n}\n\nfunction buildProd(): void {\n console.log(chalk.cyan('[EFC] Building for production…'));\n\n // Type-check first\n const tsc = spawn('npx', ['tsc', '--noEmit'], { stdio: 'inherit' });\n\n tsc.on('exit', (code) => {\n if (code !== 0) {\n console.error(chalk.red('[EFC] TypeScript errors found. Fix them before building.'));\n process.exit(1);\n }\n\n const tsup = spawn('npx', ['tsup'], { stdio: 'inherit' });\n tsup.on('exit', (tsupCode) => {\n if (tsupCode === 0) {\n console.log(chalk.green('[EFC] Build complete → dist/'));\n } else {\n process.exit(tsupCode ?? 1);\n }\n });\n });\n}\n","import { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport chalk from 'chalk';\n\nexport function runCommand(): Command {\n const cmd = new Command('run');\n\n cmd\n .argument('<runner>', 'tests')\n .description('Run EFC sub-commands (tests)')\n .allowUnknownOption()\n .action((runner: string) => {\n if (runner === 'tests') {\n runTests(cmd.args.slice(1));\n } else {\n console.error(chalk.red(`Unknown runner: ${runner}. Use 'tests'.`));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nfunction runTests(extraArgs: string[]): void {\n console.log(chalk.cyan('[EFC] Running tests via Vitest…'));\n const child = spawn('npx', ['vitest', 'run', ...extraArgs], { stdio: 'inherit' });\n child.on('exit', (code) => process.exit(code ?? 0));\n}\n","import { Command } from 'commander';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport chalk from 'chalk';\n\nexport function generateCommand(): Command {\n const cmd = new Command('generate').alias('g').description('Scaffold EFC modules');\n\n cmd\n .command('route <routePath>')\n .description('Scaffold a route module, e.g. users/[id]')\n .action((routePath: string) => generateRoute(routePath));\n\n cmd\n .command('task <name>')\n .description('Scaffold a background task module')\n .action((name: string) => generateTask(name));\n\n cmd\n .command('middleware <name>')\n .description('Scaffold a middleware module')\n .action((name: string) => generateMiddleware(name));\n\n return cmd;\n}\n\nfunction writeFile(filePath: string, content: string): void {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n if (fs.existsSync(filePath)) {\n console.error(chalk.red(`File already exists: ${filePath}`));\n process.exit(1);\n }\n fs.writeFileSync(filePath, content, 'utf8');\n console.log(chalk.green(` created ${path.relative(process.cwd(), filePath)}`));\n}\n\nfunction generateRoute(routePath: string): void {\n const cwd = process.cwd();\n const filePath = path.join(cwd, 'src', 'api', `${routePath}.ts`);\n\n const content = `import type { Request, Response } from 'express';\n\nexport const GET = async (req: Request, res: Response) => {\n res.json({ message: 'OK' });\n};\n\nexport const POST = async (req: Request, res: Response) => {\n res.status(201).json({ message: 'Created' });\n};\n`;\n\n writeFile(filePath, content);\n console.log(chalk.cyan(`[EFC] Route scaffolded`));\n}\n\nfunction generateTask(name: string): void {\n const cwd = process.cwd();\n const filePath = path.join(cwd, 'src', 'tasks', `${name}.ts`);\n\n const content = `import { defineTask } from 'express-file-cluster/tasks';\n\ninterface ${name}Payload {\n // TODO: define payload fields\n}\n\nexport default defineTask<${name}Payload>(async (payload) => {\n // TODO: implement task logic\n console.log('[Task:${name}]', payload);\n});\n`;\n\n writeFile(filePath, content);\n console.log(chalk.cyan(`[EFC] Task scaffolded`));\n}\n\nfunction generateMiddleware(name: string): void {\n const cwd = process.cwd();\n const filePath = path.join(cwd, 'src', 'middlewares', `${name}.ts`);\n\n const content = `import type { Request, Response, NextFunction } from 'express';\n\nexport function ${name}(req: Request, res: Response, next: NextFunction): void {\n // TODO: implement middleware logic\n next();\n}\n`;\n\n writeFile(filePath, content);\n console.log(chalk.cyan(`[EFC] Middleware scaffolded`));\n}\n","import { Command } from 'commander';\nimport { scanDir } from '../../router/scan.js';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport chalk from 'chalk';\n\nexport function diagnosticsCommands(): Command[] {\n return [routesCommand(), tasksCommand(), doctorCommand()];\n}\n\nfunction routesCommand(): Command {\n return new Command('routes')\n .description('Print the resolved route table')\n .action(() => {\n const apiDir = resolveApiDir();\n if (!apiDir) {\n console.error(chalk.red('[EFC] Could not find apiDir (expected src/api)'));\n process.exit(1);\n }\n\n const routes = scanDir(apiDir);\n if (routes.length === 0) {\n console.log(chalk.yellow('No routes found.'));\n return;\n }\n\n console.log(chalk.bold('\\n Route Table\\n'));\n console.log(chalk.dim(' ' + '─'.repeat(60)));\n for (const route of routes) {\n const rel = path.relative(process.cwd(), route.filePath);\n console.log(` ${chalk.cyan(route.urlPath.padEnd(35))} ${chalk.dim(rel)}`);\n }\n console.log(chalk.dim(' ' + '─'.repeat(60)));\n console.log(chalk.dim(`\\n ${routes.length} route(s) found\\n`));\n });\n}\n\nfunction tasksCommand(): Command {\n return new Command('tasks')\n .description('List registered background tasks')\n .action(() => {\n const tasksDir = resolveTasksDir();\n if (!tasksDir || !fs.existsSync(tasksDir)) {\n console.log(chalk.yellow('No tasks directory found.'));\n return;\n }\n\n const files = fs.readdirSync(tasksDir).filter((f) => /\\.(ts|js)$/.test(f));\n if (files.length === 0) {\n console.log(chalk.yellow('No tasks found.'));\n return;\n }\n\n console.log(chalk.bold('\\n Background Tasks\\n'));\n for (const file of files) {\n console.log(` ${chalk.cyan(path.basename(file, path.extname(file)))}`);\n }\n console.log();\n });\n}\n\nfunction doctorCommand(): Command {\n return new Command('doctor')\n .description('Validate config, env vars, and project setup')\n .action(() => {\n const cwd = process.cwd();\n const checks: { label: string; ok: boolean; hint?: string }[] = [\n {\n label: 'package.json exists',\n ok: fs.existsSync(path.join(cwd, 'package.json')),\n },\n {\n label: 'tsconfig.json exists',\n ok: fs.existsSync(path.join(cwd, 'tsconfig.json')),\n hint: 'Run `tsc --init` to create one',\n },\n {\n label: 'src/api directory exists',\n ok: fs.existsSync(path.join(cwd, 'src', 'api')),\n hint: 'Create src/api/ and add route files',\n },\n {\n label: 'DATABASE_URL set',\n ok: Boolean(process.env['DATABASE_URL']),\n hint: 'Add DATABASE_URL to .env',\n },\n {\n label: 'JWT_SECRET set',\n ok: Boolean(process.env['JWT_SECRET']),\n hint: 'Add JWT_SECRET to .env (generate: openssl rand -hex 64)',\n },\n ];\n\n console.log(chalk.bold('\\n EFC Doctor\\n'));\n let allOk = true;\n for (const check of checks) {\n const icon = check.ok ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${icon} ${check.label}`);\n if (!check.ok) {\n allOk = false;\n if (check.hint) console.log(chalk.dim(` → ${check.hint}`));\n }\n }\n console.log();\n if (allOk) {\n console.log(chalk.green(' All checks passed!\\n'));\n } else {\n console.log(chalk.yellow(' Some checks failed. Fix the issues above.\\n'));\n process.exit(1);\n }\n });\n}\n\nfunction resolveApiDir(): string | null {\n const cwd = process.cwd();\n const candidates = [path.join(cwd, 'src', 'api'), path.join(cwd, 'api')];\n return candidates.find((d) => fs.existsSync(d)) ?? null;\n}\n\nfunction resolveTasksDir(): string | null {\n const cwd = process.cwd();\n const candidates = [path.join(cwd, 'src', 'tasks'), path.join(cwd, 'tasks')];\n return candidates.find((d) => fs.existsSync(d)) ?? null;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { RouteEntry } from '../types.js';\n\nconst ROUTE_FILE_RE = /\\.(ts|js|mts|mjs|cts|cjs)$/;\nconst DYNAMIC_SEGMENT_RE = /\\[([^\\]]+)\\]/g;\n\nfunction filePathToUrlPath(relativePath: string): string {\n let p = relativePath.replace(ROUTE_FILE_RE, '');\n // index files map to parent path\n p = p.replace(/\\/index$/, '');\n // [param] → :param\n p = p.replace(DYNAMIC_SEGMENT_RE, ':$1');\n return p === '' ? '/' : p.startsWith('/') ? p : `/${p}`;\n}\n\nfunction extractParams(relativePath: string): string[] {\n const params: string[] = [];\n let match: RegExpExecArray | null;\n const re = new RegExp(DYNAMIC_SEGMENT_RE.source, 'g');\n while ((match = re.exec(relativePath)) !== null) {\n if (match[1]) params.push(match[1]);\n }\n return params;\n}\n\nexport function scanDir(dir: string, base: string = dir): RouteEntry[] {\n if (!fs.existsSync(dir)) return [];\n\n const entries: RouteEntry[] = [];\n const items = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const item of items) {\n const fullPath = path.join(dir, item.name);\n if (item.isDirectory()) {\n entries.push(...scanDir(fullPath, base));\n } else if (ROUTE_FILE_RE.test(item.name)) {\n const relative = '/' + path.relative(base, fullPath).replace(/\\\\/g, '/');\n entries.push({\n urlPath: filePathToUrlPath(relative),\n filePath: fullPath,\n params: extractParams(relative),\n });\n }\n }\n\n // Sort: static routes before dynamic ones at each segment level\n return entries.sort((a, b) => {\n const aDynamic = a.urlPath.includes(':') ? 1 : 0;\n const bDynamic = b.urlPath.includes(':') ? 1 : 0;\n return aDynamic - bDynamic || a.urlPath.localeCompare(b.urlPath);\n });\n}\n\nexport { filePathToUrlPath };\n"],"mappings":"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","names":["import_commander","chalk","path","fs","import_commander","import_node_child_process","import_chalk","chalk","import_commander","import_node_child_process","import_chalk","chalk","import_commander","import_node_fs","import_node_path","import_chalk","path","fs","chalk","import_commander","import_node_fs","import_node_path","fs","path","import_node_path","import_node_fs","import_chalk","chalk","path","fs"]}
1
+ {"version":3,"sources":["/home/runner/work/efc.js/efc.js/packages/core/dist/cli/index.cjs","../../src/cli/index.ts","../../src/cli/commands/start.ts","../../src/cli/commands/build.ts","../../src/cli/commands/run.ts","../../src/cli/commands/generate.ts","../../src/cli/commands/diagnostics.ts"],"names":["path","pc"],"mappings":"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","file":"/home/runner/work/efc.js/efc.js/packages/core/dist/cli/index.cjs","sourcesContent":[null,"#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { startCommand } from './commands/start.js';\nimport { buildCommand } from './commands/build.js';\nimport { runCommand } from './commands/run.js';\nimport { generateCommand } from './commands/generate.js';\nimport { diagnosticsCommands } from './commands/diagnostics.js';\n\nconst program = new Command('efc')\n .description('Express File Cluster CLI')\n .version('0.1.0');\n\nprogram.addCommand(startCommand());\nprogram.addCommand(buildCommand());\nprogram.addCommand(runCommand());\nprogram.addCommand(generateCommand());\n\nfor (const cmd of diagnosticsCommands()) {\n program.addCommand(cmd);\n}\n\nprogram.parse(process.argv);\n","import { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport pc from 'picocolors';\n\nexport function startCommand(): Command {\n const cmd = new Command('start');\n\n cmd\n .argument('<mode>', 'dev | prod')\n .description('Start the EFC server')\n .action((mode: string) => {\n if (mode === 'dev') {\n startDev();\n } else if (mode === 'prod') {\n startProd();\n } else {\n console.error(pc.red(`Unknown mode: ${mode}. Use 'dev' or 'prod'.`));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nfunction parseDotenv(cwd: string): Record<string, string> {\n const envFile = path.join(cwd, '.env');\n if (!fs.existsSync(envFile)) return {};\n const vars: Record<string, string> = {};\n for (const line of fs.readFileSync(envFile, 'utf8').split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eq = trimmed.indexOf('=');\n if (eq === -1) continue;\n const key = trimmed.slice(0, eq).trim();\n const raw = trimmed.slice(eq + 1).trim();\n vars[key] = raw.replace(/^(['\"])(.*)\\1$/, '$2');\n }\n return vars;\n}\n\nfunction startDev(): void {\n const entry = resolveEntry();\n if (!entry) {\n console.error(pc.red('[EFC] Could not find entry point. Expected src/index.ts or index.ts'));\n process.exit(1);\n }\n\n console.log(pc.cyan('[EFC] Starting development server…'));\n console.log(pc.dim(` Entry: ${entry}`));\n\n const cwd = process.cwd();\n const localTsx = path.join(cwd, 'node_modules', '.bin', 'tsx');\n const tsx = fs.existsSync(localTsx) ? localTsx : 'tsx';\n\n // .env values are base; existing process.env takes precedence (same as dotenv default)\n const env: NodeJS.ProcessEnv = { ...parseDotenv(cwd), ...process.env, NODE_ENV: 'development' };\n\n const child = spawn(tsx, ['watch', '--include', 'src', entry], { stdio: 'inherit', env });\n child.on('exit', (code) => process.exit(code ?? 0));\n}\n\nfunction startProd(): void {\n const cwd = process.cwd();\n const distEntry = path.join(cwd, 'dist', 'index.js');\n\n if (!fs.existsSync(distEntry)) {\n console.error(pc.red('[EFC] dist/index.js not found. Run `efc build prod` first.'));\n process.exit(1);\n }\n\n console.log(pc.cyan('[EFC] Starting production server…'));\n\n // Production env comes exclusively from process.env — no .env file loading.\n // Platforms (Docker, Kubernetes, Railway, Heroku, etc.) inject vars directly.\n const child = spawn('node', [distEntry], {\n stdio: 'inherit',\n env: { ...process.env, NODE_ENV: 'production' },\n });\n child.on('exit', (code) => process.exit(code ?? 0));\n}\n\nfunction resolveEntry(): string | null {\n const cwd = process.cwd();\n const candidates = [\n path.join(cwd, 'src', 'index.ts'),\n path.join(cwd, 'index.ts'),\n path.join(cwd, 'src', 'index.js'),\n path.join(cwd, 'index.js'),\n ];\n return candidates.find((f) => fs.existsSync(f)) ?? null;\n}\n","import { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport pc from 'picocolors';\n\nexport function buildCommand(): Command {\n const cmd = new Command('build');\n\n cmd\n .argument('<mode>', 'prod')\n .description('Build the application for production')\n .action((mode: string) => {\n if (mode !== 'prod') {\n console.error(pc.red(`Unknown build mode: ${mode}. Use 'prod'.`));\n process.exit(1);\n }\n buildProd();\n });\n\n return cmd;\n}\n\nfunction buildProd(): void {\n console.log(pc.cyan('[EFC] Building for production…'));\n\n // Type-check first\n const tsc = spawn('npx', ['tsc', '--noEmit'], { stdio: 'inherit' });\n\n tsc.on('exit', (code) => {\n if (code !== 0) {\n console.error(pc.red('[EFC] TypeScript errors found. Fix them before building.'));\n process.exit(1);\n }\n\n const tsup = spawn('npx', ['tsup'], { stdio: 'inherit' });\n tsup.on('exit', (tsupCode) => {\n if (tsupCode === 0) {\n console.log(pc.green('[EFC] Build complete → dist/'));\n } else {\n process.exit(tsupCode ?? 1);\n }\n });\n });\n}\n","import { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport pc from 'picocolors';\n\nexport function runCommand(): Command {\n const cmd = new Command('run');\n\n cmd\n .argument('<runner>', 'tests')\n .description('Run EFC sub-commands (tests)')\n .allowUnknownOption()\n .action((runner: string) => {\n if (runner === 'tests') {\n runTests(cmd.args.slice(1));\n } else {\n console.error(pc.red(`Unknown runner: ${runner}. Use 'tests'.`));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nfunction runTests(extraArgs: string[]): void {\n console.log(pc.cyan('[EFC] Running tests via Vitest…'));\n const child = spawn('npx', ['vitest', 'run', ...extraArgs], { stdio: 'inherit' });\n child.on('exit', (code) => process.exit(code ?? 0));\n}\n","import { Command } from 'commander';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\n\nexport function generateCommand(): Command {\n const cmd = new Command('generate').alias('g').description('Scaffold EFC modules');\n\n cmd\n .command('route <routePath>')\n .description('Scaffold a route module, e.g. users/[id]')\n .action((routePath: string) => generateRoute(routePath));\n\n cmd\n .command('task <name>')\n .description('Scaffold a background task module')\n .action((name: string) => generateTask(name));\n\n cmd\n .command('middleware <name>')\n .description('Scaffold a middleware module')\n .action((name: string) => generateMiddleware(name));\n\n return cmd;\n}\n\nfunction writeFile(filePath: string, content: string): void {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n if (fs.existsSync(filePath)) {\n console.error(pc.red(`File already exists: ${filePath}`));\n process.exit(1);\n }\n fs.writeFileSync(filePath, content, 'utf8');\n console.log(pc.green(` created ${path.relative(process.cwd(), filePath)}`));\n}\n\nfunction generateRoute(routePath: string): void {\n const cwd = process.cwd();\n const filePath = path.join(cwd, 'src', 'api', `${routePath}.ts`);\n\n const content = `import type { Request, Response } from 'express';\n\nexport const GET = async (req: Request, res: Response) => {\n res.json({ message: 'OK' });\n};\n\nexport const POST = async (req: Request, res: Response) => {\n res.status(201).json({ message: 'Created' });\n};\n`;\n\n writeFile(filePath, content);\n console.log(pc.cyan(`[EFC] Route scaffolded`));\n}\n\nfunction generateTask(name: string): void {\n const cwd = process.cwd();\n const filePath = path.join(cwd, 'src', 'tasks', `${name}.ts`);\n\n const content = `import { defineTask } from 'express-file-cluster/tasks';\n\ninterface ${name}Payload {\n // TODO: define payload fields\n}\n\nexport default defineTask<${name}Payload>(async (payload) => {\n // TODO: implement task logic\n console.log('[Task:${name}]', payload);\n});\n`;\n\n writeFile(filePath, content);\n console.log(pc.cyan(`[EFC] Task scaffolded`));\n}\n\nfunction generateMiddleware(name: string): void {\n const cwd = process.cwd();\n const filePath = path.join(cwd, 'src', 'middlewares', `${name}.ts`);\n\n const content = `import type { Request, Response, NextFunction } from 'express';\n\nexport function ${name}(req: Request, res: Response, next: NextFunction): void {\n // TODO: implement middleware logic\n next();\n}\n`;\n\n writeFile(filePath, content);\n console.log(pc.cyan(`[EFC] Middleware scaffolded`));\n}\n","import { Command } from 'commander';\nimport { scanDir } from '../../router/scan.js';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport pc from 'picocolors';\n\nexport function diagnosticsCommands(): Command[] {\n return [routesCommand(), tasksCommand(), doctorCommand()];\n}\n\nfunction routesCommand(): Command {\n return new Command('routes')\n .description('Print the resolved route table')\n .action(() => {\n const apiDir = resolveApiDir();\n if (!apiDir) {\n console.error(pc.red('[EFC] Could not find apiDir (expected src/api)'));\n process.exit(1);\n }\n\n const routes = scanDir(apiDir);\n if (routes.length === 0) {\n console.log(pc.yellow('No routes found.'));\n return;\n }\n\n console.log(pc.bold('\\n Route Table\\n'));\n console.log(pc.dim(' ' + '─'.repeat(60)));\n for (const route of routes) {\n const rel = path.relative(process.cwd(), route.filePath);\n console.log(` ${pc.cyan(route.urlPath.padEnd(35))} ${pc.dim(rel)}`);\n }\n console.log(pc.dim(' ' + '─'.repeat(60)));\n console.log(pc.dim(`\\n ${routes.length} route(s) found\\n`));\n });\n}\n\nfunction tasksCommand(): Command {\n return new Command('tasks')\n .description('List registered background tasks')\n .action(() => {\n const tasksDir = resolveTasksDir();\n if (!tasksDir || !fs.existsSync(tasksDir)) {\n console.log(pc.yellow('No tasks directory found.'));\n return;\n }\n\n const files = fs.readdirSync(tasksDir).filter((f) => /\\.(ts|js)$/.test(f));\n if (files.length === 0) {\n console.log(pc.yellow('No tasks found.'));\n return;\n }\n\n console.log(pc.bold('\\n Background Tasks\\n'));\n for (const file of files) {\n console.log(` ${pc.cyan(path.basename(file, path.extname(file)))}`);\n }\n console.log();\n });\n}\n\nfunction doctorCommand(): Command {\n return new Command('doctor')\n .description('Validate config, env vars, and project setup')\n .action(() => {\n const cwd = process.cwd();\n const checks: { label: string; ok: boolean; hint?: string }[] = [\n {\n label: 'package.json exists',\n ok: fs.existsSync(path.join(cwd, 'package.json')),\n },\n {\n label: 'tsconfig.json exists',\n ok: fs.existsSync(path.join(cwd, 'tsconfig.json')),\n hint: 'Run `tsc --init` to create one',\n },\n {\n label: 'src/api directory exists',\n ok: fs.existsSync(path.join(cwd, 'src', 'api')),\n hint: 'Create src/api/ and add route files',\n },\n {\n label: 'DATABASE_URL set',\n ok: Boolean(process.env['DATABASE_URL']),\n hint: 'Add DATABASE_URL to .env',\n },\n {\n label: 'JWT_SECRET set',\n ok: Boolean(process.env['JWT_SECRET']),\n hint: 'Add JWT_SECRET to .env (generate: openssl rand -hex 64)',\n },\n ];\n\n console.log(pc.bold('\\n EFC Doctor\\n'));\n let allOk = true;\n for (const check of checks) {\n const icon = check.ok ? pc.green('✓') : pc.red('✗');\n console.log(` ${icon} ${check.label}`);\n if (!check.ok) {\n allOk = false;\n if (check.hint) console.log(pc.dim(` → ${check.hint}`));\n }\n }\n console.log();\n if (allOk) {\n console.log(pc.green(' All checks passed!\\n'));\n } else {\n console.log(pc.yellow(' Some checks failed. Fix the issues above.\\n'));\n process.exit(1);\n }\n });\n}\n\nfunction resolveApiDir(): string | null {\n const cwd = process.cwd();\n const candidates = [path.join(cwd, 'src', 'api'), path.join(cwd, 'api')];\n return candidates.find((d) => fs.existsSync(d)) ?? null;\n}\n\nfunction resolveTasksDir(): string | null {\n const cwd = process.cwd();\n const candidates = [path.join(cwd, 'src', 'tasks'), path.join(cwd, 'tasks')];\n return candidates.find((d) => fs.existsSync(d)) ?? null;\n}\n"]}