@meadmin/cli 1.3.6 → 1.3.8

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.
@@ -0,0 +1,20 @@
1
+ export declare function versionParts(version: string): number[];
2
+ export declare function compareVersions(a: string, b: string): number;
3
+ export declare function currentVersion(root: string): string;
4
+ export declare function selectVersion(current: string, versions: Record<string, {
5
+ deprecated?: string;
6
+ }>, requested?: string): string;
7
+ export type RegistryManifest = {
8
+ versions: Record<string, {
9
+ deprecated?: string;
10
+ dist: {
11
+ tarball: string;
12
+ integrity?: string;
13
+ shasum?: string;
14
+ };
15
+ }>;
16
+ };
17
+ export declare function registryManifest(registry: string): Promise<RegistryManifest>;
18
+ /** 安全的 npm tar 子集解包;不支持的扩展和链接直接拒绝,不跟随符号链接。 */
19
+ export declare function unpackTemplate(archive: Buffer, destination: string): void;
20
+ export declare function downloadTemplate(manifest: RegistryManifest, version: string, destination: string): Promise<string>;
@@ -0,0 +1,147 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { gunzipSync } from 'node:zlib';
6
+ export function versionParts(version) {
7
+ if (!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(version))
8
+ throw new Error(`仅支持准确的 x.y.z 稳定版本号:${version}`);
9
+ const parts = version.split('.').map(Number);
10
+ if (parts.some((part) => !Number.isSafeInteger(part)))
11
+ throw new Error('版本号超出安全范围');
12
+ return parts;
13
+ }
14
+ export function compareVersions(a, b) {
15
+ const av = versionParts(a), bv = versionParts(b);
16
+ return av[0] - bv[0] || av[1] - bv[1] || av[2] - bv[2];
17
+ }
18
+ export function currentVersion(root) {
19
+ if (!existsSync(join(root, 'node_modules/@meadmin/cli/package.json')))
20
+ throw new Error('目标项目尚未安装本地 @meadmin/cli,请先安装项目依赖');
21
+ const require = createRequire(join(root, 'package.json'));
22
+ let location;
23
+ try {
24
+ location = require.resolve('@meadmin/cli');
25
+ }
26
+ catch {
27
+ throw new Error('项目尚未安装 @meadmin/cli,请先安装项目依赖。');
28
+ }
29
+ let directory = dirname(location);
30
+ while (directory !== dirname(directory)) {
31
+ const file = join(directory, 'package.json');
32
+ if (existsSync(file)) {
33
+ const pkg = JSON.parse(readFileSync(file, 'utf8'));
34
+ if (pkg.name === '@meadmin/cli') {
35
+ versionParts(pkg.version);
36
+ return pkg.version;
37
+ }
38
+ }
39
+ directory = dirname(directory);
40
+ }
41
+ throw new Error('无法读取项目本地 @meadmin/cli 版本');
42
+ }
43
+ export function selectVersion(current, versions, requested) {
44
+ versionParts(current);
45
+ const target = requested ??
46
+ Object.keys(versions)
47
+ .filter((v) => /^\d+\.\d+\.\d+$/.test(v) && versionParts(v)[0] === versionParts(current)[0] && !versions[v].deprecated)
48
+ .sort(compareVersions)
49
+ .at(-1);
50
+ if (!target || !versions[target])
51
+ throw new Error('没有可用的目标版本');
52
+ versionParts(target);
53
+ if (versions[target].deprecated)
54
+ throw new Error('目标版本已废弃');
55
+ if (compareVersions(target, current) < 0)
56
+ throw new Error('不支持降级');
57
+ return target;
58
+ }
59
+ export async function registryManifest(registry) {
60
+ const url = new URL(registry);
61
+ if (url.protocol !== 'https:' && !(url.protocol === 'http:' && ['localhost', '127.0.0.1'].includes(url.hostname)))
62
+ throw new Error('registry 必须使用 HTTPS');
63
+ const response = await fetch(registry.replace(/\/$/, '') + '/create-meadminjs', { signal: AbortSignal.timeout(30000) });
64
+ if (!response.ok)
65
+ throw new Error(`模板元数据读取失败:HTTP ${response.status}`);
66
+ return response.json();
67
+ }
68
+ /** 安全的 npm tar 子集解包;不支持的扩展和链接直接拒绝,不跟随符号链接。 */
69
+ export function unpackTemplate(archive, destination) {
70
+ const tar = gunzipSync(archive, { maxOutputLength: 256 * 1024 * 1024 });
71
+ const seen = new Set();
72
+ for (let offset = 0; offset + 512 <= tar.length;) {
73
+ const header = tar.subarray(offset, offset + 512);
74
+ if (header.every((byte) => byte === 0))
75
+ break;
76
+ const text = (start, length) => header
77
+ .subarray(start, start + length)
78
+ .toString('utf8')
79
+ .split('\0')[0];
80
+ const stored = parseInt(text(148, 8).trim(), 8);
81
+ const checksum = header.reduce((sum, byte, index) => sum + (index >= 148 && index < 156 ? 32 : byte), 0);
82
+ if (stored !== checksum)
83
+ throw new Error('tar header 校验失败');
84
+ const size = parseInt(text(124, 12).trim() || '0', 8);
85
+ if (!Number.isSafeInteger(size) || size < 0 || offset + 512 + size > tar.length)
86
+ throw new Error('tar 长度无效');
87
+ const name = [text(345, 155), text(0, 100)].filter(Boolean).join('/').replace(/\/$/, '');
88
+ if (!name.startsWith('package/') && name !== 'package')
89
+ throw new Error('压缩包包含非 package 路径');
90
+ if (name.includes('\\') || name.split('/').some((part) => part === '..' || part === '.' || part.includes(':')))
91
+ throw new Error('压缩包路径不安全');
92
+ const type = text(156, 1);
93
+ if (!['', '0', '5'].includes(type))
94
+ throw new Error(`不支持的 tar 条目类型 ${type},需人工检查`);
95
+ const key = name.toLowerCase();
96
+ if (seen.has(key))
97
+ throw new Error(`压缩包路径重复:${name}`);
98
+ seen.add(key);
99
+ const path = resolve(destination, name);
100
+ if (type === '5')
101
+ mkdirSync(path, { recursive: true });
102
+ else {
103
+ mkdirSync(dirname(path), { recursive: true });
104
+ writeFileSync(path, tar.subarray(offset + 512, offset + 512 + size));
105
+ }
106
+ offset += 512 + Math.ceil(size / 512) * 512;
107
+ }
108
+ }
109
+ export async function downloadTemplate(manifest, version, destination) {
110
+ const release = manifest.versions[version];
111
+ if (!release)
112
+ throw new Error(`缺少旧/目标模板 ${version},升级停止`);
113
+ const { dist } = release;
114
+ const downloadUrl = new URL(dist.tarball);
115
+ if (downloadUrl.protocol !== 'https:' && !(downloadUrl.protocol === 'http:' && ['localhost', '127.0.0.1'].includes(downloadUrl.hostname)))
116
+ throw new Error('模板下载必须使用 HTTPS(本机测试registry除外)');
117
+ const response = await fetch(dist.tarball, { signal: AbortSignal.timeout(120000) });
118
+ if (!response.ok)
119
+ throw new Error(`下载失败:${version}`);
120
+ const chunks = [];
121
+ let size = 0;
122
+ if (!response.body)
123
+ throw new Error('模板响应为空');
124
+ for await (const chunk of response.body) {
125
+ size += chunk.length;
126
+ if (size > 64 * 1024 * 1024)
127
+ throw new Error('模板压缩包超过64MB限制');
128
+ chunks.push(chunk);
129
+ }
130
+ const archive = Buffer.concat(chunks);
131
+ const integrity = dist.integrity?.split(/\s+/).find((x) => x.startsWith('sha512-'));
132
+ if (integrity) {
133
+ if (createHash('sha512').update(archive).digest('base64') !== integrity.slice(7))
134
+ throw new Error('模板完整性校验失败');
135
+ }
136
+ else if (!dist.shasum || createHash('sha1').update(archive).digest('hex') !== dist.shasum)
137
+ throw new Error('缺少有效模板完整性校验');
138
+ unpackTemplate(archive, destination);
139
+ const pkg = JSON.parse(readFileSync(join(destination, 'package/package.json'), 'utf8'));
140
+ if (pkg.name !== 'create-meadminjs' || pkg.version !== version)
141
+ throw new Error('模板包名称或版本不匹配');
142
+ const template = join(destination, 'package/template/meadmin');
143
+ if (!existsSync(join(template, 'packageTemplate.json')))
144
+ throw new Error('模板根目录无效');
145
+ return template;
146
+ }
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXBkYXRlL3RlbXBsYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXZDLE1BQU0sVUFBVSxZQUFZLENBQUMsT0FBZTtJQUMxQyxJQUFJLENBQUMsNENBQTRDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbEgsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BGLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUNELE1BQU0sVUFBVSxlQUFlLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDbEQsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUN4QixFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meadmin/cli",
3
- "version": "1.3.6",
3
+ "version": "1.3.8",
4
4
  "description": "meadmin cli",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -29,10 +29,10 @@
