create-sprint 0.0.42 → 0.0.46

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.
@@ -65,10 +65,11 @@ export function getJavaScriptPackageJson(name, telemetry) {
65
65
  export function getTsConfig() {
66
66
  return JSON.stringify({
67
67
  compilerOptions: {
68
- target: "ES2020",
69
- module: "ESNext",
70
- moduleResolution: "bundler",
71
- lib: ["ES2020"],
68
+ target: "ES2022",
69
+ module: "NodeNext",
70
+ moduleResolution: "NodeNext",
71
+ lib: ["ES2022"],
72
+ types: ["node"],
72
73
  outDir: "./dist",
73
74
  rootDir: "./src",
74
75
  strict: true,
@@ -79,7 +80,6 @@ export function getTsConfig() {
79
80
  declaration: true,
80
81
  declarationMap: true,
81
82
  sourceMap: true,
82
- tabWidth: 4,
83
83
  baseUrl: ".",
84
84
  paths: {
85
85
  "@/*": ["./src/*"]
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { execSync } from "child_process";
1
+ import { spawn } from "child_process";
2
2
  import { existsSync } from "fs";
3
3
  import { mkdir, writeFile } from "fs/promises";
4
4
  import { join } from "path";
@@ -47,7 +47,18 @@ export async function runCLI(args) {
47
47
  const s2 = p.spinner();
48
48
  s2.start("Installing dependencies");
49
49
  try {
50
- execSync("npm install", { cwd: targetDir, stdio: "pipe" });
50
+ await new Promise((resolve, reject) => {
51
+ const child = spawn("npm", ["install"], {
52
+ cwd: targetDir,
53
+ stdio: "pipe"
54
+ });
55
+ child.on("close", (code) => {
56
+ if (code === 0)
57
+ resolve();
58
+ else
59
+ reject(new Error(`npm install exited with code ${code}`));
60
+ });
61
+ });
51
62
  s2.stop("Dependencies installed");
52
63
  }
53
64
  catch {
@@ -93,56 +104,15 @@ function parseArgs(args) {
93
104
  return options;
94
105
  }
95
106
  ;
96
- async function getProjectName() {
97
- const name = await p.text({
98
- message: "Enter project name:",
99
- validate: (value) => validateProjectName(value) || undefined,
100
- });
101
- return name;
102
- }
103
- ;
104
- async function selectLanguage() {
105
- const language = await p.select({
106
- message: "Select your preferred language:",
107
- options: [
108
- { value: "typescript", label: "TypeScript", hint: "recommended" },
109
- { value: "javascript", label: "JavaScript" },
110
- ],
111
- });
112
- return language;
113
- }
114
- ;
115
- async function selectTelemetry() {
116
- const telemetry = await p.select({
117
- message: "Select error tracking/telemetry solution:",
118
- options: [
119
- { value: "none", label: "None" },
120
- { value: "sentry", label: "Sentry", hint: "free tier available" },
121
- { value: "glitchtip", label: "GlitchTip", hint: "self-hostable" },
122
- { value: "discord", label: "Discord Webhook", hint: "sends to a channel" },
123
- ],
124
- });
125
- return telemetry;
126
- }
127
- async function createProject(projectName, language, telemetryArg, useDockerArg) {
107
+ async function createProject(projectName, language, telemetry, useDocker) {
128
108
  const isCurrentDir = projectName === ".";
129
109
  const targetDir = isCurrentDir ? process.cwd() : join(process.cwd(), projectName);
130
110
  if (!isCurrentDir && existsSync(targetDir)) {
131
- console.error(`Error: Directory ${projectName} already exists`);
111
+ p.cancel(`Directory "${projectName}" already exists.`);
132
112
  process.exit(1);
133
113
  }
134
114
  if (!isCurrentDir)
135
115
  await mkdir(targetDir, { recursive: true });
136
- let telemetry = telemetryArg || "none";
137
- if (!telemetryArg)
138
- telemetry = await selectTelemetry();
139
- let useDocker = useDockerArg || false;
140
- if (!useDockerArg) {
141
- useDocker = await p.confirm({
142
- message: "Do you want to add Docker support?",
143
- initialValue: false,
144
- });
145
- }
146
116
  let pkgJson;
147
117
  if (language === "typescript")
148
118
  pkgJson = getTypeScriptPackageJson(projectName, telemetry);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-sprint",
3
- "version": "0.0.42",
3
+ "version": "0.0.46",
4
4
  "description": "Create a new Sprint API project",
5
5
  "type": "module",
6
6
  "bin": {
package/src/generators.ts CHANGED
@@ -77,10 +77,11 @@ export function getJavaScriptPackageJson(name: string, telemetry: string) {
77
77
  export function getTsConfig() {
78
78
  return JSON.stringify({
79
79
  compilerOptions: {
80
- target: "ES2020",
81
- module: "ESNext",
82
- moduleResolution: "bundler",
83
- lib: ["ES2020"],
80
+ target: "ES2022",
81
+ module: "NodeNext",
82
+ moduleResolution: "NodeNext",
83
+ lib: ["ES2022"],
84
+ types: ["node"],
84
85
  outDir: "./dist",
85
86
  rootDir: "./src",
86
87
  strict: true,
@@ -91,7 +92,6 @@ export function getTsConfig() {
91
92
  declaration: true,
92
93
  declarationMap: true,
93
94
  sourceMap: true,
94
- tabWidth: 4,
95
95
  baseUrl: ".",
96
96
  paths: {
97
97
  "@/*": ["./src/*"]
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { execSync } from "child_process";
1
+ import { spawn } from "child_process";
2
2
  import { existsSync } from "fs";
3
3
  import { mkdir, writeFile } from "fs/promises";
4
4
  import { join } from "path";
@@ -64,7 +64,12 @@ export async function runCLI(args: string[]) {
64
64
 
65
65
  const s = p.spinner();
66
66
  s.start("Creating project");
67
- await createProject(config.projectName, config.language as "typescript" | "javascript", config.telemetry, config.docker);
67
+ await createProject(
68
+ config.projectName as string,
69
+ config.language as "typescript" | "javascript",
70
+ config.telemetry as string,
71
+ config.docker as boolean,
72
+ );
68
73
  s.stop("Project created");
69
74
 
70
75
  const installDeps = await p.confirm({ message: "Install dependencies now?", initialValue: true });
@@ -73,7 +78,16 @@ export async function runCLI(args: string[]) {
73
78
  const s2 = p.spinner();
74
79
  s2.start("Installing dependencies");
75
80
  try {
76
- execSync("npm install", { cwd: targetDir, stdio: "pipe" });
81
+ await new Promise<void>((resolve, reject) => {
82
+ const child = spawn("npm", ["install"], {
83
+ cwd: targetDir,
84
+ stdio: "pipe"
85
+ });
86
+ child.on("close", (code) => {
87
+ if (code === 0) resolve();
88
+ else reject(new Error(`npm install exited with code ${code}`));
89
+ });
90
+ });
77
91
  s2.stop("Dependencies installed");
78
92
  } catch {
79
93
  s2.stop("Install failed — run npm install manually");
@@ -122,68 +136,22 @@ function parseArgs(args: string[]): CLIOptions {
122
136
  return options;
123
137
  };
124
138
 
125
- async function getProjectName(): Promise<string> {
126
- const name = await p.text({
127
- message: "Enter project name:",
128
- validate: (value) => validateProjectName(value) || undefined,
129
- });
130
-
131
- return name as string;
132
- };
133
-
134
- async function selectLanguage(): Promise<"typescript" | "javascript"> {
135
- const language = await p.select({
136
- message: "Select your preferred language:",
137
- options: [
138
- { value: "typescript", label: "TypeScript", hint: "recommended" },
139
- { value: "javascript", label: "JavaScript" },
140
- ],
141
- });
142
-
143
- return language as "typescript" | "javascript";
144
- };
145
-
146
- async function selectTelemetry(): Promise<"none" | "sentry" | "glitchtip" | "discord"> {
147
- const telemetry = await p.select({
148
- message: "Select error tracking/telemetry solution:",
149
- options: [
150
- { value: "none", label: "None" },
151
- { value: "sentry", label: "Sentry", hint: "free tier available" },
152
- { value: "glitchtip", label: "GlitchTip", hint: "self-hostable" },
153
- { value: "discord", label: "Discord Webhook", hint: "sends to a channel" },
154
- ],
155
- });
156
-
157
- return telemetry as "none" | "sentry" | "glitchtip" | "discord";
158
- }
159
-
160
139
  async function createProject(
161
140
  projectName: string,
162
141
  language: "typescript" | "javascript",
163
- telemetryArg?: string,
164
- useDockerArg?: boolean
142
+ telemetry: string,
143
+ useDocker: boolean
165
144
  ) {
166
145
  const isCurrentDir = projectName === ".";
167
146
  const targetDir = isCurrentDir ? process.cwd() : join(process.cwd(), projectName);
168
147
 
169
148
  if (!isCurrentDir && existsSync(targetDir)) {
170
- console.error(`Error: Directory ${projectName} already exists`);
149
+ p.cancel(`Directory "${projectName}" already exists.`);
171
150
  process.exit(1);
172
151
  }
173
152
 
174
153
  if (!isCurrentDir) await mkdir(targetDir, { recursive: true });
175
154
 
176
- let telemetry = telemetryArg || "none";
177
- if (!telemetryArg) telemetry = await selectTelemetry();
178
-
179
- let useDocker = useDockerArg || false;
180
- if (!useDockerArg) {
181
- useDocker = await p.confirm({
182
- message: "Do you want to add Docker support?",
183
- initialValue: false,
184
- }) as boolean;
185
- }
186
-
187
155
  let pkgJson;
188
156
  if (language === "typescript") pkgJson = getTypeScriptPackageJson(projectName, telemetry);
189
157
  else pkgJson = getJavaScriptPackageJson(projectName, telemetry);