create-fer 0.1.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 +55 -0
- package/bin/cli.js +105 -0
- package/package.json +32 -0
- package/template/index.js +2 -0
- package/template/package.json +11 -0
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# create-fer
|
|
2
|
+
|
|
3
|
+
CLI tạo project từ thư mục `template/` (đóng gói sẵn trong package).
|
|
4
|
+
|
|
5
|
+
## Cấu trúc
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
template/ <-- Nơi chứa toàn bộ source code mẫu
|
|
9
|
+
bin/
|
|
10
|
+
cli.js <-- File thực thi chính khi chạy lệnh
|
|
11
|
+
package.json
|
|
12
|
+
README.md
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Dùng thử local (trong repo)
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
node bin/cli.js my-app
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Dùng qua npx (sau khi publish)
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx create-fer my-app
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Cấu hình quan trọng trong package.json
|
|
28
|
+
|
|
29
|
+
- Trường `bin` để ánh xạ command:
|
|
30
|
+
- `create-fer` -> `bin/cli.js`
|
|
31
|
+
- Trường `files` để đảm bảo npm publish mang theo `template/`, `bin/`, `README.md`
|
|
32
|
+
|
|
33
|
+
## Publish lên npm
|
|
34
|
+
|
|
35
|
+
1) Đổi tên package (phải unique trên npm):
|
|
36
|
+
- sửa `name` trong `package.json` (ví dụ: `@your-scope/create-fer`)
|
|
37
|
+
|
|
38
|
+
2) Đăng nhập npm:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm login
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
3) Publish:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm publish
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Nếu dùng scope private/public:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npm publish --access public
|
|
54
|
+
```
|
|
55
|
+
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* create-fer - CLI scaffold tool
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx create-fer my-app
|
|
7
|
+
* create-fer my-app
|
|
8
|
+
* create-fer . # scaffold into current directory
|
|
9
|
+
*
|
|
10
|
+
* Flags:
|
|
11
|
+
* --help
|
|
12
|
+
* --force # overwrite existing files
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const fs = require("fs");
|
|
16
|
+
const path = require("path");
|
|
17
|
+
|
|
18
|
+
function printHelp() {
|
|
19
|
+
console.log(`
|
|
20
|
+
create-fer
|
|
21
|
+
|
|
22
|
+
Scaffold a project from the bundled template.
|
|
23
|
+
|
|
24
|
+
Usage:
|
|
25
|
+
create-fer <project-name|.> [--force]
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
npx create-fer my-app
|
|
29
|
+
npx create-fer .
|
|
30
|
+
create-fer my-app --force
|
|
31
|
+
`.trim());
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function parseArgs(argv) {
|
|
35
|
+
const args = argv.slice(2);
|
|
36
|
+
const out = { target: null, force: false, help: false };
|
|
37
|
+
for (const a of args) {
|
|
38
|
+
if (a === "--help" || a === "-h") out.help = true;
|
|
39
|
+
else if (a === "--force" || a === "-f") out.force = true;
|
|
40
|
+
else if (!out.target) out.target = a;
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function ensureDir(dir) {
|
|
46
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function copyDir(srcDir, destDir, force) {
|
|
50
|
+
ensureDir(destDir);
|
|
51
|
+
const entries = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
52
|
+
for (const e of entries) {
|
|
53
|
+
const src = path.join(srcDir, e.name);
|
|
54
|
+
const dest = path.join(destDir, e.name);
|
|
55
|
+
if (e.isDirectory()) {
|
|
56
|
+
copyDir(src, dest, force);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (fs.existsSync(dest) && !force) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
`File exists: ${path.relative(process.cwd(), dest)} (use --force to overwrite)`
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
ensureDir(path.dirname(dest));
|
|
65
|
+
fs.copyFileSync(src, dest);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function main() {
|
|
70
|
+
const { target, force, help } = parseArgs(process.argv);
|
|
71
|
+
if (help) {
|
|
72
|
+
printHelp();
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!target) {
|
|
77
|
+
printHelp();
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const templateDir = path.resolve(__dirname, "..", "template");
|
|
82
|
+
if (!fs.existsSync(templateDir)) {
|
|
83
|
+
console.error("Missing template directory:", templateDir);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const destDir =
|
|
88
|
+
target === "." ? process.cwd() : path.resolve(process.cwd(), target);
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
copyDir(templateDir, destDir, force);
|
|
92
|
+
console.log("✅ Created project at:", destDir);
|
|
93
|
+
if (target !== ".") {
|
|
94
|
+
console.log(`Next:\n cd ${target}\n npm install\n npm run dev`);
|
|
95
|
+
} else {
|
|
96
|
+
console.log("Next:\n npm install\n npm run dev");
|
|
97
|
+
}
|
|
98
|
+
} catch (err) {
|
|
99
|
+
console.error("❌ Failed:", err && err.message ? err.message : err);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
main();
|
|
105
|
+
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-fer",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Scaffold a FER project from a template",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": ""
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"cli",
|
|
13
|
+
"scaffold",
|
|
14
|
+
"template",
|
|
15
|
+
"create"
|
|
16
|
+
],
|
|
17
|
+
"type": "commonjs",
|
|
18
|
+
"bin": {
|
|
19
|
+
"create-fer": "bin/cli.js"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"bin/",
|
|
23
|
+
"template/",
|
|
24
|
+
"README.md"
|
|
25
|
+
],
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"test": "node bin/cli.js --help"
|
|
31
|
+
}
|
|
32
|
+
}
|