dsh-plugin-manager-companion 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/LICENSE +21 -0
- package/README.en.md +144 -0
- package/README.md +142 -0
- package/cordis.patch.yml +9 -0
- package/dist/about.d.ts +77 -0
- package/dist/about.js +179 -0
- package/dist/cli.d.ts +226 -0
- package/dist/cli.js +856 -0
- package/dist/client/AboutPage.d.ts +75 -0
- package/dist/client/ConsolePage.d.ts +79 -0
- package/dist/client/KindsPage.d.ts +21 -0
- package/dist/client/MarketplacePage.d.ts +36 -0
- package/dist/client/OfficialSlots.d.ts +35 -0
- package/dist/client/UpgradeRow.d.ts +108 -0
- package/dist/client/index.d.ts +26 -0
- package/dist/client/locales.d.ts +475 -0
- package/dist/client/pmSelect.d.ts +38 -0
- package/dist/client/shared.d.ts +928 -0
- package/dist/client/upgradeView.d.ts +278 -0
- package/dist/client/wire.d.ts +401 -0
- package/dist/client.js +9194 -0
- package/dist/diagnostics.d.ts +332 -0
- package/dist/diagnostics.js +2631 -0
- package/dist/envManager.d.ts +1047 -0
- package/dist/envManager.js +3214 -0
- package/dist/fix.d.ts +60 -0
- package/dist/fix.js +168 -0
- package/dist/guard.d.ts +133 -0
- package/dist/guard.js +232 -0
- package/dist/index.d.ts +121 -0
- package/dist/index.js +1150 -0
- package/dist/installSession.d.ts +111 -0
- package/dist/installSession.js +150 -0
- package/dist/kinds.d.ts +464 -0
- package/dist/kinds.js +1029 -0
- package/dist/marketView.d.ts +261 -0
- package/dist/marketView.js +406 -0
- package/dist/marketplace.d.ts +248 -0
- package/dist/marketplace.js +500 -0
- package/dist/match.d.ts +67 -0
- package/dist/match.js +203 -0
- package/dist/net.d.ts +108 -0
- package/dist/net.js +163 -0
- package/dist/official.d.ts +145 -0
- package/dist/official.js +205 -0
- package/dist/paths.d.ts +108 -0
- package/dist/paths.js +236 -0
- package/dist/presets.d.ts +299 -0
- package/dist/presets.js +578 -0
- package/dist/qualityGate.d.ts +66 -0
- package/dist/qualityGate.js +247 -0
- package/dist/rank.d.ts +88 -0
- package/dist/rank.js +164 -0
- package/dist/registry.d.ts +295 -0
- package/dist/registry.js +686 -0
- package/dist/rest.d.ts +122 -0
- package/dist/rest.js +219 -0
- package/dist/scan.d.ts +134 -0
- package/dist/scan.js +396 -0
- package/dist/settings.d.ts +447 -0
- package/dist/settings.js +263 -0
- package/dist/tags.d.ts +119 -0
- package/dist/tags.js +166 -0
- package/dist/tools.d.ts +131 -0
- package/dist/tools.js +377 -0
- package/dist/types.d.ts +651 -0
- package/dist/types.js +13 -0
- package/dist/upgrade.d.ts +428 -0
- package/dist/upgrade.js +1100 -0
- package/dist/upgradeView.d.ts +313 -0
- package/dist/upgradeView.js +273 -0
- package/docs/images/readme/01-console-health.png +0 -0
- package/docs/images/readme/02-console-envs.png +0 -0
- package/docs/images/readme/03-marketplace.png +0 -0
- package/docs/images/readme/04-official-plugin-page.png +0 -0
- package/package.json +104 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 诊断引擎 — 对本地 DSH 环境做五层只读分析(环境控制台的核心)。
|
|
3
|
+
*
|
|
4
|
+
* 归属:A 类·重写(旧 src/analyze.ts 只作**检测清单**意图参考,未复制任何代码)。
|
|
5
|
+
* 旧实现参考:dsh-web-plugin-manager/src/analyze.ts(检测哪些问题)、
|
|
6
|
+
* src/installFlow.ts#qualityIssues(安装前质量门的检查面)。
|
|
7
|
+
* 旧扫描器是"正则 + 手工剥注释":被注释掉的 new Service(ctx, 'x') 会被算成真实注册(误报),
|
|
8
|
+
* 字符串里的 from 'x' 会被算成 import,正则字面量里的双斜杠会把整行代码当注释吞掉(漏报)。
|
|
9
|
+
* 本模块改为**逐字符词法扫描**:只在代码位置识别 import/export/require 关键字与调用实参,
|
|
10
|
+
* 注释与字符串字面量在词法阶段就被跳过,行号由扫描器直接给出,不做事后回找。
|
|
11
|
+
* 官方复用:@deepseek-ai/dsh-app-boot 的 loadProfileDirectory / composeEntries
|
|
12
|
+
* (patch 层栈与合并语义的唯一权威口径)、@deepseek-ai/dsh-host-plugin-inventory
|
|
13
|
+
* (运行时 fiber 事实,经 official.ts 的 readRuntimeInventory 降级封装)、
|
|
14
|
+
* Node 的 createRequire 真实解析(只用于判定"能解析";判定"不能解析"走文件与 exports 探测)。
|
|
15
|
+
*
|
|
16
|
+
* 解析根(2026-09-19 修复的误报根因):一个 profile 只装自己的依赖,官方包(@deepseek-ai/*)
|
|
17
|
+
* 与 bundle 本体都不在 profile 的 node_modules 里,它们由**安装锚点**提供。只按
|
|
18
|
+
* profile 目录解析会把官方包的每一行都判成孤儿(实测干净环境 163 条 orphan-row 全部是误报)。
|
|
19
|
+
* 因此解析根纳入 ctx.get('profileContext').installAnchor,口径与官方 profile.ts 的
|
|
20
|
+
* packageDirFromAnchor 一致:createRequire(anchor).resolve.paths(name),先 realpath 锚点
|
|
21
|
+
* (pnpm 的 bin shim 路径不是安装目录的兄弟目录,不 realpath 会一个包都解析不到)。
|
|
22
|
+
* 锚点拿不到时退回 profile 解析并在 skipped 里如实说明,绝不静默当成"包不存在"。
|
|
23
|
+
* 前提检查:旧实现的前提是"官方只有只读清单,所以诊断必须自己扫 patch 文本、自己猜绑定关系"。
|
|
24
|
+
* 0.1.6 之后该前提消失:官方提供 composeEntries(与 boot 同一次 applyEntryPatches 调用)与
|
|
25
|
+
* readPluginInventory。自己再实现一遍 patch 合并只会与官方漂移,因此事实来源是
|
|
26
|
+
* **官方优先、静态兜底、缺失记 skipped**,绝不假装健康。
|
|
27
|
+
*
|
|
28
|
+
* 五层,逐层独立可跳过(能力缺失时写入 report.skipped 并给原因):
|
|
29
|
+
* L1 dependency — import 图 × package.json 声明 × loader 提供项
|
|
30
|
+
* L2 composition — patch 层栈的行 id / 禁用 / 孤立行(只读,保留原始行号)
|
|
31
|
+
* L3 runtime — loader fiber 相位 + 源码注册名冲突
|
|
32
|
+
* L4 consistency — 官方 inventory × 本地 manifest
|
|
33
|
+
* L5 ecosystem — 市场索引(默认关闭;本模块只留最小骨架,索引归市场模块)
|
|
34
|
+
*
|
|
35
|
+
* 本模块不写任何文件、不调 pnpm、不注册服务。
|
|
36
|
+
*/
|
|
37
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
38
|
+
import type { CompanionConfig, DiagnosticsConfig } from './settings.ts';
|
|
39
|
+
import type { DiagnosticGroup, DiagnosticIssue, DiagnosticReport, EnvironmentInfo } from './types.ts';
|
|
40
|
+
/**
|
|
41
|
+
* 官方包里允许作为**普通 dependencies** 声明的那几个。
|
|
42
|
+
*
|
|
43
|
+
* 理由(沿用前身仓库审计结论,此处只记录事实):这两个包的模块身份不敏感——
|
|
44
|
+
* schemastery 的校验错误走 Symbol.for('ValidationError') 全局符号,schema 本身是纯闭包;
|
|
45
|
+
* cosmokit 是无模块级可变状态的工具集。其余 @deepseek-ai/* 一旦以普通依赖落进 profile,
|
|
46
|
+
* pnpm 会装出第二份拷贝,loader 从 profile 目录解析官方行时就会用到它,
|
|
47
|
+
* 唯一符号与类身份随之分裂,运行时报 "Cannot read properties of undefined" 这类错。
|
|
48
|
+
*/
|
|
49
|
+
export declare const OFFICIAL_DEP_ALLOWED: ReadonlySet<string>;
|
|
50
|
+
/**
|
|
51
|
+
* 说明符是否由 loader / 平台提供(不需要在包里声明)。
|
|
52
|
+
* @param spec - 裸说明符。
|
|
53
|
+
* @returns 是否由平台提供。
|
|
54
|
+
*/
|
|
55
|
+
export declare function isLoaderProvided(spec: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* 本模块会产出的修复动作标识(host 端据此分派,是闭集)。
|
|
58
|
+
*
|
|
59
|
+
* wire 契约见 src/types.ts 的 DiagnosticFix.action(那里是 string);
|
|
60
|
+
* host 的 switch 应当覆盖全部取值。
|
|
61
|
+
*/
|
|
62
|
+
export type DiagnosticFixAction = 'remove-duplicate-row' | 'enable-row' | 'remove-official-copy' | 'remove-row' | 'install-provider' | 'install-dependency' | 'disable-row';
|
|
63
|
+
/** 一次源码扫描给出的命名注册点。 */
|
|
64
|
+
export interface RegistrationHit {
|
|
65
|
+
readonly name: string;
|
|
66
|
+
readonly file: string;
|
|
67
|
+
readonly line: number;
|
|
68
|
+
}
|
|
69
|
+
/** import / require / re-export 的一处说明符。 */
|
|
70
|
+
export interface ScannedImport {
|
|
71
|
+
readonly spec: string;
|
|
72
|
+
readonly file: string;
|
|
73
|
+
readonly line: number;
|
|
74
|
+
readonly kind: 'static' | 'dynamic' | 're-export' | 'require';
|
|
75
|
+
}
|
|
76
|
+
/** 一个包完整扫描的结果。 */
|
|
77
|
+
export interface PackageScan {
|
|
78
|
+
readonly imports: readonly ScannedImport[];
|
|
79
|
+
readonly services: readonly RegistrationHit[];
|
|
80
|
+
readonly injects: readonly RegistrationHit[];
|
|
81
|
+
readonly tools: readonly RegistrationHit[];
|
|
82
|
+
readonly sections: readonly RegistrationHit[];
|
|
83
|
+
readonly routes: readonly RegistrationHit[];
|
|
84
|
+
readonly entryFiles: readonly string[];
|
|
85
|
+
readonly filesScanned: number;
|
|
86
|
+
/** 命中上限时为 true(结果不完整,调用方必须如实标注)。 */
|
|
87
|
+
readonly truncated: boolean;
|
|
88
|
+
/** 无法扫描时的原因(没有入口、manifest 不可读等)。 */
|
|
89
|
+
readonly reason?: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 诊断目标环境:EnvironmentInfo 加上可选的安装锚点。
|
|
93
|
+
*
|
|
94
|
+
* 锚点不是"环境的事实"而是**启动这次诊断的 dsh 安装**的事实,所以调用方可以在环境对象上
|
|
95
|
+
* 原样透传(EnvironmentInfo 兼容这个类型);不传时引擎自己从 ctx.get('profileContext') 取。
|
|
96
|
+
* 两种来源都没有时按"没有锚点"处理并记 skipped,绝不静默当成"包不存在"。
|
|
97
|
+
*/
|
|
98
|
+
export interface DiagnosticTargetEnvironment extends EnvironmentInfo {
|
|
99
|
+
/** 启动这次诊断的 dsh 安装的 package.json 绝对路径(官方 ProfileContext.installAnchor)。 */
|
|
100
|
+
readonly installAnchor?: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 对一个环境做完整诊断。
|
|
104
|
+
*
|
|
105
|
+
* 五层依次执行,任何一层失败只影响它自己:该层的失败原因写进 report.skipped,
|
|
106
|
+
* 其余层照常产出。函数本身不抛错——诊断工具把异常抛给 UI 只能得到白屏。
|
|
107
|
+
*
|
|
108
|
+
* @param ctx - host 上下文;只用 ctx.get()(官方能力探测)与 ctx.logger。
|
|
109
|
+
* @param env - 被诊断环境(EnvironmentInfo,来自环境列表)。
|
|
110
|
+
* @param config - 本插件配置;同时接受 CompanionConfig 与单独的 diagnostics 段。
|
|
111
|
+
* @returns 报告:分层问题数 + 按 code/作用域聚合的组 + 逐条问题清单 + 跳过项。
|
|
112
|
+
*/
|
|
113
|
+
export declare function analyzeEnvironment(ctx: Context, env: DiagnosticTargetEnvironment, config: CompanionConfig | DiagnosticsConfig): Promise<DiagnosticReport>;
|
|
114
|
+
export type { DiagnosticGroup } from './types.ts';
|
|
115
|
+
/**
|
|
116
|
+
* 组键:层级 + 类别 + 严重级别 + 作用域(同一个 code 落在不同包里是不同的问题)。
|
|
117
|
+
* @param issue - 一条发现。
|
|
118
|
+
* @returns 稳定组键。
|
|
119
|
+
*/
|
|
120
|
+
export declare function groupKeyOf(issue: DiagnosticIssue): string;
|
|
121
|
+
/**
|
|
122
|
+
* 按组键聚合发现;组按问题数降序、同数按组键升序,结果确定性可测。
|
|
123
|
+
* @param issues - 逐条发现(在报告里已带唯一 id)。
|
|
124
|
+
* @returns 组列表;每组给出计数、归属包计数与样例标题。
|
|
125
|
+
*/
|
|
126
|
+
export declare function buildGroups(issues: readonly DiagnosticIssue[]): DiagnosticGroup[];
|
|
127
|
+
/**
|
|
128
|
+
* 官方 ProfileContext 的安装锚点(launcher 之外的上下文没有它)。
|
|
129
|
+
* @param ctx - host 上下文。
|
|
130
|
+
* @returns package.json 绝对路径;拿不到时 undefined。
|
|
131
|
+
*/
|
|
132
|
+
export declare function readInstallAnchor(ctx: Context): string | undefined;
|
|
133
|
+
/** patch 文件里一行的原始事实(行号只有读原始文本时才有)。 */
|
|
134
|
+
interface RawRow {
|
|
135
|
+
readonly file: string;
|
|
136
|
+
readonly line: number;
|
|
137
|
+
readonly id?: string;
|
|
138
|
+
readonly name?: string;
|
|
139
|
+
/** 字面量 disabled 状态;条件表达式记 conditional(静态不可判定)。 */
|
|
140
|
+
readonly disabled: 'true' | 'false' | 'conditional';
|
|
141
|
+
/** 该行插入到哪个 group id 下(顶层 insert 为 undefined)。 */
|
|
142
|
+
readonly group?: string;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 原始文本里的 insert 行定位。
|
|
146
|
+
*
|
|
147
|
+
* 这不是 YAML 解析器:语义一律取官方返回值(见 readComposition),
|
|
148
|
+
* 这里只负责"哪一行、有没有显式 id、字面量上写没写 disabled"。
|
|
149
|
+
* 做法是按 insert 键的列号推出行缩进,再把该缩进上的列表条目当作一行,
|
|
150
|
+
* 因此不需要理解 YAML 的类型系统,也不会被条件表达式绊倒。
|
|
151
|
+
*
|
|
152
|
+
* @param file - patch 文件的绝对路径。
|
|
153
|
+
* @returns 按文件顺序排列的原始行;文件不可读时为空数组。
|
|
154
|
+
*/
|
|
155
|
+
export declare function locatePatchRows(file: string): RawRow[];
|
|
156
|
+
/** 词法记号。扫描器只在**代码位置**识别关键字,注释与字符串字面量不参与匹配。 */
|
|
157
|
+
interface Token {
|
|
158
|
+
readonly kind: 'word' | 'string' | 'punct';
|
|
159
|
+
readonly value: string;
|
|
160
|
+
readonly line: number;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 极简词法扫描:切出 word / string / punct 三类记号,跳过注释。
|
|
164
|
+
*
|
|
165
|
+
* 与"正则剥注释"相比的两点改进:字符串字面量内部不会被当成代码
|
|
166
|
+
* ("from 'x'" 不产生 import),注释里的 new Service(ctx, 'x') 不产生注册。
|
|
167
|
+
* 已知不做的事:正则字面量不做完整识别(含双斜杠的正则可能被当成注释吞掉),
|
|
168
|
+
* 模板字面量里的插值不求值。
|
|
169
|
+
*
|
|
170
|
+
* @param code - 源码文本。
|
|
171
|
+
* @returns 按出现顺序排列的记号;行号从 1 起。
|
|
172
|
+
*/
|
|
173
|
+
export declare function tokenize(code: string): Token[];
|
|
174
|
+
/** 一份源码的扫描结果(说明符 + 命名注册,均带行号)。 */
|
|
175
|
+
export interface CodeScan {
|
|
176
|
+
readonly imports: readonly {
|
|
177
|
+
readonly spec: string;
|
|
178
|
+
readonly line: number;
|
|
179
|
+
readonly kind: ScannedImport['kind'];
|
|
180
|
+
}[];
|
|
181
|
+
readonly services: readonly {
|
|
182
|
+
readonly name: string;
|
|
183
|
+
readonly line: number;
|
|
184
|
+
}[];
|
|
185
|
+
readonly injects: readonly {
|
|
186
|
+
readonly name: string;
|
|
187
|
+
readonly line: number;
|
|
188
|
+
}[];
|
|
189
|
+
readonly tools: readonly {
|
|
190
|
+
readonly name: string;
|
|
191
|
+
readonly line: number;
|
|
192
|
+
}[];
|
|
193
|
+
readonly sections: readonly {
|
|
194
|
+
readonly name: string;
|
|
195
|
+
readonly line: number;
|
|
196
|
+
}[];
|
|
197
|
+
readonly routes: readonly {
|
|
198
|
+
readonly name: string;
|
|
199
|
+
readonly line: number;
|
|
200
|
+
}[];
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* 扫描一份 JS/TS 源码:静态与动态 import、re-export、require,
|
|
204
|
+
* 以及服务、工具、提示词段落、HTTP 路由的命名注册点。
|
|
205
|
+
*
|
|
206
|
+
* @param code - 源码文本。
|
|
207
|
+
* @returns 说明符与注册点,均带行号。
|
|
208
|
+
*/
|
|
209
|
+
export declare function scanCode(code: string): CodeScan;
|
|
210
|
+
/**
|
|
211
|
+
* 这条裸说明符看起来**可能**是一个真模块名吗(扫描器的输入过滤)。
|
|
212
|
+
*
|
|
213
|
+
* 为什么需要它:打包产物会把模板字面量拆成 "字面量 + ${…} 表达式",字面量部分于是成了
|
|
214
|
+
* **无插值的反引号字符串**,被词法器当成 string 记号收集,形如 " || token.value === "、
|
|
215
|
+
* ") {\n if (next?.kind === "。这些片段被当成说明符后,会给"这个包导入了不存在的依赖"这类
|
|
216
|
+
* 结论提供假输入(实测:CLI 逃生口路径上 9 条假 missing-import)。
|
|
217
|
+
*
|
|
218
|
+
* 判据只做"合法裸说明符"的形状检查:首字符字母或数字,其余字母/数字/._-~/%@+ 或查询串,
|
|
219
|
+
* 且不含空白与控制字符。npm 包名本来就不允许空白与这些符号,因此被丢弃的必然是打包碎片;
|
|
220
|
+
* 相对路径与绝对路径走的是另外的分支(由调用方先判),本函数只作用于裸说明符。
|
|
221
|
+
*
|
|
222
|
+
* @param spec - 说明符。
|
|
223
|
+
* @returns 是否可能是模块名(false 表示应当丢弃)。
|
|
224
|
+
*/
|
|
225
|
+
export declare function isPlausibleSpecifier(spec: string): boolean;
|
|
226
|
+
/**
|
|
227
|
+
* 扫描一个已安装包:入口 → 相对 import 可达文件(有界 BFS)。
|
|
228
|
+
*
|
|
229
|
+
* @param pkgDir - 包目录绝对路径。
|
|
230
|
+
* @param manifest - 该包 package.json 的解析结果。
|
|
231
|
+
* @param maxFiles - 本次可用的文件预算(逐包递减,来自全局预算)。
|
|
232
|
+
* @returns 扫描结果;没有可解析入口时给出 reason。
|
|
233
|
+
*/
|
|
234
|
+
export declare function scanPackage(pkgDir: string, manifest: Record<string, unknown>, maxFiles?: number): PackageScan;
|
|
235
|
+
/**
|
|
236
|
+
* 一个包声明的全部入口文件(exports 的每个子路径 + main + module)。
|
|
237
|
+
*
|
|
238
|
+
* 只取一个入口是历史缺陷:DSH 插件常同时带 host/client/worker 多个入口,
|
|
239
|
+
* 未声明依赖若只出现在 exports["./server"] 指向的文件里,单入口检查会整条漏过,
|
|
240
|
+
* 而挂载该子路径的行会让整个 profile 起不来。
|
|
241
|
+
*
|
|
242
|
+
* @param pkgDir - 包目录绝对路径。
|
|
243
|
+
* @param manifest - 该包 package.json 的解析结果。
|
|
244
|
+
* @returns 去重后仍存在的入口文件路径。
|
|
245
|
+
*/
|
|
246
|
+
export declare function packageEntryFiles(pkgDir: string, manifest: Record<string, unknown>): string[];
|
|
247
|
+
/**
|
|
248
|
+
* 按 Node 的解析顺序探测相对说明符指向的文件。
|
|
249
|
+
* @param baseDir - 相对说明符的基准目录。
|
|
250
|
+
* @param spec - 相对说明符。
|
|
251
|
+
* @returns 命中文件的绝对路径;都不存在时 undefined。
|
|
252
|
+
*/
|
|
253
|
+
export declare function resolveRelativeFile(baseDir: string, spec: string): string | undefined;
|
|
254
|
+
/**
|
|
255
|
+
* 安装锚点对应的 Node 解析根:**官方同款口径**。
|
|
256
|
+
*
|
|
257
|
+
* 官方 @deepseek-ai/dsh-app-boot/profile.ts 的 packageDirFromAnchor 从锚点走
|
|
258
|
+
* createRequire(anchor).resolve.paths(packageName),本函数取同一串搜索路径里
|
|
259
|
+
* 以 node_modules 结尾的那些(Node 会按顺序往上走:包内 → 安装目录 → 祖先目录)。
|
|
260
|
+
* 官方包里已经存在的路径不再重复放进来。
|
|
261
|
+
*
|
|
262
|
+
* 锚点必须先 realpath:pnpm 的 bin shim 指向全局安装目录下的一个符号链接,
|
|
263
|
+
* 而 Node 用的是**字面路径**,不 realpath 时那条链上一个官方包都解析不到。
|
|
264
|
+
*
|
|
265
|
+
* @param installAnchor - dsh 应用包的 package.json 绝对路径(ProfileContext.installAnchor)。
|
|
266
|
+
* @returns 解析根(按 Node 的查找顺序);锚点缺失、读不到或解析不出节点时为 null。
|
|
267
|
+
*/
|
|
268
|
+
export declare function installAnchorRoots(installAnchor: string | undefined): string[] | null;
|
|
269
|
+
/**
|
|
270
|
+
* 环境的模块解析顺序:profile 层 → 共享兜底层 → Harness home 的 profiles 兜底 → 安装锚点。
|
|
271
|
+
*
|
|
272
|
+
* 前三个是 profile 自己的依赖;安装锚点由**安装侧**提供(官方包、bundle 本体与它们携带的
|
|
273
|
+
* 传递依赖都在这里),缺少它会把官方包的每一行都判成孤儿。
|
|
274
|
+
*
|
|
275
|
+
* @param envDir - 环境目录。
|
|
276
|
+
* @param installAnchor - dsh 应用包的 package.json(可省略)。
|
|
277
|
+
* @returns 去重后的解析根,按查找优先级排列。
|
|
278
|
+
*/
|
|
279
|
+
export declare function moduleRoots(envDir: string, installAnchor?: string): string[];
|
|
280
|
+
/**
|
|
281
|
+
* 一个包在某个环境里的安装目录(profile 层优先,其次共享兜底层,最后是安装锚点)。
|
|
282
|
+
*
|
|
283
|
+
* 质量门与诊断共用这一套解析顺序,避免两处口径漂移。
|
|
284
|
+
*
|
|
285
|
+
* @param envDir - 环境目录。
|
|
286
|
+
* @param packageName - 包名。
|
|
287
|
+
* @param installAnchor - dsh 应用包的 package.json;省略时只按 profile 侧解析。
|
|
288
|
+
* @returns 包目录绝对路径;未安装时 undefined。
|
|
289
|
+
*/
|
|
290
|
+
export declare function installedPackageDir(envDir: string, packageName: string, installAnchor?: string): string | undefined;
|
|
291
|
+
/**
|
|
292
|
+
* 一个说明符在当前环境里能否解析。
|
|
293
|
+
*
|
|
294
|
+
* 判定"能"用两把尺子(任一成立即可):Node 的真实解析(createRequire)与
|
|
295
|
+
* 文件/exports 探测;判定"不能"必须两者都不成立——这样 scoped 子路径不会被
|
|
296
|
+
* 误判为可解析(前身仓库在这一点上有过 Critical 缺陷:只要 @scope/pkg 目录存在,
|
|
297
|
+
* @scope/pkg 下的任意子路径都返回 true,最后一道兜底检查因此完全失效)。
|
|
298
|
+
*
|
|
299
|
+
* @param envDir - 环境目录(解析锚点)。
|
|
300
|
+
* @param spec - 裸说明符或带子路径的说明符。
|
|
301
|
+
* @param installAnchor - dsh 应用包的 package.json;省略时只按 profile 侧解析。
|
|
302
|
+
* @returns 能否解析到模块。
|
|
303
|
+
*/
|
|
304
|
+
export declare function specifierResolves(envDir: string, spec: string, installAnchor?: string): boolean;
|
|
305
|
+
/**
|
|
306
|
+
* exports 是否声明了某个子路径(支持星号通配)。
|
|
307
|
+
* @param exportsField - package.json 的 exports 字段。
|
|
308
|
+
* @param key - 形如 "./sub" 的子路径键。
|
|
309
|
+
* @returns 是否声明。
|
|
310
|
+
*/
|
|
311
|
+
export declare function exportsDeclaresSubpath(exportsField: unknown, key: string): boolean;
|
|
312
|
+
/**
|
|
313
|
+
* 简化 semver:判断安装版本是否满足一个范围。
|
|
314
|
+
*
|
|
315
|
+
* 支持星号、=、^、~、>、>=、<、<=,空格或逗号连接的合取,以及 || 析取。
|
|
316
|
+
* prerelease 只参与"基线相同"时的排序(不实现 semver 的 prerelease 全规则),
|
|
317
|
+
* 因此不会把 0.1.6-alpha.2 这类官方版本误判为不满足。
|
|
318
|
+
*
|
|
319
|
+
* @param installed - 实际安装的版本。
|
|
320
|
+
* @param range - 声明的要求范围。
|
|
321
|
+
* @returns 是否满足。
|
|
322
|
+
*/
|
|
323
|
+
export declare function satisfiesRange(installed: string, range: string): boolean;
|
|
324
|
+
/**
|
|
325
|
+
* JSON 文本里某个键所在的行号(证据要能点回 package.json:12)。
|
|
326
|
+
*
|
|
327
|
+
* @param text - package.json 的原始文本。
|
|
328
|
+
* @param section - 顶层段名(dependencies / peerDependencies);传空串表示全文查找。
|
|
329
|
+
* @param key - 段内的键。
|
|
330
|
+
* @returns 1 起的行号;找不到时 undefined。
|
|
331
|
+
*/
|
|
332
|
+
export declare function jsonKeyLine(text: string, section: string, key: string): number | undefined;
|