create-clean-node 1.0.2 → 1.0.5
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/index.js +68 -48
- package/package.json +1 -1
- package/template_express_ejs/.env +1 -0
- package/template_express_ejs/index.test.ts +3 -0
- package/template_express_ejs/index.ts +24 -0
- package/template_express_ejs/package.json +28 -0
- package/template_express_ejs/public/css/style.css +6 -0
- package/{template → template_express_ejs}/tsconfig.json +1 -2
- package/template_express_ejs/views/index.ejs +12 -0
- package/template_node/index.test.ts +3 -0
- package/template_node/jest.config.js +5 -0
- package/template_node/package-lock.json +3912 -0
- package/template_node/package.json +22 -0
- package/template_node/tsconfig.json +108 -0
- package/template_node_readline/index.test.ts +3 -0
- package/template_node_readline/index.ts +5 -0
- package/template_node_readline/jest.config.js +5 -0
- package/template_node_readline/package.json +24 -0
- package/template_node_readline/tsconfig.json +108 -0
- package/template/package.json +0 -14
- /package/{template → template_node}/index.ts +0 -0
package/index.js
CHANGED
|
@@ -4,66 +4,86 @@ const spawn = require('cross-spawn');
|
|
|
4
4
|
const fs = require('fs');
|
|
5
5
|
const path = require('path');
|
|
6
6
|
|
|
7
|
+
async function createProject(template, projectName) {
|
|
8
|
+
const currentDir = process.cwd();
|
|
9
|
+
const projectDir = path.resolve(currentDir, projectName);
|
|
10
|
+
fs.mkdirSync(projectDir, { recursive: true });
|
|
11
|
+
|
|
12
|
+
const templateDir = path.resolve(__dirname, template);
|
|
13
|
+
fs.cpSync(templateDir, projectDir, { recursive: true });
|
|
14
|
+
|
|
15
|
+
const projectPackageJsonPath = path.join(projectDir, 'package.json');
|
|
16
|
+
if (fs.existsSync(projectPackageJsonPath)) {
|
|
17
|
+
const projectPackageJson = require(projectPackageJsonPath);
|
|
18
|
+
projectPackageJson.name = projectName;
|
|
19
|
+
fs.writeFileSync(
|
|
20
|
+
projectPackageJsonPath,
|
|
21
|
+
JSON.stringify(projectPackageJson, null, 2)
|
|
22
|
+
);
|
|
23
|
+
} else {
|
|
24
|
+
console.error('Error: package.json does not exist in the template directory.');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Install base dependencies
|
|
29
|
+
spawn.sync('npm', ['install'], { stdio: 'inherit', cwd: projectDir });
|
|
30
|
+
|
|
31
|
+
console.log('Success! Your new project is ready.');
|
|
32
|
+
console.log(`Created ${projectName} at ${projectDir}`);
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function createExpressProject(projectName) {
|
|
37
|
+
let template = "template_express_ejs";
|
|
38
|
+
await createProject(template, projectName);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function createNodeProject(projectName) {
|
|
42
|
+
const inquirer = (await import("inquirer")).default;
|
|
43
|
+
let template = "template_node";
|
|
44
|
+
|
|
45
|
+
const { installReadlineSync } = await inquirer.prompt(
|
|
46
|
+
{
|
|
47
|
+
type: 'confirm',
|
|
48
|
+
name: 'installReadlineSync',
|
|
49
|
+
message: 'Do you want to install the readline-sync library?',
|
|
50
|
+
default: false // Default no installation
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
if (installReadlineSync) {
|
|
55
|
+
template = "template_node_readline";
|
|
56
|
+
}
|
|
57
|
+
await createProject(template, projectName);
|
|
58
|
+
}
|
|
59
|
+
|
|
7
60
|
async function setupProject() {
|
|
8
61
|
const inquirer = (await import("inquirer")).default;
|
|
9
62
|
try {
|
|
10
|
-
|
|
63
|
+
let result = await inquirer.prompt({
|
|
64
|
+
type: 'list',
|
|
65
|
+
name: 'projectType',
|
|
66
|
+
message: 'What type of project would you like to create?',
|
|
67
|
+
choices: ['Node.js', 'Express.js'],
|
|
68
|
+
default: 'Simple Node.js',
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
let projectName = await inquirer.prompt(
|
|
11
72
|
{
|
|
12
73
|
type: 'input',
|
|
13
74
|
name: 'projectName',
|
|
14
75
|
message: 'What is the name of your project?',
|
|
15
|
-
validate: function(input) {
|
|
76
|
+
validate: function (input) {
|
|
16
77
|
if (/^[\w-]+$/.test(input)) return true;
|
|
17
78
|
return 'Project name can only include letters, numbers, underscores, and hyphens.';
|
|
18
79
|
}
|
|
19
|
-
}
|
|
20
|
-
{
|
|
21
|
-
type: 'confirm',
|
|
22
|
-
name: 'installReadlineSync',
|
|
23
|
-
message: 'Do you want to install the readline-sync library?',
|
|
24
|
-
default: false // Default no installation
|
|
25
|
-
}
|
|
26
|
-
]);
|
|
27
|
-
|
|
28
|
-
const { projectName, installReadlineSync } = answers;
|
|
29
|
-
const currentDir = process.cwd();
|
|
30
|
-
const projectDir = path.resolve(currentDir, projectName);
|
|
31
|
-
fs.mkdirSync(projectDir, { recursive: true });
|
|
80
|
+
});
|
|
32
81
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (fs.existsSync(projectPackageJsonPath)) {
|
|
38
|
-
const projectPackageJson = require(projectPackageJsonPath);
|
|
39
|
-
projectPackageJson.name = projectName;
|
|
40
|
-
fs.writeFileSync(
|
|
41
|
-
projectPackageJsonPath,
|
|
42
|
-
JSON.stringify(projectPackageJson, null, 2)
|
|
43
|
-
);
|
|
44
|
-
} else {
|
|
45
|
-
console.error('Error: package.json does not exist in the template directory.');
|
|
46
|
-
process.exit(1);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Install base dependencies
|
|
50
|
-
spawn.sync('npm', ['install'], { stdio: 'inherit', cwd: projectDir });
|
|
51
|
-
|
|
52
|
-
// Conditionally install readline-sync if the user requested it
|
|
53
|
-
if (installReadlineSync) {
|
|
54
|
-
console.log('Installing readline-sync...');
|
|
55
|
-
spawn.sync('npm', ['install', 'readline-sync'], { stdio: 'inherit', cwd: projectDir });
|
|
56
|
-
spawn.sync('npm', ['install', '--save-dev', '@types/readline-sync'], { stdio: 'inherit', cwd: projectDir });
|
|
57
|
-
|
|
58
|
-
// Prepend import statement to index.ts
|
|
59
|
-
const indexPath = path.join(projectDir, 'index.ts');
|
|
60
|
-
let fileContent = fs.readFileSync(indexPath, { encoding: 'utf8' });
|
|
61
|
-
fileContent = `import readline from 'readline-sync';\n\n` + fileContent;
|
|
62
|
-
fs.writeFileSync(indexPath, fileContent);
|
|
82
|
+
if (result.projectType === 'Express.js') {
|
|
83
|
+
await createExpressProject(projectName.projectName);
|
|
84
|
+
} else if (result.projectType === 'Node.js') {
|
|
85
|
+
await createNodeProject(projectName.projectName);
|
|
63
86
|
}
|
|
64
|
-
|
|
65
|
-
console.log('Success! Your new project is ready.');
|
|
66
|
-
console.log(`Created ${projectName} at ${projectDir}`);
|
|
67
87
|
} catch (error) {
|
|
68
88
|
console.error('An error occurred:', error);
|
|
69
89
|
}
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
PORT=3000
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import express, { Express } from "express";
|
|
2
|
+
import dotenv from "dotenv";
|
|
3
|
+
|
|
4
|
+
dotenv.config();
|
|
5
|
+
|
|
6
|
+
const app : Express = express();
|
|
7
|
+
|
|
8
|
+
app.set("view engine", "ejs");
|
|
9
|
+
app.use(express.json());
|
|
10
|
+
app.use(express.urlencoded({ extended: true }));
|
|
11
|
+
app.use(express.static("public"));
|
|
12
|
+
|
|
13
|
+
app.set("port", process.env.PORT || 3000);
|
|
14
|
+
|
|
15
|
+
app.use("/", (req, res) => {
|
|
16
|
+
res.render("index", {
|
|
17
|
+
title: "Hello World",
|
|
18
|
+
message: "Hello World"
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
app.listen(app.get("port"), () => {
|
|
23
|
+
console.log("Server started on http://localhost:" + app.get('port'));
|
|
24
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "template",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "index.ts",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "jest",
|
|
8
|
+
"start": "nodemon index.ts"
|
|
9
|
+
},
|
|
10
|
+
"author": "",
|
|
11
|
+
"license": "ISC",
|
|
12
|
+
"devDependencies": {
|
|
13
|
+
"typescript": "^5.3.3",
|
|
14
|
+
"@types/ejs": "^3.1.5",
|
|
15
|
+
"@types/express": "^4.17.21",
|
|
16
|
+
"@types/node": "^20.11.16",
|
|
17
|
+
"nodemon": "^3.1.0",
|
|
18
|
+
"ts-node": "^10.9.2",
|
|
19
|
+
"ts-jest": "^29.1.2",
|
|
20
|
+
"jest": "^29.7.0",
|
|
21
|
+
"@types/jest": "^29.5.12"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"dotenv": "^16.4.5",
|
|
25
|
+
"ejs": "^3.1.9",
|
|
26
|
+
"express": "^4.18.3"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
/* Modules */
|
|
28
28
|
"module": "commonjs", /* Specify what module code is generated. */
|
|
29
|
+
"resolveJsonModule": true, /* Enable importing .json files. */
|
|
29
30
|
// "rootDir": "./", /* Specify the root folder within your source files. */
|
|
30
31
|
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
|
|
31
32
|
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
|
@@ -39,10 +40,8 @@
|
|
|
39
40
|
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
|
|
40
41
|
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
|
|
41
42
|
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
|
|
42
|
-
// "resolveJsonModule": true, /* Enable importing .json files. */
|
|
43
43
|
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
|
|
44
44
|
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
|
|
45
|
-
|
|
46
45
|
/* JavaScript Support */
|
|
47
46
|
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
|
|
48
47
|
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<link rel="stylesheet" href="/css/style.css">
|
|
7
|
+
<title><%= title %></title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<%= message %>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|