legonode 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/cli.js CHANGED
@@ -36,7 +36,8 @@ program
36
36
  .action((opts) => buildCommand.run(opts));
37
37
  program
38
38
  .command("create [name]")
39
- .description("Create a new Legonode project")
39
+ .description("Create a new Legonode project (local scaffold, or clone a template via -t)")
40
+ .option("-t, --template <value>", "Template: built-in name (e.g. basic) or git URL / github.com/.../tree/branch/path")
40
41
  .option("--no-install", "Skip npm/bun install")
41
42
  .action(async (name, cmd) => {
42
43
  const opts = cmd?.opts?.() ?? {};
@@ -45,6 +46,9 @@ program
45
46
  };
46
47
  if (name !== undefined)
47
48
  runOpts.name = name;
49
+ if (opts.template !== undefined && opts.template !== "") {
50
+ runOpts.template = opts.template;
51
+ }
48
52
  await createCommand.run(runOpts);
49
53
  });
50
54
  program
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../cli/cli.ts"],"names":[],"mappings":";AAEA,iFAAiF;AACjF,IAAI,OAAQ,UAAkB,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;IACnD,IAAI,CAAC;QACH,sDAAsD;QACtD,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;AACH,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAyB,CAAC;AAElE,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,wBAAwB,CAAC;KACrC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;AAEnC,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;KAClE,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;KAC3D,MAAM,CAAC,mBAAmB,EAAE,iEAAiE,CAAC;KAC9F,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAE1C,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,qBAAqB,EAAE,qCAAqC,CAAC;KACpE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAE5C,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,cAAc,EAAE,sBAAsB,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,GAA2C,EAAE,EAAE;IACtF,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;IACjC,MAAM,OAAO,GAA0C;QACrD,SAAS,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK;KAClC,CAAC;IACF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC5C,MAAM,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;KACrD,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;KAC9D,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;KACvE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAE5C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../cli/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../cli/commands/build.ts"],"names":[],"mappings":"AAyEA,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,YAAY;;0BAEL,YAAY;CAmFtB,CAAC"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../cli/commands/build.ts"],"names":[],"mappings":"AAgEA,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,YAAY;;0BAEL,YAAY;CAmFtB,CAAC"}
@@ -1,9 +1,10 @@
1
- import { existsSync, readdirSync, writeFileSync } from "node:fs";
1
+ import { existsSync, writeFileSync } from "node:fs";
2
2
  import { join, resolve } from "node:path";
3
3
  import { spawn } from "node:child_process";
4
4
  import { loadConfig, getAppDir, getBuildPath } from "../../src/config/loadConfig.js";
5
5
  import { scanAppFiles } from "../../src/loader/fileScanner.js";
6
6
  import { validateApp } from "../../src/validation/validateApp.js";
7
+ import { scanEventFiles } from "../../src/events/eventExecutor.js";
7
8
  import { runPluginHook } from "../pluginHooks.js";
8
9
  import { appLogger } from "../../src/utils/logger.js";
9
10
  /**
@@ -55,16 +56,8 @@ runServer(opts).catch((err) => {
55
56
  writeFileSync(serverPath, serverJs, "utf-8");
56
57
  appLogger.info(" server.js written to " + serverPath);
57
58
  }
58
- const EVENT_EXTENSIONS = [".event.ts", ".event.js", ".event.mts", ".event.mjs"];
59
59
  function countEventFiles(appDir) {
60
- try {
61
- const eventsDir = join(resolve(appDir), "events");
62
- const entries = readdirSync(eventsDir, { withFileTypes: true });
63
- return entries.filter((e) => e.isFile() && EVENT_EXTENSIONS.some((ext) => e.name.endsWith(ext))).length;
64
- }
65
- catch {
66
- return 0;
67
- }
60
+ return scanEventFiles(appDir).length;
68
61
  }
69
62
  export const buildCommand = {
70
63
  name: "build",
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../cli/commands/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../cli/commands/build.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,20 @@ export type CreateOptions = {
3
3
  name?: string;
4
4
  /** Skip package manager install */
