create-sprint 0.0.68 → 0.0.72

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.js CHANGED
@@ -22,6 +22,7 @@ export async function runCLI(args) {
22
22
  projectName: options.projectName || "sprint-app",
23
23
  language: options.language || "typescript",
24
24
  telemetry: options.telemetry || "none",
25
+ swagger: options.swagger ?? true,
25
26
  docker: options.docker || false,
26
27
  };
27
28
  }
@@ -48,6 +49,7 @@ export async function runCLI(args) {
48
49
  { value: "discord", label: "Discord Webhook", hint: "sends to a channel" },
49
50
  ],
50
51
  }),
52
+ swagger: () => p.confirm({ message: "Add Swagger UI & OpenAPI?", initialValue: true }),
51
53
  docker: () => p.confirm({ message: "Add Docker support?", initialValue: false }),
52
54
  }, {
53
55
  onCancel: () => {
@@ -59,7 +61,7 @@ export async function runCLI(args) {
59
61
  const targetDir = config.projectName === "." ? process.cwd() : join(process.cwd(), config.projectName);
60
62
  const s = p.spinner();
61
63
  s.start("Creating project");
62
- await createProject(config.projectName, config.language, config.telemetry, config.docker);
64
+ await createProject(config.projectName, config.language, config.telemetry, config.swagger, config.docker);
63
65
  s.stop("Project created");
64
66
  let installDeps = true;
65
67
  if (options.skipInstall) {
@@ -128,6 +130,10 @@ function parseArgs(args) {
128
130
  options.projectName = ".";
129
131
  if (args.includes("--docker"))
130
132
  options.docker = true;
133
+ if (args.includes("--swagger"))
134
+ options.swagger = true;
135
+ else if (args.includes("--no-swagger"))
136
+ options.swagger = false;
131
137
  if (args.includes("--no-install"))
132
138
  options.skipInstall = true;
133
139
  if (telemetryArg && ["sentry", "glitchtip", "discord", "none"].includes(telemetryArg))
@@ -135,7 +141,7 @@ function parseArgs(args) {
135
141
  return options;
136
142
  }
137
143
  ;
138
- async function createProject(projectName, language, telemetry, useDocker) {
144
+ async function createProject(projectName, language, telemetry, swagger, useDocker) {
139
145
  const isCurrentDir = projectName === ".";
140
146
  const targetDir = isCurrentDir ? process.cwd() : join(process.cwd(), projectName);
141
147
  if (!isCurrentDir && existsSync(targetDir)) {
@@ -146,17 +152,17 @@ async function createProject(projectName, language, telemetry, useDocker) {
146
152
  await mkdir(targetDir, { recursive: true });
147
153
  let pkgJson;
148
154
  if (language === "typescript")
149
- pkgJson = getTypeScriptPackageJson(projectName, telemetry);
155
+ pkgJson = getTypeScriptPackageJson(projectName, telemetry, swagger);
150
156
  else
151
- pkgJson = getJavaScriptPackageJson(projectName, telemetry);
157
+ pkgJson = getJavaScriptPackageJson(projectName, telemetry, swagger);
152
158
  await writeFile(join(targetDir, "package.json"), JSON.stringify(pkgJson, null, 2));
153
159
  if (language === "typescript") {
154
160
  await writeFile(join(targetDir, "tsconfig.json"), getTsConfig());
155
161
  await writeFile(join(targetDir, "vite.config.ts"), getViteConfig());
156
- await writeFile(join(targetDir, "sprint.config.ts"), getSprintConfigFile(language, telemetry));
162
+ await writeFile(join(targetDir, "sprint.config.ts"), getSprintConfigFile(language, telemetry, swagger));
157
163
  }
158
164
  else
159
- await writeFile(join(targetDir, "sprint.config.js"), getSprintConfigFile(language, telemetry));
165
+ await writeFile(join(targetDir, "sprint.config.js"), getSprintConfigFile(language, telemetry, swagger));
160
166
  const srcDir = join(targetDir, "src");
161
167
  await mkdir(srcDir, { recursive: true });
162
168
  await mkdir(join(srcDir, "middlewares"), { recursive: true });
@@ -165,6 +171,7 @@ async function createProject(projectName, language, telemetry, useDocker) {
165
171
  await mkdir(join(srcDir, "schemas"), { recursive: true });
166
172
  await mkdir(join(srcDir, "cronjobs"), { recursive: true });
167
173
  await mkdir(join(srcDir, "config"), { recursive: true });
174
+ await mkdir(join(srcDir, "services"), { recursive: true });
168
175
  if (language === "typescript") {
169
176
  await writeFile(join(srcDir, "config", "index.ts"), "");
170
177
  await writeFile(join(srcDir, "config", "clients.ts"), "");
@@ -173,7 +180,7 @@ async function createProject(projectName, language, telemetry, useDocker) {
173
180
  await writeFile(join(srcDir, "config", "index.js"), "");
174
181
  await writeFile(join(srcDir, "config", "clients.js"), "");
175
182
  }
176
- await writeFile(join(srcDir, "middlewares", ".gitkeep"), "");
183
+ await writeFile(join(srcDir, "services", ".gitkeep"), "");
177
184
  await writeFile(join(srcDir, "app." + (language === "typescript" ? "ts" : "js")), getMainFile(language));
178
185
  await writeFile(join(srcDir, "routes", "home." + (language === "typescript" ? "ts" : "js")), getHomeRoute(language));
179
186
  await writeFile(join(srcDir, "routes", "admin." + (language === "typescript" ? "ts" : "js")), getAdminRoute(language));
@@ -52,14 +52,17 @@ export default defineConfig({
52
52
  `;
53
53
  }
54
54
  ;
55
- export function getSprintConfigFile(language, telemetry) {
55
+ export function getSprintConfigFile(language, telemetry, swagger) {
56
56
  if (language === "typescript") {
57
57
  let config = `import type { SprintOptions } from "sprint-es";
58
58
 
59
59
  export const config: SprintOptions = {
60
60
  openapi: {
61
- /* Generate OpenAPI spec on build - Coming Soon */
62
- generateOnBuild: false
61
+ enabled: ${swagger},
62
+ generateOnBuild: ${swagger},
63
+ swaggerUi: {
64
+ enabled: ${swagger}
65
+ }
63
66
  }
64
67
  };
65
68
 
@@ -91,8 +94,11 @@ initTelemetry({
91
94
  }
92
95
  let config = `export const config = {
93
96
  openapi: {
94
- /* Generate OpenAPI spec on build - Coming Soon */
95
- generateOnBuild: false
97
+ enabled: ${swagger},
98
+ generateOnBuild: ${swagger},
99
+ swaggerUi: {
100
+ enabled: ${swagger}
101
+ }
96
102
  }
97
103
  };
98
104
  `;
@@ -29,9 +29,9 @@ export function getEnvDevelopment(telemetry) {
29
29
  const keys = generateJWTKeys();
30
30
  let env = `NODE_ENV=development
31
31
  PORT=5000
32
- JWT_PUBLIC_KEY='${keys.publicKey}'
33
- JWT_PRIVATE_KEY='${keys.privateKey}'
34
- JWT_ENCRYPTION_SECRET='${crypto.randomBytes(32).toString("hex")}'
32
+ JWT_PUBLIC_KEY="${keys.publicKey}"
33
+ JWT_PRIVATE_KEY="${keys.privateKey}"
34
+ JWT_ENCRYPTION_SECRET="${crypto.randomBytes(32).toString("hex")}"
35
35
  `;
36
36
  if (telemetry === "sentry" || telemetry === "glitchtip") {
37
37
  env += `
@@ -52,20 +52,20 @@ export function getEnvProduction(telemetry) {
52
52
  const keys = generateJWTKeys();
53
53
  let env = `NODE_ENV=production
54
54
  PORT=5000
55
- JWT_PUBLIC_KEY='${keys.publicKey}'
56
- JWT_PRIVATE_KEY='${keys.privateKey}'
57
- JWT_ENCRYPTION_SECRET='${crypto.randomBytes(32).toString("hex")}'
55
+ JWT_PUBLIC_KEY="${keys.publicKey}"
56
+ JWT_PRIVATE_KEY="${keys.privateKey}"
57
+ JWT_ENCRYPTION_SECRET="${crypto.randomBytes(32).toString("hex")}"
58
58
  `;
59
59
  if (telemetry === "sentry" || telemetry === "glitchtip") {
60
60
  env += `
61
61
  # Sentry / GlitchTip
62
- SENTRY_DSN=
62
+ SENTRY_DSN=""
63
63
  `;
64
64
  }
65
65
  else if (telemetry === "discord") {
66
66
  env += `
67
67
  # Discord Webhook URL
68
- DISCORD_TELEMETRY_WEBHOOK_URL=
68
+ DISCORD_TELEMETRY_WEBHOOK_URL=""
69
69
  `;
70
70
  }
71
71
  return env;
@@ -8,21 +8,23 @@ export function generateJWTKeys() {
8
8
  return keys;
9
9
  }
10
10
  ;
11
- export function getTypeScriptPackageJson(name, telemetry) {
11
+ export function getTypeScriptPackageJson(name, telemetry, swagger) {
12
12
  const deps = {
13
- "sprint-es": "^0.0.54"
13
+ "sprint-es": "^0.0.73"
14
14
  };
15
15
  const devDeps = {
16
16
  "@types/node": "^22.0.0",
17
17
  "tsx": "^4.19.0",
18
- typescript: "^5.6.0",
18
+ typescript: "^5.6.0"
19
19
  };
20
- if (telemetry === "sentry" || telemetry === "glitchtip") {
20
+ if (telemetry === "sentry" || telemetry === "glitchtip")
21
21
  deps["@sentry/node"] = "^8.0.0";
22
- }
23
- else if (telemetry === "discord") {
22
+ else if (telemetry === "discord")
24
23
  deps["axios"] = "^1.6.0";
25
- }
24
+ if (swagger)
25
+ deps["swagger-ui-express"] = "^5.0.0";
26
+ if (swagger)
27
+ devDeps["@types/swagger-ui-express"] = "^4.1.8";
26
28
  return {
27
29
  name: name === "." ? "sprint-app" : name,
28
30
  version: "0.0.1",
@@ -35,20 +37,20 @@ export function getTypeScriptPackageJson(name, telemetry) {
35
37
  "generate:keys": "sprint-es generate-keys"
36
38
  },
37
39
  dependencies: deps,
38
- devDependencies: devDeps,
40
+ devDependencies: devDeps
39
41
  };
40
42
  }
41
43
  ;
42
- export function getJavaScriptPackageJson(name, telemetry) {
44
+ export function getJavaScriptPackageJson(name, telemetry, swagger) {
43
45
  const deps = {
44
- "sprint-es": "^0.0.54"
46
+ "sprint-es": "^0.0.73"
45
47
  };
46
- if (telemetry === "sentry" || telemetry === "glitchtip") {
48
+ if (telemetry === "sentry" || telemetry === "glitchtip")
47
49
  deps["@sentry/node"] = "^8.0.0";
48
- }
49
- else if (telemetry === "discord") {
50
+ else if (telemetry === "discord")
50
51
  deps["axios"] = "^1.6.0";
51
- }
52
+ if (swagger)
53
+ deps["swagger-ui-express"] = "^5.0.0";
52
54
  return {
53
55
  name: name === "." ? "sprint-app" : name,
54
56
  version: "0.0.1",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-sprint",
3
- "version": "0.0.68",
3
+ "version": "0.0.72",
4
4
  "description": "Create a new Sprint API project",
5
5
  "type": "module",
6
6
  "bin": {
package/src/index.ts CHANGED
@@ -11,6 +11,7 @@ export interface CLIOptions {
11
11
  projectName?: string;
12
12
  language?: "typescript" | "javascript";
13
13
  telemetry?: "none" | "sentry" | "glitchtip" | "discord";
14
+ swagger?: boolean;
14
15
  docker?: boolean;
15
16
  skipInstall?: boolean;
16
17
  skipPrompts?: boolean;
@@ -32,6 +33,7 @@ export async function runCLI(args: string[]) {
32
33
  projectName: string;
33
34
  language: "typescript" | "javascript";
34
35
  telemetry: string;
36
+ swagger: boolean;
35
37
  docker: boolean;
36
38
  };
37
39
 
@@ -40,6 +42,7 @@ export async function runCLI(args: string[]) {
40
42
  projectName: options.projectName || "sprint-app",
41
43
  language: options.language || "typescript",
42
44
  telemetry: options.telemetry || "none",
45
+ swagger: options.swagger ?? true,
43
46
  docker: options.docker || false,
44
47
  };
45
48
  } else {
@@ -72,6 +75,9 @@ export async function runCLI(args: string[]) {
72
75
  ],
73
76
  }),
74
77
 
78
+ swagger: () =>
79
+ p.confirm({ message: "Add Swagger UI & OpenAPI?", initialValue: true }),
80
+
75
81
  docker: () =>
76
82
  p.confirm({ message: "Add Docker support?", initialValue: false }),
77
83
  },
@@ -92,6 +98,7 @@ export async function runCLI(args: string[]) {
92
98
  config.projectName,
93
99
  config.language,
94
100
  config.telemetry,
101
+ config.swagger,
95
102
  config.docker,
96
103
  );
97
104
  s.stop("Project created");
@@ -164,6 +171,9 @@ function parseArgs(args: string[]): CLIOptions {
164
171
 
165
172
  if (args.includes("--docker")) options.docker = true;
166
173
 
174
+ if (args.includes("--swagger")) options.swagger = true;
175
+ else if (args.includes("--no-swagger")) options.swagger = false;
176
+
167
177
  if (args.includes("--no-install")) options.skipInstall = true;
168
178
 
169
179
  if (telemetryArg && ["sentry", "glitchtip", "discord", "none"].includes(telemetryArg)) options.telemetry = telemetryArg as CLIOptions["telemetry"];
@@ -175,6 +185,7 @@ async function createProject(
175
185
  projectName: string,
176
186
  language: "typescript" | "javascript",
177
187
  telemetry: string,
188
+ swagger: boolean,
178
189
  useDocker: boolean
179
190
  ) {
180
191
  const isCurrentDir = projectName === ".";
@@ -188,16 +199,16 @@ async function createProject(
188
199
  if (!isCurrentDir) await mkdir(targetDir, { recursive: true });
189
200
 
190
201
  let pkgJson;
191
- if (language === "typescript") pkgJson = getTypeScriptPackageJson(projectName, telemetry);
192
- else pkgJson = getJavaScriptPackageJson(projectName, telemetry);
202
+ if (language === "typescript") pkgJson = getTypeScriptPackageJson(projectName, telemetry, swagger);
203
+ else pkgJson = getJavaScriptPackageJson(projectName, telemetry, swagger);
193
204
 
194
205
  await writeFile(join(targetDir, "package.json"), JSON.stringify(pkgJson, null, 2));
195
206
 
196
207
  if (language === "typescript") {
197
208
  await writeFile(join(targetDir, "tsconfig.json"), getTsConfig());
198
209
  await writeFile(join(targetDir, "vite.config.ts"), getViteConfig());
199
- await writeFile(join(targetDir, "sprint.config.ts"), getSprintConfigFile(language, telemetry));
200
- } else await writeFile(join(targetDir, "sprint.config.js"), getSprintConfigFile(language, telemetry));
210
+ await writeFile(join(targetDir, "sprint.config.ts"), getSprintConfigFile(language, telemetry, swagger));
211
+ } else await writeFile(join(targetDir, "sprint.config.js"), getSprintConfigFile(language, telemetry, swagger));
201
212
 
202
213
  const srcDir = join(targetDir, "src");
203
214
  await mkdir(srcDir, { recursive: true });
@@ -208,6 +219,7 @@ async function createProject(
208
219
  await mkdir(join(srcDir, "schemas"), { recursive: true });
209
220
  await mkdir(join(srcDir, "cronjobs"), { recursive: true });
210
221
  await mkdir(join(srcDir, "config"), { recursive: true });
222
+ await mkdir(join(srcDir, "services"), { recursive: true });
211
223
 
212
224
  if (language === "typescript") {
213
225
  await writeFile(join(srcDir, "config", "index.ts"), "");
@@ -217,7 +229,7 @@ async function createProject(
217
229
  await writeFile(join(srcDir, "config", "clients.js"), "");
218
230
  }
219
231
 
220
- await writeFile(join(srcDir, "middlewares", ".gitkeep"), "");
232
+ await writeFile(join(srcDir, "services", ".gitkeep"), "");
221
233
 
222
234
  await writeFile(join(srcDir, "app." + (language === "typescript" ? "ts" : "js")), getMainFile(language));
223
235
 
@@ -52,14 +52,17 @@ export default defineConfig({
52
52
  `;
53
53
  };
54
54
 
55
- export function getSprintConfigFile(language: string, telemetry: string) {
55
+ export function getSprintConfigFile(language: string, telemetry: string, swagger: boolean) {
56
56
  if (language === "typescript") {
57
57
  let config = `import type { SprintOptions } from "sprint-es";
58
58
 
59
59
  export const config: SprintOptions = {
60
60
  openapi: {
61
- /* Generate OpenAPI spec on build - Coming Soon */
62
- generateOnBuild: false
61
+ enabled: ${swagger},
62
+ generateOnBuild: ${swagger},
63
+ swaggerUi: {
64
+ enabled: ${swagger}
65
+ }
63
66
  }
64
67
  };
65
68
 
@@ -93,8 +96,11 @@ initTelemetry({
93
96
 
94
97
  let config = `export const config = {
95
98
  openapi: {
96
- /* Generate OpenAPI spec on build - Coming Soon */
97
- generateOnBuild: false
99
+ enabled: ${swagger},
100
+ generateOnBuild: ${swagger},
101
+ swaggerUi: {
102
+ enabled: ${swagger}
103
+ }
98
104
  }
99
105
  };
100
106
  `;
@@ -31,9 +31,9 @@ export function getEnvDevelopment(telemetry: string) {
31
31
  const keys = generateJWTKeys();
32
32
  let env = `NODE_ENV=development
33
33
  PORT=5000
34
- JWT_PUBLIC_KEY='${keys.publicKey}'
35
- JWT_PRIVATE_KEY='${keys.privateKey}'
36
- JWT_ENCRYPTION_SECRET='${crypto.randomBytes(32).toString("hex")}'
34
+ JWT_PUBLIC_KEY="${keys.publicKey}"
35
+ JWT_PRIVATE_KEY="${keys.privateKey}"
36
+ JWT_ENCRYPTION_SECRET="${crypto.randomBytes(32).toString("hex")}"
37
37
  `;
38
38
 
39
39
  if (telemetry === "sentry" || telemetry === "glitchtip") {
@@ -55,20 +55,20 @@ export function getEnvProduction(telemetry: string) {
55
55
  const keys = generateJWTKeys();
56
56
  let env = `NODE_ENV=production
57
57
  PORT=5000
58
- JWT_PUBLIC_KEY='${keys.publicKey}'
59
- JWT_PRIVATE_KEY='${keys.privateKey}'
60
- JWT_ENCRYPTION_SECRET='${crypto.randomBytes(32).toString("hex")}'
58
+ JWT_PUBLIC_KEY="${keys.publicKey}"
59
+ JWT_PRIVATE_KEY="${keys.privateKey}"
60
+ JWT_ENCRYPTION_SECRET="${crypto.randomBytes(32).toString("hex")}"
61
61
  `;
62
62
 
63
63
  if (telemetry === "sentry" || telemetry === "glitchtip") {
64
64
  env += `
65
65
  # Sentry / GlitchTip
66
- SENTRY_DSN=
66
+ SENTRY_DSN=""
67
67
  `;
68
68
  } else if (telemetry === "discord") {
69
69
  env += `
70
70
  # Discord Webhook URL
71
- DISCORD_TELEMETRY_WEBHOOK_URL=
71
+ DISCORD_TELEMETRY_WEBHOOK_URL=""
72
72
  `;
73
73
  }
74
74
 
@@ -10,26 +10,26 @@ export function generateJWTKeys(): JWTKeys {
10
10
  modulusLength: 4096,
11
11
  publicKeyEncoding: { type: "spki", format: "pem" },
12
12
  privateKeyEncoding: { type: "pkcs8", format: "pem" }
13
- }) as unknown as { publicKey: string; privateKey: string };
13
+ }) as unknown as { publicKey: string; privateKey: string; };
14
14
  return keys;
15
15
  };
16
16
 
17
- export function getTypeScriptPackageJson(name: string, telemetry: string) {
17
+ export function getTypeScriptPackageJson(name: string, telemetry: string, swagger: boolean) {
18
18
  const deps: Record<string, string> = {
19
- "sprint-es": "^0.0.54"
19
+ "sprint-es": "^0.0.73"
20
20
  };
21
21
 
22
22
  const devDeps: Record<string, string> = {
23
23
  "@types/node": "^22.0.0",
24
24
  "tsx": "^4.19.0",
25
- typescript: "^5.6.0",
25
+ typescript: "^5.6.0"
26
26
  };
27
27
 
28
- if (telemetry === "sentry" || telemetry === "glitchtip") {
29
- deps["@sentry/node"] = "^8.0.0";
30
- } else if (telemetry === "discord") {
31
- deps["axios"] = "^1.6.0";
32
- }
28
+ if (telemetry === "sentry" || telemetry === "glitchtip") deps["@sentry/node"] = "^8.0.0";
29
+ else if (telemetry === "discord") deps["axios"] = "^1.6.0";
30
+
31
+ if (swagger) deps["swagger-ui-express"] = "^5.0.0";
32
+ if (swagger) devDeps["@types/swagger-ui-express"] = "^4.1.8";
33
33
 
34
34
  return {
35
35
  name: name === "." ? "sprint-app" : name,
@@ -43,20 +43,19 @@ export function getTypeScriptPackageJson(name: string, telemetry: string) {
43
43
  "generate:keys": "sprint-es generate-keys"
44
44
  },
45
45
  dependencies: deps,
46
- devDependencies: devDeps,
46
+ devDependencies: devDeps
47
47
  };
48
48
  };
49
49
 
50
- export function getJavaScriptPackageJson(name: string, telemetry: string) {
50
+ export function getJavaScriptPackageJson(name: string, telemetry: string, swagger: boolean) {
51
51
  const deps: Record<string, string> = {
52
- "sprint-es": "^0.0.54"
52
+ "sprint-es": "^0.0.73"
53
53
  };
54
54
 
55
- if (telemetry === "sentry" || telemetry === "glitchtip") {
56
- deps["@sentry/node"] = "^8.0.0";
57
- } else if (telemetry === "discord") {
58
- deps["axios"] = "^1.6.0";
59
- }
55
+ if (telemetry === "sentry" || telemetry === "glitchtip") deps["@sentry/node"] = "^8.0.0";
56
+ else if (telemetry === "discord") deps["axios"] = "^1.6.0";
57
+
58
+ if (swagger) deps["swagger-ui-express"] = "^5.0.0";
60
59
 
61
60
  return {
62
61
  name: name === "." ? "sprint-app" : name,