create-qiusoft-app 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 +15 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +287 -0
- package/dist/index.js.map +1 -0
- package/package.json +37 -0
package/README.md
ADDED
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import AdmZip from 'adm-zip';
|
|
6
|
+
import fg from 'fast-glob';
|
|
7
|
+
import micromatch from 'micromatch';
|
|
8
|
+
import { fetch } from 'undici';
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
import { spawnSync } from 'child_process';
|
|
11
|
+
const DEFAULT_REPO = process.env.QIUSOFT_TEMPLATE_REPO || 'github:Nokecy/qiusoft-template';
|
|
12
|
+
const DEFAULT_REF = 'main';
|
|
13
|
+
const DEFAULT_TOKEN_ENV = 'GITHUB_TOKEN';
|
|
14
|
+
const DEFAULT_MANIFEST = 'shared.manifest.json';
|
|
15
|
+
function parseGithub(repo) {
|
|
16
|
+
const m = repo.match(/^github:([^/]+)\/(.+)$/);
|
|
17
|
+
if (m)
|
|
18
|
+
return { owner: m[1], name: m[2] };
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
function resolveLocalRepo(repo, baseDir) {
|
|
22
|
+
if (repo.startsWith('github:'))
|
|
23
|
+
return null;
|
|
24
|
+
let raw = repo;
|
|
25
|
+
if (repo.startsWith('file:'))
|
|
26
|
+
raw = repo.slice('file:'.length);
|
|
27
|
+
if (repo.startsWith('local:'))
|
|
28
|
+
raw = repo.slice('local:'.length);
|
|
29
|
+
const full = path.isAbsolute(raw) ? raw : path.resolve(baseDir, raw);
|
|
30
|
+
return fs.existsSync(full) ? full : null;
|
|
31
|
+
}
|
|
32
|
+
async function githubResolveSha(opts) {
|
|
33
|
+
const url = `https://api.github.com/repos/${opts.repo.owner}/${opts.repo.name}/commits/${encodeURIComponent(opts.ref)}`;
|
|
34
|
+
const headers = {
|
|
35
|
+
'User-Agent': 'create-qiusoft-app',
|
|
36
|
+
Accept: 'application/vnd.github+json',
|
|
37
|
+
};
|
|
38
|
+
if (opts.token)
|
|
39
|
+
headers.Authorization = `Bearer ${opts.token}`;
|
|
40
|
+
const res = await fetch(url, { headers });
|
|
41
|
+
if (!res.ok)
|
|
42
|
+
return null;
|
|
43
|
+
const json = (await res.json());
|
|
44
|
+
return typeof json?.sha === 'string' ? json.sha : null;
|
|
45
|
+
}
|
|
46
|
+
async function githubDownloadZip(opts) {
|
|
47
|
+
const url = `https://api.github.com/repos/${opts.repo.owner}/${opts.repo.name}/zipball/${encodeURIComponent(opts.ref)}`;
|
|
48
|
+
const headers = {
|
|
49
|
+
'User-Agent': 'create-qiusoft-app',
|
|
50
|
+
Accept: 'application/vnd.github+json',
|
|
51
|
+
};
|
|
52
|
+
if (opts.token)
|
|
53
|
+
headers.Authorization = `Bearer ${opts.token}`;
|
|
54
|
+
const res = await fetch(url, { headers, redirect: 'follow' });
|
|
55
|
+
if (!res.ok) {
|
|
56
|
+
const text = await res.text().catch(() => '');
|
|
57
|
+
throw new Error(`GitHub zip download failed: ${res.status} ${res.statusText} ${text}`.trim());
|
|
58
|
+
}
|
|
59
|
+
return await res.arrayBuffer();
|
|
60
|
+
}
|
|
61
|
+
async function fetchRepoSnapshot(opts) {
|
|
62
|
+
const localRepo = resolveLocalRepo(opts.repo, opts.baseDir || process.cwd());
|
|
63
|
+
if (localRepo) {
|
|
64
|
+
return { dir: localRepo, resolvedSha: null, tempRoot: '' };
|
|
65
|
+
}
|
|
66
|
+
const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'create-qiusoft-app-'));
|
|
67
|
+
const outDir = path.join(tempRoot, 'repo');
|
|
68
|
+
await fs.ensureDir(outDir);
|
|
69
|
+
const gh = parseGithub(opts.repo);
|
|
70
|
+
if (!gh) {
|
|
71
|
+
throw new Error(`仅支持 github:* 仓库格式,当前为: ${opts.repo}`);
|
|
72
|
+
}
|
|
73
|
+
const [zipBuf, sha] = await Promise.all([
|
|
74
|
+
githubDownloadZip({ repo: gh, ref: opts.ref, token: opts.token }),
|
|
75
|
+
githubResolveSha({ repo: gh, ref: opts.ref, token: opts.token }),
|
|
76
|
+
]);
|
|
77
|
+
const zip = new AdmZip(Buffer.from(zipBuf));
|
|
78
|
+
zip.extractAllTo(outDir, true);
|
|
79
|
+
const entries = await fs.readdir(outDir);
|
|
80
|
+
if (!entries.length)
|
|
81
|
+
throw new Error('Zip 解压完成但未找到文件。');
|
|
82
|
+
const root = path.join(outDir, entries[0]);
|
|
83
|
+
return { dir: root, resolvedSha: sha, tempRoot };
|
|
84
|
+
}
|
|
85
|
+
function toPosix(p) {
|
|
86
|
+
return p.replace(/\\/g, '/');
|
|
87
|
+
}
|
|
88
|
+
function shouldIgnore(relFromMapping, relFromRepo, ignore) {
|
|
89
|
+
if (!ignore.length)
|
|
90
|
+
return false;
|
|
91
|
+
return (micromatch.isMatch(relFromMapping, ignore, { dot: true }) ||
|
|
92
|
+
micromatch.isMatch(relFromRepo, ignore, { dot: true }));
|
|
93
|
+
}
|
|
94
|
+
async function readManifest(repoDir, manifestFile) {
|
|
95
|
+
const p = path.join(repoDir, manifestFile);
|
|
96
|
+
if (!(await fs.pathExists(p))) {
|
|
97
|
+
throw new Error(`找不到共享清单: ${manifestFile}`);
|
|
98
|
+
}
|
|
99
|
+
const manifest = (await fs.readJSON(p));
|
|
100
|
+
if (!Array.isArray(manifest.includes) || manifest.includes.length === 0) {
|
|
101
|
+
throw new Error('共享清单 includes 不能为空。');
|
|
102
|
+
}
|
|
103
|
+
manifest.exclude ||= [];
|
|
104
|
+
return manifest;
|
|
105
|
+
}
|
|
106
|
+
async function copyMappings(opts) {
|
|
107
|
+
for (const m of opts.mappings) {
|
|
108
|
+
const srcRoot = path.join(opts.repoDir, m.from);
|
|
109
|
+
const dstRoot = path.join(opts.targetRoot, m.to);
|
|
110
|
+
if (!(await fs.pathExists(srcRoot))) {
|
|
111
|
+
throw new Error(`Source not found: ${m.from}`);
|
|
112
|
+
}
|
|
113
|
+
const srcStat = await fs.stat(srcRoot);
|
|
114
|
+
const fromPosix = toPosix(m.from);
|
|
115
|
+
if (srcStat.isFile()) {
|
|
116
|
+
const relFromMapping = toPosix(path.basename(m.from));
|
|
117
|
+
const relFromRepo = fromPosix;
|
|
118
|
+
if (shouldIgnore(relFromMapping, relFromRepo, opts.exclude)) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
await fs.ensureDir(path.dirname(dstRoot));
|
|
122
|
+
await fs.copyFile(srcRoot, dstRoot);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const allSrcFiles = await fg(['**/*'], { cwd: srcRoot, dot: true, onlyFiles: true });
|
|
126
|
+
const srcFiles = allSrcFiles.filter(file => {
|
|
127
|
+
const rel = toPosix(file);
|
|
128
|
+
const relFromRepo = `${fromPosix}/${rel}`;
|
|
129
|
+
return !shouldIgnore(rel, relFromRepo, opts.exclude);
|
|
130
|
+
});
|
|
131
|
+
for (const file of srcFiles) {
|
|
132
|
+
const src = path.join(srcRoot, file);
|
|
133
|
+
const dst = path.join(dstRoot, file);
|
|
134
|
+
await fs.ensureDir(path.dirname(dst));
|
|
135
|
+
await fs.copyFile(src, dst);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function copyExtraFiles(repoDir, targetRoot) {
|
|
140
|
+
const extraFiles = ['package.json', 'yarn.lock', '.gitmodules'];
|
|
141
|
+
for (const file of extraFiles) {
|
|
142
|
+
const src = path.join(repoDir, file);
|
|
143
|
+
if (!(await fs.pathExists(src)))
|
|
144
|
+
continue;
|
|
145
|
+
const dst = path.join(targetRoot, file);
|
|
146
|
+
await fs.ensureDir(path.dirname(dst));
|
|
147
|
+
await fs.copyFile(src, dst);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function ensureSubmodules(targetRoot) {
|
|
151
|
+
const gitmodulesPath = path.join(targetRoot, '.gitmodules');
|
|
152
|
+
if (!fs.existsSync(gitmodulesPath))
|
|
153
|
+
return;
|
|
154
|
+
const hasGit = spawnSync('git', ['--version'], { stdio: 'ignore' });
|
|
155
|
+
if (hasGit.status !== 0) {
|
|
156
|
+
throw new Error('检测到 .gitmodules,但未找到 git,请先安装 git。');
|
|
157
|
+
}
|
|
158
|
+
const gitDir = path.join(targetRoot, '.git');
|
|
159
|
+
if (!fs.existsSync(gitDir)) {
|
|
160
|
+
const init = spawnSync('git', ['init'], { cwd: targetRoot, stdio: 'inherit' });
|
|
161
|
+
if (init.status !== 0) {
|
|
162
|
+
throw new Error('git init 失败,请检查 git 环境。');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const update = spawnSync('git', ['submodule', 'update', '--init', '--recursive'], {
|
|
166
|
+
cwd: targetRoot,
|
|
167
|
+
stdio: 'inherit',
|
|
168
|
+
});
|
|
169
|
+
if (update.status !== 0) {
|
|
170
|
+
throw new Error('子模块初始化失败,请检查网络或访问权限。');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function ensureProjectLocal(opts) {
|
|
174
|
+
const relativePath = opts.relativePath || path.join('config', 'project.local.ts');
|
|
175
|
+
const target = path.join(opts.targetRoot, relativePath);
|
|
176
|
+
if (await fs.pathExists(target))
|
|
177
|
+
return;
|
|
178
|
+
const source = path.join(opts.repoDir, relativePath);
|
|
179
|
+
if (!(await fs.pathExists(source)))
|
|
180
|
+
return;
|
|
181
|
+
await fs.ensureDir(path.dirname(target));
|
|
182
|
+
await fs.copyFile(source, target);
|
|
183
|
+
}
|
|
184
|
+
async function writeSharedConfig(opts) {
|
|
185
|
+
const content = {
|
|
186
|
+
repo: opts.repo,
|
|
187
|
+
ref: opts.ref,
|
|
188
|
+
tokenEnv: opts.tokenEnv,
|
|
189
|
+
lockFile: '.shared-lock.json',
|
|
190
|
+
manifestFile: opts.manifestFile,
|
|
191
|
+
};
|
|
192
|
+
const p = path.join(opts.targetRoot, '.shared-config.json');
|
|
193
|
+
await fs.writeJSON(p, content, { spaces: 2 });
|
|
194
|
+
}
|
|
195
|
+
async function writeLock(opts) {
|
|
196
|
+
const p = path.join(opts.targetRoot, '.shared-lock.json');
|
|
197
|
+
await fs.writeJSON(p, {
|
|
198
|
+
repo: opts.repo,
|
|
199
|
+
ref: opts.ref,
|
|
200
|
+
resolvedSha: opts.resolvedSha,
|
|
201
|
+
updatedAt: new Date().toISOString(),
|
|
202
|
+
}, { spaces: 2 });
|
|
203
|
+
}
|
|
204
|
+
async function updatePackageName(targetRoot, name) {
|
|
205
|
+
const pkgPath = path.join(targetRoot, 'package.json');
|
|
206
|
+
if (!(await fs.pathExists(pkgPath)))
|
|
207
|
+
return;
|
|
208
|
+
const pkg = await fs.readJSON(pkgPath);
|
|
209
|
+
pkg.name = name;
|
|
210
|
+
await fs.writeJSON(pkgPath, pkg, { spaces: 2 });
|
|
211
|
+
}
|
|
212
|
+
async function main() {
|
|
213
|
+
const program = new Command();
|
|
214
|
+
program
|
|
215
|
+
.name('create-qiusoft-app')
|
|
216
|
+
.argument('<project-name>')
|
|
217
|
+
.option('--repo <repo>', '模板仓库地址', DEFAULT_REPO)
|
|
218
|
+
.option('--ref <ref>', '分支/标签/提交', DEFAULT_REF)
|
|
219
|
+
.option('--token-env <name>', '访问令牌环境变量名', DEFAULT_TOKEN_ENV)
|
|
220
|
+
.option('--manifest <path>', '共享清单文件名', DEFAULT_MANIFEST)
|
|
221
|
+
.option('--skip-install', '跳过 yarn install')
|
|
222
|
+
.parse();
|
|
223
|
+
const [name] = program.args;
|
|
224
|
+
const opts = program.opts();
|
|
225
|
+
if (!name) {
|
|
226
|
+
console.error('Usage: create-qiusoft-app <project-name>');
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
const targetRoot = path.resolve(process.cwd(), name);
|
|
230
|
+
if (await fs.pathExists(targetRoot)) {
|
|
231
|
+
console.error(`Target exists: ${targetRoot}`);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
const token = process.env[opts.tokenEnv || DEFAULT_TOKEN_ENV];
|
|
235
|
+
const baseDir = process.cwd();
|
|
236
|
+
const localRepo = resolveLocalRepo(opts.repo, baseDir);
|
|
237
|
+
const repoForConfig = localRepo ? `file:${localRepo}` : opts.repo;
|
|
238
|
+
const snapshot = await fetchRepoSnapshot({
|
|
239
|
+
repo: opts.repo,
|
|
240
|
+
ref: opts.ref,
|
|
241
|
+
token,
|
|
242
|
+
baseDir,
|
|
243
|
+
});
|
|
244
|
+
const manifest = await readManifest(snapshot.dir, opts.manifest);
|
|
245
|
+
await fs.ensureDir(targetRoot);
|
|
246
|
+
await copyMappings({
|
|
247
|
+
repoDir: snapshot.dir,
|
|
248
|
+
targetRoot,
|
|
249
|
+
mappings: manifest.includes,
|
|
250
|
+
exclude: manifest.exclude || [],
|
|
251
|
+
});
|
|
252
|
+
await copyExtraFiles(snapshot.dir, targetRoot);
|
|
253
|
+
await ensureProjectLocal({ repoDir: snapshot.dir, targetRoot });
|
|
254
|
+
await updatePackageName(targetRoot, name);
|
|
255
|
+
await writeSharedConfig({
|
|
256
|
+
targetRoot,
|
|
257
|
+
repo: repoForConfig,
|
|
258
|
+
ref: opts.ref,
|
|
259
|
+
tokenEnv: opts.tokenEnv || DEFAULT_TOKEN_ENV,
|
|
260
|
+
manifestFile: opts.manifest,
|
|
261
|
+
});
|
|
262
|
+
await writeLock({
|
|
263
|
+
targetRoot,
|
|
264
|
+
repo: opts.repo,
|
|
265
|
+
ref: opts.ref,
|
|
266
|
+
resolvedSha: snapshot.resolvedSha,
|
|
267
|
+
});
|
|
268
|
+
ensureSubmodules(targetRoot);
|
|
269
|
+
if (snapshot.tempRoot) {
|
|
270
|
+
await fs.remove(snapshot.tempRoot).catch(() => { });
|
|
271
|
+
}
|
|
272
|
+
if (!opts.skipInstall) {
|
|
273
|
+
const result = spawnSync('yarn', ['install'], {
|
|
274
|
+
cwd: targetRoot,
|
|
275
|
+
stdio: 'inherit',
|
|
276
|
+
});
|
|
277
|
+
if (result.status !== 0) {
|
|
278
|
+
process.exit(result.status ?? 1);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
console.log(`Done: ${name}`);
|
|
282
|
+
}
|
|
283
|
+
main().catch(error => {
|
|
284
|
+
console.error(error?.message || error);
|
|
285
|
+
process.exit(1);
|
|
286
|
+
});
|
|
287
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-qiusoft-app",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Create a qiusoft app from template",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"create-qiusoft-app": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=18"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -p tsconfig.json",
|
|
19
|
+
"dev": "node --enable-source-maps dist/index.js",
|
|
20
|
+
"prepublishOnly": "npm run build"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"adm-zip": "^0.5.16",
|
|
24
|
+
"commander": "^12.1.0",
|
|
25
|
+
"fast-glob": "^3.3.2",
|
|
26
|
+
"fs-extra": "^11.2.0",
|
|
27
|
+
"micromatch": "^4.0.8",
|
|
28
|
+
"undici": "^6.19.8"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/adm-zip": "^0.5.5",
|
|
32
|
+
"@types/fs-extra": "^11.0.4",
|
|
33
|
+
"@types/micromatch": "^4.0.9",
|
|
34
|
+
"@types/node": "^22.10.1",
|
|
35
|
+
"typescript": "^5.5.4"
|
|
36
|
+
}
|
|
37
|
+
}
|