29
29
  "devDependencies": {
30
30
  "@types/mocha": "^10.0.10",
31
31
  "mocha": "^10.8.2",
32
- "rimraf": "^6.0.1",
33
- "typescript": "^5.9.2"
32
+ "rimraf": "^6.0.1"
34
33
  },
35
34
  "dependencies": {
35
+ "typescript": "^5.9.2",
36
36
  "art-template": "4.13.2",
37
37
  "commander": "^14.0.0",
38
38
  "dayjs": "^1.11.21",
@@ -51,7 +51,7 @@
51
51
  "node": ">=22.14.0"
52
52
  },
53
53
  "scripts": {
54
- "test": "echo \"Error: no test specified\" && exit 1",
54
+ "test": "pnpm build && node --test test/update-*.test.mjs",
55
55
  "build": "rimraf dist && tsc --build"
56
56
  }
57
57
  }
@@ -0,0 +1,29 @@
1
+ {
2
+ "skipExisting": {
3
+ "view/index/src/views/index/**": true,
4
+ "view/admin/src/views/index/**": true,
5
+ "public/**": true,
6
+ ".env*": true,
7
+ "view/*/public/**": true,
8
+ "view/*/.env*": true,
9
+ "addons/**": true,
10
+ "src/app/*/addons/**": true,
11
+ "view/*/src/addons/**": true
12
+ },
13
+ "mergeSource": {
14
+ "src/api/**/*.ts": "functions",
15
+ "src/utils/**/*.ts": "functions",
16
+ "src/helper/**/*.ts": "functions",
17
+ "src/decorators/index.ts": "exports",
18
+ "view/admin/src/store/module.ts": "exports",
19
+ "view/index/src/store/module.ts": "exports",
20
+ "view/admin/src/event/module.ts": "exports",
21
+ "view/admin/src/api/**/*.ts": "functions",
22
+ "view/admin/src/utils/**/*.ts": "functions",
23
+ "view/admin/src/helper/**/*.ts": "functions",
24
+ "view/index/src/api/**/*.ts": "functions",
25
+ "view/index/src/utils/**/*.ts": "functions",
26
+ "view/index/src/helper/**/*.ts": "functions",
27
+ "src/filter/index.ts": "exports"
28
+ }
29
+ }