@avantf/dsh-plugin-base 0.3.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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +303 -0
  3. package/dist/artifact.d.ts +29 -0
  4. package/dist/artifact.d.ts.map +1 -0
  5. package/dist/artifact.js +60 -0
  6. package/dist/artifact.js.map +1 -0
  7. package/dist/bootstrap.d.ts +54 -0
  8. package/dist/bootstrap.d.ts.map +1 -0
  9. package/dist/bootstrap.js +334 -0
  10. package/dist/bootstrap.js.map +1 -0
  11. package/dist/cli.d.ts +4 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +37 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/compat.d.ts +413 -0
  16. package/dist/compat.d.ts.map +1 -0
  17. package/dist/compat.js +742 -0
  18. package/dist/compat.js.map +1 -0
  19. package/dist/conformance.d.ts +55 -0
  20. package/dist/conformance.d.ts.map +1 -0
  21. package/dist/conformance.js +702 -0
  22. package/dist/conformance.js.map +1 -0
  23. package/dist/errors.d.ts +26 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +28 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/fs.d.ts +18 -0
  28. package/dist/fs.d.ts.map +1 -0
  29. package/dist/fs.js +152 -0
  30. package/dist/fs.js.map +1 -0
  31. package/dist/index.d.ts +22 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +35 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/integrity.d.ts +5 -0
  36. package/dist/integrity.d.ts.map +1 -0
  37. package/dist/integrity.js +33 -0
  38. package/dist/integrity.js.map +1 -0
  39. package/dist/interface.d.ts +262 -0
  40. package/dist/interface.d.ts.map +1 -0
  41. package/dist/interface.js +136 -0
  42. package/dist/interface.js.map +1 -0
  43. package/dist/interface_gate.d.ts +61 -0
  44. package/dist/interface_gate.d.ts.map +1 -0
  45. package/dist/interface_gate.js +103 -0
  46. package/dist/interface_gate.js.map +1 -0
  47. package/dist/internal.d.ts +23 -0
  48. package/dist/internal.d.ts.map +1 -0
  49. package/dist/internal.js +18 -0
  50. package/dist/internal.js.map +1 -0
  51. package/dist/kit/family.d.ts +52 -0
  52. package/dist/kit/family.d.ts.map +1 -0
  53. package/dist/kit/family.js +65 -0
  54. package/dist/kit/family.js.map +1 -0
  55. package/dist/kit/index.d.ts +26 -0
  56. package/dist/kit/index.d.ts.map +1 -0
  57. package/dist/kit/index.js +26 -0
  58. package/dist/kit/index.js.map +1 -0
  59. package/dist/kit/logger.d.ts +41 -0
  60. package/dist/kit/logger.d.ts.map +1 -0
  61. package/dist/kit/logger.js +42 -0
  62. package/dist/kit/logger.js.map +1 -0
  63. package/dist/kit/prompt_files.d.ts +90 -0
  64. package/dist/kit/prompt_files.d.ts.map +1 -0
  65. package/dist/kit/prompt_files.js +121 -0
  66. package/dist/kit/prompt_files.js.map +1 -0
  67. package/dist/kit/typert.d.ts +40 -0
  68. package/dist/kit/typert.d.ts.map +1 -0
  69. package/dist/kit/typert.js +17 -0
  70. package/dist/kit/typert.js.map +1 -0
  71. package/dist/layout.d.ts +28 -0
  72. package/dist/layout.d.ts.map +1 -0
  73. package/dist/layout.js +84 -0
  74. package/dist/layout.js.map +1 -0
  75. package/dist/lint.d.ts +33 -0
  76. package/dist/lint.d.ts.map +1 -0
  77. package/dist/lint.js +271 -0
  78. package/dist/lint.js.map +1 -0
  79. package/dist/lock.d.ts +12 -0
  80. package/dist/lock.d.ts.map +1 -0
  81. package/dist/lock.js +93 -0
  82. package/dist/lock.js.map +1 -0
  83. package/dist/manifest.d.ts +12 -0
  84. package/dist/manifest.d.ts.map +1 -0
  85. package/dist/manifest.js +75 -0
  86. package/dist/manifest.js.map +1 -0
  87. package/dist/net.d.ts +23 -0
  88. package/dist/net.d.ts.map +1 -0
  89. package/dist/net.js +112 -0
  90. package/dist/net.js.map +1 -0
  91. package/dist/package-name.d.ts +3 -0
  92. package/dist/package-name.d.ts.map +1 -0
  93. package/dist/package-name.js +13 -0
  94. package/dist/package-name.js.map +1 -0
  95. package/dist/preset.d.ts +46 -0
  96. package/dist/preset.d.ts.map +1 -0
  97. package/dist/preset.js +230 -0
  98. package/dist/preset.js.map +1 -0
  99. package/dist/providers/archive.d.ts +32 -0
  100. package/dist/providers/archive.d.ts.map +1 -0
  101. package/dist/providers/archive.js +248 -0
  102. package/dist/providers/archive.js.map +1 -0
  103. package/dist/providers/model.d.ts +25 -0
  104. package/dist/providers/model.d.ts.map +1 -0
  105. package/dist/providers/model.js +550 -0
  106. package/dist/providers/model.js.map +1 -0
  107. package/dist/providers/npm.d.ts +21 -0
  108. package/dist/providers/npm.d.ts.map +1 -0
  109. package/dist/providers/npm.js +458 -0
  110. package/dist/providers/npm.js.map +1 -0
  111. package/dist/provisioner.d.ts +21 -0
  112. package/dist/provisioner.d.ts.map +1 -0
  113. package/dist/provisioner.js +962 -0
  114. package/dist/provisioner.js.map +1 -0
  115. package/dist/semver.d.ts +31 -0
  116. package/dist/semver.d.ts.map +1 -0
  117. package/dist/semver.js +244 -0
  118. package/dist/semver.js.map +1 -0
  119. package/dist/state.d.ts +71 -0
  120. package/dist/state.d.ts.map +1 -0
  121. package/dist/state.js +225 -0
  122. package/dist/state.js.map +1 -0
  123. package/dist/tar.d.ts +10 -0
  124. package/dist/tar.d.ts.map +1 -0
  125. package/dist/tar.js +178 -0
  126. package/dist/tar.js.map +1 -0
  127. package/dist/types.d.ts +431 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +2 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/zip.d.ts +8 -0
  132. package/dist/zip.d.ts.map +1 -0
  133. package/dist/zip.js +109 -0
  134. package/dist/zip.js.map +1 -0
  135. package/package.json +84 -0
