create-sprint 0.0.7 → 0.0.8
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/generators.js +140 -37
- package/dist/index.js +20 -10
- package/package.json +1 -1
- package/src/generators.ts +144 -37
- package/src/index.ts +21 -9
package/dist/generators.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
export function getTypeScriptPackageJson(name, telemetry) {
|
|
2
2
|
const deps = {
|
|
3
|
-
"sprint-es": "^0.0.
|
|
3
|
+
"sprint-es": "^0.0.28",
|
|
4
|
+
"sprint": "^0.0.1",
|
|
4
5
|
dotenv: "^17.0.0",
|
|
5
6
|
};
|
|
6
7
|
const devDeps = {
|
|
7
8
|
"@types/node": "^22.0.0",
|
|
8
9
|
"tsx": "^4.19.0",
|
|
9
10
|
typescript: "^5.6.0",
|
|
10
|
-
vite: "^6.0.0",
|
|
11
11
|
};
|
|
12
12
|
if (telemetry === "sentry" || telemetry === "glitchtip") {
|
|
13
13
|
deps["@sentry/node"] = "^8.0.0";
|
|
@@ -21,9 +21,9 @@ export function getTypeScriptPackageJson(name, telemetry) {
|
|
|
21
21
|
description: "Sprint API",
|
|
22
22
|
main: "dist/index.js",
|
|
23
23
|
scripts: {
|
|
24
|
-
build: "
|
|
25
|
-
start: "
|
|
26
|
-
dev: "
|
|
24
|
+
build: "sprint build",
|
|
25
|
+
start: "sprint start",
|
|
26
|
+
dev: "sprint dev",
|
|
27
27
|
},
|
|
28
28
|
dependencies: deps,
|
|
29
29
|
devDependencies: devDeps,
|
|
@@ -31,7 +31,8 @@ export function getTypeScriptPackageJson(name, telemetry) {
|
|
|
31
31
|
}
|
|
32
32
|
export function getJavaScriptPackageJson(name, telemetry) {
|
|
33
33
|
const deps = {
|
|
34
|
-
"sprint-es": "^0.0.
|
|
34
|
+
"sprint-es": "^0.0.28",
|
|
35
|
+
"sprint": "^0.0.1",
|
|
35
36
|
dotenv: "^17.0.0",
|
|
36
37
|
};
|
|
37
38
|
if (telemetry === "sentry" || telemetry === "glitchtip") {
|
|
@@ -47,8 +48,9 @@ export function getJavaScriptPackageJson(name, telemetry) {
|
|
|
47
48
|
main: "src/index.js",
|
|
48
49
|
type: "module",
|
|
49
50
|
scripts: {
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
build: "sprint build",
|
|
52
|
+
start: "sprint start",
|
|
53
|
+
dev: "sprint dev",
|
|
52
54
|
},
|
|
53
55
|
dependencies: deps,
|
|
54
56
|
};
|
|
@@ -71,6 +73,10 @@ export function getTsConfig() {
|
|
|
71
73
|
declarationMap: true,
|
|
72
74
|
sourceMap: true,
|
|
73
75
|
tabWidth: 4,
|
|
76
|
+
baseUrl: ".",
|
|
77
|
+
paths: {
|
|
78
|
+
"@/*": ["./src/*"]
|
|
79
|
+
}
|
|
74
80
|
},
|
|
75
81
|
include: ["src/**/*"],
|
|
76
82
|
exclude: ["node_modules", "dist"],
|
|
@@ -104,43 +110,35 @@ export default defineConfig({
|
|
|
104
110
|
export function getMainFile(language) {
|
|
105
111
|
if (language === "typescript") {
|
|
106
112
|
return `import Sprint from "sprint-es";
|
|
107
|
-
import { config } from "./sprint.config";
|
|
108
113
|
|
|
109
|
-
const app = new Sprint(
|
|
114
|
+
const app = new Sprint();
|
|
110
115
|
`;
|
|
111
116
|
}
|
|
112
117
|
return `import Sprint from "sprint-es";
|
|
113
|
-
import { config } from "./sprint.config.js";
|
|
114
118
|
|
|
115
|
-
const app = new Sprint(
|
|
119
|
+
const app = new Sprint();
|
|
116
120
|
`;
|
|
117
121
|
}
|
|
118
122
|
export function getHomeRoute(language) {
|
|
119
123
|
if (language === "typescript") {
|
|
120
124
|
return `import { Router } from "sprint-es";
|
|
125
|
+
import { homeSchema } from "@/schemas/home";
|
|
126
|
+
import { homeController } from "@/controllers/home";
|
|
121
127
|
|
|
122
128
|
const router = Router();
|
|
123
129
|
|
|
124
|
-
router.get("/",
|
|
125
|
-
res.json({
|
|
126
|
-
message: "Hello World",
|
|
127
|
-
status: "ok"
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
+
router.get("/", homeSchema, homeController);
|
|
130
131
|
|
|
131
132
|
export default router;
|
|
132
133
|
`;
|
|
133
134
|
}
|
|
134
135
|
return `import { Router } from "sprint-es";
|
|
136
|
+
import { homeSchema } from "../schemas/home.js";
|
|
137
|
+
import { homeController } from "../controllers/home.js";
|
|
135
138
|
|
|
136
139
|
const router = Router();
|
|
137
140
|
|
|
138
|
-
router.get("/",
|
|
139
|
-
res.json({
|
|
140
|
-
message: "Hello World",
|
|
141
|
-
status: "ok"
|
|
142
|
-
});
|
|
143
|
-
});
|
|
141
|
+
router.get("/", homeSchema, homeController);
|
|
144
142
|
|
|
145
143
|
export default router;
|
|
146
144
|
`;
|
|
@@ -148,49 +146,149 @@ export default router;
|
|
|
148
146
|
export function getAdminRoute(language) {
|
|
149
147
|
if (language === "typescript") {
|
|
150
148
|
return `import { Router } from "sprint-es";
|
|
149
|
+
import { adminSchema } from "@/schemas/admin";
|
|
150
|
+
import { adminController, adminUsersController } from "@/controllers/admin";
|
|
151
|
+
|
|
152
|
+
const router = Router();
|
|
153
|
+
|
|
154
|
+
router.get("/", adminSchema, adminController);
|
|
155
|
+
router.get("/users", adminSchema, adminUsersController);
|
|
156
|
+
|
|
157
|
+
export default router;
|
|
158
|
+
`;
|
|
159
|
+
}
|
|
160
|
+
return `import { Router } from "sprint-es";
|
|
161
|
+
import { adminSchema } from "../schemas/admin.js";
|
|
162
|
+
import { adminController, adminUsersController } from "../controllers/admin.js";
|
|
151
163
|
|
|
152
164
|
const router = Router();
|
|
153
165
|
|
|
154
|
-
router.get("/",
|
|
166
|
+
router.get("/", adminSchema, adminController);
|
|
167
|
+
router.get("/users", adminSchema, adminUsersController);
|
|
168
|
+
|
|
169
|
+
export default router;
|
|
170
|
+
`;
|
|
171
|
+
}
|
|
172
|
+
export function getHomeController(language) {
|
|
173
|
+
if (language === "typescript") {
|
|
174
|
+
return `import { Handler } from "sprint-es";
|
|
175
|
+
|
|
176
|
+
export const homeController: Handler = (req, res) => {
|
|
177
|
+
res.json({
|
|
178
|
+
message: "Hello World",
|
|
179
|
+
status: "ok"
|
|
180
|
+
});
|
|
181
|
+
};
|
|
182
|
+
`;
|
|
183
|
+
}
|
|
184
|
+
return `import { Handler } from "sprint-es";
|
|
185
|
+
|
|
186
|
+
export const homeController = (req, res) => {
|
|
187
|
+
res.json({
|
|
188
|
+
message: "Hello World",
|
|
189
|
+
status: "ok"
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
`;
|
|
193
|
+
}
|
|
194
|
+
export function getAdminController(language) {
|
|
195
|
+
if (language === "typescript") {
|
|
196
|
+
return `import { Handler } from "sprint-es";
|
|
197
|
+
|
|
198
|
+
export const adminController: Handler = (req, res) => {
|
|
155
199
|
res.json({
|
|
156
200
|
message: "Admin Dashboard",
|
|
157
201
|
status: "ok"
|
|
158
202
|
});
|
|
159
|
-
}
|
|
203
|
+
};
|
|
160
204
|
|
|
161
|
-
|
|
205
|
+
export const adminUsersController: Handler = (req, res) => {
|
|
162
206
|
res.json({
|
|
163
207
|
users: [
|
|
164
208
|
{ id: 1, name: "John Doe", role: "admin" },
|
|
165
209
|
{ id: 2, name: "Jane Smith", role: "user" }
|
|
166
210
|
]
|
|
167
211
|
});
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export default router;
|
|
212
|
+
};
|
|
171
213
|
`;
|
|
172
214
|
}
|
|
173
|
-
return `import {
|
|
215
|
+
return `import { Handler } from "sprint-es";
|
|
174
216
|
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
router.get("/", (req, res) => {
|
|
217
|
+
export const adminController = (req, res) => {
|
|
178
218
|
res.json({
|
|
179
219
|
message: "Admin Dashboard",
|
|
180
220
|
status: "ok"
|
|
181
221
|
});
|
|
182
|
-
}
|
|
222
|
+
};
|
|
183
223
|
|
|
184
|
-
|
|
224
|
+
export const adminUsersController = (req, res) => {
|
|
185
225
|
res.json({
|
|
186
226
|
users: [
|
|
187
227
|
{ id: 1, name: "John Doe", role: "admin" },
|
|
188
228
|
{ id: 2, name: "Jane Smith", role: "user" }
|
|
189
229
|
]
|
|
190
230
|
});
|
|
231
|
+
};
|
|
232
|
+
`;
|
|
233
|
+
}
|
|
234
|
+
export function getHomeSchema(language) {
|
|
235
|
+
if (language === "typescript") {
|
|
236
|
+
return `import { z, defineRouteSchema } from "sprint-es/schemas";
|
|
237
|
+
|
|
238
|
+
export const homeSchema = defineRouteSchema({
|
|
239
|
+
input: z.object({
|
|
240
|
+
message: z.string(),
|
|
241
|
+
status: z.string()
|
|
242
|
+
})
|
|
191
243
|
});
|
|
244
|
+
`;
|
|
245
|
+
}
|
|
246
|
+
return `import { z, defineRouteSchema } from "sprint-es/schemas";
|
|
192
247
|
|
|
193
|
-
export
|
|
248
|
+
export const homeSchema = defineRouteSchema({
|
|
249
|
+
input: z.object({
|
|
250
|
+
message: z.string(),
|
|
251
|
+
status: z.string()
|
|
252
|
+
})
|
|
253
|
+
});
|
|
254
|
+
`;
|
|
255
|
+
}
|
|
256
|
+
export function getAdminSchema(language) {
|
|
257
|
+
if (language === "typescript") {
|
|
258
|
+
return `import { z, defineRouteSchema } from "sprint-es/schemas";
|
|
259
|
+
|
|
260
|
+
export const adminSchema = defineRouteSchema({
|
|
261
|
+
params: z.object({
|
|
262
|
+
id: z.string().uuid()
|
|
263
|
+
}),
|
|
264
|
+
body: z.object({
|
|
265
|
+
name: z.string().min(1),
|
|
266
|
+
email: z.email().optional()
|
|
267
|
+
}),
|
|
268
|
+
input: z.object({
|
|
269
|
+
id: z.string().uuid(),
|
|
270
|
+
name: z.string(),
|
|
271
|
+
email: z.string().email().optional()
|
|
272
|
+
})
|
|
273
|
+
});
|
|
274
|
+
`;
|
|
275
|
+
}
|
|
276
|
+
return `import { z, defineRouteSchema } from "sprint-es/schemas";
|
|
277
|
+
|
|
278
|
+
export const adminSchema = defineRouteSchema({
|
|
279
|
+
params: z.object({
|
|
280
|
+
id: z.string().uuid()
|
|
281
|
+
}),
|
|
282
|
+
body: z.object({
|
|
283
|
+
name: z.string().min(1),
|
|
284
|
+
email: z.email().optional()
|
|
285
|
+
}),
|
|
286
|
+
input: z.object({
|
|
287
|
+
id: z.string().uuid(),
|
|
288
|
+
name: z.string(),
|
|
289
|
+
email: z.string().email().optional()
|
|
290
|
+
})
|
|
291
|
+
});
|
|
194
292
|
`;
|
|
195
293
|
}
|
|
196
294
|
export function getAuthMiddleware(language) {
|
|
@@ -358,6 +456,11 @@ export const config: SprintOptions = {
|
|
|
358
456
|
port: process.env.PORT ? parseInt(process.env.PORT) : 3000
|
|
359
457
|
};
|
|
360
458
|
|
|
459
|
+
// Add Vite config here if needed
|
|
460
|
+
// export const vite = {
|
|
461
|
+
// build: { ... }
|
|
462
|
+
// };
|
|
463
|
+
|
|
361
464
|
`;
|
|
362
465
|
if (telemetry === "sentry" || telemetry === "glitchtip") {
|
|
363
466
|
config += `import { initTelemetry } from "sprint-es/telemetry";
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { mkdir, writeFile } from "fs/promises";
|
|
|
4
4
|
import { join } from "path";
|
|
5
5
|
import { input, select, confirm } from "@inquirer/prompts";
|
|
6
6
|
import { validateProjectName } from "./validators.js";
|
|
7
|
-
import { getTypeScriptPackageJson, getJavaScriptPackageJson, getTsConfig, getViteConfig, getMainFile, getHomeRoute, getAdminRoute, getAuthMiddleware, getDockerfile, getDockerCompose, getGitignore, getDockerIgnore, getSprintConfigFile,
|
|
7
|
+
import { getTypeScriptPackageJson, getJavaScriptPackageJson, getTsConfig, getViteConfig, getMainFile, getHomeRoute, getAdminRoute, getHomeController, getAdminController, getAuthMiddleware, getHomeSchema, getAdminSchema, getDockerfile, getDockerCompose, getGitignore, getDockerIgnore, getSprintConfigFile, getEnvDevelopment, getEnvProduction } from "./generators.js";
|
|
8
8
|
export async function runCLI(args) {
|
|
9
9
|
const options = parseArgs(args);
|
|
10
10
|
console.log("\n🚀 Welcome to Sprint - Quickly API Framework\n");
|
|
@@ -30,7 +30,7 @@ export async function runCLI(args) {
|
|
|
30
30
|
if (options.skipInstall) {
|
|
31
31
|
installDeps = false;
|
|
32
32
|
}
|
|
33
|
-
else
|
|
33
|
+
else {
|
|
34
34
|
installDeps = await confirm({
|
|
35
35
|
message: "Do you want to install dependencies now?",
|
|
36
36
|
default: true,
|
|
@@ -64,11 +64,16 @@ function parseArgs(args) {
|
|
|
64
64
|
if (args.includes("--yes") || args.includes("-y")) {
|
|
65
65
|
options.skipPrompts = true;
|
|
66
66
|
}
|
|
67
|
-
if (
|
|
68
|
-
|
|
67
|
+
if (!options.skipPrompts) {
|
|
68
|
+
if (hasTs) {
|
|
69
|
+
options.language = "typescript";
|
|
70
|
+
}
|
|
71
|
+
else if (hasJs) {
|
|
72
|
+
options.language = "javascript";
|
|
73
|
+
}
|
|
69
74
|
}
|
|
70
|
-
else
|
|
71
|
-
options.language = "
|
|
75
|
+
else {
|
|
76
|
+
options.language = "typescript";
|
|
72
77
|
}
|
|
73
78
|
if (hasName !== -1 && args[hasName + 1]) {
|
|
74
79
|
options.projectName = args[hasName + 1];
|
|
@@ -184,15 +189,20 @@ async function createProject(projectName, language, telemetryArg, useDockerArg)
|
|
|
184
189
|
await mkdir(join(srcDir, "middlewares"), { recursive: true });
|
|
185
190
|
await mkdir(join(srcDir, "routes"), { recursive: true });
|
|
186
191
|
await mkdir(join(srcDir, "controllers"), { recursive: true });
|
|
192
|
+
await mkdir(join(srcDir, "schemas"), { recursive: true });
|
|
187
193
|
await writeFile(join(srcDir, "middlewares", ".gitkeep"), "");
|
|
188
|
-
await writeFile(join(srcDir, "controllers", ".gitkeep"), "");
|
|
189
194
|
await writeFile(join(srcDir, "app." + (language === "typescript" ? "ts" : "js")), getMainFile(language));
|
|
190
195
|
await writeFile(join(srcDir, "routes", "home." + (language === "typescript" ? "ts" : "js")), getHomeRoute(language));
|
|
191
196
|
await writeFile(join(srcDir, "routes", "admin." + (language === "typescript" ? "ts" : "js")), getAdminRoute(language));
|
|
197
|
+
await writeFile(join(srcDir, "controllers", "home." + (language === "typescript" ? "ts" : "js")), getHomeController(language));
|
|
198
|
+
await writeFile(join(srcDir, "controllers", "admin." + (language === "typescript" ? "ts" : "js")), getAdminController(language));
|
|
192
199
|
await writeFile(join(srcDir, "middlewares", "auth." + (language === "typescript" ? "ts" : "js")), getAuthMiddleware(language));
|
|
193
|
-
await writeFile(join(
|
|
194
|
-
await writeFile(join(
|
|
195
|
-
await writeFile(join(targetDir, ".env.
|
|
200
|
+
await writeFile(join(srcDir, "schemas", "home." + (language === "typescript" ? "ts" : "js")), getHomeSchema(language));
|
|
201
|
+
await writeFile(join(srcDir, "schemas", "admin." + (language === "typescript" ? "ts" : "js")), getAdminSchema(language));
|
|
202
|
+
await writeFile(join(targetDir, ".env.development.example"), getEnvDevelopment(telemetry));
|
|
203
|
+
await writeFile(join(targetDir, ".env.production.example"), getEnvProduction(telemetry));
|
|
204
|
+
await writeFile(join(targetDir, ".env.development"), "");
|
|
205
|
+
await writeFile(join(targetDir, ".env.production"), "");
|
|
196
206
|
await writeFile(join(targetDir, ".gitignore"), getGitignore());
|
|
197
207
|
if (useDocker) {
|
|
198
208
|
await writeFile(join(targetDir, "Dockerfile"), getDockerfile(language));
|
package/package.json
CHANGED
package/src/generators.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export function getTypeScriptPackageJson(name: string, telemetry: string) {
|
|
2
2
|
const deps: Record<string, string> = {
|
|
3
|
-
"sprint-es": "^0.0.
|
|
3
|
+
"sprint-es": "^0.0.28",
|
|
4
|
+
"sprint": "^0.0.1",
|
|
4
5
|
dotenv: "^17.0.0",
|
|
5
6
|
};
|
|
6
7
|
|
|
@@ -8,7 +9,6 @@ export function getTypeScriptPackageJson(name: string, telemetry: string) {
|
|
|
8
9
|
"@types/node": "^22.0.0",
|
|
9
10
|
"tsx": "^4.19.0",
|
|
10
11
|
typescript: "^5.6.0",
|
|
11
|
-
vite: "^6.0.0",
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
if (telemetry === "sentry" || telemetry === "glitchtip") {
|
|
@@ -23,9 +23,9 @@ export function getTypeScriptPackageJson(name: string, telemetry: string) {
|
|
|
23
23
|
description: "Sprint API",
|
|
24
24
|
main: "dist/index.js",
|
|
25
25
|
scripts: {
|
|
26
|
-
build: "
|
|
27
|
-
start: "
|
|
28
|
-
dev: "
|
|
26
|
+
build: "sprint build",
|
|
27
|
+
start: "sprint start",
|
|
28
|
+
dev: "sprint dev",
|
|
29
29
|
},
|
|
30
30
|
dependencies: deps,
|
|
31
31
|
devDependencies: devDeps,
|
|
@@ -34,7 +34,8 @@ export function getTypeScriptPackageJson(name: string, telemetry: string) {
|
|
|
34
34
|
|
|
35
35
|
export function getJavaScriptPackageJson(name: string, telemetry: string) {
|
|
36
36
|
const deps: Record<string, string> = {
|
|
37
|
-
"sprint-es": "^0.0.
|
|
37
|
+
"sprint-es": "^0.0.28",
|
|
38
|
+
"sprint": "^0.0.1",
|
|
38
39
|
dotenv: "^17.0.0",
|
|
39
40
|
};
|
|
40
41
|
|
|
@@ -51,8 +52,9 @@ export function getJavaScriptPackageJson(name: string, telemetry: string) {
|
|
|
51
52
|
main: "src/index.js",
|
|
52
53
|
type: "module",
|
|
53
54
|
scripts: {
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
build: "sprint build",
|
|
56
|
+
start: "sprint start",
|
|
57
|
+
dev: "sprint dev",
|
|
56
58
|
},
|
|
57
59
|
dependencies: deps,
|
|
58
60
|
};
|
|
@@ -76,6 +78,10 @@ export function getTsConfig() {
|
|
|
76
78
|
declarationMap: true,
|
|
77
79
|
sourceMap: true,
|
|
78
80
|
tabWidth: 4,
|
|
81
|
+
baseUrl: ".",
|
|
82
|
+
paths: {
|
|
83
|
+
"@/*": ["./src/*"]
|
|
84
|
+
}
|
|
79
85
|
},
|
|
80
86
|
include: ["src/**/*"],
|
|
81
87
|
exclude: ["node_modules", "dist"],
|
|
@@ -111,45 +117,37 @@ export default defineConfig({
|
|
|
111
117
|
export function getMainFile(language: string) {
|
|
112
118
|
if (language === "typescript") {
|
|
113
119
|
return `import Sprint from "sprint-es";
|
|
114
|
-
import { config } from "./sprint.config";
|
|
115
120
|
|
|
116
|
-
const app = new Sprint(
|
|
121
|
+
const app = new Sprint();
|
|
117
122
|
`;
|
|
118
123
|
}
|
|
119
124
|
|
|
120
125
|
return `import Sprint from "sprint-es";
|
|
121
|
-
import { config } from "./sprint.config.js";
|
|
122
126
|
|
|
123
|
-
const app = new Sprint(
|
|
127
|
+
const app = new Sprint();
|
|
124
128
|
`;
|
|
125
129
|
}
|
|
126
130
|
|
|
127
131
|
export function getHomeRoute(language: string) {
|
|
128
132
|
if (language === "typescript") {
|
|
129
133
|
return `import { Router } from "sprint-es";
|
|
134
|
+
import { homeSchema } from "@/schemas/home";
|
|
135
|
+
import { homeController } from "@/controllers/home";
|
|
130
136
|
|
|
131
137
|
const router = Router();
|
|
132
138
|
|
|
133
|
-
router.get("/",
|
|
134
|
-
res.json({
|
|
135
|
-
message: "Hello World",
|
|
136
|
-
status: "ok"
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
+
router.get("/", homeSchema, homeController);
|
|
139
140
|
|
|
140
141
|
export default router;
|
|
141
142
|
`;
|
|
142
143
|
}
|
|
143
144
|
return `import { Router } from "sprint-es";
|
|
145
|
+
import { homeSchema } from "../schemas/home.js";
|
|
146
|
+
import { homeController } from "../controllers/home.js";
|
|
144
147
|
|
|
145
148
|
const router = Router();
|
|
146
149
|
|
|
147
|
-
router.get("/",
|
|
148
|
-
res.json({
|
|
149
|
-
message: "Hello World",
|
|
150
|
-
status: "ok"
|
|
151
|
-
});
|
|
152
|
-
});
|
|
150
|
+
router.get("/", homeSchema, homeController);
|
|
153
151
|
|
|
154
152
|
export default router;
|
|
155
153
|
`;
|
|
@@ -158,49 +156,153 @@ export default router;
|
|
|
158
156
|
export function getAdminRoute(language: string) {
|
|
159
157
|
if (language === "typescript") {
|
|
160
158
|
return `import { Router } from "sprint-es";
|
|
159
|
+
import { adminSchema } from "@/schemas/admin";
|
|
160
|
+
import { adminController, adminUsersController } from "@/controllers/admin";
|
|
161
161
|
|
|
162
162
|
const router = Router();
|
|
163
163
|
|
|
164
|
-
router.get("/",
|
|
164
|
+
router.get("/", adminSchema, adminController);
|
|
165
|
+
router.get("/users", adminSchema, adminUsersController);
|
|
166
|
+
|
|
167
|
+
export default router;
|
|
168
|
+
`;
|
|
169
|
+
}
|
|
170
|
+
return `import { Router } from "sprint-es";
|
|
171
|
+
import { adminSchema } from "../schemas/admin.js";
|
|
172
|
+
import { adminController, adminUsersController } from "../controllers/admin.js";
|
|
173
|
+
|
|
174
|
+
const router = Router();
|
|
175
|
+
|
|
176
|
+
router.get("/", adminSchema, adminController);
|
|
177
|
+
router.get("/users", adminSchema, adminUsersController);
|
|
178
|
+
|
|
179
|
+
export default router;
|
|
180
|
+
`;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function getHomeController(language: string) {
|
|
184
|
+
if (language === "typescript") {
|
|
185
|
+
return `import { Handler } from "sprint-es";
|
|
186
|
+
|
|
187
|
+
export const homeController: Handler = (req, res) => {
|
|
188
|
+
res.json({
|
|
189
|
+
message: "Hello World",
|
|
190
|
+
status: "ok"
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
`;
|
|
194
|
+
}
|
|
195
|
+
return `import { Handler } from "sprint-es";
|
|
196
|
+
|
|
197
|
+
export const homeController = (req, res) => {
|
|
198
|
+
res.json({
|
|
199
|
+
message: "Hello World",
|
|
200
|
+
status: "ok"
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
`;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export function getAdminController(language: string) {
|
|
207
|
+
if (language === "typescript") {
|
|
208
|
+
return `import { Handler } from "sprint-es";
|
|
209
|
+
|
|
210
|
+
export const adminController: Handler = (req, res) => {
|
|
165
211
|
res.json({
|
|
166
212
|
message: "Admin Dashboard",
|
|
167
213
|
status: "ok"
|
|
168
214
|
});
|
|
169
|
-
}
|
|
215
|
+
};
|
|
170
216
|
|
|
171
|
-
|
|
217
|
+
export const adminUsersController: Handler = (req, res) => {
|
|
172
218
|
res.json({
|
|
173
219
|
users: [
|
|
174
220
|
{ id: 1, name: "John Doe", role: "admin" },
|
|
175
221
|
{ id: 2, name: "Jane Smith", role: "user" }
|
|
176
222
|
]
|
|
177
223
|
});
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export default router;
|
|
224
|
+
};
|
|
181
225
|
`;
|
|
182
226
|
}
|
|
183
|
-
return `import {
|
|
227
|
+
return `import { Handler } from "sprint-es";
|
|
184
228
|
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
router.get("/", (req, res) => {
|
|
229
|
+
export const adminController = (req, res) => {
|
|
188
230
|
res.json({
|
|
189
231
|
message: "Admin Dashboard",
|
|
190
232
|
status: "ok"
|
|
191
233
|
});
|
|
192
|
-
}
|
|
234
|
+
};
|
|
193
235
|
|
|
194
|
-
|
|
236
|
+
export const adminUsersController = (req, res) => {
|
|
195
237
|
res.json({
|
|
196
238
|
users: [
|
|
197
239
|
{ id: 1, name: "John Doe", role: "admin" },
|
|
198
240
|
{ id: 2, name: "Jane Smith", role: "user" }
|
|
199
241
|
]
|
|
200
242
|
});
|
|
243
|
+
};
|
|
244
|
+
`;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export function getHomeSchema(language: string) {
|
|
248
|
+
if (language === "typescript") {
|
|
249
|
+
return `import { z, defineRouteSchema } from "sprint-es/schemas";
|
|
250
|
+
|
|
251
|
+
export const homeSchema = defineRouteSchema({
|
|
252
|
+
input: z.object({
|
|
253
|
+
message: z.string(),
|
|
254
|
+
status: z.string()
|
|
255
|
+
})
|
|
201
256
|
});
|
|
257
|
+
`;
|
|
258
|
+
}
|
|
259
|
+
return `import { z, defineRouteSchema } from "sprint-es/schemas";
|
|
202
260
|
|
|
203
|
-
export
|
|
261
|
+
export const homeSchema = defineRouteSchema({
|
|
262
|
+
input: z.object({
|
|
263
|
+
message: z.string(),
|
|
264
|
+
status: z.string()
|
|
265
|
+
})
|
|
266
|
+
});
|
|
267
|
+
`;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export function getAdminSchema(language: string) {
|
|
271
|
+
if (language === "typescript") {
|
|
272
|
+
return `import { z, defineRouteSchema } from "sprint-es/schemas";
|
|
273
|
+
|
|
274
|
+
export const adminSchema = defineRouteSchema({
|
|
275
|
+
params: z.object({
|
|
276
|
+
id: z.string().uuid()
|
|
277
|
+
}),
|
|
278
|
+
body: z.object({
|
|
279
|
+
name: z.string().min(1),
|
|
280
|
+
email: z.email().optional()
|
|
281
|
+
}),
|
|
282
|
+
input: z.object({
|
|
283
|
+
id: z.string().uuid(),
|
|
284
|
+
name: z.string(),
|
|
285
|
+
email: z.string().email().optional()
|
|
286
|
+
})
|
|
287
|
+
});
|
|
288
|
+
`;
|
|
289
|
+
}
|
|
290
|
+
return `import { z, defineRouteSchema } from "sprint-es/schemas";
|
|
291
|
+
|
|
292
|
+
export const adminSchema = defineRouteSchema({
|
|
293
|
+
params: z.object({
|
|
294
|
+
id: z.string().uuid()
|
|
295
|
+
}),
|
|
296
|
+
body: z.object({
|
|
297
|
+
name: z.string().min(1),
|
|
298
|
+
email: z.email().optional()
|
|
299
|
+
}),
|
|
300
|
+
input: z.object({
|
|
301
|
+
id: z.string().uuid(),
|
|
302
|
+
name: z.string(),
|
|
303
|
+
email: z.string().email().optional()
|
|
304
|
+
})
|
|
305
|
+
});
|
|
204
306
|
`;
|
|
205
307
|
}
|
|
206
308
|
|
|
@@ -374,6 +476,11 @@ export const config: SprintOptions = {
|
|
|
374
476
|
port: process.env.PORT ? parseInt(process.env.PORT) : 3000
|
|
375
477
|
};
|
|
376
478
|
|
|
479
|
+
// Add Vite config here if needed
|
|
480
|
+
// export const vite = {
|
|
481
|
+
// build: { ... }
|
|
482
|
+
// };
|
|
483
|
+
|
|
377
484
|
`;
|
|
378
485
|
|
|
379
486
|
if (telemetry === "sentry" || telemetry === "glitchtip") {
|
package/src/index.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { mkdir, writeFile } from "fs/promises";
|
|
|
4
4
|
import { join } from "path";
|
|
5
5
|
import { input, select, confirm } from "@inquirer/prompts";
|
|
6
6
|
import { validateProjectName } from "./validators.js";
|
|
7
|
-
import { getTypeScriptPackageJson, getJavaScriptPackageJson, getTsConfig, getViteConfig, getMainFile, getHomeRoute, getAdminRoute, getAuthMiddleware, getDockerfile, getDockerCompose, getGitignore, getDockerIgnore, getSprintConfigFile,
|
|
7
|
+
import { getTypeScriptPackageJson, getJavaScriptPackageJson, getTsConfig, getViteConfig, getMainFile, getHomeRoute, getAdminRoute, getHomeController, getAdminController, getAuthMiddleware, getHomeSchema, getAdminSchema, getDockerfile, getDockerCompose, getGitignore, getDockerIgnore, getSprintConfigFile, getEnvDevelopment, getEnvProduction } from "./generators.js";
|
|
8
8
|
|
|
9
9
|
export interface CLIOptions {
|
|
10
10
|
projectName?: string;
|
|
@@ -48,7 +48,7 @@ export async function runCLI(args: string[]) {
|
|
|
48
48
|
let installDeps = true;
|
|
49
49
|
if (options.skipInstall) {
|
|
50
50
|
installDeps = false;
|
|
51
|
-
} else
|
|
51
|
+
} else {
|
|
52
52
|
installDeps = await confirm({
|
|
53
53
|
message: "Do you want to install dependencies now?",
|
|
54
54
|
default: true,
|
|
@@ -87,10 +87,14 @@ function parseArgs(args: string[]): CLIOptions {
|
|
|
87
87
|
options.skipPrompts = true;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
if (
|
|
90
|
+
if (!options.skipPrompts) {
|
|
91
|
+
if (hasTs) {
|
|
92
|
+
options.language = "typescript";
|
|
93
|
+
} else if (hasJs) {
|
|
94
|
+
options.language = "javascript";
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
91
97
|
options.language = "typescript";
|
|
92
|
-
} else if (hasJs) {
|
|
93
|
-
options.language = "javascript";
|
|
94
98
|
}
|
|
95
99
|
|
|
96
100
|
if (hasName !== -1 && args[hasName + 1]) {
|
|
@@ -231,20 +235,28 @@ async function createProject(
|
|
|
231
235
|
await mkdir(join(srcDir, "middlewares"), { recursive: true });
|
|
232
236
|
await mkdir(join(srcDir, "routes"), { recursive: true });
|
|
233
237
|
await mkdir(join(srcDir, "controllers"), { recursive: true });
|
|
238
|
+
await mkdir(join(srcDir, "schemas"), { recursive: true });
|
|
234
239
|
|
|
235
240
|
await writeFile(join(srcDir, "middlewares", ".gitkeep"), "");
|
|
236
|
-
await writeFile(join(srcDir, "controllers", ".gitkeep"), "");
|
|
237
241
|
|
|
238
242
|
await writeFile(join(srcDir, "app." + (language === "typescript" ? "ts" : "js")), getMainFile(language));
|
|
239
243
|
|
|
240
244
|
await writeFile(join(srcDir, "routes", "home." + (language === "typescript" ? "ts" : "js")), getHomeRoute(language));
|
|
241
245
|
await writeFile(join(srcDir, "routes", "admin." + (language === "typescript" ? "ts" : "js")), getAdminRoute(language));
|
|
242
246
|
|
|
247
|
+
await writeFile(join(srcDir, "controllers", "home." + (language === "typescript" ? "ts" : "js")), getHomeController(language));
|
|
248
|
+
await writeFile(join(srcDir, "controllers", "admin." + (language === "typescript" ? "ts" : "js")), getAdminController(language));
|
|
249
|
+
|
|
243
250
|
await writeFile(join(srcDir, "middlewares", "auth." + (language === "typescript" ? "ts" : "js")), getAuthMiddleware(language));
|
|
244
251
|
|
|
245
|
-
await writeFile(join(
|
|
246
|
-
await writeFile(join(
|
|
247
|
-
|
|
252
|
+
await writeFile(join(srcDir, "schemas", "home." + (language === "typescript" ? "ts" : "js")), getHomeSchema(language));
|
|
253
|
+
await writeFile(join(srcDir, "schemas", "admin." + (language === "typescript" ? "ts" : "js")), getAdminSchema(language));
|
|
254
|
+
|
|
255
|
+
await writeFile(join(targetDir, ".env.development.example"), getEnvDevelopment(telemetry));
|
|
256
|
+
await writeFile(join(targetDir, ".env.production.example"), getEnvProduction(telemetry));
|
|
257
|
+
|
|
258
|
+
await writeFile(join(targetDir, ".env.development"), "");
|
|
259
|
+
await writeFile(join(targetDir, ".env.production"), "");
|
|
248
260
|
|
|
249
261
|
await writeFile(join(targetDir, ".gitignore"), getGitignore());
|
|
250
262
|
|