tanmi-dock 0.4.0-beta.1

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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +302 -0
  3. package/dist/commands/clean.d.ts +10 -0
  4. package/dist/commands/clean.d.ts.map +1 -0
  5. package/dist/commands/clean.js +215 -0
  6. package/dist/commands/clean.js.map +1 -0
  7. package/dist/commands/config.d.ts +10 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +105 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +7 -0
  12. package/dist/commands/doctor.d.ts.map +1 -0
  13. package/dist/commands/doctor.js +127 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/init.d.ts +7 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +153 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/link.d.ts +7 -0
  20. package/dist/commands/link.d.ts.map +1 -0
  21. package/dist/commands/link.js +522 -0
  22. package/dist/commands/link.js.map +1 -0
  23. package/dist/commands/migrate.d.ts +7 -0
  24. package/dist/commands/migrate.d.ts.map +1 -0
  25. package/dist/commands/migrate.js +137 -0
  26. package/dist/commands/migrate.js.map +1 -0
  27. package/dist/commands/projects.d.ts +7 -0
  28. package/dist/commands/projects.d.ts.map +1 -0
  29. package/dist/commands/projects.js +126 -0
  30. package/dist/commands/projects.js.map +1 -0
  31. package/dist/commands/repair.d.ts +7 -0
  32. package/dist/commands/repair.d.ts.map +1 -0
  33. package/dist/commands/repair.js +256 -0
  34. package/dist/commands/repair.js.map +1 -0
  35. package/dist/commands/status.d.ts +7 -0
  36. package/dist/commands/status.d.ts.map +1 -0
  37. package/dist/commands/status.js +172 -0
  38. package/dist/commands/status.js.map +1 -0
  39. package/dist/commands/unlink.d.ts +7 -0
  40. package/dist/commands/unlink.d.ts.map +1 -0
  41. package/dist/commands/unlink.js +104 -0
  42. package/dist/commands/unlink.js.map +1 -0
  43. package/dist/commands/verify.d.ts +7 -0
  44. package/dist/commands/verify.d.ts.map +1 -0
  45. package/dist/commands/verify.js +190 -0
  46. package/dist/commands/verify.js.map +1 -0
  47. package/dist/core/codepac.d.ts +79 -0
  48. package/dist/core/codepac.d.ts.map +1 -0
  49. package/dist/core/codepac.js +188 -0
  50. package/dist/core/codepac.js.map +1 -0
  51. package/dist/core/config.d.ts +70 -0
  52. package/dist/core/config.d.ts.map +1 -0
  53. package/dist/core/config.js +210 -0
  54. package/dist/core/config.js.map +1 -0
  55. package/dist/core/guard.d.ts +18 -0
  56. package/dist/core/guard.d.ts.map +1 -0
  57. package/dist/core/guard.js +82 -0
  58. package/dist/core/guard.js.map +1 -0
  59. package/dist/core/linker.d.ts +76 -0
  60. package/dist/core/linker.d.ts.map +1 -0
  61. package/dist/core/linker.js +263 -0
  62. package/dist/core/linker.js.map +1 -0
  63. package/dist/core/parser.d.ts +43 -0
  64. package/dist/core/parser.d.ts.map +1 -0
  65. package/dist/core/parser.js +133 -0
  66. package/dist/core/parser.js.map +1 -0
  67. package/dist/core/platform.d.ts +100 -0
  68. package/dist/core/platform.d.ts.map +1 -0
  69. package/dist/core/platform.js +193 -0
  70. package/dist/core/platform.js.map +1 -0
  71. package/dist/core/registry.d.ts +181 -0
  72. package/dist/core/registry.d.ts.map +1 -0
  73. package/dist/core/registry.js +443 -0
  74. package/dist/core/registry.js.map +1 -0
  75. package/dist/core/store.d.ts +77 -0
  76. package/dist/core/store.d.ts.map +1 -0
  77. package/dist/core/store.js +226 -0
  78. package/dist/core/store.js.map +1 -0
  79. package/dist/core/transaction.d.ts +106 -0
  80. package/dist/core/transaction.d.ts.map +1 -0
  81. package/dist/core/transaction.js +295 -0
  82. package/dist/core/transaction.js.map +1 -0
  83. package/dist/index.d.ts +3 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +84 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/types/index.d.ts +174 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +47 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/dist/utils/disk.d.ts +57 -0
  92. package/dist/utils/disk.d.ts.map +1 -0
  93. package/dist/utils/disk.js +313 -0
  94. package/dist/utils/disk.js.map +1 -0
  95. package/dist/utils/exit-codes.d.ts +42 -0
  96. package/dist/utils/exit-codes.d.ts.map +1 -0
  97. package/dist/utils/exit-codes.js +91 -0
  98. package/dist/utils/exit-codes.js.map +1 -0
  99. package/dist/utils/fs-utils.d.ts +44 -0
  100. package/dist/utils/fs-utils.d.ts.map +1 -0
  101. package/dist/utils/fs-utils.js +107 -0
  102. package/dist/utils/fs-utils.js.map +1 -0
  103. package/dist/utils/global-lock.d.ts +28 -0
  104. package/dist/utils/global-lock.d.ts.map +1 -0
  105. package/dist/utils/global-lock.js +89 -0
  106. package/dist/utils/global-lock.js.map +1 -0
  107. package/dist/utils/lock.d.ts +26 -0
  108. package/dist/utils/lock.d.ts.map +1 -0
  109. package/dist/utils/lock.js +68 -0
  110. package/dist/utils/lock.js.map +1 -0
  111. package/dist/utils/logger.d.ts +98 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +190 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/prompt.d.ts +32 -0
  116. package/dist/utils/prompt.d.ts.map +1 -0
  117. package/dist/utils/prompt.js +131 -0
  118. package/dist/utils/prompt.js.map +1 -0
  119. package/package.json +73 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linker.d.ts","sourceRoot":"","sources":["../../src/core/linker.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMvE;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcpE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW9F;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,MAAM,UAAQ,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2CxB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,CAAC,CAkB5D;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Cf;;;;;;;;;;;;;;AAED,wBAYE"}
