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.
- package/.eslintrc.json +28 -0
- package/.github/workflows/ci.yml +96 -0
- package/.prettierrc.json +10 -0
- package/CHANGELOG.md +55 -0
- package/README.md +138 -0
- package/__tests__/cli-e2e.test.ts +145 -0
- package/__tests__/config.test.ts +268 -0
- package/__tests__/filesystem.test.ts +453 -0
- package/__tests__/logger.test.ts +274 -0
- package/__tests__/template-engine.test.ts +450 -0
- package/__tests__/types.test.ts +25 -0
- package/deep_todos.md +766 -0
- package/dist/cli/commands/create.d.ts +26 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +308 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/git.d.ts +10 -0
- package/dist/cli/commands/git.d.ts.map +1 -0
- package/dist/cli/commands/git.js +887 -0
- package/dist/cli/commands/git.js.map +1 -0
- package/dist/cli/commands/list.d.ts +10 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +90 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/index.d.ts +15 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +62 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config.d.ts +35 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +260 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/filesystem.d.ts +84 -0
- package/dist/core/filesystem.d.ts.map +1 -0
- package/dist/core/filesystem.js +417 -0
- package/dist/core/filesystem.js.map +1 -0
- package/dist/core/git-token.d.ts +81 -0
- package/dist/core/git-token.d.ts.map +1 -0
- package/dist/core/git-token.js +244 -0
- package/dist/core/git-token.js.map +1 -0
- package/dist/core/git.d.ts +70 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +367 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/prompt.d.ts +28 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +253 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/template-engine.d.ts +52 -0
- package/dist/core/template-engine.d.ts.map +1 -0
- package/dist/core/template-engine.js +308 -0
- package/dist/core/template-engine.js.map +1 -0
- package/dist/core/template-manager.d.ts +54 -0
- package/dist/core/template-manager.d.ts.map +1 -0
- package/dist/core/template-manager.js +330 -0
- package/dist/core/template-manager.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +244 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +51 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +68 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +140 -0
- package/dist/utils/logger.js.map +1 -0
- package/memory.md +241 -0
- package/need-debug.md +395 -0
- package/package.json +42 -0
- package/src/cli/commands/create.ts +326 -0
- package/src/cli/commands/git.ts +1001 -0
- package/src/cli/commands/list.ts +97 -0
- package/src/cli/index.ts +71 -0
- package/src/core/config.ts +262 -0
- package/src/core/filesystem.ts +408 -0
- package/src/core/git-token.ts +248 -0
- package/src/core/git.ts +384 -0
- package/src/core/prompt.ts +345 -0
- package/src/core/template-engine.ts +324 -0
- package/src/core/template-manager.ts +338 -0
- package/src/index.ts +19 -0
- package/src/types/index.ts +259 -0
- package/src/utils/logger.ts +150 -0
- package/templates/pages/basic/README.md.mustache +63 -0
- package/templates/pages/basic/package.json.mustache +23 -0
- package/templates/pages/basic/public/css/style.css +199 -0
- package/templates/pages/basic/public/index.html.mustache +72 -0
- package/templates/pages/basic/public/js/main.js +103 -0
- package/templates/pages/basic/template.json +38 -0
- package/templates/pages/basic/tsconfig.json +21 -0
- package/templates/pages/basic/wrangler.toml.mustache +14 -0
- package/templates/pages/basic-js/README.md.mustache +62 -0
- package/templates/pages/basic-js/package.json.mustache +25 -0
- package/templates/pages/basic-js/public/css/style.css +212 -0
- package/templates/pages/basic-js/public/index.html.mustache +53 -0
- package/templates/pages/basic-js/public/js/main.js +134 -0
- package/templates/pages/basic-js/template.json +35 -0
- package/templates/pages/basic-js/wrangler.toml.mustache +14 -0
- package/templates/pages/react/README.md.mustache +97 -0
- package/templates/pages/react/index.html.mustache +14 -0
- package/templates/pages/react/package.json.mustache +34 -0
- package/templates/pages/react/src/App.css +168 -0
- package/templates/pages/react/src/App.tsx.mustache +62 -0
- package/templates/pages/react/src/index.css +53 -0
- package/templates/pages/react/src/main.tsx.mustache +10 -0
- package/templates/pages/react/src/vite-env.d.ts +1 -0
- package/templates/pages/react/template.json +54 -0
- package/templates/pages/react/tsconfig.json +21 -0
- package/templates/pages/react/tsconfig.node.json +10 -0
- package/templates/pages/react/vite.config.ts +16 -0
- package/templates/worker/basic/README.md.mustache +56 -0
- package/templates/worker/basic/package.json.mustache +29 -0
- package/templates/worker/basic/src/index.ts.mustache +125 -0
- package/templates/worker/basic/template.json +30 -0
- package/templates/worker/basic/tsconfig.json +24 -0
- package/templates/worker/basic/wrangler.toml.mustache +33 -0
- package/templates/worker/basic-js/README.md.mustache +55 -0
- package/templates/worker/basic-js/package.json.mustache +25 -0
- package/templates/worker/basic-js/src/index.js.mustache +146 -0
- package/templates/worker/basic-js/template.json +27 -0
- package/templates/worker/basic-js/wrangler.toml.mustache +33 -0
- package/templates/worker/hono/README.md.mustache +79 -0
- package/templates/worker/hono/package.json.mustache +33 -0
- package/templates/worker/hono/src/index.ts.mustache +64 -0
- package/templates/worker/hono/src/routes/index.ts.mustache +165 -0
- package/templates/worker/hono/template.json +34 -0
- package/templates/worker/hono/tsconfig.json +24 -0
- package/templates/worker/hono/wrangler.toml.mustache +36 -0
- package/templates/worker/hono-js/README.md.mustache +67 -0
- package/templates/worker/hono-js/package.json.mustache +29 -0
- package/templates/worker/hono-js/src/index.js.mustache +55 -0
- package/templates/worker/hono-js/src/routes/index.js.mustache +127 -0
- package/templates/worker/hono-js/template.json +31 -0
- package/templates/worker/hono-js/wrangler.toml.mustache +36 -0
- package/thoughts/ledgers/CONTINUITY_ses_287e.md +74 -0
- package/thoughts/ledgers/CONTINUITY_ses_28b5.md +85 -0
- package/tsconfig.json +30 -0
- package/vitest.config.ts +20 -0
- package//351/240/205/347/233/256/350/241/250.md +140 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 檔案系統操作模組
|
|
4
|
+
* 負責目錄創建、檔案寫入、衝突處理
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.directoryExists = directoryExists;
|
|
41
|
+
exports.fileExists = fileExists;
|
|
42
|
+
exports.isEmptyDir = isEmptyDir;
|
|
43
|
+
exports.createDirectory = createDirectory;
|
|
44
|
+
exports.writeFile = writeFile;
|
|
45
|
+
exports.readFile = readFile;
|
|
46
|
+
exports.copyFile = copyFile;
|
|
47
|
+
exports.copyDirectory = copyDirectory;
|
|
48
|
+
exports.deleteFile = deleteFile;
|
|
49
|
+
exports.deleteDirectory = deleteDirectory;
|
|
50
|
+
exports.checkDirectoryConflict = checkDirectoryConflict;
|
|
51
|
+
exports.createProjectStructure = createProjectStructure;
|
|
52
|
+
exports.listDirectory = listDirectory;
|
|
53
|
+
exports.getFileSize = getFileSize;
|
|
54
|
+
exports.getFileModifiedDate = getFileModifiedDate;
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
const logger_1 = require("../utils/logger");
|
|
58
|
+
/**
|
|
59
|
+
* 檢查目錄是否存在
|
|
60
|
+
*/
|
|
61
|
+
function directoryExists(dirPath) {
|
|
62
|
+
try {
|
|
63
|
+
const stats = fs.statSync(dirPath);
|
|
64
|
+
return stats.isDirectory();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 檢查檔案是否存在
|
|
72
|
+
*/
|
|
73
|
+
function fileExists(filePath) {
|
|
74
|
+
try {
|
|
75
|
+
const stats = fs.statSync(filePath);
|
|
76
|
+
return stats.isFile();
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 檢查路徑是否為空目錄
|
|
84
|
+
*/
|
|
85
|
+
function isEmptyDir(dirPath) {
|
|
86
|
+
if (!directoryExists(dirPath)) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const files = fs.readdirSync(dirPath);
|
|
91
|
+
return files.length === 0;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 創建目錄(遞迴創建)
|
|
99
|
+
*/
|
|
100
|
+
function createDirectory(dirPath, options) {
|
|
101
|
+
const { recursive = true } = options || {};
|
|
102
|
+
try {
|
|
103
|
+
fs.mkdirSync(dirPath, { recursive });
|
|
104
|
+
logger_1.logger.debug(`目錄已創建:${dirPath}`);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
109
|
+
logger_1.logger.error(`創建目錄失敗:${message}`);
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 寫入檔案內容
|
|
115
|
+
*/
|
|
116
|
+
function writeFile(filePath, content, options) {
|
|
117
|
+
const { encoding = 'utf-8', overwrite = true } = options || {};
|
|
118
|
+
try {
|
|
119
|
+
// 如果檔案已存在且不允許覆蓋,則抛出錯誤
|
|
120
|
+
if (!overwrite && fileExists(filePath)) {
|
|
121
|
+
throw new Error(`檔案已存在:${filePath}`);
|
|
122
|
+
}
|
|
123
|
+
// 確保父目錄存在
|
|
124
|
+
const dirPath = path.dirname(filePath);
|
|
125
|
+
if (!directoryExists(dirPath)) {
|
|
126
|
+
createDirectory(dirPath, { recursive: true });
|
|
127
|
+
}
|
|
128
|
+
fs.writeFileSync(filePath, content, { encoding });
|
|
129
|
+
logger_1.logger.debug(`檔案已寫入:${filePath}`);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
134
|
+
logger_1.logger.error(`寫入檔案失敗:${message}`);
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 讀取檔案內容
|
|
140
|
+
*/
|
|
141
|
+
function readFile(filePath, options) {
|
|
142
|
+
const { encoding = 'utf-8' } = options || {};
|
|
143
|
+
try {
|
|
144
|
+
const content = fs.readFileSync(filePath, { encoding });
|
|
145
|
+
logger_1.logger.debug(`檔案已讀取:${filePath}`);
|
|
146
|
+
return content;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
150
|
+
logger_1.logger.error(`讀取檔案失敗:${message}`);
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 複製檔案
|
|
156
|
+
*/
|
|
157
|
+
function copyFile(srcPath, destPath, options) {
|
|
158
|
+
const { overwrite = false } = options || {};
|
|
159
|
+
try {
|
|
160
|
+
// 如果目標檔案已存在且不允許覆蓋,則抛出錯誤
|
|
161
|
+
if (!overwrite && fileExists(destPath)) {
|
|
162
|
+
throw new Error(`目標檔案已存在:${destPath}`);
|
|
163
|
+
}
|
|
164
|
+
// 確保目標目錄存在
|
|
165
|
+
const destDir = path.dirname(destPath);
|
|
166
|
+
if (!directoryExists(destDir)) {
|
|
167
|
+
createDirectory(destDir, { recursive: true });
|
|
168
|
+
}
|
|
169
|
+
fs.copyFileSync(srcPath, destPath);
|
|
170
|
+
logger_1.logger.debug(`檔案已複製:${srcPath} -> ${destPath}`);
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
175
|
+
logger_1.logger.error(`複製檔案失敗:${message}`);
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 複製目錄(遞迴)
|
|
181
|
+
*/
|
|
182
|
+
function copyDirectory(srcDir, destDir, options) {
|
|
183
|
+
const { overwrite = false } = options || {};
|
|
184
|
+
const files = [];
|
|
185
|
+
try {
|
|
186
|
+
if (!directoryExists(srcDir)) {
|
|
187
|
+
throw new Error(`來源目錄不存在:${srcDir}`);
|
|
188
|
+
}
|
|
189
|
+
// 創建目標目錄
|
|
190
|
+
if (!directoryExists(destDir)) {
|
|
191
|
+
createDirectory(destDir, { recursive: true });
|
|
192
|
+
}
|
|
193
|
+
// 讀取來源目錄
|
|
194
|
+
const entries = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
195
|
+
for (const entry of entries) {
|
|
196
|
+
const srcPath = path.join(srcDir, entry.name);
|
|
197
|
+
const destPath = path.join(destDir, entry.name);
|
|
198
|
+
if (entry.isDirectory()) {
|
|
199
|
+
// 遞迴複製子目錄
|
|
200
|
+
const result = copyDirectory(srcPath, destPath, { overwrite });
|
|
201
|
+
if (result.success) {
|
|
202
|
+
files.push(...result.files);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// 複製檔案
|
|
207
|
+
if (copyFile(srcPath, destPath, { overwrite })) {
|
|
208
|
+
files.push(destPath);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
logger_1.logger.debug(`目錄已複製:${srcDir} -> ${destDir} (${files.length} 個檔案)`);
|
|
213
|
+
return { success: true, files };
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
217
|
+
logger_1.logger.error(`複製目錄失敗:${message}`);
|
|
218
|
+
return { success: false, files: [] };
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* 刪除檔案
|
|
223
|
+
*/
|
|
224
|
+
function deleteFile(filePath) {
|
|
225
|
+
try {
|
|
226
|
+
if (fileExists(filePath)) {
|
|
227
|
+
fs.unlinkSync(filePath);
|
|
228
|
+
logger_1.logger.debug(`檔案已刪除:${filePath}`);
|
|
229
|
+
}
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
234
|
+
logger_1.logger.error(`刪除檔案失敗:${message}`);
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* 刪除目錄(遞迴)
|
|
240
|
+
*/
|
|
241
|
+
function deleteDirectory(dirPath) {
|
|
242
|
+
try {
|
|
243
|
+
if (directoryExists(dirPath)) {
|
|
244
|
+
fs.rmSync(dirPath, { recursive: true, force: true });
|
|
245
|
+
logger_1.logger.debug(`目錄已刪除:${dirPath}`);
|
|
246
|
+
}
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
251
|
+
logger_1.logger.error(`刪除目錄失敗:${message}`);
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* 檢查並處理目錄衝突
|
|
257
|
+
* 如果目錄已存在且不為空,則需要用戶確認
|
|
258
|
+
*/
|
|
259
|
+
function checkDirectoryConflict(dirPath, onConflict) {
|
|
260
|
+
// 目錄不存在,沒有衝突
|
|
261
|
+
if (!directoryExists(dirPath)) {
|
|
262
|
+
return { hasConflict: false };
|
|
263
|
+
}
|
|
264
|
+
// 目錄存在但為空,沒有衝突
|
|
265
|
+
if (isEmptyDir(dirPath)) {
|
|
266
|
+
return { hasConflict: false };
|
|
267
|
+
}
|
|
268
|
+
// 目錄存在且不為空,需要處理衝突
|
|
269
|
+
const resolution = {
|
|
270
|
+
action: 'abort', // 預設行為
|
|
271
|
+
};
|
|
272
|
+
// 調用回調函數讓用戶決定
|
|
273
|
+
onConflict(resolution);
|
|
274
|
+
return { hasConflict: true, resolution };
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* 創建專案目錄結構
|
|
278
|
+
*/
|
|
279
|
+
function createProjectStructure(targetDir, projectName) {
|
|
280
|
+
const files = [];
|
|
281
|
+
const directories = [];
|
|
282
|
+
try {
|
|
283
|
+
// 創建主目錄
|
|
284
|
+
if (!createDirectory(targetDir)) {
|
|
285
|
+
return {
|
|
286
|
+
success: false,
|
|
287
|
+
error: '無法創建專案目錄',
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
directories.push(targetDir);
|
|
291
|
+
// 創建基礎目錄結構
|
|
292
|
+
const subDirs = ['src', 'public', 'tests'];
|
|
293
|
+
for (const dir of subDirs) {
|
|
294
|
+
const dirPath = path.join(targetDir, dir);
|
|
295
|
+
if (createDirectory(dirPath)) {
|
|
296
|
+
directories.push(dirPath);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// 創建 .gitignore
|
|
300
|
+
const gitignorePath = path.join(targetDir, '.gitignore');
|
|
301
|
+
const gitignoreContent = `# 依賴
|
|
302
|
+
node_modules/
|
|
303
|
+
dist/
|
|
304
|
+
|
|
305
|
+
# 環境變數
|
|
306
|
+
.env
|
|
307
|
+
.env.local
|
|
308
|
+
.env.*.local
|
|
309
|
+
|
|
310
|
+
# 日誌
|
|
311
|
+
*.log
|
|
312
|
+
npm-debug.log*
|
|
313
|
+
|
|
314
|
+
# 操作系統
|
|
315
|
+
.DS_Store
|
|
316
|
+
Thumbs.db
|
|
317
|
+
|
|
318
|
+
# IDE
|
|
319
|
+
.vscode/
|
|
320
|
+
.idea/
|
|
321
|
+
*.swp
|
|
322
|
+
*.swo
|
|
323
|
+
`;
|
|
324
|
+
if (writeFile(gitignorePath, gitignoreContent)) {
|
|
325
|
+
files.push(gitignorePath);
|
|
326
|
+
}
|
|
327
|
+
// 創建 README.md
|
|
328
|
+
const readmePath = path.join(targetDir, 'README.md');
|
|
329
|
+
const readmeContent = `# ${projectName}
|
|
330
|
+
|
|
331
|
+
## 專案說明
|
|
332
|
+
|
|
333
|
+
這是一個 Cloudflare 專案,使用 create-cf-project 腳手架工具建立。
|
|
334
|
+
|
|
335
|
+
## 快速開始
|
|
336
|
+
|
|
337
|
+
\`\`\`bash
|
|
338
|
+
# 安裝依賴
|
|
339
|
+
npm install
|
|
340
|
+
|
|
341
|
+
# 開發模式
|
|
342
|
+
npm run dev
|
|
343
|
+
|
|
344
|
+
# 建置專案
|
|
345
|
+
npm run build
|
|
346
|
+
\`\`\`
|
|
347
|
+
|
|
348
|
+
## 功能特色
|
|
349
|
+
|
|
350
|
+
- ☁️ 基於 Cloudflare 平台
|
|
351
|
+
- 📦 使用 TypeScript 開發
|
|
352
|
+
- ⚡ 快速部署
|
|
353
|
+
|
|
354
|
+
## 授權
|
|
355
|
+
|
|
356
|
+
MIT License
|
|
357
|
+
`;
|
|
358
|
+
if (writeFile(readmePath, readmeContent)) {
|
|
359
|
+
files.push(readmePath);
|
|
360
|
+
}
|
|
361
|
+
// 創建 .gitignore 提示
|
|
362
|
+
logger_1.logger.success('專案結構已建立');
|
|
363
|
+
return {
|
|
364
|
+
success: true,
|
|
365
|
+
files,
|
|
366
|
+
directories,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
371
|
+
return {
|
|
372
|
+
success: false,
|
|
373
|
+
error: message || '建立專案結構時發生錯誤',
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* 獲取目錄內容列表
|
|
379
|
+
*/
|
|
380
|
+
function listDirectory(dirPath) {
|
|
381
|
+
try {
|
|
382
|
+
if (!directoryExists(dirPath)) {
|
|
383
|
+
return [];
|
|
384
|
+
}
|
|
385
|
+
return fs.readdirSync(dirPath);
|
|
386
|
+
}
|
|
387
|
+
catch (error) {
|
|
388
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
389
|
+
logger_1.logger.error(`讀取目錄列表失敗:${message}`);
|
|
390
|
+
return [];
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* 獲取檔案大小(位元組)
|
|
395
|
+
*/
|
|
396
|
+
function getFileSize(filePath) {
|
|
397
|
+
try {
|
|
398
|
+
const stats = fs.statSync(filePath);
|
|
399
|
+
return stats.size;
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
return 0;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* 獲取檔案修改時間
|
|
407
|
+
*/
|
|
408
|
+
function getFileModifiedDate(filePath) {
|
|
409
|
+
try {
|
|
410
|
+
const stats = fs.statSync(filePath);
|
|
411
|
+
return stats.mtime;
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
return null;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/core/filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Token 管理模組
|
|
3
|
+
* 負責管理私人倉庫推送所需的 Git Token
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Git Token 資料結構
|
|
7
|
+
*/
|
|
8
|
+
export interface GitToken {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
token: string;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Git Token 配置結構
|
|
16
|
+
*/
|
|
17
|
+
export interface GitTokenConfig {
|
|
18
|
+
tokens: GitToken[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 獲取配置檔路徑
|
|
22
|
+
* 路徑:~/.config/cf-yoyo/git-token.json(跨平台)
|
|
23
|
+
* 使用 os.homedir() 確保在 Windows、macOS、Linux 上都能正確獲取用戶目錄
|
|
24
|
+
*/
|
|
25
|
+
export declare function getTokenConfigPath(): string;
|
|
26
|
+
/**
|
|
27
|
+
* 載入已存 Token
|
|
28
|
+
* @returns GitTokenConfig 配置對象
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadTokens(): GitTokenConfig;
|
|
31
|
+
/**
|
|
32
|
+
* 保存 Token 配置
|
|
33
|
+
* @param tokens Token 配置對象
|
|
34
|
+
*/
|
|
35
|
+
export declare function saveTokens(tokens: GitTokenConfig): void;
|
|
36
|
+
/**
|
|
37
|
+
* 新增 Token
|
|
38
|
+
* @param name Token 名稱
|
|
39
|
+
* @param token Token 值
|
|
40
|
+
* @returns 新增的 GitToken 對象
|
|
41
|
+
*/
|
|
42
|
+
export declare function addToken(name: string, token: string): GitToken;
|
|
43
|
+
/**
|
|
44
|
+
* 刪除 Token
|
|
45
|
+
* @param id Token ID
|
|
46
|
+
* @returns 是否刪除成功
|
|
47
|
+
*/
|
|
48
|
+
export declare function deleteToken(id: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* 更新 Token
|
|
51
|
+
* @param id Token ID
|
|
52
|
+
* @param name Token 名稱
|
|
53
|
+
* @param token Token 值
|
|
54
|
+
* @returns 是否更新成功
|
|
55
|
+
*/
|
|
56
|
+
export declare function updateToken(id: string, name: string, token: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* 更新 Token 名稱
|
|
59
|
+
* @param id Token ID
|
|
60
|
+
* @param name 新名稱
|
|
61
|
+
* @returns 是否更新成功
|
|
62
|
+
*/
|
|
63
|
+
export declare function updateTokenName(id: string, name: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* 選擇 Token(互動式)
|
|
66
|
+
* 根據不同情況返回對應的 Token
|
|
67
|
+
* - 若無 Token:返回 null
|
|
68
|
+
* - 若有 1 個 Token:返回該 Token
|
|
69
|
+
* - 若有 2+ 個 Token:讓用戶選擇
|
|
70
|
+
* @returns 選擇的 GitToken 或 null
|
|
71
|
+
*/
|
|
72
|
+
export declare function selectToken(): Promise<GitToken | null>;
|
|
73
|
+
/**
|
|
74
|
+
* 獲取所有 Token 名稱列表(用於顯示,不顯示 Token 值)
|
|
75
|
+
*/
|
|
76
|
+
export declare function getTokenList(): {
|
|
77
|
+
id: string;
|
|
78
|
+
name: string;
|
|
79
|
+
createdAt: string;
|
|
80
|
+
}[];
|
|
81
|
+
//# sourceMappingURL=git-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-token.d.ts","sourceRoot":"","sources":["../../src/core/git-token.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAQ3C;AAcD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,cAAc,CAe3C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAIvD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAc9D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAW/C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAqB5E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAgBjE;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA+C5D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,CAOhF"}
|