create-elseware-app 1.0.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/README.md +1 -0
- package/bin/elseware.js +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +112 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# elseware-npm-cli
|
package/bin/elseware.js
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/create.ts
|
|
4
|
+
import path2 from "path";
|
|
5
|
+
import fs2 from "fs";
|
|
6
|
+
|
|
7
|
+
// src/prompts.ts
|
|
8
|
+
import inquirer from "inquirer";
|
|
9
|
+
async function getProjectOptions(projectName2) {
|
|
10
|
+
const answers = await inquirer.prompt([
|
|
11
|
+
{
|
|
12
|
+
type: "confirm",
|
|
13
|
+
name: "useMongo",
|
|
14
|
+
message: "Use MongoDB?",
|
|
15
|
+
default: true
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
type: "confirm",
|
|
19
|
+
name: "useDocker",
|
|
20
|
+
message: "Include Docker config?",
|
|
21
|
+
default: false
|
|
22
|
+
}
|
|
23
|
+
]);
|
|
24
|
+
return answers;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// src/generator.ts
|
|
28
|
+
import fs from "fs";
|
|
29
|
+
import path from "path";
|
|
30
|
+
async function generateProject({
|
|
31
|
+
targetDir,
|
|
32
|
+
projectName: projectName2
|
|
33
|
+
}) {
|
|
34
|
+
const templateDir = path.resolve(
|
|
35
|
+
new URL(import.meta.url).pathname,
|
|
36
|
+
"../../templates/base"
|
|
37
|
+
);
|
|
38
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
39
|
+
copyRecursive(templateDir, targetDir);
|
|
40
|
+
replacePlaceholders(targetDir, projectName2);
|
|
41
|
+
}
|
|
42
|
+
function copyRecursive(src, dest) {
|
|
43
|
+
for (const file of fs.readdirSync(src)) {
|
|
44
|
+
const srcPath = path.join(src, file);
|
|
45
|
+
const destPath = path.join(dest, file);
|
|
46
|
+
if (fs.statSync(srcPath).isDirectory()) {
|
|
47
|
+
fs.mkdirSync(destPath, { recursive: true });
|
|
48
|
+
copyRecursive(srcPath, destPath);
|
|
49
|
+
} else {
|
|
50
|
+
fs.copyFileSync(srcPath, destPath);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function replacePlaceholders(dir, projectName2) {
|
|
55
|
+
for (const file of fs.readdirSync(dir)) {
|
|
56
|
+
const filePath = path.join(dir, file);
|
|
57
|
+
if (fs.statSync(filePath).isDirectory()) {
|
|
58
|
+
replacePlaceholders(filePath, projectName2);
|
|
59
|
+
} else if (file.endsWith(".json") || file.endsWith(".md")) {
|
|
60
|
+
let content = fs.readFileSync(filePath, "utf-8");
|
|
61
|
+
content = content.replace(/__APP_NAME__/g, projectName2);
|
|
62
|
+
fs.writeFileSync(filePath, content);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// utils/logger.ts
|
|
68
|
+
var logger = {
|
|
69
|
+
success: (msg) => console.log(`\u2705 ${msg}`),
|
|
70
|
+
info: (msg) => console.log(`\u2139\uFE0F ${msg}`),
|
|
71
|
+
warn: (msg) => console.log(`\u26A0\uFE0F ${msg}`),
|
|
72
|
+
error: (msg) => console.error(`\u274C ${msg}`)
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// src/create.ts
|
|
76
|
+
async function createProject(projectName2) {
|
|
77
|
+
if (!projectName2) {
|
|
78
|
+
throw new Error("Project name is required");
|
|
79
|
+
}
|
|
80
|
+
const targetDir = path2.resolve(process.cwd(), projectName2);
|
|
81
|
+
if (fs2.existsSync(targetDir)) {
|
|
82
|
+
throw new Error(`Directory "${projectName2}" already exists`);
|
|
83
|
+
}
|
|
84
|
+
logger.info(`Creating Elseware app: ${projectName2}`);
|
|
85
|
+
const options = await getProjectOptions(projectName2);
|
|
86
|
+
await generateProject({
|
|
87
|
+
targetDir,
|
|
88
|
+
projectName: projectName2,
|
|
89
|
+
options
|
|
90
|
+
});
|
|
91
|
+
logger.success("Project created successfully!");
|
|
92
|
+
logger.info("Next steps:");
|
|
93
|
+
logger.info(` cd ${projectName2}`);
|
|
94
|
+
logger.info(" npm install");
|
|
95
|
+
logger.info(" npm run dev");
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// src/index.ts
|
|
99
|
+
var [, , projectName] = process.argv;
|
|
100
|
+
async function bootstrap() {
|
|
101
|
+
try {
|
|
102
|
+
await createProject(projectName);
|
|
103
|
+
return;
|
|
104
|
+
} catch (error) {
|
|
105
|
+
logger.error("Failed to execute command");
|
|
106
|
+
if (error instanceof Error) {
|
|
107
|
+
logger.error(error.message);
|
|
108
|
+
}
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
bootstrap();
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-elseware-app",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI to scaffold Elseware NodeJS applications",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"private": false,
|
|
7
|
+
"bin": {
|
|
8
|
+
"create-elseware-app": "bin/elseware.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"bin",
|
|
13
|
+
"templates"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"clean": "rm -rf dist",
|
|
17
|
+
"build": "tsup src/index.ts --format esm --dts",
|
|
18
|
+
"dev": "tsx src/index.ts",
|
|
19
|
+
"prepublishOnly": "npm run build",
|
|
20
|
+
"release": "npm publish --access public"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/elsewaretechnologies/elseware-npm-cli.git"
|
|
25
|
+
},
|
|
26
|
+
"author": "Dhanushka Sandakelum",
|
|
27
|
+
"license": "ISC",
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/elsewaretechnologies/elseware-npm-cli/issues"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/elsewaretechnologies/elseware-npm-cli#readme",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"inquirer": "^12.11.1"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^25.0.3",
|
|
37
|
+
"tsup": "^8.0.0",
|
|
38
|
+
"tsx": "^4.19.0",
|
|
39
|
+
"typescript": "^5.9.0"
|
|
40
|
+
}
|
|
41
|
+
}
|