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 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
+ }
@@ -0,0 +1,2 @@
1
+ console.log("Hello from FER template!");
2
+
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "fer-app",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "node index.js",
8
+ "start": "node index.js"
9
+ }
10
+ }
11
+