@@ -0,0 +1,263 @@
1
+ /**
2
+ * 符号链接操作
3
+ * - macOS: 使用 symlink
4
+ * - Windows: 使用 junction (无需管理员权限)
5
+ */
6
+ import fs from 'fs/promises';
7
+ import path from 'path';
8
+ import { isWindows, KNOWN_PLATFORM_VALUES } from './platform.js';
9
+ import { copyDir } from '../utils/fs-utils.js';
10
+ /**
11
+ * 创建符号链接
12
+ * @param target 目标路径(链接指向的位置)
13
+ * @param linkPath 链接路径(创建链接的位置)
14
+ */
15
+ export async function link(target, linkPath) {
16
+ // 确保父目录存在
17
+ const parentDir = path.dirname(linkPath);
18
+ await fs.mkdir(parentDir, { recursive: true });
19
+ // Windows 使用 junction,macOS 使用 dir 类型的 symlink
20
+ const type = isWindows() ? 'junction' : 'dir';
21
+ await fs.symlink(target, linkPath, type);
22
+ }
23
+ /**
24
+ * 检查路径是否为符号链接
25
+ */
26
+ export async function isSymlink(linkPath) {
27
+ try {
28
+ const stat = await fs.lstat(linkPath);
29
+ return stat.isSymbolicLink();
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ /**
36
+ * 读取符号链接目标
37
+ */
38
+ export async function readLink(linkPath) {
39
+ try {
40
+ return await fs.readlink(linkPath);
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ /**
47
+ * 删除符号链接
48
+ */
49
+ export async function unlink(linkPath) {
50
+ // 在 Windows 上,junction 需要用 rmdir 删除
51
+ // 但 fs.unlink 在 Node.js 中可以处理符号链接
52
+ try {
53
+ const stat = await fs.lstat(linkPath);
54
+ if (stat.isSymbolicLink()) {
55
+ await fs.unlink(linkPath);
56
+ }
57
+ }
58
+ catch {
59
+ // 链接不存在,忽略
60
+ }
61
+ }
62
+ /**
63
+ * 检查符号链接是否有效(目标存在)
64
+ */
65
+ export async function isValidLink(linkPath) {
66
+ try {
67
+ // lstat 检查链接本身是否存在
68
+ const lstat = await fs.lstat(linkPath);
69
+ if (!lstat.isSymbolicLink()) {
70
+ return false;
71
+ }
72
+ // stat 检查链接目标是否存在(会跟随链接)
73
+ await fs.stat(linkPath);
74
+ return true;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ /**
81
+ * 检查符号链接是否指向正确的目标
82
+ */
83
+ export async function isCorrectLink(linkPath, expectedTarget) {
84
+ const actualTarget = await readLink(linkPath);
85
+ if (!actualTarget) {
86
+ return false;
87
+ }
88
+ // 规范化路径后比较
89
+ const normalizedActual = path.resolve(path.dirname(linkPath), actualTarget);
90
+ const normalizedExpected = path.resolve(expectedTarget);
91
+ return normalizedActual === normalizedExpected;
92
+ }
93
+ /**
94
+ * 将普通目录替换为符号链接
95
+ * @param dirPath 要替换的目录路径
96
+ * @param target 链接目标
97
+ * @param backup 是否备份原目录(默认删除)
98
+ * @returns 备份路径(如果有)
99
+ */
100
+ export async function replaceWithLink(dirPath, target, backup = false) {
101
+ // 检查是否已经是正确的链接
102
+ if (await isCorrectLink(dirPath, target)) {
103
+ return null;
104
+ }
105
+ // 如果是链接但指向错误,先删除
106
+ if (await isSymlink(dirPath)) {
107
+ await unlink(dirPath);
108
+ await link(target, dirPath);
109
+ return null;
110
+ }
111
+ // 检查目录是否存在
112
+ try {
113
+ const stat = await fs.lstat(dirPath);
114
+ if (!stat.isDirectory()) {
115
+ throw new Error(`路径不是目录: ${dirPath}`);
116
+ }
117
+ }
118
+ catch (err) {
119
+ if (err.code === 'ENOENT') {
120
+ // 目录不存在,直接创建链接
121
+ await link(target, dirPath);
122
+ return null;
123
+ }
124
+ throw err;
125
+ }
126
+ let backupPath = null;
127
+ if (backup) {
128
+ // 备份目录
129
+ backupPath = `${dirPath}.backup.${Date.now()}`;
130
+ await fs.rename(dirPath, backupPath);
131
+ }
132
+ else {
133
+ // 删除目录
134
+ await fs.rm(dirPath, { recursive: true, force: true });
135
+ }
136
+ // 创建链接
137
+ await link(target, dirPath);
138
+ return backupPath;
139
+ }
140
+ /**
141
+ * 将符号链接还原为普通目录(从目标复制内容)
142
+ */
143
+ export async function restoreFromLink(linkPath) {
144
+ const target = await readLink(linkPath);
145
+ if (!target) {
146
+ throw new Error(`不是符号链接: ${linkPath}`);
147
+ }
148
+ // 获取绝对目标路径
149
+ const absoluteTarget = path.resolve(path.dirname(linkPath), target);
150
+ // 删除链接
151
+ await unlink(linkPath);
152
+ // 复制目标内容(保留符号链接)
153
+ await copyDir(absoluteTarget, linkPath, { preserveSymlinks: true });
154
+ }
155
+ /**
156
+ * 检查路径状态
157
+ */
158
+ export async function getPathStatus(localPath, expectedTarget) {
159
+ try {
160
+ const lstat = await fs.lstat(localPath);
161
+ if (lstat.isSymbolicLink()) {
162
+ const isCorrect = await isCorrectLink(localPath, expectedTarget);
163
+ return isCorrect ? 'linked' : 'wrong_link';
164
+ }
165
+ if (lstat.isDirectory()) {
166
+ return 'directory';
167
+ }
168
+ // 其他情况视为 missing
169
+ return 'missing';
170
+ }
171
+ catch {
172
+ return 'missing';
173
+ }
174
+ }
175
+ /**
176
+ * 链接库到项目(自动选择单平台/多平台策略)
177
+ * @param localPath 本地路径 (3rdparty/libXxx)
178
+ * @param storePath Store 根路径
179
+ * @param libName 库名
180
+ * @param commit commit hash
181
+ * @param platforms 选择的平台列表
182
+ */
183
+ export async function linkLibrary(localPath, storePath, libName, commit, platforms) {
184
+ if (platforms.length === 0) {
185
+ throw new Error('至少需要一个平台');
186
+ }
187
+ if (platforms.length === 1) {
188
+ // 单平台:直接链接到平台目录
189
+ const target = path.join(storePath, libName, commit, platforms[0]);
190
+ await replaceWithLink(localPath, target);
191
+ }
192
+ else {
193
+ // 多平台:调用组合链接(3-2 实现)
194
+ await linkMultiPlatform(localPath, storePath, libName, commit, platforms);
195
+ }
196
+ }
197
+ /**
198
+ * 多平台组合链接
199
+ * 创建真实目录,内部分别链接各平台内容和共享内容
200
+ * @param localPath 本地路径
201
+ * @param storePath Store 根路径
202
+ * @param libName 库名
203
+ * @param commit commit hash
204
+ * @param platforms 平台列表
205
+ */
206
+ export async function linkMultiPlatform(localPath, storePath, libName, commit, platforms) {
207
+ // 1. 删除旧链接/目录,创建真实目录
208
+ await fs.rm(localPath, { recursive: true, force: true });
209
+ await fs.mkdir(localPath, { recursive: true });
210
+ // 2. 取第一个平台作为共享内容来源
211
+ const primaryPlatform = platforms[0];
212
+ const primaryPath = path.join(storePath, libName, commit, primaryPlatform);
213
+ // 3. 遍历主平台目录内容
214
+ const entries = await fs.readdir(primaryPath, { withFileTypes: true });
215
+ for (const entry of entries) {
216
+ const linkPath = path.join(localPath, entry.name);
217
+ if (KNOWN_PLATFORM_VALUES.includes(entry.name)) {
218
+ // 平台目录:检查是否在选择列表中
219
+ if (platforms.includes(entry.name)) {
220
+ // 链接到对应 store 平台目录下的平台子目录
221
+ const target = path.join(storePath, libName, commit, entry.name, entry.name);
222
+ await link(target, linkPath);
223
+ }
224
+ }
225
+ else {
226
+ // 共享内容:链接到主平台
227
+ const target = path.join(primaryPath, entry.name);
228
+ await link(target, linkPath);
229
+ }
230
+ }
231
+ // 4. 链接其他平台的平台目录(如果主平台没有)
232
+ for (const platform of platforms.slice(1)) {
233
+ if (!KNOWN_PLATFORM_VALUES.includes(platform))
234
+ continue;
235
+ const linkPath = path.join(localPath, platform);
236
+ // 如果还没链接(主平台可能已处理)
237
+ if (!(await isSymlink(linkPath))) {
238
+ const platformPath = path.join(storePath, libName, commit, platform, platform);
239
+ // 检查目标是否存在
240
+ try {
241
+ await fs.access(platformPath);
242
+ await link(platformPath, linkPath);
243
+ }
244
+ catch {
245
+ // 目标不存在,跳过
246
+ }
247
+ }
248
+ }
249
+ }
250
+ export default {
251
+ link,
252
+ isSymlink,
253
+ readLink,
254
+ unlink,
255
+ isValidLink,
256
+ isCorrectLink,
257
+ replaceWithLink,
258
+ restoreFromLink,
259
+ getPathStatus,
260
+ linkLibrary,
261
+ linkMultiPlatform,
262
+ };
263
+ //# sourceMappingURL=linker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linker.js","sourceRoot":"","sources":["../../src/core/linker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { CodepacDep, ParsedDependency } from '../types/index.js';
2
+ /**
3
+ * 查找 codepac 配置文件
4
+ * @param projectPath 项目路径
5
+ * @returns 配置文件路径,不存在返回 null
6
+ */
7
+ export declare function findCodepacConfig(projectPath: string): Promise<string | null>;
8
+ /**
9
+ * 解析 codepac-dep.json 配置文件
10
+ * @param configPath 配置文件路径
11
+ * @returns 解析后的配置对象
12
+ * @throws 文件不存在或格式错误时抛出异常
13
+ */
14
+ export declare function parseCodepacDep(configPath: string): Promise<CodepacDep>;
15
+ /**
16
+ * 从配置中提取依赖列表
17
+ * @param config 配置对象
18
+ * @returns 依赖列表
19
+ */
20
+ export declare function extractDependencies(config: CodepacDep): ParsedDependency[];
21
+ /**
22
+ * 解析项目依赖(便捷方法)
23
+ * @param projectPath 项目路径
24
+ * @returns 依赖列表和配置路径
25
+ * @throws 找不到配置文件或解析失败时抛出异常
26
+ */
27
+ export declare function parseProjectDependencies(projectPath: string): Promise<{
28
+ dependencies: ParsedDependency[];
29
+ configPath: string;
30
+ }>;
31
+ /**
32
+ * 获取配置文件相对于项目的路径
33
+ */
34
+ export declare function getRelativeConfigPath(projectPath: string, configPath: string): string;
35
+ declare const _default: {
36
+ findCodepacConfig: typeof findCodepacConfig;
37
+ parseCodepacDep: typeof parseCodepacDep;
38
+ extractDependencies: typeof extractDependencies;
39
+ parseProjectDependencies: typeof parseProjectDependencies;
40
+ getRelativeConfigPath: typeof getRelativeConfigPath;
41
+ };
42
+ export default _default;
43
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAYtE;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWnF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAoB7E;AA6CD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,gBAAgB,EAAE,CAQ1E;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAWnE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAErF;;;;;;;;AAED,wBAME"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * codepac-dep.json 解析器
3
+ */
4
+ import fs from 'fs/promises';
5
+ import path from 'path';
6
+ /**
7
+ * codepac 配置文件名
8
+ */
9
+ const CONFIG_FILENAME = 'codepac-dep.json';
10
+ /**
11
+ * 搜索配置文件的目录列表
12
+ */
13
+ const SEARCH_DIRS = ['3rdparty', '.'];
14
+ /**
15
+ * 查找 codepac 配置文件
16
+ * @param projectPath 项目路径
17
+ * @returns 配置文件路径,不存在返回 null
18
+ */
19
+ export async function findCodepacConfig(projectPath) {
20
+ for (const dir of SEARCH_DIRS) {
21
+ const configPath = path.join(projectPath, dir, CONFIG_FILENAME);
22
+ try {
23
+ await fs.access(configPath);
24
+ return configPath;
25
+ }
26
+ catch {
27
+ // 继续搜索
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+ /**
33
+ * 解析 codepac-dep.json 配置文件
34
+ * @param configPath 配置文件路径
35
+ * @returns 解析后的配置对象
36
+ * @throws 文件不存在或格式错误时抛出异常
37
+ */
38
+ export async function parseCodepacDep(configPath) {
39
+ let content;
40
+ try {
41
+ content = await fs.readFile(configPath, 'utf-8');
42
+ }
43
+ catch (_err) {
44
+ throw new Error(`无法读取配置文件: ${configPath}`);
45
+ }
46
+ let config;
47
+ try {
48
+ config = JSON.parse(content);
49
+ }
50
+ catch {
51
+ throw new Error(`配置文件格式错误 (JSON 解析失败): ${configPath}`);
52
+ }
53
+ // 验证配置结构
54
+ validateCodepacDep(config, configPath);
55
+ return config;
56
+ }
57
+ /**
58
+ * 验证 codepac-dep.json 配置结构
59
+ */
60
+ function validateCodepacDep(config, configPath) {
61
+ if (!config || typeof config !== 'object') {
62
+ throw new Error(`配置文件格式错误: 期望对象类型 (${configPath})`);
63
+ }
64
+ const obj = config;
65
+ // 验证 version
66
+ if (typeof obj.version !== 'string') {
67
+ throw new Error(`配置文件格式错误: 缺少 version 字段 (${configPath})`);
68
+ }
69
+ // 验证 repos
70
+ if (!obj.repos || typeof obj.repos !== 'object') {
71
+ throw new Error(`配置文件格式错误: 缺少 repos 字段 (${configPath})`);
72
+ }
73
+ const repos = obj.repos;
74
+ if (!Array.isArray(repos.common)) {
75
+ throw new Error(`配置文件格式错误: repos.common 必须是数组 (${configPath})`);
76
+ }
77
+ // 验证每个 repo 配置
78
+ for (let i = 0; i < repos.common.length; i++) {
79
+ const repo = repos.common[i];
80
+ if (!repo || typeof repo !== 'object') {
81
+ throw new Error(`配置文件格式错误: repos.common[${i}] 必须是对象 (${configPath})`);
82
+ }
83
+ const required = ['url', 'commit', 'branch', 'dir'];
84
+ for (const field of required) {
85
+ if (typeof repo[field] !== 'string') {
86
+ throw new Error(`配置文件格式错误: repos.common[${i}].${field} 必须是字符串 (${configPath})`);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * 从配置中提取依赖列表
93
+ * @param config 配置对象
94
+ * @returns 依赖列表
95
+ */
96
+ export function extractDependencies(config) {
97
+ return config.repos.common.map((repo) => ({
98
+ libName: repo.dir,
99
+ commit: repo.commit,
100
+ branch: repo.branch,
101
+ url: repo.url,
102
+ sparse: repo.sparse,
103
+ }));
104
+ }
105
+ /**
106
+ * 解析项目依赖(便捷方法)
107
+ * @param projectPath 项目路径
108
+ * @returns 依赖列表和配置路径
109
+ * @throws 找不到配置文件或解析失败时抛出异常
110
+ */
111
+ export async function parseProjectDependencies(projectPath) {
112
+ const configPath = await findCodepacConfig(projectPath);
113
+ if (!configPath) {
114
+ throw new Error(`找不到 codepac-dep.json 配置文件,已搜索: ${SEARCH_DIRS.join(', ')}`);
115
+ }
116
+ const config = await parseCodepacDep(configPath);
117
+ const dependencies = extractDependencies(config);
118
+ return { dependencies, configPath };
119
+ }
120
+ /**
121
+ * 获取配置文件相对于项目的路径
122
+ */
123
+ export function getRelativeConfigPath(projectPath, configPath) {
124
+ return path.relative(projectPath, configPath);
125
+ }
126
+ export default {
127
+ findCodepacConfig,
128
+ parseCodepacDep,
129
+ extractDependencies,
130
+ parseProjectDependencies,
131
+ getRelativeConfigPath,
132
+ };
133
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import type { Platform } from '../types/index.js';
2
+ /**
3
+ * 平台选项定义
4
+ */
5
+ export interface PlatformOption {
6
+ key: string;
7
+ value: string;
8
+ asan?: string;
9
+ hwasan?: string;
10
+ }
11
+ /**
12
+ * 支持的平台列表
13
+ */
14
+ export declare const PLATFORM_OPTIONS: PlatformOption[];
15
+ /**
16
+ * 通过 key 获取平台选项
17
+ */
18
+ export declare function getPlatformOption(key: string): PlatformOption | undefined;
19
+ /**
20
+ * 通过 value 获取平台选项
21
+ */
22
+ export declare function getPlatformOptionByValue(value: string): PlatformOption | undefined;
23
+ /**
24
+ * key 转换为 value
25
+ */
26
+ export declare function platformKeyToValue(key: string): string | undefined;
27
+ /**
28
+ * 获取所有平台 keys
29
+ */
30
+ export declare function getAllPlatformKeys(): string[];
31
+ /**
32
+ * 已知平台目录名列表 (用于多平台链接时识别平台子目录)
33
+ */
34
+ export declare const KNOWN_PLATFORM_VALUES: string[];
35
+ /**
36
+ * 获取配置目录路径 (固定位置)
37
+ * - macOS: ~/.tanmi-dock
38
+ * - Windows: %USERPROFILE%\.tanmi-dock
39
+ */
40
+ export declare function getConfigDir(): string;
41
+ /**
42
+ * 获取配置文件路径
43
+ */
44
+ export declare function getConfigPath(): string;
45
+ /**
46
+ * 获取注册表文件路径
47
+ */
48
+ export declare function getRegistryPath(): string;
49
+ /**
50
+ * 获取当前平台
51
+ */
52
+ export declare function getPlatform(): Platform;
53
+ /**
54
+ * 判断是否为 Windows
55
+ */
56
+ export declare function isWindows(): boolean;
57
+ /**
58
+ * 判断是否为 macOS
59
+ */
60
+ export declare function isMacOS(): boolean;
61
+ /**
62
+ * 规范化路径分隔符
63
+ */
64
+ export declare function normalizePath(p: string): string;
65
+ /**
66
+ * 展开 ~ 为用户主目录
67
+ */
68
+ export declare function expandHome(p: string): string;
69
+ /**
70
+ * 收缩路径,将用户主目录替换为 ~
71
+ */
72
+ export declare function shrinkHome(p: string): string;
73
+ /**
74
+ * 获取路径的绝对路径
75
+ */
76
+ export declare function resolvePath(p: string): string;
77
+ /**
78
+ * 判断路径是否为绝对路径
79
+ */
80
+ export declare function isAbsolutePath(p: string): boolean;
81
+ /**
82
+ * 连接路径
83
+ */
84
+ export declare function joinPath(...parts: string[]): string;
85
+ /**
86
+ * 路径安全检查结果
87
+ */
88
+ export interface PathSafetyResult {
89
+ safe: boolean;
90
+ reason?: string;
91
+ }
92
+ /**
93
+ * 检查路径是否安全
94
+ */
95
+ export declare function isPathSafe(p: string): PathSafetyResult;
96
+ /**
97
+ * 确保路径安全,不安全时抛出错误
98
+ */
99
+ export declare function ensurePathSafe(p: string): string;
100
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/core/platform.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIlD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAQ5C,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEzE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAIlF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAQzC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEnD;AAeD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA2CtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAMhD"}