5
5
  noInstall?: boolean;
6
+ /**
7
+ * Template: built-in key from `BUILTIN_TEMPLATES`, a Git clone URL, or a GitHub folder link
8
+ * (`https://github.com/owner/repo/tree/branch/path`).
9
+ * Undefined = prompt to pick a template or default scaffold.
10
+ */
11
+ template?: string;
6
12
  };
13
+ /**
14
+ * Built-in template name → source:
15
+ * - Full git remote (`.git` or `git@...`), or
16
+ * - GitHub browser URL: `https://github.com/{owner}/{repo}/tree/{branch}/{path}` (sparse checkout of that folder).
17
+ * Keys are matched case-insensitively when using `-t <name>`.
18
+ */
19
+ export declare const BUILTIN_TEMPLATES: Record<string, string>;
7
20
  export declare const createCommand: {
8
21
  readonly name: "create";
9
22
  readonly run: (opts?: CreateOptions) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../cli/commands/create.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GAAG;IAC1B,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AA4EF,eAAO,MAAM,aAAa;;0BAEN,aAAa;CAgHvB,CAAC"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../cli/commands/create.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,aAAa,GAAG;IAC1B,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAIF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEpD,CAAC;AA4VF,eAAO,MAAM,aAAa;;0BAEN,aAAa;CAWvB,CAAC"}
@@ -1,8 +1,20 @@
1
- import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
1
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, rmSync, statSync, writeFileSync, } from "node:fs";
2
2
  import { basename, join, resolve } from "node:path";
3
- import { execSync, spawn } from "node:child_process";
3
+ import { tmpdir } from "node:os";
4
+ import { execFileSync, execSync, spawn } from "node:child_process";
5
+ import { ExitPromptError } from "@inquirer/core";
4
6
  import { input, select } from "@inquirer/prompts";
5
7
  import { appLogger } from "../../src/utils/logger.js";
