create-express-kickstart 1.2.10 → 1.3.0
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/bin/cli.js +32 -9
- package/package.json +1 -1
- package/src/app.js +6 -3
- package/src/server.js +0 -7
package/bin/cli.js
CHANGED
|
@@ -258,11 +258,6 @@ export const verifyToken = (token) => {
|
|
|
258
258
|
if (fs.existsSync(dbDir)) fs.rmSync(dbDir, { recursive: true, force: true });
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
-
if (!deps.dotenv) {
|
|
262
|
-
serverJsCode = serverJsCode.replace(/import dotenv from "dotenv";\r?\n/, '');
|
|
263
|
-
serverJsCode = serverJsCode.replace(/\/\/ Load environment variables[\s\S]*?\}\);\r?\n/, '');
|
|
264
|
-
}
|
|
265
|
-
|
|
266
261
|
fs.writeFileSync(serverJsPath, serverJsCode);
|
|
267
262
|
}
|
|
268
263
|
|
|
@@ -276,7 +271,7 @@ export const verifyToken = (token) => {
|
|
|
276
271
|
type: "module",
|
|
277
272
|
scripts: {
|
|
278
273
|
"start": "node src/server.js",
|
|
279
|
-
"dev": "nodemon src/server.js"
|
|
274
|
+
"dev": deps.dotenv ? "nodemon -r dotenv/config src/server.js" : "nodemon src/server.js"
|
|
280
275
|
},
|
|
281
276
|
imports: {
|
|
282
277
|
"#*": "./src/*"
|
|
@@ -296,21 +291,22 @@ export const verifyToken = (token) => {
|
|
|
296
291
|
|
|
297
292
|
// Write package.json
|
|
298
293
|
fs.writeFileSync(
|
|
299
|
-
path.join(projectPath, 'package.json'),
|
|
294
|
+
path.join(projectPath, 'package.json'),
|
|
300
295
|
JSON.stringify(packageJsonTemplate, null, 2)
|
|
301
296
|
);
|
|
302
297
|
|
|
303
298
|
// Install Dependencies
|
|
304
|
-
const dependenciesToInstall = Object.keys(deps).filter(dep => deps[dep] && dep !== 'prettier');
|
|
299
|
+
const dependenciesToInstall = Object.keys(deps).filter(dep => deps[dep] && dep !== 'prettier' && dep !== 'dotenv');
|
|
305
300
|
if (deps['pino-http']) {
|
|
306
301
|
dependenciesToInstall.push('pino');
|
|
307
302
|
}
|
|
308
303
|
if (initAuth) {
|
|
309
304
|
dependenciesToInstall.push('jsonwebtoken', 'bcryptjs'); // Add bcryptjs too since it's standard with JWT
|
|
310
305
|
}
|
|
311
|
-
|
|
306
|
+
|
|
312
307
|
const devDependenciesToInstall = ['nodemon'];
|
|
313
308
|
if (deps.prettier) devDependenciesToInstall.push('prettier');
|
|
309
|
+
if (deps.dotenv) devDependenciesToInstall.push('dotenv');
|
|
314
310
|
if (installPinoPretty) devDependenciesToInstall.push('pino-pretty');
|
|
315
311
|
if (initTests) {
|
|
316
312
|
devDependenciesToInstall.push('jest', 'supertest');
|
|
@@ -340,6 +336,33 @@ export const verifyToken = (token) => {
|
|
|
340
336
|
const installTriggerCmd = packageManager === 'npm' ? 'npm install' : `${packageManager} install`;
|
|
341
337
|
execSync(installTriggerCmd, execConfig);
|
|
342
338
|
|
|
339
|
+
// Update package.json with the actual installed versions instead of "latest"
|
|
340
|
+
try {
|
|
341
|
+
const installedPackageJson = JSON.parse(fs.readFileSync(finalPackageJsonPath, 'utf8'));
|
|
342
|
+
|
|
343
|
+
const getInstalledVersion = (dep) => {
|
|
344
|
+
try {
|
|
345
|
+
const depPkgPath = path.join(projectPath, 'node_modules', dep, 'package.json');
|
|
346
|
+
const depPkgCode = JSON.parse(fs.readFileSync(depPkgPath, 'utf8'));
|
|
347
|
+
return `^${depPkgCode.version}`;
|
|
348
|
+
} catch (err) {
|
|
349
|
+
return 'latest';
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
dependenciesToInstall.forEach(d => {
|
|
354
|
+
installedPackageJson.dependencies[d] = getInstalledVersion(d);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
devDependenciesToInstall.forEach(d => {
|
|
358
|
+
installedPackageJson.devDependencies[d] = getInstalledVersion(d);
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
fs.writeFileSync(finalPackageJsonPath, JSON.stringify(installedPackageJson, null, 2));
|
|
362
|
+
} catch (err) {
|
|
363
|
+
// Silently fall back to 'latest' if parsing fails
|
|
364
|
+
}
|
|
365
|
+
|
|
343
366
|
if (initGit) {
|
|
344
367
|
console.log(`\n Initializing Git repository...`);
|
|
345
368
|
execSync('git init', { cwd: projectPath, stdio: 'inherit' });
|
package/package.json
CHANGED
package/src/app.js
CHANGED
|
@@ -16,8 +16,8 @@ app.use(helmet());
|
|
|
16
16
|
|
|
17
17
|
// Rate Limiting
|
|
18
18
|
const limiter = rateLimit({
|
|
19
|
-
windowMs: process.env.RATE_LIMIT_WINDOW_MS || 15 * 60 * 1000, // Default 15 minutes
|
|
20
|
-
limit: process.env.RATE_LIMIT_MAX || 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes)
|
|
19
|
+
windowMs: Number(process.env.RATE_LIMIT_WINDOW_MS) || 15 * 60 * 1000, // Default 15 minutes
|
|
20
|
+
limit: Number(process.env.RATE_LIMIT_MAX) || 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes)
|
|
21
21
|
standardHeaders: 'draft-7', // draft-6: `RateLimit-*` headers; draft-7: combined `RateLimit` header
|
|
22
22
|
legacyHeaders: false, // Disable the `X-RateLimit-*` headers
|
|
23
23
|
message: "Too many requests from this IP, please try again later"
|
|
@@ -51,9 +51,12 @@ app.use(pinoHttp({
|
|
|
51
51
|
}));
|
|
52
52
|
|
|
53
53
|
// CORS setup
|
|
54
|
+
if (!process.env.CORS_ORIGIN && process.env.NODE_ENV === "production") {
|
|
55
|
+
throw new Error("CORS_ORIGIN must be set");
|
|
56
|
+
}
|
|
54
57
|
app.use(
|
|
55
58
|
cors({
|
|
56
|
-
origin: process.env.CORS_ORIGIN || "*",
|
|
59
|
+
origin: process.env.CORS_ORIGIN || "*",
|
|
57
60
|
credentials: true, // Allow cookies with requests
|
|
58
61
|
})
|
|
59
62
|
);
|
package/src/server.js
CHANGED