cf-yoyo 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.
Files changed (141) hide show
  1. package/.eslintrc.json +28 -0
  2. package/.github/workflows/ci.yml +96 -0
  3. package/.prettierrc.json +10 -0
  4. package/CHANGELOG.md +55 -0
  5. package/README.md +138 -0
  6. package/__tests__/cli-e2e.test.ts +145 -0
  7. package/__tests__/config.test.ts +268 -0
  8. package/__tests__/filesystem.test.ts +453 -0
  9. package/__tests__/logger.test.ts +274 -0
  10. package/__tests__/template-engine.test.ts +450 -0
  11. package/__tests__/types.test.ts +25 -0
  12. package/deep_todos.md +766 -0
  13. package/dist/cli/commands/create.d.ts +26 -0
  14. package/dist/cli/commands/create.d.ts.map +1 -0
  15. package/dist/cli/commands/create.js +308 -0
  16. package/dist/cli/commands/create.js.map +1 -0
  17. package/dist/cli/commands/git.d.ts +10 -0
  18. package/dist/cli/commands/git.d.ts.map +1 -0
  19. package/dist/cli/commands/git.js +887 -0
  20. package/dist/cli/commands/git.js.map +1 -0
  21. package/dist/cli/commands/list.d.ts +10 -0
  22. package/dist/cli/commands/list.d.ts.map +1 -0
  23. package/dist/cli/commands/list.js +90 -0
  24. package/dist/cli/commands/list.js.map +1 -0
  25. package/dist/cli/index.d.ts +15 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +62 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/core/config.d.ts +35 -0
  30. package/dist/core/config.d.ts.map +1 -0
  31. package/dist/core/config.js +260 -0
  32. package/dist/core/config.js.map +1 -0
  33. package/dist/core/filesystem.d.ts +84 -0
  34. package/dist/core/filesystem.d.ts.map +1 -0
  35. package/dist/core/filesystem.js +417 -0
  36. package/dist/core/filesystem.js.map +1 -0
  37. package/dist/core/git-token.d.ts +81 -0
  38. package/dist/core/git-token.d.ts.map +1 -0
  39. package/dist/core/git-token.js +244 -0
  40. package/dist/core/git-token.js.map +1 -0
  41. package/dist/core/git.d.ts +70 -0
  42. package/dist/core/git.d.ts.map +1 -0
  43. package/dist/core/git.js +367 -0
  44. package/dist/core/git.js.map +1 -0
  45. package/dist/core/prompt.d.ts +28 -0
  46. package/dist/core/prompt.d.ts.map +1 -0
  47. package/dist/core/prompt.js +253 -0
  48. package/dist/core/prompt.js.map +1 -0
  49. package/dist/core/template-engine.d.ts +52 -0
  50. package/dist/core/template-engine.d.ts.map +1 -0
  51. package/dist/core/template-engine.js +308 -0
  52. package/dist/core/template-engine.js.map +1 -0
  53. package/dist/core/template-manager.d.ts +54 -0
  54. package/dist/core/template-manager.d.ts.map +1 -0
  55. package/dist/core/template-manager.js +330 -0
  56. package/dist/core/template-manager.js.map +1 -0
  57. package/dist/index.d.ts +12 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +19 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/types/index.d.ts +244 -0
  62. package/dist/types/index.d.ts.map +1 -0
  63. package/dist/types/index.js +51 -0
  64. package/dist/types/index.js.map +1 -0
  65. package/dist/utils/logger.d.ts +68 -0
  66. package/dist/utils/logger.d.ts.map +1 -0
  67. package/dist/utils/logger.js +140 -0
  68. package/dist/utils/logger.js.map +1 -0
  69. package/memory.md +241 -0
  70. package/need-debug.md +395 -0
  71. package/package.json +42 -0
  72. package/src/cli/commands/create.ts +326 -0
  73. package/src/cli/commands/git.ts +1001 -0
  74. package/src/cli/commands/list.ts +97 -0
  75. package/src/cli/index.ts +71 -0
  76. package/src/core/config.ts +262 -0
  77. package/src/core/filesystem.ts +408 -0
  78. package/src/core/git-token.ts +248 -0
  79. package/src/core/git.ts +384 -0
  80. package/src/core/prompt.ts +345 -0
  81. package/src/core/template-engine.ts +324 -0
  82. package/src/core/template-manager.ts +338 -0
  83. package/src/index.ts +19 -0
  84. package/src/types/index.ts +259 -0
  85. package/src/utils/logger.ts +150 -0
  86. package/templates/pages/basic/README.md.mustache +63 -0
  87. package/templates/pages/basic/package.json.mustache +23 -0
  88. package/templates/pages/basic/public/css/style.css +199 -0
  89. package/templates/pages/basic/public/index.html.mustache +72 -0
  90. package/templates/pages/basic/public/js/main.js +103 -0
  91. package/templates/pages/basic/template.json +38 -0
  92. package/templates/pages/basic/tsconfig.json +21 -0
  93. package/templates/pages/basic/wrangler.toml.mustache +14 -0
  94. package/templates/pages/basic-js/README.md.mustache +62 -0
  95. package/templates/pages/basic-js/package.json.mustache +25 -0
  96. package/templates/pages/basic-js/public/css/style.css +212 -0
  97. package/templates/pages/basic-js/public/index.html.mustache +53 -0
  98. package/templates/pages/basic-js/public/js/main.js +134 -0
  99. package/templates/pages/basic-js/template.json +35 -0
  100. package/templates/pages/basic-js/wrangler.toml.mustache +14 -0
  101. package/templates/pages/react/README.md.mustache +97 -0
  102. package/templates/pages/react/index.html.mustache +14 -0
  103. package/templates/pages/react/package.json.mustache +34 -0
  104. package/templates/pages/react/src/App.css +168 -0
  105. package/templates/pages/react/src/App.tsx.mustache +62 -0
  106. package/templates/pages/react/src/index.css +53 -0
  107. package/templates/pages/react/src/main.tsx.mustache +10 -0
  108. package/templates/pages/react/src/vite-env.d.ts +1 -0
  109. package/templates/pages/react/template.json +54 -0
  110. package/templates/pages/react/tsconfig.json +21 -0
  111. package/templates/pages/react/tsconfig.node.json +10 -0
  112. package/templates/pages/react/vite.config.ts +16 -0
  113. package/templates/worker/basic/README.md.mustache +56 -0
  114. package/templates/worker/basic/package.json.mustache +29 -0
  115. package/templates/worker/basic/src/index.ts.mustache +125 -0
  116. package/templates/worker/basic/template.json +30 -0
  117. package/templates/worker/basic/tsconfig.json +24 -0
  118. package/templates/worker/basic/wrangler.toml.mustache +33 -0
  119. package/templates/worker/basic-js/README.md.mustache +55 -0
  120. package/templates/worker/basic-js/package.json.mustache +25 -0
  121. package/templates/worker/basic-js/src/index.js.mustache +146 -0
  122. package/templates/worker/basic-js/template.json +27 -0
  123. package/templates/worker/basic-js/wrangler.toml.mustache +33 -0
  124. package/templates/worker/hono/README.md.mustache +79 -0
  125. package/templates/worker/hono/package.json.mustache +33 -0
  126. package/templates/worker/hono/src/index.ts.mustache +64 -0
  127. package/templates/worker/hono/src/routes/index.ts.mustache +165 -0
  128. package/templates/worker/hono/template.json +34 -0
  129. package/templates/worker/hono/tsconfig.json +24 -0
  130. package/templates/worker/hono/wrangler.toml.mustache +36 -0
  131. package/templates/worker/hono-js/README.md.mustache +67 -0
  132. package/templates/worker/hono-js/package.json.mustache +29 -0
  133. package/templates/worker/hono-js/src/index.js.mustache +55 -0
  134. package/templates/worker/hono-js/src/routes/index.js.mustache +127 -0
  135. package/templates/worker/hono-js/template.json +31 -0
  136. package/templates/worker/hono-js/wrangler.toml.mustache +36 -0
  137. package/thoughts/ledgers/CONTINUITY_ses_287e.md +74 -0
  138. package/thoughts/ledgers/CONTINUITY_ses_28b5.md +85 -0
  139. package/tsconfig.json +30 -0
  140. package/vitest.config.ts +20 -0
  141. package//351/240/205/347/233/256/350/241/250.md +140 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 互動式問答模組
