nural 0.3.8 → 0.3.10
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/index.cjs +124 -114
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +128 -129
- package/dist/index.d.ts +128 -129
- package/dist/index.js +123 -114
- package/dist/index.js.map +1 -1
- package/package.json +10 -18
- package/README.md +0 -446
- package/dist/cli/index.cjs +0 -221
- package/dist/cli/index.cjs.map +0 -1
- package/dist/cli/index.d.cts +0 -2
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.js +0 -212
- package/dist/cli/index.js.map +0 -1
package/dist/cli/index.js
DELETED
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { Command } from 'commander';
|
|
3
|
-
import inquirer from 'inquirer';
|
|
4
|
-
import chalk from 'chalk';
|
|
5
|
-
import fs from 'fs-extra';
|
|
6
|
-
import path from 'path';
|
|
7
|
-
|
|
8
|
-
var program = new Command();
|
|
9
|
-
program.name("nural").description("Nural Framework CLI").version("0.3.8");
|
|
10
|
-
program.command("new <project-name>").description("Create a new Nural project").action(async (projectName) => {
|
|
11
|
-
const projectPath = path.join(process.cwd(), projectName);
|
|
12
|
-
if (fs.existsSync(projectPath)) {
|
|
13
|
-
console.error(
|
|
14
|
-
chalk.red(`Error: Directory ${projectName} already exists.`)
|
|
15
|
-
);
|
|
16
|
-
process.exit(1);
|
|
17
|
-
}
|
|
18
|
-
const { framework } = await inquirer.prompt([
|
|
19
|
-
{
|
|
20
|
-
type: "list",
|
|
21
|
-
name: "framework",
|
|
22
|
-
message: "Select a framework (express/fastify):",
|
|
23
|
-
choices: [
|
|
24
|
-
{
|
|
25
|
-
name: "express",
|
|
26
|
-
value: "express",
|
|
27
|
-
description: "Fast, unopinionated, minimalist web framework"
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
name: "fastify",
|
|
31
|
-
value: "fastify",
|
|
32
|
-
description: "Fast and low overhead web framework"
|
|
33
|
-
}
|
|
34
|
-
],
|
|
35
|
-
default: "express"
|
|
36
|
-
}
|
|
37
|
-
]);
|
|
38
|
-
console.log(
|
|
39
|
-
chalk.blue(`
|
|
40
|
-
Initializing new Nural project in ${projectName}...`)
|
|
41
|
-
);
|
|
42
|
-
fs.ensureDirSync(path.join(projectPath, "src/config"));
|
|
43
|
-
fs.ensureDirSync(path.join(projectPath, "src/routes"));
|
|
44
|
-
fs.ensureDirSync(path.join(projectPath, "src/middleware"));
|
|
45
|
-
fs.ensureDirSync(path.join(projectPath, "src/services"));
|
|
46
|
-
const packageJson = {
|
|
47
|
-
name: projectName,
|
|
48
|
-
version: "1.0.0",
|
|
49
|
-
main: "dist/index.js",
|
|
50
|
-
scripts: {
|
|
51
|
-
dev: "nodemon --exec tsx src/index.ts",
|
|
52
|
-
build: "tsup src/index.ts --format cjs,esm --dts",
|
|
53
|
-
start: "node dist/index.js"
|
|
54
|
-
},
|
|
55
|
-
dependencies: {
|
|
56
|
-
nural: "^0.3.8",
|
|
57
|
-
[framework]: framework === "express" ? "^5.0.0" : "^5.0.0",
|
|
58
|
-
// Using explicit versions for peer deps
|
|
59
|
-
zod: "^3.22.4"
|
|
60
|
-
},
|
|
61
|
-
devDependencies: {
|
|
62
|
-
tsx: "^4.7.1",
|
|
63
|
-
tsup: "^8.0.2",
|
|
64
|
-
typescript: "^5.3.3",
|
|
65
|
-
nodemon: "^3.1.11",
|
|
66
|
-
"@types/node": "^20.11.24",
|
|
67
|
-
...framework === "express" ? { "@types/express": "^5.0.0" } : {}
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
fs.writeJsonSync(path.join(projectPath, "package.json"), packageJson, {
|
|
71
|
-
spaces: 2
|
|
72
|
-
});
|
|
73
|
-
const tsconfig = {
|
|
74
|
-
compilerOptions: {
|
|
75
|
-
target: "ES2020",
|
|
76
|
-
module: "CommonJS",
|
|
77
|
-
moduleResolution: "node",
|
|
78
|
-
strict: true,
|
|
79
|
-
esModuleInterop: true,
|
|
80
|
-
skipLibCheck: true,
|
|
81
|
-
forceConsistentCasingInFileNames: true,
|
|
82
|
-
outDir: "./dist"
|
|
83
|
-
},
|
|
84
|
-
include: ["src/**/*"],
|
|
85
|
-
exclude: ["node_modules"]
|
|
86
|
-
};
|
|
87
|
-
fs.writeJsonSync(path.join(projectPath, "tsconfig.json"), tsconfig, {
|
|
88
|
-
spaces: 2
|
|
89
|
-
});
|
|
90
|
-
const indexContent = `import { Nural } from "nural";
|
|
91
|
-
import { appConfig } from "./config/app.config";
|
|
92
|
-
|
|
93
|
-
const app = new Nural(appConfig);
|
|
94
|
-
|
|
95
|
-
app.start(3000)
|
|
96
|
-
`;
|
|
97
|
-
fs.writeFileSync(path.join(projectPath, "src/index.ts"), indexContent);
|
|
98
|
-
const configContent = `import { NuralConfig } from "nural";
|
|
99
|
-
|
|
100
|
-
export const appConfig: NuralConfig = {
|
|
101
|
-
framework: "${framework}",
|
|
102
|
-
docs: true,
|
|
103
|
-
logger: {
|
|
104
|
-
enabled: true,
|
|
105
|
-
},
|
|
106
|
-
};
|
|
107
|
-
`;
|
|
108
|
-
fs.writeFileSync(
|
|
109
|
-
path.join(projectPath, "src/config/app.config.ts"),
|
|
110
|
-
configContent
|
|
111
|
-
);
|
|
112
|
-
console.log(
|
|
113
|
-
chalk.green(`
|
|
114
|
-
\u2714 Project ${projectName} created successfully!`)
|
|
115
|
-
);
|
|
116
|
-
console.log(chalk.white(`
|
|
117
|
-
Next steps:`));
|
|
118
|
-
console.log(chalk.cyan(` cd ${projectName}`));
|
|
119
|
-
console.log(chalk.cyan(` npm install`));
|
|
120
|
-
console.log(chalk.cyan(` npm run dev`));
|
|
121
|
-
});
|
|
122
|
-
program.command("generate <type> <name>").alias("g").description("Generate a resource (route, middleware, service)").action((typeArg, nameArg) => {
|
|
123
|
-
const type = typeArg.toLowerCase();
|
|
124
|
-
const name = nameArg.toLowerCase();
|
|
125
|
-
const srcDir = path.join(process.cwd(), "src");
|
|
126
|
-
if (!fs.existsSync(srcDir)) {
|
|
127
|
-
console.error(
|
|
128
|
-
chalk.red(
|
|
129
|
-
"Error: src directory not found. Are you in a Nural project root?"
|
|
130
|
-
)
|
|
131
|
-
);
|
|
132
|
-
process.exit(1);
|
|
133
|
-
}
|
|
134
|
-
const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
135
|
-
switch (type) {
|
|
136
|
-
case "route": {
|
|
137
|
-
const routeContent = `import { createRoute, z } from "nural";
|
|
138
|
-
|
|
139
|
-
export const ${name}Route = createRoute({
|
|
140
|
-
method: "GET",
|
|
141
|
-
path: "/${name}",
|
|
142
|
-
summary: "${capitalize(name)} route",
|
|
143
|
-
responses: {
|
|
144
|
-
200: z.object({ message: z.string() }),
|
|
145
|
-
},
|
|
146
|
-
handler: async () => {
|
|
147
|
-
return { message: "Hello from ${name}" };
|
|
148
|
-
},
|
|
149
|
-
|
|
150
|
-
export const ${name}Routes = [${name}Route]
|
|
151
|
-
});
|
|
152
|
-
`;
|
|
153
|
-
const routesDir = path.join(srcDir, "routes");
|
|
154
|
-
fs.ensureDirSync(routesDir);
|
|
155
|
-
fs.writeFileSync(
|
|
156
|
-
path.join(routesDir, `${name}.routes.ts`),
|
|
157
|
-
routeContent
|
|
158
|
-
);
|
|
159
|
-
console.log(chalk.green(`Created src/routes/${name}.routes.ts`));
|
|
160
|
-
break;
|
|
161
|
-
}
|
|
162
|
-
case "middleware": {
|
|
163
|
-
const middlewareContent = `import { defineMiddleware } from "nural";
|
|
164
|
-
|
|
165
|
-
export const ${name}Middleware = defineMiddleware(async (req, res) => {
|
|
166
|
-
// TODO: Implement middleware logic
|
|
167
|
-
return { ${name}: true };
|
|
168
|
-
});
|
|
169
|
-
`;
|
|
170
|
-
const middlewareDir = path.join(srcDir, "middleware");
|
|
171
|
-
fs.ensureDirSync(middlewareDir);
|
|
172
|
-
fs.writeFileSync(
|
|
173
|
-
path.join(middlewareDir, `${name}.middleware.ts`),
|
|
174
|
-
middlewareContent
|
|
175
|
-
);
|
|
176
|
-
console.log(
|
|
177
|
-
chalk.green(`Created src/middleware/${name}.middleware.ts`)
|
|
178
|
-
);
|
|
179
|
-
break;
|
|
180
|
-
}
|
|
181
|
-
case "service": {
|
|
182
|
-
const serviceContent = `export class ${capitalize(name)}Service {
|
|
183
|
-
constructor() {}
|
|
184
|
-
|
|
185
|
-
async findAll() {
|
|
186
|
-
return [];
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
export const ${name}Service = new ${capitalize(name)}Service();
|
|
191
|
-
`;
|
|
192
|
-
const servicesDir = path.join(srcDir, "services");
|
|
193
|
-
fs.ensureDirSync(servicesDir);
|
|
194
|
-
fs.writeFileSync(
|
|
195
|
-
path.join(servicesDir, `${name}.service.ts`),
|
|
196
|
-
serviceContent
|
|
197
|
-
);
|
|
198
|
-
console.log(chalk.green(`Created src/services/${name}.service.ts`));
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
default:
|
|
202
|
-
console.error(
|
|
203
|
-
chalk.red(
|
|
204
|
-
`Unknown type: ${type}. Supported: route, middleware, service`
|
|
205
|
-
)
|
|
206
|
-
);
|
|
207
|
-
process.exit(1);
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
program.parse(process.argv);
|
|
211
|
-
//# sourceMappingURL=index.js.map
|
|
212
|
-
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\n\nconst program = new Command();\n\nprogram.name(\"nural\").description(\"Nural Framework CLI\").version(\"0.3.8\");\n\nprogram\n .command(\"new <project-name>\")\n .description(\"Create a new Nural project\")\n .action(async (projectName) => {\n const projectPath = path.join(process.cwd(), projectName);\n\n if (fs.existsSync(projectPath)) {\n console.error(\n chalk.red(`Error: Directory ${projectName} already exists.`),\n );\n process.exit(1);\n }\n\n const { framework } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"framework\",\n message: \"Select a framework (express/fastify):\",\n choices: [\n {\n name: \"express\",\n value: \"express\",\n description: \"Fast, unopinionated, minimalist web framework\",\n },\n {\n name: \"fastify\",\n value: \"fastify\",\n description: \"Fast and low overhead web framework\",\n },\n ],\n default: \"express\",\n },\n ]);\n\n console.log(\n chalk.blue(`\\nInitializing new Nural project in ${projectName}...`),\n );\n\n // Create directories\n fs.ensureDirSync(path.join(projectPath, \"src/config\"));\n fs.ensureDirSync(path.join(projectPath, \"src/routes\"));\n fs.ensureDirSync(path.join(projectPath, \"src/middleware\"));\n fs.ensureDirSync(path.join(projectPath, \"src/services\"));\n\n // Create package.json\n const packageJson = {\n name: projectName,\n version: \"1.0.0\",\n main: \"dist/index.js\",\n scripts: {\n dev: \"nodemon --exec tsx src/index.ts\",\n build: \"tsup src/index.ts --format cjs,esm --dts\",\n start: \"node dist/index.js\",\n },\n dependencies: {\n nural: \"^0.3.8\",\n [framework]: framework === \"express\" ? \"^5.0.0\" : \"^5.0.0\", // Using explicit versions for peer deps\n zod: \"^3.22.4\",\n },\n devDependencies: {\n tsx: \"^4.7.1\",\n tsup: \"^8.0.2\",\n typescript: \"^5.3.3\",\n nodemon: \"^3.1.11\",\n \"@types/node\": \"^20.11.24\",\n ...(framework === \"express\" ? { \"@types/express\": \"^5.0.0\" } : {}),\n },\n };\n\n fs.writeJsonSync(path.join(projectPath, \"package.json\"), packageJson, {\n spaces: 2,\n });\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: \"ES2020\",\n module: \"CommonJS\",\n moduleResolution: \"node\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n outDir: \"./dist\",\n },\n include: [\"src/**/*\"],\n exclude: [\"node_modules\"],\n };\n\n fs.writeJsonSync(path.join(projectPath, \"tsconfig.json\"), tsconfig, {\n spaces: 2,\n });\n\n // Create src/index.ts\n const indexContent = `import { Nural } from \"nural\";\nimport { appConfig } from \"./config/app.config\";\n\nconst app = new Nural(appConfig);\n\napp.start(3000)\n`;\n fs.writeFileSync(path.join(projectPath, \"src/index.ts\"), indexContent);\n\n // Create src/config/app.config.ts\n const configContent = `import { NuralConfig } from \"nural\";\n\nexport const appConfig: NuralConfig = {\n framework: \"${framework}\",\n docs: true,\n logger: {\n enabled: true,\n },\n};\n`;\n fs.writeFileSync(\n path.join(projectPath, \"src/config/app.config.ts\"),\n configContent,\n );\n\n console.log(\n chalk.green(`\\n✔ Project ${projectName} created successfully!`),\n );\n console.log(chalk.white(`\\nNext steps:`));\n console.log(chalk.cyan(` cd ${projectName}`));\n console.log(chalk.cyan(` npm install`));\n console.log(chalk.cyan(` npm run dev`));\n });\n\nprogram\n .command(\"generate <type> <name>\")\n .alias(\"g\")\n .description(\"Generate a resource (route, middleware, service)\")\n .action((typeArg, nameArg) => {\n const type = typeArg.toLowerCase();\n const name = nameArg.toLowerCase();\n const srcDir = path.join(process.cwd(), \"src\");\n\n if (!fs.existsSync(srcDir)) {\n console.error(\n chalk.red(\n \"Error: src directory not found. Are you in a Nural project root?\",\n ),\n );\n process.exit(1);\n }\n\n const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n\n switch (type) {\n case \"route\": {\n const routeContent = `import { createRoute, z } from \"nural\";\n\nexport const ${name}Route = createRoute({\n method: \"GET\",\n path: \"/${name}\",\n summary: \"${capitalize(name)} route\",\n responses: {\n 200: z.object({ message: z.string() }),\n },\n handler: async () => {\n return { message: \"Hello from ${name}\" };\n },\n\n export const ${name}Routes = [${name}Route]\n});\n`;\n const routesDir = path.join(srcDir, \"routes\");\n fs.ensureDirSync(routesDir);\n fs.writeFileSync(\n path.join(routesDir, `${name}.routes.ts`),\n routeContent,\n );\n console.log(chalk.green(`Created src/routes/${name}.routes.ts`));\n break;\n }\n case \"middleware\": {\n const middlewareContent = `import { defineMiddleware } from \"nural\";\n\nexport const ${name}Middleware = defineMiddleware(async (req, res) => {\n // TODO: Implement middleware logic\n return { ${name}: true };\n});\n`;\n const middlewareDir = path.join(srcDir, \"middleware\");\n fs.ensureDirSync(middlewareDir);\n fs.writeFileSync(\n path.join(middlewareDir, `${name}.middleware.ts`),\n middlewareContent,\n );\n console.log(\n chalk.green(`Created src/middleware/${name}.middleware.ts`),\n );\n break;\n }\n case \"service\": {\n const serviceContent = `export class ${capitalize(name)}Service {\n constructor() {}\n\n async findAll() {\n return [];\n }\n}\n\nexport const ${name}Service = new ${capitalize(name)}Service();\n`;\n const servicesDir = path.join(srcDir, \"services\");\n fs.ensureDirSync(servicesDir);\n fs.writeFileSync(\n path.join(servicesDir, `${name}.service.ts`),\n serviceContent,\n );\n console.log(chalk.green(`Created src/services/${name}.service.ts`));\n break;\n }\n default:\n console.error(\n chalk.red(\n `Unknown type: ${type}. Supported: route, middleware, service`,\n ),\n );\n process.exit(1);\n }\n });\n\nprogram.parse(process.argv);\n"]}
|