create-sprint 0.0.5 ā 0.0.7
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.js +1 -2
- package/dist/generators.js +98 -6
- package/dist/index.js +5 -4
- package/package.json +2 -2
- package/src/cli.ts +1 -2
- package/src/generators.ts +100 -6
- package/src/index.ts +8 -4
package/dist/cli.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { runCLI } from "./index";
|
|
2
|
+
import { runCLI } from "./index.js";
|
|
4
3
|
const args = process.argv.slice(2);
|
|
5
4
|
if (args.includes("--help") || args.includes("-h")) {
|
|
6
5
|
console.log("\nš Sprint - Quickly API Framework\n");
|
package/dist/generators.js
CHANGED
|
@@ -105,20 +105,14 @@ export function getMainFile(language) {
|
|
|
105
105
|
if (language === "typescript") {
|
|
106
106
|
return `import Sprint from "sprint-es";
|
|
107
107
|
import { config } from "./sprint.config";
|
|
108
|
-
import homeRouter from "./routes/home";
|
|
109
108
|
|
|
110
109
|
const app = new Sprint(config);
|
|
111
|
-
|
|
112
|
-
app.use(homeRouter);
|
|
113
110
|
`;
|
|
114
111
|
}
|
|
115
112
|
return `import Sprint from "sprint-es";
|
|
116
113
|
import { config } from "./sprint.config.js";
|
|
117
|
-
import homeRouter from "./routes/home.js";
|
|
118
114
|
|
|
119
115
|
const app = new Sprint(config);
|
|
120
|
-
|
|
121
|
-
app.use(homeRouter);
|
|
122
116
|
`;
|
|
123
117
|
}
|
|
124
118
|
export function getHomeRoute(language) {
|
|
@@ -151,6 +145,104 @@ router.get("/", (req, res) => {
|
|
|
151
145
|
export default router;
|
|
152
146
|
`;
|
|
153
147
|
}
|
|
148
|
+
export function getAdminRoute(language) {
|
|
149
|
+
if (language === "typescript") {
|
|
150
|
+
return `import { Router } from "sprint-es";
|
|
151
|
+
|
|
152
|
+
const router = Router();
|
|
153
|
+
|
|
154
|
+
router.get("/", (req, res) => {
|
|
155
|
+
res.json({
|
|
156
|
+
message: "Admin Dashboard",
|
|
157
|
+
status: "ok"
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
router.get("/users", (req, res) => {
|
|
162
|
+
res.json({
|
|
163
|
+
users: [
|
|
164
|
+
{ id: 1, name: "John Doe", role: "admin" },
|
|
165
|
+
{ id: 2, name: "Jane Smith", role: "user" }
|
|
166
|
+
]
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
export default router;
|
|
171
|
+
`;
|
|
172
|
+
}
|
|
173
|
+
return `import { Router } from "sprint-es";
|
|
174
|
+
|
|
175
|
+
const router = Router();
|
|
176
|
+
|
|
177
|
+
router.get("/", (req, res) => {
|
|
178
|
+
res.json({
|
|
179
|
+
message: "Admin Dashboard",
|
|
180
|
+
status: "ok"
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
router.get("/users", (req, res) => {
|
|
185
|
+
res.json({
|
|
186
|
+
users: [
|
|
187
|
+
{ id: 1, name: "John Doe", role: "admin" },
|
|
188
|
+
{ id: 2, name: "Jane Smith", role: "user" }
|
|
189
|
+
]
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
export default router;
|
|
194
|
+
`;
|
|
195
|
+
}
|
|
196
|
+
export function getAuthMiddleware(language) {
|
|
197
|
+
if (language === "typescript") {
|
|
198
|
+
return `import { defineMiddleware } from "sprint-es";
|
|
199
|
+
|
|
200
|
+
export default defineMiddleware({
|
|
201
|
+
name: "auth",
|
|
202
|
+
priority: 10,
|
|
203
|
+
include: "/admin/**",
|
|
204
|
+
handler: (req, res, next) => {
|
|
205
|
+
const authHeader = req.headers.authorization;
|
|
206
|
+
|
|
207
|
+
if (!authHeader) {
|
|
208
|
+
return res.status(401).json({ error: "No authorization header" });
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const token = authHeader.replace("Bearer ", "");
|
|
212
|
+
|
|
213
|
+
if (token !== "admin-token") {
|
|
214
|
+
return res.status(403).json({ error: "Invalid token" });
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
next();
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
`;
|
|
221
|
+
}
|
|
222
|
+
return `import { defineMiddleware } from "sprint-es";
|
|
223
|
+
|
|
224
|
+
export default defineMiddleware({
|
|
225
|
+
name: "auth",
|
|
226
|
+
priority: 10,
|
|
227
|
+
include: "/admin/**",
|
|
228
|
+
handler: (req, res, next) => {
|
|
229
|
+
const authHeader = req.headers.authorization;
|
|
230
|
+
|
|
231
|
+
if (!authHeader) {
|
|
232
|
+
return res.status(401).json({ error: "No authorization header" });
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const token = authHeader.replace("Bearer ", "");
|
|
236
|
+
|
|
237
|
+
if (token !== "admin-token") {
|
|
238
|
+
return res.status(403).json({ error: "Invalid token" });
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
next();
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
`;
|
|
245
|
+
}
|
|
154
246
|
export function getDockerfile(language) {
|
|
155
247
|
if (language === "typescript") {
|
|
156
248
|
return `FROM node:20-alpine
|
package/dist/index.js
CHANGED
|
@@ -3,8 +3,8 @@ import { existsSync } from "fs";
|
|
|
3
3
|
import { mkdir, writeFile } from "fs/promises";
|
|
4
4
|
import { join } from "path";
|
|
5
5
|
import { input, select, confirm } from "@inquirer/prompts";
|
|
6
|
-
import { validateProjectName } from "./validators";
|
|
7
|
-
import { getTypeScriptPackageJson, getJavaScriptPackageJson, getTsConfig, getViteConfig, getMainFile, getHomeRoute, getDockerfile, getDockerCompose, getGitignore, getDockerIgnore, getSprintConfigFile, getEnvExample, getEnvDevelopment, getEnvProduction } from "./generators";
|
|
6
|
+
import { validateProjectName } from "./validators.js";
|
|
7
|
+
import { getTypeScriptPackageJson, getJavaScriptPackageJson, getTsConfig, getViteConfig, getMainFile, getHomeRoute, getAdminRoute, getAuthMiddleware, getDockerfile, getDockerCompose, getGitignore, getDockerIgnore, getSprintConfigFile, getEnvExample, 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");
|
|
@@ -63,9 +63,8 @@ function parseArgs(args) {
|
|
|
63
63
|
const telemetryArg = args.includes("--telemetry") ? args[args.indexOf("--telemetry") + 1] : null;
|
|
64
64
|
if (args.includes("--yes") || args.includes("-y")) {
|
|
65
65
|
options.skipPrompts = true;
|
|
66
|
-
options.language = "typescript";
|
|
67
66
|
}
|
|
68
|
-
|
|
67
|
+
if (hasTs) {
|
|
69
68
|
options.language = "typescript";
|
|
70
69
|
}
|
|
71
70
|
else if (hasJs) {
|
|
@@ -189,6 +188,8 @@ async function createProject(projectName, language, telemetryArg, useDockerArg)
|
|
|
189
188
|
await writeFile(join(srcDir, "controllers", ".gitkeep"), "");
|
|
190
189
|
await writeFile(join(srcDir, "app." + (language === "typescript" ? "ts" : "js")), getMainFile(language));
|
|
191
190
|
await writeFile(join(srcDir, "routes", "home." + (language === "typescript" ? "ts" : "js")), getHomeRoute(language));
|
|
191
|
+
await writeFile(join(srcDir, "routes", "admin." + (language === "typescript" ? "ts" : "js")), getAdminRoute(language));
|
|
192
|
+
await writeFile(join(srcDir, "middlewares", "auth." + (language === "typescript" ? "ts" : "js")), getAuthMiddleware(language));
|
|
192
193
|
await writeFile(join(targetDir, ".env.example"), getEnvExample(telemetry));
|
|
193
194
|
await writeFile(join(targetDir, ".env.development"), getEnvDevelopment(telemetry));
|
|
194
195
|
await writeFile(join(targetDir, ".env.production"), getEnvProduction(telemetry));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-sprint",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "Create a new Sprint API project",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"src/**/*"
|
|
13
13
|
],
|
|
14
14
|
"scripts": {
|
|
15
|
-
"build": "tsc && node -e \"const fs=require('fs');const p='dist/cli.js';
|
|
15
|
+
"build": "tsc && node -e \"const fs=require('fs');const p='dist/cli.js';let c=fs.readFileSync(p,'utf8');if(!c.startsWith('#!')){fs.writeFileSync(p,'#!/usr/bin/env node\\n'+c)}\"",
|
|
16
16
|
"prepublishOnly": "npm run build",
|
|
17
17
|
"start": "node dist/cli.js"
|
|
18
18
|
},
|
package/src/cli.ts
CHANGED
package/src/generators.ts
CHANGED
|
@@ -112,21 +112,15 @@ export function getMainFile(language: string) {
|
|
|
112
112
|
if (language === "typescript") {
|
|
113
113
|
return `import Sprint from "sprint-es";
|
|
114
114
|
import { config } from "./sprint.config";
|
|
115
|
-
import homeRouter from "./routes/home";
|
|
116
115
|
|
|
117
116
|
const app = new Sprint(config);
|
|
118
|
-
|
|
119
|
-
app.use(homeRouter);
|
|
120
117
|
`;
|
|
121
118
|
}
|
|
122
119
|
|
|
123
120
|
return `import Sprint from "sprint-es";
|
|
124
121
|
import { config } from "./sprint.config.js";
|
|
125
|
-
import homeRouter from "./routes/home.js";
|
|
126
122
|
|
|
127
123
|
const app = new Sprint(config);
|
|
128
|
-
|
|
129
|
-
app.use(homeRouter);
|
|
130
124
|
`;
|
|
131
125
|
}
|
|
132
126
|
|
|
@@ -161,6 +155,106 @@ export default router;
|
|
|
161
155
|
`;
|
|
162
156
|
}
|
|
163
157
|
|
|
158
|
+
export function getAdminRoute(language: string) {
|
|
159
|
+
if (language === "typescript") {
|
|
160
|
+
return `import { Router } from "sprint-es";
|
|
161
|
+
|
|
162
|
+
const router = Router();
|
|
163
|
+
|
|
164
|
+
router.get("/", (req, res) => {
|
|
165
|
+
res.json({
|
|
166
|
+
message: "Admin Dashboard",
|
|
167
|
+
status: "ok"
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
router.get("/users", (req, res) => {
|
|
172
|
+
res.json({
|
|
173
|
+
users: [
|
|
174
|
+
{ id: 1, name: "John Doe", role: "admin" },
|
|
175
|
+
{ id: 2, name: "Jane Smith", role: "user" }
|
|
176
|
+
]
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
export default router;
|
|
181
|
+
`;
|
|
182
|
+
}
|
|
183
|
+
return `import { Router } from "sprint-es";
|
|
184
|
+
|
|
185
|
+
const router = Router();
|
|
186
|
+
|
|
187
|
+
router.get("/", (req, res) => {
|
|
188
|
+
res.json({
|
|
189
|
+
message: "Admin Dashboard",
|
|
190
|
+
status: "ok"
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
router.get("/users", (req, res) => {
|
|
195
|
+
res.json({
|
|
196
|
+
users: [
|
|
197
|
+
{ id: 1, name: "John Doe", role: "admin" },
|
|
198
|
+
{ id: 2, name: "Jane Smith", role: "user" }
|
|
199
|
+
]
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
export default router;
|
|
204
|
+
`;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export function getAuthMiddleware(language: string) {
|
|
208
|
+
if (language === "typescript") {
|
|
209
|
+
return `import { defineMiddleware } from "sprint-es";
|
|
210
|
+
|
|
211
|
+
export default defineMiddleware({
|
|
212
|
+
name: "auth",
|
|
213
|
+
priority: 10,
|
|
214
|
+
include: "/admin/**",
|
|
215
|
+
handler: (req, res, next) => {
|
|
216
|
+
const authHeader = req.headers.authorization;
|
|
217
|
+
|
|
218
|
+
if (!authHeader) {
|
|
219
|
+
return res.status(401).json({ error: "No authorization header" });
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const token = authHeader.replace("Bearer ", "");
|
|
223
|
+
|
|
224
|
+
if (token !== "admin-token") {
|
|
225
|
+
return res.status(403).json({ error: "Invalid token" });
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
next();
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
`;
|
|
232
|
+
}
|
|
233
|
+
return `import { defineMiddleware } from "sprint-es";
|
|
234
|
+
|
|
235
|
+
export default defineMiddleware({
|
|
236
|
+
name: "auth",
|
|
237
|
+
priority: 10,
|
|
238
|
+
include: "/admin/**",
|
|
239
|
+
handler: (req, res, next) => {
|
|
240
|
+
const authHeader = req.headers.authorization;
|
|
241
|
+
|
|
242
|
+
if (!authHeader) {
|
|
243
|
+
return res.status(401).json({ error: "No authorization header" });
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const token = authHeader.replace("Bearer ", "");
|
|
247
|
+
|
|
248
|
+
if (token !== "admin-token") {
|
|
249
|
+
return res.status(403).json({ error: "Invalid token" });
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
next();
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
`;
|
|
256
|
+
}
|
|
257
|
+
|
|
164
258
|
export function getDockerfile(language: string) {
|
|
165
259
|
if (language === "typescript") {
|
|
166
260
|
return `FROM node:20-alpine
|
package/src/index.ts
CHANGED
|
@@ -3,8 +3,8 @@ import { existsSync } from "fs";
|
|
|
3
3
|
import { mkdir, writeFile } from "fs/promises";
|
|
4
4
|
import { join } from "path";
|
|
5
5
|
import { input, select, confirm } from "@inquirer/prompts";
|
|
6
|
-
import { validateProjectName } from "./validators";
|
|
7
|
-
import { getTypeScriptPackageJson, getJavaScriptPackageJson, getTsConfig, getViteConfig, getMainFile, getHomeRoute, getDockerfile, getDockerCompose, getGitignore, getDockerIgnore, getSprintConfigFile, getEnvExample, getEnvDevelopment, getEnvProduction } from "./generators";
|
|
6
|
+
import { validateProjectName } from "./validators.js";
|
|
7
|
+
import { getTypeScriptPackageJson, getJavaScriptPackageJson, getTsConfig, getViteConfig, getMainFile, getHomeRoute, getAdminRoute, getAuthMiddleware, getDockerfile, getDockerCompose, getGitignore, getDockerIgnore, getSprintConfigFile, getEnvExample, getEnvDevelopment, getEnvProduction } from "./generators.js";
|
|
8
8
|
|
|
9
9
|
export interface CLIOptions {
|
|
10
10
|
projectName?: string;
|
|
@@ -85,8 +85,9 @@ function parseArgs(args: string[]): CLIOptions {
|
|
|
85
85
|
|
|
86
86
|
if (args.includes("--yes") || args.includes("-y")) {
|
|
87
87
|
options.skipPrompts = true;
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (hasTs) {
|
|
90
91
|
options.language = "typescript";
|
|
91
92
|
} else if (hasJs) {
|
|
92
93
|
options.language = "javascript";
|
|
@@ -237,6 +238,9 @@ async function createProject(
|
|
|
237
238
|
await writeFile(join(srcDir, "app." + (language === "typescript" ? "ts" : "js")), getMainFile(language));
|
|
238
239
|
|
|
239
240
|
await writeFile(join(srcDir, "routes", "home." + (language === "typescript" ? "ts" : "js")), getHomeRoute(language));
|
|
241
|
+
await writeFile(join(srcDir, "routes", "admin." + (language === "typescript" ? "ts" : "js")), getAdminRoute(language));
|
|
242
|
+
|
|
243
|
+
await writeFile(join(srcDir, "middlewares", "auth." + (language === "typescript" ? "ts" : "js")), getAuthMiddleware(language));
|
|
240
244
|
|
|
241
245
|
await writeFile(join(targetDir, ".env.example"), getEnvExample(telemetry));
|
|
242
246
|
await writeFile(join(targetDir, ".env.development"), getEnvDevelopment(telemetry));
|