8
+ /**
9
+ * Built-in template name → source:
10
+ * - Full git remote (`.git` or `git@...`), or
11
+ * - GitHub browser URL: `https://github.com/{owner}/{repo}/tree/{branch}/{path}` (sparse checkout of that folder).
12
+ * Keys are matched case-insensitively when using `-t <name>`.
13
+ */
14
+ export const BUILTIN_TEMPLATES = {
15
+ basic: "https://github.com/legonode/legonode/tree/dev/templates/basic",
16
+ };
17
+ const DEFAULT_SCAFFOLD_VALUE = "__default_scaffold__";
6
18
  function isPackageManagerAvailable(cmd) {
7
19
  try {
8
20
  execSync(`${cmd} --version`, { stdio: "ignore" });
@@ -16,6 +28,193 @@ function getAvailablePackageManagers() {
16
28
  const all = ["npm", "yarn", "pnpm", "bun"];
17
29
  return all.filter(isPackageManagerAvailable);
18
30
  }
31
+ function isGitAvailable() {
32
+ try {
33
+ execSync("git --version", { stdio: "ignore" });
34
+ return true;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ /** True if `-t` value should be treated as a clone URL / GitHub link, not a template key. */
41
+ function looksLikeGitUrl(value) {
42
+ const v = value.trim();
43
+ if (/^git@[^:]+:.+/i.test(v))
44
+ return true;
45
+ if (/^https?:\/\//i.test(v))
46
+ return true;
47
+ return false;
48
+ }
49
+ function parseGithubTreeBrowserUrl(url) {
50
+ const u = url.trim();
51
+ const m = u.match(/^https?:\/\/github\.com\/([^/]+)\/([^/]+)\/tree\/([^/]+)\/(.+)$/i);
52
+ if (!m)
53
+ return null;
54
+ const [, owner, repo, branch, pathPart] = m;
55
+ if (!owner || !repo || !branch || !pathPart)
56
+ return null;
57
+ const path = pathPart.split(/[?#]/)[0]?.replace(/\/+$/, "") ?? "";
58
+ if (!path)
59
+ return null;
60
+ return { owner, repo, branch, path };
61
+ }
62
+ function resolveBuiltinTemplateKey(inputKey) {
63
+ const k = inputKey.trim();
64
+ if (BUILTIN_TEMPLATES[k] !== undefined)
65
+ return k;
66
+ const lower = k.toLowerCase();
67
+ for (const name of Object.keys(BUILTIN_TEMPLATES)) {
68
+ if (name.toLowerCase() === lower)
69
+ return name;
70
+ }
71
+ return undefined;
72
+ }
73
+ function resolveCloneUrl(templateOpt) {
74
+ const t = templateOpt.trim();
75
+ if (looksLikeGitUrl(t))
76
+ return t;
77
+ const key = resolveBuiltinTemplateKey(t);
78
+ if (key !== undefined)
79
+ return BUILTIN_TEMPLATES[key];
80
+ const known = Object.keys(BUILTIN_TEMPLATES);
81
+ const hint = known.length > 0
82
+ ? `Use a built-in name (${known.join(", ")}) or pass a Git clone URL with -t.`
83
+ : "Pass a Git clone URL with -t, or add names and URLs to BUILTIN_TEMPLATES.";
84
+ throw new Error(`Unknown template "${t}". ${hint}`);
85
+ }
86
+ async function resolveTemplateChoice(templateOpt) {
87
+ if (templateOpt !== undefined && templateOpt.trim() !== "") {
88
+ const url = resolveCloneUrl(templateOpt);
89
+ return { mode: "clone", url };
90
+ }
91
+ const builtinChoices = Object.keys(BUILTIN_TEMPLATES).map((name) => ({
92
+ name: `${name} (${BUILTIN_TEMPLATES[name]})`,
93
+ value: name,
94
+ description: `Clone built-in template: ${name}`,
95
+ }));
96
+ const choices = [
97
+ ...builtinChoices,
98
+ {
99
+ name: "Default (local starter — no git)",
100
+ value: DEFAULT_SCAFFOLD_VALUE,
101
+ description: "Minimal Legonode app scaffold in this CLI",
102
+ },
103
+ ];
104
+ const picked = await select({
105
+ message: "Choose a template (use ↑/↓ arrows):",
106
+ choices,
107
+ });
108
+ if (picked === DEFAULT_SCAFFOLD_VALUE)
109
+ return { mode: "scaffold" };
110
+ return { mode: "clone", url: BUILTIN_TEMPLATES[picked] };
111
+ }
112
+ function assertDirEmptyForClone(dir, label) {
113
+ if (!existsSync(dir))
114
+ return;
115
+ const entries = readdirSync(dir).filter((e) => e !== ".git" && e !== ".DS_Store");
116
+ if (entries.length > 0) {
117
+ appLogger.error(`${label} is not empty. Choose an empty directory or a new project name.`);
118
+ process.exit(1);
119
+ }
120
+ }
121
+ /**
122
+ * Sparse-checkout a subfolder from GitHub (browser `tree/branch/path` links).
123
+ * Requires Git 2.25+ (`clone --sparse`).
124
+ */
125
+ function cloneGithubTreeFolder(spec, targetDir) {
126
+ const remote = `https://github.com/${spec.owner}/${spec.repo}.git`;
127
+ const tmpRoot = mkdtempSync(join(tmpdir(), "legonode-create-"));
128
+ const cloneDest = join(tmpRoot, "repo");
129
+ try {
130
+ appLogger.info(` Cloning ${remote} @ ${spec.branch} (sparse: ${spec.path})`);
131
+ execFileSync("git", [
132
+ "clone",
133
+ "--depth",
134
+ "1",
135
+ "-b",
136
+ spec.branch,
137
+ "--sparse",
138
+ remote,
139
+ cloneDest,
140
+ ], { stdio: "inherit" });
141
+ execFileSync("git", ["sparse-checkout", "set", spec.path], {
142
+ cwd: cloneDest,
143
+ stdio: "inherit",
144
+ });
145
+ const source = join(cloneDest, ...spec.path.split("/"));
146
+ if (!existsSync(source)) {
147
+ appLogger.error(`Sparse checkout did not produce "${spec.path}". Check branch and path.`);
148
+ process.exit(1);
149
+ }
150
+ cpSync(source, targetDir, { recursive: true });
151
+ }
152
+ catch {
153
+ appLogger.error("git sparse clone failed. Use Git 2.25+, check branch/path, and network access.");
154
+ process.exit(1);
155
+ }
156
+ finally {
157
+ rmSync(tmpRoot, { recursive: true, force: true });
158
+ }
159
+ try {
160
+ rmSync(join(targetDir, ".git"), { recursive: true, force: true });
161
+ }
162
+ catch {
163
+ // optional
164
+ }
165
+ }
166
+ /**
167
+ * Clone into a temp directory, then copy into `targetDir`.
168
+ * Supports full repo URLs and GitHub `.../tree/branch/path` links (sparse).
169
+ * If the repo root is a single subdirectory, that folder is unwrapped.
170
+ */
171
+ function cloneTemplateRepo(repoUrl, targetDir) {
172
+ if (!isGitAvailable()) {
173
+ appLogger.error("git is not installed or not on PATH. Install git to clone templates.");
174
+ process.exit(1);
175
+ }
176
+ assertDirEmptyForClone(targetDir, `Directory "${targetDir}"`);
177
+ mkdirSync(targetDir, { recursive: true });
178
+ const tree = parseGithubTreeBrowserUrl(repoUrl);
179
+ if (tree) {
180
+ cloneGithubTreeFolder(tree, targetDir);
181
+ return;
182
+ }
183
+ const tmpRoot = mkdtempSync(join(tmpdir(), "legonode-create-"));
184
+ const cloneDest = join(tmpRoot, "repo");
185
+ try {
186
+ appLogger.info(` Cloning ${repoUrl}`);
187
+ execFileSync("git", ["clone", "--depth", "1", repoUrl, cloneDest], {
188
+ stdio: "inherit",
189
+ });
190
+ const visible = readdirSync(cloneDest).filter((e) => e !== ".git");
191
+ let source = cloneDest;
192
+ if (visible.length === 1) {
193
+ const one = join(cloneDest, visible[0]);
194
+ try {
195
+ if (statSync(one).isDirectory())
196
+ source = one;
197
+ }
198
+ catch {
199
+ // keep source = cloneDest
200
+ }
201
+ }
202
+ cpSync(source, targetDir, { recursive: true });
203
+ }
204
+ catch {
205
+ appLogger.error("git clone failed. Check the URL and your network access.");
206
+ process.exit(1);
207
+ }
208
+ finally {
209
+ rmSync(tmpRoot, { recursive: true, force: true });
210
+ }
211
+ try {
212
+ rmSync(join(targetDir, ".git"), { recursive: true, force: true });
213
+ }
214
+ catch {
215
+ // optional
216
+ }
217
+ }
19
218
  const PACKAGE_JSON = (name) => `{
20
219
  "name": "${name}",
21
220
  "version": "0.0.1",
@@ -27,7 +226,7 @@ const PACKAGE_JSON = (name) => `{
27
226
  "start": "legonode start"
28
227
  },
29
228
  "dependencies": {
30
- "legonode": "^0.0.2"
229
+ "legonode": "^0.0.6"
31
230
  },
32
231
  "devDependencies": {
33
232
  "typescript": "^5.9.0"
@@ -69,101 +268,112 @@ export async function GET(ctx: Context) {
69
268
  function sanitizePackageName(name) {
70
269
  return name.replace(/[^a-z0-9-]/gi, "-").toLowerCase() || "my-legonode-app";
71
270
  }
271
+ async function runInstall(targetDir, noInstall) {
272
+ let depsInstalled = false;
273
+ if (noInstall) {
274
+ appLogger.info(" Run your package manager to install dependencies.");
275
+ return false;
276
+ }
277
+ const available = getAvailablePackageManagers();
278
+ if (available.length === 0) {
279
+ appLogger.warn(" No package manager found (npm, yarn, pnpm, bun). Run install manually.");
280
+ return false;
281
+ }
282
+ const choices = [
283
+ ...available.map((pm) => ({
284
+ name: pm,
285
+ value: pm,
286
+ description: `Use ${pm} to install dependencies`,
287
+ })),
288
+ {
289
+ name: "Skip install",
290
+ value: "skip",
291
+ description: "Don't install dependencies now",
292
+ },
293
+ ];
294
+ const selected = await select({
295
+ message: "Select a package manager (use ↑/↓ arrows):",
296
+ choices,
297
+ });
298
+ if (selected === "skip") {
299
+ appLogger.info(" Skipped install. Run your package manager to install dependencies.");
300
+ return false;
301
+ }
302
+ appLogger.info(` Installing dependencies with ${selected}...`);
303
+ await new Promise((resolvePromise, reject) => {
304
+ const args = selected === "bun" ? ["install"] : ["install"];
305
+ const child = spawn(selected, args, {
306
+ stdio: "inherit",
307
+ cwd: targetDir,
308
+ });
309
+ child.on("exit", (code) => {
310
+ if (code === 0) {
311
+ appLogger.info(" Done!");
312
+ resolvePromise();
313
+ }
314
+ else {
315
+ reject(new Error(`${selected} install exited with code ${code}`));
316
+ }
317
+ });
318
+ child.on("error", reject);
319
+ });
320
+ return true;
321
+ }
72
322
  export const createCommand = {
73
323
  name: "create",
74
324
  run: async (opts = {}) => {
75
- const cwd = process.cwd();
76
- // Resolve project name: prompt if not provided
77
- let projectName;
78
- if (opts.name === undefined) {
79
- const answered = await input({
80
- message: "Project name (leave empty to use current directory):",
81
- default: "",
82
- });
83
- projectName = answered.trim() === "" ? "." : answered.trim();
325
+ try {
326
+ await runCreate(opts);
84
327
  }
85
- else {
86
- projectName = opts.name;
87
- }
88
- const targetDir = projectName === "." ? cwd : resolve(cwd, projectName);
89
- if (projectName !== "." && existsSync(targetDir)) {
90
- const entries = readdirSync(targetDir);
91
- if (entries.length > 0) {
92
- appLogger.error(`Directory "${projectName}" already exists and is not empty.`);
93
- process.exit(1);
94
- }
95
- }
96
- // Package.json name: use folder name when in current dir, else use project name
97
- const packageJsonName = projectName === "."
98
- ? sanitizePackageName(basename(cwd)) || "my-legonode-app"
99
- : sanitizePackageName(projectName);
100
- appLogger.info("legonode create");
101
- appLogger.info(` Creating project in ${targetDir}`);
102
- function ensureDir(path) {
103
- if (!existsSync(path)) {
104
- mkdirSync(path, { recursive: true });
328
+ catch (e) {
329
+ if (e instanceof ExitPromptError) {
330
+ appLogger.error(e.message);
331
+ process.exit(130);
105
332
  }
333
+ throw e;
106
334
  }
107
- function write(path, content) {
108
- ensureDir(resolve(path, ".."));
109
- writeFileSync(path, content.trimStart(), "utf-8");
110
- }
111
- // package.json
112
- write(join(targetDir, "package.json"), PACKAGE_JSON(packageJsonName));
113
- // tsconfig.json
114
- write(join(targetDir, "tsconfig.json"), TSCONFIG_JSON);
115
- // legonode.config.ts
116
- write(join(targetDir, "legonode.config.ts"), LEGONODE_CONFIG_TS);
117
- // src/router/ping/route.ts
118
- const srcPath = join(targetDir, "src");
119
- write(join(srcPath, "router", "ping", "route.ts"), PING_ROUTE_TS);
120
- appLogger.info(` Created: package.json, tsconfig.json, legonode.config.ts`);
121
- appLogger.info(` Created: src/router/ping/route.ts`);
122
- // Package manager selection and install
123
- let depsInstalled = false;
124
- if (!opts.noInstall) {
125
- const available = getAvailablePackageManagers();
126
- if (available.length === 0) {
127
- appLogger.warn(" No package manager found (npm, yarn, pnpm, bun). Run install manually.");
128
- }
129
- else {
130
- const choices = [
131
- ...available.map((pm) => ({ name: pm, value: pm, description: `Use ${pm} to install dependencies` })),
132
- { name: "Skip install", value: "skip", description: "Don't install dependencies now" },
133
- ];
134
- const selected = await select({
135
- message: "Select a package manager (use ↑/↓ arrows):",
136
- choices,
137
- });
138
- if (selected !== "skip") {
139
- appLogger.info(` Installing dependencies with ${selected}...`);
140
- await new Promise((resolvePromise, reject) => {
141
- const args = selected === "bun" ? ["install"] : ["install"];
142
- const child = spawn(selected, args, {
143
- stdio: "inherit",
144
- cwd: targetDir,
145
- });
146
- child.on("exit", (code) => {
147
- if (code === 0) {
148
- appLogger.info(" Done!");
149
- depsInstalled = true;
150
- resolvePromise();
151
- }
152
- else {
153
- reject(new Error(`${selected} install exited with code ${code}`));
154
- }
155
- });
156
- child.on("error", reject);
157
- });
158
- }
159
- else {
160
- appLogger.info(" Skipped install. Run your package manager to install dependencies.");
161
- }
162
- }
163
- }
164
- else {
165
- appLogger.info(" Run your package manager to install dependencies.");
335
+ },
336
+ };
337
+ async function runCreate(opts = {}) {
338
+ const cwd = process.cwd();
339
+ let projectName;
340
+ if (opts.name === undefined) {
341
+ const answered = await input({
342
+ message: "Project name (leave empty to use current directory):",
343
+ default: "",
344
+ });
345
+ projectName = answered.trim() === "" ? "." : answered.trim();
346
+ }
347
+ else {
348
+ projectName = opts.name;
349
+ }
350
+ const targetDir = projectName === "." ? cwd : resolve(cwd, projectName);
351
+ if (projectName !== "." && existsSync(targetDir)) {
352
+ const entries = readdirSync(targetDir);
353
+ if (entries.length > 0) {
354
+ appLogger.error(`Directory "${projectName}" already exists and is not empty.`);
355
+ process.exit(1);
166
356
  }
357
+ }
358
+ const packageJsonName = projectName === "."
359
+ ? sanitizePackageName(basename(cwd)) || "my-legonode-app"
360
+ : sanitizePackageName(projectName);
361
+ let templateChoice;
362
+ try {
363
+ templateChoice = await resolveTemplateChoice(opts.template);
364
+ }
365
+ catch (e) {
366
+ if (e instanceof ExitPromptError)
367
+ throw e;
368
+ appLogger.error(e instanceof Error ? e.message : String(e));
369
+ process.exit(1);
370
+ }
371
+ appLogger.info("legonode create");
372
+ appLogger.info(` Target: ${targetDir}`);
373
+ if (templateChoice.mode === "clone") {
374
+ cloneTemplateRepo(templateChoice.url, targetDir);
375
+ appLogger.info(" Template cloned. .git removed for a fresh project.");
376
+ const depsInstalled = await runInstall(targetDir, opts.noInstall === true);
167
377
  appLogger.info("");
168
378
  appLogger.info("Next steps:");
169
379
  appLogger.info(` cd ${projectName === "." ? "." : projectName}`);
@@ -171,6 +381,32 @@ export const createCommand = {
171
381
  appLogger.info(" npm install # or: yarn / pnpm / bun install");
172
382
  }
173
383
  appLogger.info(" legonode dev");
174
- },
175
- };
384
+ return;
385
+ }
386
+ // --- default local scaffold ---
387
+ function ensureDir(path) {
388
+ if (!existsSync(path)) {
389
+ mkdirSync(path, { recursive: true });
390
+ }
391
+ }
392
+ function write(path, content) {
393
+ ensureDir(resolve(path, ".."));
394
+ writeFileSync(path, content.trimStart(), "utf-8");
395
+ }
396
+ write(join(targetDir, "package.json"), PACKAGE_JSON(packageJsonName));
397
+ write(join(targetDir, "tsconfig.json"), TSCONFIG_JSON);
398
+ write(join(targetDir, "legonode.config.ts"), LEGONODE_CONFIG_TS);
399
+ const srcPath = join(targetDir, "src");
400
+ write(join(srcPath, "router", "ping", "route.ts"), PING_ROUTE_TS);
401
+ appLogger.info(` Created: package.json, tsconfig.json, legonode.config.ts`);
402
+ appLogger.info(` Created: src/router/ping/route.ts`);
403
+ const depsInstalled = await runInstall(targetDir, opts.noInstall === true);
404
+ appLogger.info("");
405
+ appLogger.info("Next steps:");
406
+ appLogger.info(` cd ${projectName === "." ? "." : projectName}`);
407
+ if (!depsInstalled) {
408
+ appLogger.info(" npm install # or: yarn / pnpm / bun install");
409
+ }
410
+ appLogger.info(" legonode dev");
411
+ }
176
412
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../cli/commands/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../cli/commands/create.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../cli/commands/dev.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAaF,iBAAe,GAAG,CAAC,IAAI,GAAE,UAAe,iBAuOvC;AA0BD,eAAO,MAAM,UAAU;;;CAGb,CAAC"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../cli/commands/dev.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAaF,iBAAe,GAAG,CAAC,IAAI,GAAE,UAAe,iBAuOvC;AAuBD,eAAO,MAAM,UAAU;;;CAGb,CAAC"}
@@ -8,7 +8,7 @@ import { validateApp } from "../../src/validation/validateApp.js";
8
8
  import { clearPipelineCache } from "../../src/pipeline/pipelineCache.js";
9
9
  import { clearMiddlewareTableCache } from "../../src/middleware/middlewareTable.js";
10
10
  import { clearMiddlewareResolverCache } from "../../src/middleware/middlewareResolver.js";
11
- import { clearEventBusCache } from "../../src/events/eventExecutor.js";
11
+ import { clearEventBusCache, isLikelyEventHandlerFilename, } from "../../src/events/eventExecutor.js";
12
12
  import { clearRouteSecurityConfigCache } from "../../src/security/securityConfigLoader.js";
13
13
  import { reloadRoutes } from "../../src/router/routeLoader.js";
14
14
  import { runPluginHook } from "../pluginHooks.js";
@@ -244,11 +244,10 @@ function getFileTypeForReload(filename) {
244
244
  else if (/security\.(ts|js|mts|mjs)$/.test(filename)) {
245
245
  return "security";
246
246
  }
247
- else if (filename.startsWith("events/") &&
248
- /\.event\.(ts|js|mts|mjs)$/.test(filename)) {
247
+ else if (isLikelyEventHandlerFilename(filename)) {
249
248
  return "event";
250
249
  }
251
- else if (filename.startsWith("plugins/")) {
250
+ else if (filename.startsWith("plugins/") || filename.includes("plugins/")) {
252
251
  return "plugin";
253
252
  }
254
253
  return "other";