@@ -0,0 +1,458 @@
1
+ /**
2
+ * The built-in `npm-package` provider.
3
+ * @module providers/npm
4
+ */
5
+ import { createRequire } from 'node:module';
6
+ import { dirname, join } from 'node:path';
7
+ import { pathToFileURL } from 'node:url';
8
+ import { ProvisionError } from '../errors.js';
9
+ import { exists, linkOrCopy } from '../fs.js';
10
+ import { verifyIntegrity } from '../integrity.js';
11
+ import { isInside } from '../layout.js';
12
+ import { decodeJson, readInstallManifest } from '../manifest.js';
13
+ import { DEFAULT_MAX_BYTES, candidateUrls, fetchImplOf, readCapped, signalFor } from '../net.js';
14
+ import { assertPackageName } from '../package-name.js';
15
+ import { parseRange, parseVersion, satisfiesRange, selectVersion } from '../semver.js';
16
+ import { extractTarGz } from '../tar.js';
17
+ export const NPM_PACKAGE_KIND = 'npm-package';
18
+ const DEFAULT_REGISTRY = 'https://registry.npmjs.org';
19
+ const VERIFY_TIMEOUT_MS = 15_000;
20
+ /** Depth limit for the `verify` scan for a prebuilt native module. */
21
+ const NATIVE_SCAN_DEPTH = 3;
22
+ function parseSpec(item) {
23
+ const spec = item.spec;
24
+ if (typeof spec !== 'object' || spec === null) {
25
+ throw new ProvisionError('invalid-option', `npm-package 的 spec 必须是 {name, range}:${String(item.id)}`);
26
+ }
27
+ const record = spec;
28
+ const name = record['name'];
29
+ const range = record['range'];
30
+ if (typeof name !== 'string' || name === '' || typeof range !== 'string' || range === '') {
31
+ throw new ProvisionError('invalid-option', `npm-package 的 spec 缺少 name/range:${String(item.id)}`);
32
+ }
33
+ assertPackageName(name);
34
+ return spec;
35
+ }
36
+ async function fetchPackument(ctx, spec) {
37
+ const registry = spec.registry ?? DEFAULT_REGISTRY;
38
+ const url = `${registry.replace(/\/+$/, '')}/${spec.name}`;
39
+ let response;
40
+ try {
41
+ response = await fetchImplOf(ctx)(url, { headers: { accept: 'application/json' }, signal: signalFor(ctx) });
42
+ }
43
+ catch (error) {
44
+ throw new ProvisionError('fetch/failed', `无法获取 packument:${url}(${error instanceof Error ? error.message : String(error)})`);
45
+ }
46
+ if (!response.ok)
47
+ throw new ProvisionError('fetch/failed', `packument ${url} 返回 HTTP ${String(response.status)}`);
48
+ const body = await response.json();
49
+ const versions = typeof body === 'object' && body !== null ? body.versions : undefined;
50
+ if (typeof versions !== 'object' || versions === null) {
51
+ throw new ProvisionError('fetch/failed', `packument ${url} 没有 versions`);
52
+ }
53
+ return versions;
54
+ }
55
+ async function download(ctx, urls, integrity) {
56
+ const problems = [];
57
+ for (const url of urls) {
58
+ let bytes;
59
+ try {
60
+ const response = await fetchImplOf(ctx)(url, { signal: signalFor(ctx) });
61
+ if (!response.ok) {
62
+ problems.push(`${url} → HTTP ${String(response.status)}`);
63
+ continue;
64
+ }
65
+ bytes = await readCapped(response, DEFAULT_MAX_BYTES);
66
+ }
67
+ catch (error) {
68
+ problems.push(`${url} → ${error instanceof Error ? error.message : String(error)}`);
69
+ continue;
70
+ }
71
+ // Only transport failures fall through to the next candidate.
72
+ verifyIntegrity(bytes, integrity);
73
+ return { bytes, url };
74
+ }
75
+ throw new ProvisionError('fetch/failed', `npm 包的所有候选源都失败:${problems.join('; ')}`);
76
+ }
77
+ /** npm's `os`/`cpu` semantics: bare names allow, `!name` denials win. */
78
+ function listAllows(list, value) {
79
+ if (list === undefined || list.length === 0)
80
+ return true;
81
+ const negatives = list.filter(entry => entry.startsWith('!')).map(entry => entry.slice(1));
82
+ if (negatives.includes(value))
83
+ return false;
84
+ const positives = list.filter(entry => !entry.startsWith('!'));
85
+ return positives.length === 0 || positives.includes(value);
86
+ }
87
+ function nodeAllows(range, runtime) {
88
+ if (range === undefined || range === '')
89
+ return true;
90
+ try {
91
+ return satisfiesRange(runtime, range);
92
+ }
93
+ catch {
94
+ return true; // an engine range outside the supported subset is ignored
95
+ }
96
+ }
97
+ /** Versions a range names with an exact comparator, i.e. those allowed to be deprecated. */
98
+ function pinnedVersions(range) {
99
+ const pinned = new Set();
100
+ try {
101
+ for (const alternative of parseRange(range)) {
102
+ for (const comparator of alternative) {
103
+ if (comparator.op !== '=')
104
+ continue;
105
+ const { major, minor, patch, prerelease } = comparator.version;
106
+ pinned.add(`${String(major)}.${String(minor)}.${String(patch)}${prerelease.length === 0 ? '' : `-${prerelease.join('.')}`}`);
107
+ }
108
+ }
109
+ }
110
+ catch {
111
+ return pinned;
112
+ }
113
+ return pinned;
114
+ }
115
+ /** Pick the highest release satisfying the range, engine, `os`/`cpu` and deprecation filters. */
116
+ function resolveVersion(versions, spec, platform, arch, runtime) {
117
+ const pinned = pinnedVersions(spec.range);
118
+ const usable = Object.entries(versions).filter(([text, candidate]) => {
119
+ if (candidate === undefined || parseVersion(text) === undefined)
120
+ return false;
121
+ if (!nodeAllows(candidate.engines?.node, runtime))
122
+ return false;
123
+ if (!listAllows(candidate.os, platform))
124
+ return false;
125
+ if (!listAllows(candidate.cpu, arch))
126
+ return false;
127
+ if (candidate.deprecated !== undefined && !pinned.has(text))
128
+ return false;
129
+ return true;
130
+ });
131
+ return selectVersion(usable.map(([text]) => text), spec.range);
132
+ }
133
+ /** Depth-first search for a prebuilt native module (`*.node`). */
134
+ async function findNativeModule(ctx, dir, depth = 0) {
135
+ if (depth > NATIVE_SCAN_DEPTH)
136
+ return undefined;
137
+ let entries;
138
+ try {
139
+ entries = await ctx.fs.readdir(dir);
140
+ }
141
+ catch {
142
+ return undefined;
143
+ }
144
+ for (const entry of entries) {
145
+ if (entry.endsWith('.node'))
146
+ return join(dir, entry);
147
+ if (entry === 'node_modules')
148
+ continue;
149
+ const path = join(dir, entry);
150
+ const info = await ctx.fs.stat(path);
151
+ if (info?.isDirectory === true) {
152
+ const found = await findNativeModule(ctx, path, depth + 1);
153
+ if (found !== undefined)
154
+ return found;
155
+ }
156
+ }
157
+ return undefined;
158
+ }
159
+ async function packageVersionOf(ctx, dir) {
160
+ try {
161
+ const raw = decodeJson(await ctx.fs.readFile(join(dir, 'package.json')));
162
+ if (typeof raw !== 'object' || raw === null)
163
+ return undefined;
164
+ const version = raw.version;
165
+ return typeof version === 'string' && version !== '' ? version : undefined;
166
+ }
167
+ catch {
168
+ return undefined;
169
+ }
170
+ }
171
+ /** Walk up from a resolved entry to the owning package directory. */
172
+ function packageDirOf(entry, name) {
173
+ let dir = dirname(entry);
174
+ for (let depth = 0; depth < 6; depth += 1) {
175
+ if (dir === dirname(dir))
176
+ return undefined;
177
+ dir = dirname(dir);
178
+ if (dir.endsWith(name))
179
+ return dir;
180
+ }
181
+ return undefined;
182
+ }
183
+ /** Resolve a peer directory from the caller's tree, falling back to an entry walk-up. */
184
+ function resolvePeerDir(peer) {
185
+ const roots = [join(process.cwd(), 'noop.js'), import.meta.url];
186
+ for (const root of roots) {
187
+ try {
188
+ return dirname(createRequire(root).resolve(`${peer}/package.json`));
189
+ }
190
+ catch {
191
+ // fall through to the entry walk-up
192
+ }
193
+ }
194
+ for (const root of roots) {
195
+ try {
196
+ const entry = createRequire(root).resolve(peer);
197
+ const dir = packageDirOf(entry, peer);
198
+ if (dir !== undefined)
199
+ return dir;
200
+ }
201
+ catch {
202
+ // not resolvable from this root
203
+ }
204
+ }
205
+ return undefined;
206
+ }
207
+ async function linkPeers(pkgDir, spec, staging, ctx) {
208
+ const raw = decodeJson(await ctx.fs.readFile(join(pkgDir, 'package.json')));
209
+ if (typeof raw !== 'object' || raw === null)
210
+ return;
211
+ const manifest = raw;
212
+ const peers = manifest.peerDependencies ?? {};
213
+ const meta = manifest.peerDependenciesMeta ?? {};
214
+ for (const [peer, range] of Object.entries(peers)) {
215
+ assertPackageName(peer, 'peer 名');
216
+ const declared = spec.peers?.find(candidate => candidate.name === peer);
217
+ const optional = meta[peer]?.optional === true || declared?.optional === true;
218
+ const dir = declared?.dir ?? resolvePeerDir(peer);
219
+ if (dir === undefined) {
220
+ if (optional)
221
+ continue;
222
+ throw new ProvisionError('peer/unsatisfied', `peer ${peer}@${range} 不可满足(调用方未解析该 peer,也没有提供目录)`);
223
+ }
224
+ // A peer that is present but does not satisfy the range makes the item unusable.
225
+ const installed = await packageVersionOf(ctx, dir);
226
+ if (installed !== undefined) {
227
+ let satisfied = true;
228
+ try {
229
+ satisfied = satisfiesRange(installed, range);
230
+ }
231
+ catch {
232
+ ctx.logger.warn(`peer ${peer} 的区间 "${range}" 不在支持的 semver 子集内,按满足处理`);
233
+ }
234
+ if (!satisfied) {
235
+ if (optional)
236
+ continue;
237
+ throw new ProvisionError('peer/unsatisfied', `peer ${peer} 需要 ${range},调用方解析到的是 ${installed}`);
238
+ }
239
+ }
240
+ const linkPath = join(staging, 'node_modules', ...peer.split('/'));
241
+ // Fall back to a real copy when symlinks are unavailable.
242
+ await linkOrCopy(ctx.fs, dir, linkPath, {
243
+ onFallback: () => ctx.logger.warn(`peer ${peer} 退化为复制:identity 不再保证`),
244
+ });
245
+ }
246
+ }
247
+ async function withTimeout(promise, ms, message) {
248
+ let timer;
249
+ try {
250
+ return await Promise.race([
251
+ promise,
252
+ new Promise((_resolve, reject) => {
253
+ timer = setTimeout(() => reject(new ProvisionError('verify/failed', message)), ms);
254
+ }),
255
+ ]);
256
+ }
257
+ finally {
258
+ if (timer !== undefined)
259
+ clearTimeout(timer);
260
+ }
261
+ }
262
+ /** The entry-file candidates a `package.json` points at, in Node's resolution order. */
263
+ function entryCandidatesOf(pkgDir, pkg) {
264
+ const exported = pkg['exports'];
265
+ let relativePath;
266
+ let exact = false;
267
+ if (typeof exported === 'string') {
268
+ relativePath = exported;
269
+ exact = true;
270
+ }
271
+ else if (typeof exported === 'object' && exported !== null) {
272
+ const dot = exported['.'] ?? exported;
273
+ if (typeof dot === 'string') {
274
+ relativePath = dot;
275
+ exact = true;
276
+ }
277
+ else if (typeof dot === 'object' && dot !== null) {
278
+ const conditions = dot;
279
+ for (const key of ['import', 'default', 'require']) {
280
+ const value = conditions[key];
281
+ if (typeof value === 'string') {
282
+ relativePath = value;
283
+ exact = true;
284
+ break;
285
+ }
286
+ }
287
+ }
288
+ }
289
+ if (relativePath === undefined && typeof pkg['main'] === 'string') {
290
+ const main = pkg['main'];
291
+ // An empty or root-relative `main` maps to index.js.
292
+ relativePath = main === '' || main === '.' || main === './' ? 'index.js' : main;
293
+ }
294
+ if (relativePath === undefined)
295
+ relativePath = 'index.js';
296
+ const base = join(pkgDir, relativePath);
297
+ if (exact)
298
+ return [base];
299
+ return [base, `${base}.js`, `${base}.json`, `${base}.node`, join(base, 'index.js')];
300
+ }
301
+ /** Build the built-in npm provider. */
302
+ export function npmPackageProvider(options = {}) {
303
+ const id = options.id ?? '@avantf/dsh-plugin-base/npm';
304
+ // Version directories already reported as `unverifiable`, warned once per provider instance.
305
+ const warnedUnverifiable = new Set();
306
+ return {
307
+ id,
308
+ kinds: [NPM_PACKAGE_KIND],
309
+ identify(item) {
310
+ const spec = parseSpec(item);
311
+ return { name: spec.name, range: spec.range };
312
+ },
313
+ targetDir(_item, ref) {
314
+ return `${ref.name}/${ref.segment}`;
315
+ },
316
+ async probe(item, ctx) {
317
+ const spec = parseSpec(item);
318
+ const root = join(ctx.home, item.target.root, ...spec.name.split('/'));
319
+ let entries;
320
+ try {
321
+ entries = await ctx.fs.readdir(root);
322
+ }
323
+ catch {
324
+ return { found: false };
325
+ }
326
+ const candidates = [];
327
+ for (const entry of entries) {
328
+ if (entry.startsWith('.'))
329
+ continue;
330
+ const versionDir = join(root, entry);
331
+ const manifestPath = join(versionDir, 'install.json');
332
+ if ((await ctx.fs.stat(manifestPath)) === undefined)
333
+ continue;
334
+ const manifest = readInstallManifest(decodeJson(await ctx.fs.readFile(manifestPath)), NPM_PACKAGE_KIND);
335
+ if (manifest === undefined)
336
+ continue;
337
+ if (!satisfiesRange(manifest.version, spec.range))
338
+ continue;
339
+ if (manifest.integrity === undefined && !warnedUnverifiable.has(versionDir)) {
340
+ // Without integrity the copy is still reusable, but is reported once as unverifiable.
341
+ warnedUnverifiable.add(versionDir);
342
+ ctx.logger.warn(`unverifiable: ${versionDir} 的 install.json 没有 integrity;按可用处理`);
343
+ }
344
+ const relativeEntry = manifest.entryDir ?? `node_modules/${spec.name}`;
345
+ const entryDir = join(versionDir, ...relativeEntry.split('/'));
346
+ // A copy whose entry directory is missing is not usable.
347
+ if (!(await exists(ctx.fs, entryDir)))
348
+ continue;
349
+ candidates.push({
350
+ version: manifest.version,
351
+ versionDir,
352
+ entryDir,
353
+ installedAt: Date.parse(manifest.installed_at) || 0,
354
+ });
355
+ }
356
+ // The newest `installed_at` wins when several directories describe one version.
357
+ const best = candidates.sort((a, b) => b.installedAt - a.installedAt)[0];
358
+ if (best === undefined)
359
+ return { found: false };
360
+ return { found: true, version: best.version, dir: best.entryDir, source: 'managed' };
361
+ },
362
+ plan() {
363
+ return { action: 'install' };
364
+ },
365
+ async install(item, ctx) {
366
+ const spec = parseSpec(item);
367
+ const versions = await fetchPackument(ctx, spec);
368
+ const version = resolveVersion(versions, spec, process.platform, process.arch, process.version);
369
+ if (version === undefined) {
370
+ throw new ProvisionError('npm/no-satisfying-version', `${spec.name} 没有同时满足 "${spec.range}" 与本机(node ${process.version} / ${process.platform}-${process.arch})的版本`);
371
+ }
372
+ const candidate = versions[version];
373
+ const dist = candidate?.dist;
374
+ const integrity = spec.expectedIntegrity ?? dist?.integrity;
375
+ if (integrity === undefined) {
376
+ throw new ProvisionError('npm/no-integrity', `${spec.name}@${version} 的 packument 没有 dist.integrity(只有 shasum 的包一律拒绝)`);
377
+ }
378
+ const tarball = dist?.tarball;
379
+ if (tarball === undefined || tarball === '') {
380
+ throw new ProvisionError('fetch/failed', `${spec.name}@${version} 的 packument 没有 dist.tarball`);
381
+ }
382
+ const staging = await ctx.stage();
383
+ const urls = candidateUrls(tarball, ctx.policy.mirrors?.npm);
384
+ const downloaded = await download(ctx, urls, integrity);
385
+ if (downloaded.url !== tarball)
386
+ ctx.logger.debug(`tarball 来自镜像:${downloaded.url}`);
387
+ const bytes = downloaded.bytes;
388
+ const pkgDir = join(staging, 'node_modules', ...spec.name.split('/'));
389
+ await extractTarGz(bytes, pkgDir, ctx.fs, { strip: 1 });
390
+ await linkPeers(pkgDir, spec, staging, ctx);
391
+ const meta = {
392
+ name: spec.name,
393
+ version,
394
+ integrity,
395
+ tarball,
396
+ source: 'installed',
397
+ entryDir: `node_modules/${spec.name}`,
398
+ };
399
+ return ctx.publish(staging, meta);
400
+ },
401
+ async verify(item, resolved, ctx) {
402
+ const pkgDir = resolved.entryDir;
403
+ const packageJsonPath = join(pkgDir, 'package.json');
404
+ if (!(await exists(ctx.fs, packageJsonPath))) {
405
+ throw new ProvisionError('verify/failed', `包缺少 package.json:${pkgDir}`);
406
+ }
407
+ const parsed = decodeJson(await ctx.fs.readFile(packageJsonPath));
408
+ if (typeof parsed !== 'object' || parsed === null) {
409
+ throw new ProvisionError('verify/failed', `package.json 不可解析:${packageJsonPath}`);
410
+ }
411
+ const pkg = parsed;
412
+ const scripts = (pkg['scripts'] ?? {});
413
+ for (const lifecycle of ['preinstall', 'install', 'postinstall']) {
414
+ const command = scripts[lifecycle];
415
+ if (typeof command === 'string' && command !== '') {
416
+ throw new ProvisionError('npm/lifecycle-script-unsupported', `${specNameOf(item)} 声明了 ${lifecycle} 脚本;本设施手动解包、不执行 lifecycle scripts,请手动预置`);
417
+ }
418
+ }
419
+ if (await exists(ctx.fs, join(pkgDir, 'binding.gyp'))) {
420
+ throw new ProvisionError('verify/failed', `${specNameOf(item)} 是原生模块(binding.gyp);本设施不接管原生模块,请走平台 prebuilt 或二进制归档路线`);
421
+ }
422
+ const native = await findNativeModule(ctx, pkgDir);
423
+ if (native !== undefined) {
424
+ throw new ProvisionError('verify/failed', `${specNameOf(item)} 带预编译原生模块(${native});本设施不接管原生模块,请走平台 prebuilt 或二进制归档路线`);
425
+ }
426
+ const candidates = entryCandidatesOf(pkgDir, pkg);
427
+ // A candidate must be a real descendant of the package directory.
428
+ const safe = candidates.filter(candidate => candidate !== pkgDir && isInside(pkgDir, candidate));
429
+ if (safe.length === 0) {
430
+ throw new ProvisionError('verify/failed', `package.json 的入口跳出包目录:${String(pkg['exports'] ?? pkg['main'])}`);
431
+ }
432
+ let entry;
433
+ for (const candidate of safe) {
434
+ if (await exists(ctx.fs, candidate)) {
435
+ entry = candidate;
436
+ break;
437
+ }
438
+ }
439
+ // A missing entry file means the tarball is incomplete.
440
+ if (entry === undefined) {
441
+ throw new ProvisionError('verify/failed', `${specNameOf(item)} 的入口文件不存在:${safe[0] ?? pkgDir}(包自身不完整)`);
442
+ }
443
+ const url = pathToFileURL(entry).href;
444
+ try {
445
+ await withTimeout(import(url), VERIFY_TIMEOUT_MS, `import() 超时:${url}`);
446
+ }
447
+ catch (error) {
448
+ if (error instanceof ProvisionError)
449
+ throw error;
450
+ throw new ProvisionError('verify/failed', `import() 失败:${url}(${error instanceof Error ? error.message : String(error)})`);
451
+ }
452
+ },
453
+ };
454
+ }
455
+ function specNameOf(item) {
456
+ return parseSpec(item).name;
457
+ }
458
+ //# sourceMappingURL=npm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/providers/npm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { AtStartup, AtUse, ProvisionItem, Provisioner, ProvisionerOptions } from './types.js';
2
+ /** The capability names this copy implements. @stable */
3
+ export declare const CAPABILITIES: readonly string[];
4
+ /** Startup critical-path budget in ms. @stable */
5
+ export declare const DEFAULT_DEADLINE_MS = 15000;
6
+ /** Descriptor version this build understands. @stable */
7
+ export declare const ITEM_SCHEMA_VERSION = 1;
8
+ interface NormalizedMissing {
9
+ readonly atStartup: AtStartup;
10
+ readonly atUse: AtUse;
11
+ }
12
+ /** `onMissing` defaults, per axis: `degrade` / `error` (see `docs/DESIGN.md`). Absent and `{}` are the
13
+ * SAME request — the two used to disagree on `atUse`, so "omit the object" quietly meant something
14
+ * other than "declare no preference". (`atUse` is declarative today: nothing consumes it yet, which
15
+ * is exactly why the documented default has to be the one the code reports.) */
16
+ export declare function normalizeOnMissing(value: ProvisionItem['onMissing']): NormalizedMissing;
17
+ /** Create a provisioner instance.
18
+ * @stable */
19
+ export declare function createProvisioner(options: ProvisionerOptions): Provisioner;
20
+ export {};
21
+ //# sourceMappingURL=provisioner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioner.d.ts","sourceRoot":"","sources":["../src/provisioner.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EACV,SAAS,EACT,KAAK,EAeL,aAAa,EAMb,WAAW,EAEX,kBAAkB,EAMnB,MAAM,YAAY,CAAA;AAEnB,yDAAyD;AACzD,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAA6C,CAAA;AAEvF,kDAAkD;AAClD,eAAO,MAAM,mBAAmB,QAAS,CAAA;AAEzC,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,IAAI,CAAA;AASpC,UAAU,iBAAiB;IACzB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CACtB;AAED;;;iFAGiF;AACjF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,iBAAiB,CAKvF;AAwCD;cACc;AACd,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAm5B1E"}