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.
- package/LICENSE +21 -0
- package/README.md +302 -0
- package/dist/commands/clean.d.ts +10 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +215 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/config.d.ts +10 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +105 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +127 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +153 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +7 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +522 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/migrate.d.ts +7 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +137 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/projects.d.ts +7 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +126 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/repair.d.ts +7 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.js +256 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +172 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/unlink.d.ts +7 -0
- package/dist/commands/unlink.d.ts.map +1 -0
- package/dist/commands/unlink.js +104 -0
- package/dist/commands/unlink.js.map +1 -0
- package/dist/commands/verify.d.ts +7 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +190 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/codepac.d.ts +79 -0
- package/dist/core/codepac.d.ts.map +1 -0
- package/dist/core/codepac.js +188 -0
- package/dist/core/codepac.js.map +1 -0
- package/dist/core/config.d.ts +70 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +210 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/guard.d.ts +18 -0
- package/dist/core/guard.d.ts.map +1 -0
- package/dist/core/guard.js +82 -0
- package/dist/core/guard.js.map +1 -0
- package/dist/core/linker.d.ts +76 -0
- package/dist/core/linker.d.ts.map +1 -0
- package/dist/core/linker.js +263 -0
- package/dist/core/linker.js.map +1 -0
- package/dist/core/parser.d.ts +43 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +133 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/platform.d.ts +100 -0
- package/dist/core/platform.d.ts.map +1 -0
- package/dist/core/platform.js +193 -0
- package/dist/core/platform.js.map +1 -0
- package/dist/core/registry.d.ts +181 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +443 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/store.d.ts +77 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +226 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/transaction.d.ts +106 -0
- package/dist/core/transaction.d.ts.map +1 -0
- package/dist/core/transaction.js +295 -0
- package/dist/core/transaction.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +174 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +47 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/disk.d.ts +57 -0
- package/dist/utils/disk.d.ts.map +1 -0
- package/dist/utils/disk.js +313 -0
- package/dist/utils/disk.js.map +1 -0
- package/dist/utils/exit-codes.d.ts +42 -0
- package/dist/utils/exit-codes.d.ts.map +1 -0
- package/dist/utils/exit-codes.js +91 -0
- package/dist/utils/exit-codes.js.map +1 -0
- package/dist/utils/fs-utils.d.ts +44 -0
- package/dist/utils/fs-utils.d.ts.map +1 -0
- package/dist/utils/fs-utils.js +107 -0
- package/dist/utils/fs-utils.js.map +1 -0
- package/dist/utils/global-lock.d.ts +28 -0
- package/dist/utils/global-lock.d.ts.map +1 -0
- package/dist/utils/global-lock.js +89 -0
- package/dist/utils/global-lock.js.map +1 -0
- package/dist/utils/lock.d.ts +26 -0
- package/dist/utils/lock.d.ts.map +1 -0
- package/dist/utils/lock.js +68 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/logger.d.ts +98 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +190 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/prompt.d.ts +32 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +131 -0
- package/dist/utils/prompt.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 跨平台适配工具
|
|
3
|
+
*/
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
/**
|
|
7
|
+
* 支持的平台列表
|
|
8
|
+
*/
|
|
9
|
+
export const PLATFORM_OPTIONS = [
|
|
10
|
+
{ key: 'mac', value: 'macOS', asan: 'macOS-asan' },
|
|
11
|
+
{ key: 'win', value: 'Win' },
|
|
12
|
+
{ key: 'ios', value: 'iOS', asan: 'iOS-asan' },
|
|
13
|
+
{ key: 'android', value: 'android', asan: 'android-asan', hwasan: 'android-hwasan' },
|
|
14
|
+
{ key: 'linux', value: 'ubuntu' },
|
|
15
|
+
{ key: 'wasm', value: 'wasm' },
|
|
16
|
+
{ key: 'ohos', value: 'ohos' },
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* 通过 key 获取平台选项
|
|
20
|
+
*/
|
|
21
|
+
export function getPlatformOption(key) {
|
|
22
|
+
return PLATFORM_OPTIONS.find((p) => p.key === key);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 通过 value 获取平台选项
|
|
26
|
+
*/
|
|
27
|
+
export function getPlatformOptionByValue(value) {
|
|
28
|
+
return PLATFORM_OPTIONS.find((p) => p.value === value || p.asan === value || p.hwasan === value);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* key 转换为 value
|
|
32
|
+
*/
|
|
33
|
+
export function platformKeyToValue(key) {
|
|
34
|
+
return getPlatformOption(key)?.value;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 获取所有平台 keys
|
|
38
|
+
*/
|
|
39
|
+
export function getAllPlatformKeys() {
|
|
40
|
+
return PLATFORM_OPTIONS.map((p) => p.key);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 已知平台目录名列表 (用于多平台链接时识别平台子目录)
|
|
44
|
+
*/
|
|
45
|
+
export const KNOWN_PLATFORM_VALUES = [
|
|
46
|
+
'macOS', 'macOS-asan',
|
|
47
|
+
'Win',
|
|
48
|
+
'iOS', 'iOS-asan',
|
|
49
|
+
'android', 'android-asan', 'android-hwasan',
|
|
50
|
+
'ubuntu',
|
|
51
|
+
'wasm',
|
|
52
|
+
'ohos',
|
|
53
|
+
];
|
|
54
|
+
/**
|
|
55
|
+
* 获取配置目录路径 (固定位置)
|
|
56
|
+
* - macOS: ~/.tanmi-dock
|
|
57
|
+
* - Windows: %USERPROFILE%\.tanmi-dock
|
|
58
|
+
*/
|
|
59
|
+
export function getConfigDir() {
|
|
60
|
+
return path.join(os.homedir(), '.tanmi-dock');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 获取配置文件路径
|
|
64
|
+
*/
|
|
65
|
+
export function getConfigPath() {
|
|
66
|
+
return path.join(getConfigDir(), 'config.json');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 获取注册表文件路径
|
|
70
|
+
*/
|
|
71
|
+
export function getRegistryPath() {
|
|
72
|
+
return path.join(getConfigDir(), 'registry.json');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 获取当前平台
|
|
76
|
+
*/
|
|
77
|
+
export function getPlatform() {
|
|
78
|
+
return process.platform === 'win32' ? 'win' : 'mac';
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 判断是否为 Windows
|
|
82
|
+
*/
|
|
83
|
+
export function isWindows() {
|
|
84
|
+
return process.platform === 'win32';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 判断是否为 macOS
|
|
88
|
+
*/
|
|
89
|
+
export function isMacOS() {
|
|
90
|
+
return process.platform === 'darwin';
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 规范化路径分隔符
|
|
94
|
+
*/
|
|
95
|
+
export function normalizePath(p) {
|
|
96
|
+
return path.normalize(p);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 展开 ~ 为用户主目录
|
|
100
|
+
*/
|
|
101
|
+
export function expandHome(p) {
|
|
102
|
+
if (p.startsWith('~')) {
|
|
103
|
+
return path.join(os.homedir(), p.slice(1));
|
|
104
|
+
}
|
|
105
|
+
return p;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 收缩路径,将用户主目录替换为 ~
|
|
109
|
+
*/
|
|
110
|
+
export function shrinkHome(p) {
|
|
111
|
+
const home = os.homedir();
|
|
112
|
+
if (p.startsWith(home)) {
|
|
113
|
+
return '~' + p.slice(home.length);
|
|
114
|
+
}
|
|
115
|
+
return p;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 获取路径的绝对路径
|
|
119
|
+
*/
|
|
120
|
+
export function resolvePath(p) {
|
|
121
|
+
return path.resolve(expandHome(p));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 判断路径是否为绝对路径
|
|
125
|
+
*/
|
|
126
|
+
export function isAbsolutePath(p) {
|
|
127
|
+
return path.isAbsolute(p);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 连接路径
|
|
131
|
+
*/
|
|
132
|
+
export function joinPath(...parts) {
|
|
133
|
+
return path.join(...parts);
|
|
134
|
+
}
|
|
135
|
+
// ============ 路径安全验证 ============
|
|
136
|
+
/**
|
|
137
|
+
* 安全敏感目录(禁止作为 Store)
|
|
138
|
+
*/
|
|
139
|
+
const FORBIDDEN_PATHS_UNIX = ['/etc', '/usr', '/bin', '/sbin', '/var', '/tmp', '/root', '/System'];
|
|
140
|
+
const FORBIDDEN_PATHS_WIN = [
|
|
141
|
+
'C:\\Windows',
|
|
142
|
+
'C:\\Program Files',
|
|
143
|
+
'C:\\Program Files (x86)',
|
|
144
|
+
'C:\\ProgramData',
|
|
145
|
+
];
|
|
146
|
+
/**
|
|
147
|
+
* 检查路径是否安全
|
|
148
|
+
*/
|
|
149
|
+
export function isPathSafe(p) {
|
|
150
|
+
const resolved = path.resolve(expandHome(p));
|
|
151
|
+
const normalized = path.normalize(resolved);
|
|
152
|
+
// 获取当前平台的禁止路径列表
|
|
153
|
+
const forbiddenPaths = isWindows() ? FORBIDDEN_PATHS_WIN : FORBIDDEN_PATHS_UNIX;
|
|
154
|
+
// 检查是否包含路径遍历且指向敏感目录
|
|
155
|
+
if (p.includes('..')) {
|
|
156
|
+
for (const forbidden of forbiddenPaths) {
|
|
157
|
+
const forbiddenNorm = path.normalize(forbidden);
|
|
158
|
+
if (normalized === forbiddenNorm ||
|
|
159
|
+
normalized.startsWith(forbiddenNorm + path.sep) ||
|
|
160
|
+
normalized.toLowerCase() === forbiddenNorm.toLowerCase() ||
|
|
161
|
+
normalized.toLowerCase().startsWith(forbiddenNorm.toLowerCase() + path.sep)) {
|
|
162
|
+
return { safe: false, reason: `路径遍历指向系统敏感目录: ${forbidden}` };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// 检查是否直接指向敏感目录
|
|
167
|
+
for (const forbidden of forbiddenPaths) {
|
|
168
|
+
const forbiddenNorm = path.normalize(forbidden);
|
|
169
|
+
// 大小写不敏感比较(主要针对 Windows)
|
|
170
|
+
const normalizedLower = normalized.toLowerCase();
|
|
171
|
+
const forbiddenLower = forbiddenNorm.toLowerCase();
|
|
172
|
+
if (normalizedLower === forbiddenLower ||
|
|
173
|
+
normalizedLower.startsWith(forbiddenLower + path.sep.toLowerCase())) {
|
|
174
|
+
return { safe: false, reason: `不能使用系统目录: ${forbidden}` };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// 检查 /tmp(Unix 临时目录)
|
|
178
|
+
if (!isWindows() && (normalized === '/tmp' || normalized.startsWith('/tmp/'))) {
|
|
179
|
+
return { safe: false, reason: '不能使用系统临时目录: /tmp' };
|
|
180
|
+
}
|
|
181
|
+
return { safe: true };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 确保路径安全,不安全时抛出错误
|
|
185
|
+
*/
|
|
186
|
+
export function ensurePathSafe(p) {
|
|
187
|
+
const result = isPathSafe(p);
|
|
188
|
+
if (!result.safe) {
|
|
189
|
+
throw new Error(`[安全] ${result.reason}`);
|
|
190
|
+
}
|
|
191
|
+
return path.resolve(expandHome(p));
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/core/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import type { Registry, ProjectInfo, LibraryInfo, StoreEntry } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 注册表管理器
|
|
4
|
+
*/
|
|
5
|
+
declare class RegistryManager {
|
|
6
|
+
private static instance;
|
|
7
|
+
private registry;
|
|
8
|
+
private loaded;
|
|
9
|
+
private constructor();
|
|
10
|
+
static getInstance(): RegistryManager;
|
|
11
|
+
/**
|
|
12
|
+
* 加载注册表(支持懒加载,多次调用只加载一次)
|
|
13
|
+
*/
|
|
14
|
+
load(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* 强制重新加载(用于需要刷新数据的场景)
|
|
17
|
+
*/
|
|
18
|
+
reload(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* 检查注册表文件是否存在(轻量级,不加载完整数据)
|
|
21
|
+
*/
|
|
22
|
+
exists(): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* 获取统计信息(轻量级,只读取必要数据)
|
|
25
|
+
*/
|
|
26
|
+
getStats(): Promise<{
|
|
27
|
+
projectCount: number;
|
|
28
|
+
libraryCount: number;
|
|
29
|
+
totalSize: number;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* 检查是否已加载
|
|
33
|
+
*/
|
|
34
|
+
isLoaded(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* 保存注册表(带文件锁保护)
|
|
37
|
+
*/
|
|
38
|
+
save(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* 确保已加载
|
|
41
|
+
*/
|
|
42
|
+
private ensureLoaded;
|
|
43
|
+
/**
|
|
44
|
+
* 获取项目信息
|
|
45
|
+
*/
|
|
46
|
+
getProject(pathHash: string): ProjectInfo | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* 通过路径获取项目
|
|
49
|
+
*/
|
|
50
|
+
getProjectByPath(path: string): ProjectInfo | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* 添加项目
|
|
53
|
+
*/
|
|
54
|
+
addProject(info: ProjectInfo): void;
|
|
55
|
+
/**
|
|
56
|
+
* 更新项目
|
|
57
|
+
*/
|
|
58
|
+
updateProject(pathHash: string, updates: Partial<ProjectInfo>): void;
|
|
59
|
+
/**
|
|
60
|
+
* 移除项目
|
|
61
|
+
*/
|
|
62
|
+
removeProject(pathHash: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* 列出所有项目
|
|
65
|
+
*/
|
|
66
|
+
listProjects(): ProjectInfo[];
|
|
67
|
+
/**
|
|
68
|
+
* 获取库 key
|
|
69
|
+
*/
|
|
70
|
+
getLibraryKey(libName: string, commit: string): string;
|
|
71
|
+
/**
|
|
72
|
+
* 获取库信息
|
|
73
|
+
*/
|
|
74
|
+
getLibrary(key: string): LibraryInfo | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* 添加库
|
|
77
|
+
*/
|
|
78
|
+
addLibrary(info: LibraryInfo): void;
|
|
79
|
+
/**
|
|
80
|
+
* 更新库
|
|
81
|
+
*/
|
|
82
|
+
updateLibrary(key: string, updates: Partial<LibraryInfo>): void;
|
|
83
|
+
/**
|
|
84
|
+
* 移除库
|
|
85
|
+
*/
|
|
86
|
+
removeLibrary(key: string): void;
|
|
87
|
+
/**
|
|
88
|
+
* 列出所有库
|
|
89
|
+
*/
|
|
90
|
+
listLibraries(): LibraryInfo[];
|
|
91
|
+
/**
|
|
92
|
+
* 获取无引用的库
|
|
93
|
+
*/
|
|
94
|
+
getUnreferencedLibraries(): LibraryInfo[];
|
|
95
|
+
/**
|
|
96
|
+
* 获取 Store key (lib:commit:platform)
|
|
97
|
+
*/
|
|
98
|
+
getStoreKey(libName: string, commit: string, platform: string): string;
|
|
99
|
+
/**
|
|
100
|
+
* 获取 Store 条目
|
|
101
|
+
*/
|
|
102
|
+
getStore(key: string): StoreEntry | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* 添加 Store 条目
|
|
105
|
+
*/
|
|
106
|
+
addStore(entry: StoreEntry): void;
|
|
107
|
+
/**
|
|
108
|
+
* 更新 Store 条目
|
|
109
|
+
*/
|
|
110
|
+
updateStore(key: string, updates: Partial<StoreEntry>): void;
|
|
111
|
+
/**
|
|
112
|
+
* 移除 Store 条目
|
|
113
|
+
*/
|
|
114
|
+
removeStore(key: string): void;
|
|
115
|
+
/**
|
|
116
|
+
* 列出所有 Store 条目
|
|
117
|
+
*/
|
|
118
|
+
listStores(): StoreEntry[];
|
|
119
|
+
/**
|
|
120
|
+
* 获取无引用的 Store 条目
|
|
121
|
+
*/
|
|
122
|
+
getUnreferencedStores(): StoreEntry[];
|
|
123
|
+
/**
|
|
124
|
+
* 获取可清理的 unused 库(无引用超过指定天数)
|
|
125
|
+
* @param unusedDays 无引用天数阈值
|
|
126
|
+
*/
|
|
127
|
+
getUnusedStores(unusedDays: number): StoreEntry[];
|
|
128
|
+
/**
|
|
129
|
+
* 获取无引用但未过期的库(供 status 显示)
|
|
130
|
+
* @param unusedDays 无引用天数阈值
|
|
131
|
+
*/
|
|
132
|
+
getPendingUnusedStores(unusedDays: number): Array<{
|
|
133
|
+
entry: StoreEntry;
|
|
134
|
+
daysLeft: number;
|
|
135
|
+
}>;
|
|
136
|
+
/**
|
|
137
|
+
* 添加 Store 引用(清除 unlinkedAt)
|
|
138
|
+
*/
|
|
139
|
+
addStoreReference(storeKey: string, projectHash: string): void;
|
|
140
|
+
/**
|
|
141
|
+
* 移除 Store 引用(设置 unlinkedAt)
|
|
142
|
+
*/
|
|
143
|
+
removeStoreReference(storeKey: string, projectHash: string): void;
|
|
144
|
+
/**
|
|
145
|
+
* 获取项目的 Store keys
|
|
146
|
+
*/
|
|
147
|
+
getProjectStoreKeys(projectHash: string): string[];
|
|
148
|
+
/**
|
|
149
|
+
* 添加引用
|
|
150
|
+
*/
|
|
151
|
+
addReference(libKey: string, projectHash: string): void;
|
|
152
|
+
/**
|
|
153
|
+
* 移除引用
|
|
154
|
+
*/
|
|
155
|
+
removeReference(libKey: string, projectHash: string): void;
|
|
156
|
+
/**
|
|
157
|
+
* 获取库的引用列表
|
|
158
|
+
*/
|
|
159
|
+
getLibraryReferences(libKey: string): string[];
|
|
160
|
+
/**
|
|
161
|
+
* 计算路径 hash
|
|
162
|
+
*/
|
|
163
|
+
hashPath(path: string): string;
|
|
164
|
+
/**
|
|
165
|
+
* 获取原始注册表对象
|
|
166
|
+
*/
|
|
167
|
+
getRaw(): Registry;
|
|
168
|
+
/**
|
|
169
|
+
* 清理过期项目(路径不存在的项目)
|
|
170
|
+
*/
|
|
171
|
+
cleanStaleProjects(): Promise<string[]>;
|
|
172
|
+
/**
|
|
173
|
+
* 清理失效的 Store 引用
|
|
174
|
+
* 检查所有 StoreEntry.usedBy 中的项目是否还存在
|
|
175
|
+
* @returns 被清理的引用数量
|
|
176
|
+
*/
|
|
177
|
+
cleanStaleReferences(): Promise<number>;
|
|
178
|
+
}
|
|
179
|
+
export declare function getRegistry(): RegistryManager;
|
|
180
|
+
export default RegistryManager;
|
|
181
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGxF;;GAEG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,eAAe;IAOrC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IA6B5F;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAKrD;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAKvD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAMnC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAQpE;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAarC;;OAEG;IACH,YAAY,IAAI,WAAW,EAAE;IAO7B;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAItD;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAKhD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAMnC;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAQ/D;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKhC;;OAEG;IACH,aAAa,IAAI,WAAW,EAAE;IAK9B;;OAEG;IACH,wBAAwB,IAAI,WAAW,EAAE;IAOzC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAItE;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAK7C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAMjC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAQ5D;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAK9B;;OAEG;IACH,UAAU,IAAI,UAAU,EAAE;IAK1B;;OAEG;IACH,qBAAqB,IAAI,UAAU,EAAE;IAKrC;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE;IAWjD;;;OAGG;IACH,sBAAsB,CACpB,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBjD;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAY9D;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAYjE;;OAEG;IACH,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE;IAWlD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAQvD;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAQ1D;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAO9C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI9B;;OAEG;IACH,MAAM,IAAI,QAAQ;IAKlB;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmB7C;;;;OAIG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;CAkC9C;AAGD,wBAAgB,WAAW,IAAI,eAAe,CAE7C;AAED,eAAe,eAAe,CAAC"}
|