3
+ * 使用 Inquirer.js 實現用戶輸入收集與驗證
4
+ */
5
+ import { ProjectType, UserInput } from '../types';
6
+ /**
7
+ * 驗證專案名稱
8
+ * 規則:
9
+ * - 只能包含小寫字母、數字、連字號、底線
10
+ * - 不能以大寫字母或數字開頭
11
+ * - 長度 1-214 個字元
12
+ */
13
+ declare function validateProjectName(name: string): boolean | string;
14
+ /**
15
+ * 執行互動式問答流程
16
+ * 收集所有必要的用戶輸入
17
+ */
18
+ export declare function runPrompts(initialName?: string): Promise<UserInput>;
19
+ /**
20
+ * 僅收集專案名稱
21
+ */
22
+ export declare function promptForProjectName(): Promise<string>;
23
+ /**
24
+ * 僅選擇專案類型
25
+ */
26
+ export declare function promptForProjectType(): Promise<ProjectType>;
27
+ export { validateProjectName };
28
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAgB,SAAS,EAAY,MAAM,UAAU,CAAC;AA8E1E;;;;;;GAMG;AACH,iBAAS,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CA8B3D;AAuID;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAwDzE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAW5D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAKjE;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ /**
3
+ * 互動式問答模組
4
+ * 使用 Inquirer.js 實現用戶輸入收集與驗證
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.runPrompts = runPrompts;
11
+ exports.promptForProjectName = promptForProjectName;
12
+ exports.promptForProjectType = promptForProjectType;
13
+ exports.validateProjectName = validateProjectName;
14
+ const inquirer_1 = __importDefault(require("inquirer"));
15
+ const types_1 = require("../types");
16
+ /**
17
+ * 驗證專案名稱
18
+ * 規則:
19
+ * - 只能包含小寫字母、數字、連字號、底線
20
+ * - 不能以大寫字母或數字開頭
21
+ * - 長度 1-214 個字元
22
+ */
23
+ function validateProjectName(name) {
24
+ if (!name || name.trim() === '') {
25
+ return '專案名稱不能為空';
26
+ }
27
+ const trimmedName = name.trim();
28
+ // 檢查長度
29
+ if (trimmedName.length > 214) {
30
+ return '專案名稱不能超過 214 個字元';
31
+ }
32
+ // 檢查字元
33
+ const validCharsRegex = /^[a-z0-9_.-]+$/;
34
+ if (!validCharsRegex.test(trimmedName)) {
35
+ return '專案名稱只能包含小寫字母、數字、連字號(-)、點(.)和底線(_)';
36
+ }
37
+ // 檢查開頭
38
+ if (/^[0-9A-Z]/.test(trimmedName)) {
39
+ return '專案名稱不能以大寫字母或數字開頭';
40
+ }
41
+ // 檢查是否為保留名稱
42
+ const reservedNames = ['node_modules', '__proto__', 'node', 'npm', 'pnpm', 'yarn'];
43
+ if (reservedNames.includes(trimmedName.toLowerCase())) {
44
+ return `「${trimmedName}」是保留名稱,請改用其他名稱`;
45
+ }
46
+ return true;
47
+ }
48
+ /**
49
+ * 獲取語言選擇問題
50
+ */
51
+ function getLanguageQuestion() {
52
+ return {
53
+ type: 'select',
54
+ name: 'language',
55
+ message: '請選擇程式語言:',
56
+ choices: [
57
+ { name: '🔷 TypeScript - 帶有型別安全的開發體驗', value: types_1.Language.TYPESCRIPT },
58
+ { name: '🟨 JavaScript - 純 JavaScript 開發', value: types_1.Language.JAVASCRIPT },
59
+ ],
60
+ default: 0,
61
+ };
62
+ }
63
+ /**
64
+ * 獲取專案類型選擇問題
65
+ */
66
+ function getProjectTypeQuestion() {
67
+ return {
68
+ type: 'select',
69
+ name: 'projectType',
70
+ message: '請選擇專案類型:',
71
+ choices: [
72
+ {
73
+ name: '☁️ Worker - Cloudflare Worker 基礎模板',
74
+ value: types_1.ProjectType.WORKER,
75
+ },
76
+ {
77
+ name: '📄 Pages - Cloudflare Pages 靜態網站',
78
+ value: types_1.ProjectType.PAGES,
79
+ },
80
+ {
81
+ name: '🗄️ D1 - 包含 D1 資料庫的 Worker',
82
+ value: types_1.ProjectType.D1,
83
+ },
84
+ {
85
+ name: '📦 KV - 包含 KV 存儲的 Worker',
86
+ value: types_1.ProjectType.KV,
87
+ },
88
+ {
89
+ name: '🪣 R2 - 包含 R2 存儲的 Worker',
90
+ value: types_1.ProjectType.R2,
91
+ },
92
+ ],
93
+ default: 0,
94
+ };
95
+ }
96
+ /**
97
+ * 獲取模板選擇問題
98
+ * 根據專案類型和語言動態調整可選模板
99
+ */
100
+ function getTemplateQuestion(projectType, language) {
101
+ // 根據專案類型和語言獲取可用模板
102
+ const getTemplateChoices = () => {
103
+ // JavaScript 語言支援的模板
104
+ if (language === types_1.Language.JAVASCRIPT) {
105
+ switch (projectType) {
106
+ case types_1.ProjectType.WORKER:
107
+ return [
108
+ { name: '🔹 Basic - 基礎 Worker 模板', value: types_1.TemplateType.BASIC },
109
+ { name: '🔸 Hono - Hono 框架模板', value: types_1.TemplateType.HONO },
110
+ ];
111
+ case types_1.ProjectType.PAGES:
112
+ return [{ name: '📄 Static - 靜態網站模板', value: types_1.TemplateType.STATIC }];
113
+ case types_1.ProjectType.D1:
114
+ case types_1.ProjectType.KV:
115
+ case types_1.ProjectType.R2:
116
+ return [{ name: '🔹 Basic - 基礎模板', value: types_1.TemplateType.BASIC }];
117
+ default:
118
+ return [{ name: '🔹 Basic - 基礎模板', value: types_1.TemplateType.BASIC }];
119
+ }
120
+ }
121
+ // TypeScript 語言支援的模板(原始完整支援)
122
+ switch (projectType) {
123
+ case types_1.ProjectType.WORKER:
124
+ return [
125
+ { name: '🔹 Basic - 基礎 Worker 模板', value: types_1.TemplateType.BASIC },
126
+ { name: '🔸 Hono - Hono 框架模板', value: types_1.TemplateType.HONO },
127
+ { name: '🔹 Itty Router - itty-router 模板', value: types_1.TemplateType.ITTY_ROUTER },
128
+ ];
129
+ case types_1.ProjectType.PAGES:
130
+ return [
131
+ { name: '📄 Static - 靜態網站模板', value: types_1.TemplateType.STATIC },
132
+ { name: '⚛️ React - React 模板', value: types_1.TemplateType.REACT },
133
+ { name: '🔷 Vue - Vue 模板', value: types_1.TemplateType.VUE },
134
+ { name: '⬡ Next.js - Next.js 模板', value: types_1.TemplateType.NEXTJS },
135
+ ];
136
+ case types_1.ProjectType.D1:
137
+ case types_1.ProjectType.KV:
138
+ case types_1.ProjectType.R2:
139
+ return [{ name: '🔹 Basic - 基礎模板', value: types_1.TemplateType.BASIC }];
140
+ default:
141
+ return [{ name: '🔹 Basic - 基礎模板', value: types_1.TemplateType.BASIC }];
142
+ }
143
+ };
144
+ return {
145
+ type: 'select',
146
+ name: 'template',
147
+ message: '請選擇模板:',
148
+ choices: getTemplateChoices(),
149
+ default: 0,
150
+ };
151
+ }
152
+ /**
153
+ * 獲取 Git 初始化問題
154
+ */
155
+ function getGitInitQuestion() {
156
+ return {
157
+ type: 'confirm',
158
+ name: 'initGit',
159
+ message: '是否初始化 Git 倉庫?',
160
+ default: true,
161
+ };
162
+ }
163
+ /**
164
+ * 獲取依賴安裝問題
165
+ */
166
+ function getInstallDepsQuestion() {
167
+ return {
168
+ type: 'confirm',
169
+ name: 'installDeps',
170
+ message: '是否立即安裝依賴?',
171
+ default: true,
172
+ };
173
+ }
174
+ /**
175
+ * 執行互動式問答流程
176
+ * 收集所有必要的用戶輸入
177
+ */
178
+ async function runPrompts(initialName) {
179
+ const result = {};
180
+ // 專案名稱(如果有提供則跳過)
181
+ if (!initialName) {
182
+ const { projectName } = await inquirer_1.default.prompt([
183
+ {
184
+ type: 'input',
185
+ name: 'projectName',
186
+ message: '請輸入專案名稱:',
187
+ validate: validateProjectName,
188
+ filter: (input) => input.trim(),
189
+ },
190
+ ]);
191
+ result.projectName = projectName;
192
+ }
193
+ else {
194
+ // 驗證提供的專案名稱
195
+ const validation = validateProjectName(initialName);
196
+ if (validation !== true) {
197
+ console.error(`❌ 無效的專案名稱:${validation}`);
198
+ process.exit(1);
199
+ }
200
+ result.projectName = initialName;
201
+ }
202
+ // 語言選擇
203
+ const { language } = await inquirer_1.default.prompt([
204
+ getLanguageQuestion(),
205
+ ]);
206
+ result.language = language;
207
+ // 專案類型選擇
208
+ const { projectType } = await inquirer_1.default.prompt([
209
+ getProjectTypeQuestion(),
210
+ ]);
211
+ result.projectType = projectType;
212
+ // 模板選擇(根據語言和專案類型過濾)
213
+ const { template } = await inquirer_1.default.prompt([
214
+ getTemplateQuestion(projectType, language),
215
+ ]);
216
+ result.template = template;
217
+ // Git 初始化
218
+ const { initGit } = await inquirer_1.default.prompt([
219
+ getGitInitQuestion(),
220
+ ]);
221
+ result.initGit = initGit;
222
+ // 依賴安裝
223
+ const { installDeps } = await inquirer_1.default.prompt([
224
+ getInstallDepsQuestion(),
225
+ ]);
226
+ result.installDeps = installDeps;
227
+ return result;
228
+ }
229
+ /**
230
+ * 僅收集專案名稱
231
+ */
232
+ async function promptForProjectName() {
233
+ const { projectName } = await inquirer_1.default.prompt([
234
+ {
235
+ type: 'input',
236
+ name: 'projectName',
237
+ message: '請輸入專案名稱:',
238
+ validate: validateProjectName,
239
+ filter: (input) => input.trim(),
240
+ },
241
+ ]);
242
+ return projectName;
243
+ }
244
+ /**
245
+ * 僅選擇專案類型
246
+ */
247
+ async function promptForProjectType() {
248
+ const { projectType } = await inquirer_1.default.prompt([
249
+ getProjectTypeQuestion(),
250
+ ]);
251
+ return projectType;
252
+ }
253
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * 模板引擎模組
3
+ * 負責模板的渲染、變數替換與條件渲染
4
+ *
5
+ * 使用 Mustache 語法:
6
+ * - {{variable}} - 變數替換
7
+ * - {{#condition}}...{{/condition}} - 條件渲染(條件為 truthy 時顯示)
8
+ * - {{^condition}}...{{/condition}} - 反向條件渲染(條件為 falsy 時顯示)
9
+ * - {{!comment}} - 註解(不輸出)
10
+ */
11
+ import { TemplateContext, TemplateConfig, TemplateRenderResult, RenderOptions } from '../types';
12
+ /**
13
+ * 渲染模板字符串
14
+ * 支援變數替換與條件渲染
15
+ */
16
+ export declare function renderTemplate(template: string, context: TemplateContext, options?: RenderOptions): string;
17
+ /**
18
+ * 處理檔案名稱中的變數替換
19
+ * 將 __variable__ 替換為實際值
20
+ */
21
+ export declare function renderFileName(fileName: string, context: TemplateContext): string;
22
+ /**
23
+ * 從模板配置生成完整的渲染結果
24
+ */
25
+ export declare function renderTemplateToFiles(templateConfig: TemplateConfig, targetDir: string, context: TemplateContext): Promise<TemplateRenderResult>;
26
+ /**
27
+ * 驗證模板上下文
28
+ * 檢查是否包含所有必需的變數
29
+ */
30
+ export declare function validateContext(context: TemplateContext, requiredVars: string[]): {
31
+ valid: boolean;
32
+ missing: string[];
33
+ };
34
+ /**
35
+ * 生成預設的模板上下文
36
+ * 基於專案配置生成預設值
37
+ */
38
+ export declare function generateDefaultContext(projectConfig: {
39
+ projectName: string;
40
+ projectType: string;
41
+ template: string;
42
+ language?: string;
43
+ }): TemplateContext;
44
+ declare const _default: {
45
+ renderTemplate: typeof renderTemplate;
46
+ renderFileName: typeof renderFileName;
47
+ renderTemplateToFiles: typeof renderTemplateToFiles;
48
+ validateContext: typeof validateContext;
49
+ generateDefaultContext: typeof generateDefaultContext;
50
+ };
51
+ export default _default;
52
+ //# sourceMappingURL=template-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.d.ts","sourceRoot":"","sources":["../../src/core/template-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,eAAe,EACf,cAAc,EAEd,oBAAoB,EACpB,aAAa,EACd,MAAM,UAAU,CAAC;AAgBlB;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CA8BR;AAqGD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAKjF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,oBAAoB,CAAC,CA6D/B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,EAAE,GACrB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAcvC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,eAAe,CA6BlB;;;;;;;;AAED,wBAME"}
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ /**
3
+ * 模板引擎模組
4
+ * 負責模板的渲染、變數替換與條件渲染
5
+ *
6
+ * 使用 Mustache 語法:
7
+ * - {{variable}} - 變數替換
8
+ * - {{#condition}}...{{/condition}} - 條件渲染(條件為 truthy 時顯示)
9
+ * - {{^condition}}...{{/condition}} - 反向條件渲染(條件為 falsy 時顯示)
10
+ * - {{!comment}} - 註解(不輸出)
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.renderTemplate = renderTemplate;
47
+ exports.renderFileName = renderFileName;
48
+ exports.renderTemplateToFiles = renderTemplateToFiles;
49
+ exports.validateContext = validateContext;
50
+ exports.generateDefaultContext = generateDefaultContext;
51
+ const path = __importStar(require("path"));
52
+ const filesystem_1 = require("./filesystem");
53
+ const logger_1 = require("../utils/logger");
54
+ /**
55
+ * 變數替換正則表達式
56
+ * 支援:{{variable}}、{{#condition}}、{{^condition}}、{{!comment}}
57
+ */
58
+ const VARIABLE_REGEX = /\{\{([#^!]?)\s*([a-zA-Z_$][a-zA-Z0-9_$]*)\s*\}\}/g;
59
+ /**
60
+ * 檔案名稱中的變數替換正則
61
+ * 例如:__projectName__.ts
62
+ */
63
+ const FILENAME_VARIABLE_REGEX = /__([a-zA-Z_$][a-zA-Z0-9_$]*)__/g;
64
+ /**
65
+ * 渲染模板字符串
66
+ * 支援變數替換與條件渲染
67
+ */
68
+ function renderTemplate(template, context, options) {
69
+ const { escapeHtml = true } = options || {};
70
+ if (!template) {
71
+ return '';
72
+ }
73
+ let result = template;
74
+ // 處理條件區塊(支援巢狀)
75
+ // 先處理正向條件 {{#condition}}content{{/condition}}
76
+ result = renderSections(result, context, true);
77
+ // 處理反向條件 {{^condition}}content{{/condition}}
78
+ result = renderSections(result, context, false);
79
+ // 處理普通變數替換
80
+ result = result.replace(VARIABLE_REGEX, (match, prefix, name) => {
81
+ // 跳過條件和註解前綴
82
+ if (prefix === '#' || prefix === '^' || prefix === '!') {
83
+ return match;
84
+ }
85
+ const value = getNestedValue(context, name);
86
+ const stringValue = value !== undefined && value !== null ? String(value) : '';
87
+ return escapeHtml ? escapeHtmlEntities(stringValue) : stringValue;
88
+ });
89
+ return result;
90
+ }
91
+ /**
92
+ * 渲染條件區塊
93
+ * @param isSection - true 表示正向條件({{#var}}),false 表示反向條件({{^var}})
94
+ */
95
+ function renderSections(template, context, isSection) {
96
+ let result = template;
97
+ const regex = isSection
98
+ ? /\{\{#\s*([a-zA-Z_$][a-zA-Z0-9_$]*)\s*\}\}([\s\S]*?)\{\{\/\s*\1\s*\}\}/g
99
+ : /\{\{\^\s*([a-zA-Z_$][a-zA-Z0-9_$]*)\s*\}\}([\s\S]*?)\{\{\/\s*\1\s*\}\}/g;
100
+ // 需要重複處理,因為可能存在巢狀
101
+ let lastResult = '';
102
+ let iterations = 0;
103
+ const MAX_ITERATIONS = 100; // 防止無限循環
104
+ while (result !== lastResult && iterations < MAX_ITERATIONS) {
105
+ lastResult = result;
106
+ iterations++;
107
+ result = result.replace(regex, (match, name, content) => {
108
+ const value = getNestedValue(context, name);
109
+ const isTruthy = isTruthyValue(value);
110
+ if (isSection) {
111
+ // 正向條件:值為 truthy 時顯示內容
112
+ return isTruthy ? content : '';
113
+ }
114
+ else {
115
+ // 反向條件:值為 falsy 時顯示內容
116
+ return !isTruthy ? content : '';
117
+ }
118
+ });
119
+ }
120
+ return result;
121
+ }
122
+ /**
123
+ * 檢查值是否為 truthy
124
+ * 陣列會檢查長度,物件會檢查是否有鍵
125
+ */
126
+ function isTruthyValue(value) {
127
+ if (value === undefined || value === null) {
128
+ return false;
129
+ }
130
+ if (typeof value === 'boolean') {
131
+ return value;
132
+ }
133
+ if (typeof value === 'number') {
134
+ return value !== 0;
135
+ }
136
+ if (typeof value === 'string') {
137
+ return value.length > 0;
138
+ }
139
+ if (Array.isArray(value)) {
140
+ return value.length > 0;
141
+ }
142
+ if (typeof value === 'object' && value !== null) {
143
+ return Object.keys(value).length > 0;
144
+ }
145
+ return Boolean(value);
146
+ }
147
+ /**
148
+ * 獲取巢狀物件值
149
+ * 支援點號表示法,例如:user.name
150
+ */
151
+ function getNestedValue(obj, path) {
152
+ const keys = path.split('.');
153
+ let value = obj;
154
+ for (const key of keys) {
155
+ if (value === null || value === undefined) {
156
+ return undefined;
157
+ }
158
+ if (typeof value === 'object') {
159
+ value = value[key];
160
+ }
161
+ else {
162
+ return undefined;
163
+ }
164
+ }
165
+ return value;
166
+ }
167
+ /**
168
+ * 轉義 HTML 實體
169
+ */
170
+ function escapeHtmlEntities(text) {
171
+ const htmlEntities = {
172
+ '&': '&amp;',
173
+ '<': '&lt;',
174
+ '>': '&gt;',
175
+ '"': '&quot;',
176
+ "'": '&#x27;',
177
+ };
178
+ return text.replace(/[&<>"']/g, (char) => htmlEntities[char] || char);
179
+ }
180
+ /**
181
+ * 處理檔案名稱中的變數替換
182
+ * 將 __variable__ 替換為實際值
183
+ */
184
+ function renderFileName(fileName, context) {
185
+ return fileName.replace(FILENAME_VARIABLE_REGEX, (match, name) => {
186
+ const value = getNestedValue(context, name);
187
+ return value !== undefined && value !== null ? String(value) : match;
188
+ });
189
+ }
190
+ /**
191
+ * 從模板配置生成完整的渲染結果
192
+ */
193
+ async function renderTemplateToFiles(templateConfig, targetDir, context) {
194
+ const result = {
195
+ success: true,
196
+ files: [],
197
+ errors: [],
198
+ };
199
+ logger_1.logger.debug(`開始渲染模板:${templateConfig.name}`);
200
+ logger_1.logger.debug(`目標目錄:${targetDir}`);
201
+ logger_1.logger.debug(`渲染上下文:${JSON.stringify(context, null, 2)}`);
202
+ for (const file of templateConfig.files) {
203
+ try {
204
+ // 渲染目標路徑
205
+ const renderedPath = renderFileName(file.targetPath, context);
206
+ const fullTargetPath = path.join(targetDir, renderedPath);
207
+ // 確保目標目錄存在
208
+ const targetFileDir = path.dirname(fullTargetPath);
209
+ (0, filesystem_1.createDirectory)(targetFileDir);
210
+ let content;
211
+ if (file.sourcePath) {
212
+ // 從檔案讀取模板
213
+ const templateContent = (0, filesystem_1.readFile)(file.sourcePath);
214
+ if (templateContent === null) {
215
+ throw new Error(`無法讀取模板檔案:${file.sourcePath}`);
216
+ }
217
+ content = renderTemplate(templateContent, context, {
218
+ escapeHtml: false,
219
+ });
220
+ }
221
+ else if (file.content) {
222
+ // 使用內嵌內容
223
+ content = renderTemplate(file.content, context, { escapeHtml: false });
224
+ }
225
+ else {
226
+ throw new Error(`模板檔案 ${file.targetPath} 沒有來源內容`);
227
+ }
228
+ // 寫入檔案
229
+ if ((0, filesystem_1.writeFile)(fullTargetPath, content, { overwrite: true })) {
230
+ result.files.push(fullTargetPath);
231
+ logger_1.logger.debug(`已生成檔案:${fullTargetPath}`);
232
+ }
233
+ else {
234
+ throw new Error(`無法寫入檔案:${fullTargetPath}`);
235
+ }
236
+ }
237
+ catch (error) {
238
+ const errorMessage = error instanceof Error ? error.message : String(error);
239
+ result.errors.push({
240
+ file: file.targetPath,
241
+ error: errorMessage,
242
+ });
243
+ logger_1.logger.error(`渲染檔案失敗 ${file.targetPath}:${errorMessage}`);
244
+ }
245
+ }
246
+ if (result.errors.length > 0 && result.files.length === 0) {
247
+ result.success = false;
248
+ }
249
+ return result;
250
+ }
251
+ /**
252
+ * 驗證模板上下文
253
+ * 檢查是否包含所有必需的變數
254
+ */
255
+ function validateContext(context, requiredVars) {
256
+ const missing = [];
257
+ for (const varName of requiredVars) {
258
+ const value = getNestedValue(context, varName);
259
+ if (value === undefined || value === null) {
260
+ missing.push(varName);
261
+ }
262
+ }
263
+ return {
264
+ valid: missing.length === 0,
265
+ missing,
266
+ };
267
+ }
268
+ /**
269
+ * 生成預設的模板上下文
270
+ * 基於專案配置生成預設值
271
+ */
272
+ function generateDefaultContext(projectConfig) {
273
+ const now = new Date();
274
+ return {
275
+ projectName: projectConfig.projectName,
276
+ projectType: projectConfig.projectType,
277
+ template: projectConfig.template,
278
+ // 基本資訊
279
+ author: '', // 可由用戶提供或從 git 配置讀取
280
+ email: '',
281
+ description: `${projectConfig.projectName} - Cloudflare ${projectConfig.projectType} 專案`,
282
+ version: '1.0.0',
283
+ license: 'MIT',
284
+ // 時間戳
285
+ year: now.getFullYear(),
286
+ date: now.toISOString().split('T')[0] || '',
287
+ timestamp: now.toISOString(),
288
+ // Cloudflare 相關
289
+ isWorker: projectConfig.projectType === 'worker' || projectConfig.projectType === 'hono',
290
+ isPages: projectConfig.projectType === 'pages',
291
+ isD1: projectConfig.projectType === 'd1',
292
+ isKV: projectConfig.projectType === 'kv',
293
+ isR2: projectConfig.projectType === 'r2',
294
+ // 框架相關
295
+ isHono: projectConfig.template === 'hono',
296
+ isReact: projectConfig.template === 'react',
297
+ isVue: projectConfig.template === 'vue',
298
+ isNextjs: projectConfig.template === 'nextjs',
299
+ };
300
+ }
301
+ exports.default = {
302
+ renderTemplate,
303
+ renderFileName,
304
+ renderTemplateToFiles,
305
+ validateContext,
306
+ generateDefaultContext,
307
+ };
308
+ //# sourceMappingURL=template-engine.js.map