legonode 0.0.2 → 0.0.4
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
|
@@ -14,6 +14,7 @@ import { createRequire } from "node:module";
|
|
|
14
14
|
import { devCommand } from "./commands/dev.js";
|
|
15
15
|
import { buildCommand } from "./commands/build.js";
|
|
16
16
|
import { startCommand } from "./commands/start.js";
|
|
17
|
+
import { createCommand } from "./commands/create.js";
|
|
17
18
|
const require = createRequire(import.meta.url);
|
|
18
19
|
const pkg = require("../../package.json");
|
|
19
20
|
program
|
|
@@ -33,6 +34,19 @@ program
|
|
|
33
34
|
.description("Build the app for production")
|
|
34
35
|
.option("--build-path <path>", "Output directory (overrides config)")
|
|
35
36
|
.action((opts) => buildCommand.run(opts));
|
|
37
|
+
program
|
|
38
|
+
.command("create [name]")
|
|
39
|
+
.description("Create a new Legonode project")
|
|
40
|
+
.option("--no-install", "Skip npm/bun install")
|
|
41
|
+
.action(async (name, cmd) => {
|
|
42
|
+
const opts = cmd?.opts?.() ?? {};
|
|
43
|
+
const runOpts = {
|
|
44
|
+
noInstall: opts.install === false,
|
|
45
|
+
};
|
|
46
|
+
if (name !== undefined)
|
|
47
|
+
runOpts.name = name;
|
|
48
|
+
await createCommand.run(runOpts);
|
|
49
|
+
});
|
|
36
50
|
program
|
|
37
51
|
.command("start")
|
|
38
52
|
.description("Run the built app (no hot reload)")
|
package/dist/cli/cli.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type CreateOptions = {
|
|
2
|
+
/** Project name or "." for current directory; undefined = prompt user */
|
|
3
|
+
name?: string;
|
|
4
|
+
/** Skip package manager install */
|
|
5
|
+
noInstall?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare const createCommand: {
|
|
8
|
+
readonly name: "create";
|
|
9
|
+
readonly run: (opts?: CreateOptions) => Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { basename, join, resolve } from "node:path";
|
|
3
|
+
import { execSync, spawn } from "node:child_process";
|
|
4
|
+
import { input, select } from "@inquirer/prompts";
|
|
5
|
+
import { appLogger } from "../../src/utils/logger.js";
|
|
6
|
+
function isPackageManagerAvailable(cmd) {
|
|
7
|
+
try {
|
|
8
|
+
execSync(`${cmd} --version`, { stdio: "ignore" });
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function getAvailablePackageManagers() {
|
|
16
|
+
const all = ["npm", "yarn", "pnpm", "bun"];
|
|
17
|
+
return all.filter(isPackageManagerAvailable);
|
|
18
|
+
}
|
|
19
|
+
const PACKAGE_JSON = (name) => `{
|
|
20
|
+
"name": "${name}",
|
|
21
|
+
"version": "0.0.1",
|
|
22
|
+
"private": true,
|
|
23
|
+
"type": "module",
|
|
24
|
+
"scripts": {
|
|
25
|
+
"dev": "legonode dev",
|
|
26
|
+
"build": "legonode build",
|
|
27
|
+
"start": "legonode start"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"legonode": "^0.0.2"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"typescript": "^5.9.0"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
const TSCONFIG_JSON = `{
|
|
38
|
+
"compilerOptions": {
|
|
39
|
+
"target": "ES2022",
|
|
40
|
+
"lib": ["ES2022"],
|
|
41
|
+
"module": "ESNext",
|
|
42
|
+
"moduleResolution": "Bundler",
|
|
43
|
+
"strict": true,
|
|
44
|
+
"skipLibCheck": true,
|
|
45
|
+
"resolveJsonModule": true,
|
|
46
|
+
"esModuleInterop": true,
|
|
47
|
+
"forceConsistentCasingInFileNames": true
|
|
48
|
+
},
|
|
49
|
+
"include": ["src/**/*", "legonode.config.ts"]
|
|
50
|
+
}
|
|
51
|
+
`;
|
|
52
|
+
const LEGONODE_CONFIG_TS = `import type { LegonodeConfig } from "legonode";
|
|
53
|
+
|
|
54
|
+
const config: LegonodeConfig = {
|
|
55
|
+
dev: {
|
|
56
|
+
logPretty: true,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export default config;
|
|
61
|
+
`;
|
|
62
|
+
const PING_ROUTE_TS = `import type { Context } from "legonode";
|
|
63
|
+
|
|
64
|
+
export async function GET(ctx: Context) {
|
|
65
|
+
ctx.res.status(200);
|
|
66
|
+
return { message: "pong" };
|
|
67
|
+
}
|
|
68
|
+
`;
|
|
69
|
+
function sanitizePackageName(name) {
|
|
70
|
+
return name.replace(/[^a-z0-9-]/gi, "-").toLowerCase() || "my-legonode-app";
|
|
71
|
+
}
|
|
72
|
+
export const createCommand = {
|
|
73
|
+
name: "create",
|
|
74
|
+
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();
|
|
84
|
+
}
|
|
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 });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
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.");
|
|
166
|
+
}
|
|
167
|
+
appLogger.info("");
|
|
168
|
+
appLogger.info("Next steps:");
|
|
169
|
+
appLogger.info(` cd ${projectName === "." ? "." : projectName}`);
|
|
170
|
+
if (!depsInstalled) {
|
|
171
|
+
appLogger.info(" npm install # or: yarn / pnpm / bun install");
|
|
172
|
+
}
|
|
173
|
+
appLogger.info(" legonode dev");
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../cli/commands/create.ts"],"names":[],"mappings":"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"}
|