@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 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
package/dist/net.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import type { ProgressEvent, ProviderContext } from './types.js';
2
+ /** The `fetch` a provider should use: the injected one, else the process global. */
3
+ export declare function fetchImplOf(ctx: ProviderContext): typeof fetch;
4
+ /** Default hard byte cap for one downloaded body. */
5
+ export declare const DEFAULT_MAX_BYTES: number;
6
+ /** Default per-request timeout in milliseconds. */
7
+ export declare const DEFAULT_REQUEST_TIMEOUT_MS = 300000;
8
+ /** Combine the caller's `AbortSignal` with a timeout signal. */
9
+ export declare function signalFor(ctx: ProviderContext, timeoutMs?: number): AbortSignal;
10
+ /** Read a response body with a hard byte cap; throws `fetch/failed` when the cap is crossed. */
11
+ export declare function readCapped(response: Response, maxBytes?: number): Promise<Uint8Array>;
12
+ /** `{url}` templates → concrete URLs, official source first. */
13
+ export declare function candidateUrls(url: string, mirrors: readonly string[] | undefined): readonly string[];
14
+ /** Download the first candidate that answers 2xx; throws `fetch/failed` when none does. */
15
+ export declare function downloadBytes(ctx: ProviderContext, urls: readonly string[], key: string, onProgress?: (event: ProgressEvent) => void): Promise<{
16
+ readonly bytes: Uint8Array;
17
+ readonly url: string;
18
+ }>;
19
+ /** Verify a hex sha256 of an archive. */
20
+ export declare function verifySha256(bytes: Uint8Array, expected: string): void;
21
+ /** `${platform}-${arch}`, the pack key (`linux-x64`, `darwin-arm64`, `win32-x64`, …). */
22
+ export declare function platformKey(): string;
23
+ //# sourceMappingURL=net.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"net.d.ts","sourceRoot":"","sources":["../src/net.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEhE,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,KAAK,CAI9D;AAED,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,QAAoB,CAAA;AAElD,mDAAmD;AACnD,eAAO,MAAM,0BAA0B,SAAU,CAAA;AAEjD,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,GAAE,MAAmC,GAAG,WAAW,CAG3G;AAED,gGAAgG;AAChG,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,GAAE,MAA0B,GACnC,OAAO,CAAC,UAAU,CAAC,CAwCrB;AAED,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,CAOpG;AAED,2FAA2F;AAC3F,wBAAsB,aAAa,CACjC,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAC1C,OAAO,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB/D;AAED,yCAAyC;AACzC,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAKtE;AAED,yFAAyF;AACzF,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
package/dist/net.js ADDED
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Network helpers for providers: fetch injection, mirrors and digests.
3
+ * @module net
4
+ */
5
+ import { createHash } from 'node:crypto';
6
+ import { ProvisionError } from './errors.js';
7
+ /** The `fetch` a provider should use: the injected one, else the process global. */
8
+ export function fetchImplOf(ctx) {
9
+ const impl = ctx.fetch ?? globalThis.fetch;
10
+ if (impl === undefined)
11
+ throw new ProvisionError('fetch/failed', '运行环境没有 fetch,且未注入');
12
+ return impl;
13
+ }
14
+ /** Default hard byte cap for one downloaded body. */
15
+ export const DEFAULT_MAX_BYTES = 256 * 1024 * 1024;
16
+ /** Default per-request timeout in milliseconds. */
17
+ export const DEFAULT_REQUEST_TIMEOUT_MS = 300_000;
18
+ /** Combine the caller's `AbortSignal` with a timeout signal. */
19
+ export function signalFor(ctx, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {
20
+ const timeout = AbortSignal.timeout(timeoutMs);
21
+ return ctx.signal === undefined ? timeout : AbortSignal.any([ctx.signal, timeout]);
22
+ }
23
+ /** Read a response body with a hard byte cap; throws `fetch/failed` when the cap is crossed. */
24
+ export async function readCapped(response, maxBytes = DEFAULT_MAX_BYTES) {
25
+ const declared = Number(response.headers.get('content-length') ?? Number.NaN);
26
+ if (Number.isFinite(declared) && declared > maxBytes) {
27
+ throw new ProvisionError('fetch/failed', `响应声明 ${String(declared)} 字节,超过上限 ${String(maxBytes)}`);
28
+ }
29
+ const body = response.body;
30
+ if (body === null) {
31
+ const bytes = new Uint8Array(await response.arrayBuffer());
32
+ if (bytes.byteLength > maxBytes) {
33
+ throw new ProvisionError('fetch/failed', `响应 ${String(bytes.byteLength)} 字节,超过上限 ${String(maxBytes)}`);
34
+ }
35
+ if (Number.isFinite(declared) && declared !== bytes.byteLength) {
36
+ throw new ProvisionError('fetch/failed', `响应声明 ${String(declared)} 字节,实际收到 ${String(bytes.byteLength)} 字节`);
37
+ }
38
+ return bytes;
39
+ }
40
+ const reader = body.getReader();
41
+ const chunks = [];
42
+ let total = 0;
43
+ for (;;) {
44
+ const { done, value } = await reader.read();
45
+ if (done)
46
+ break;
47
+ if (value === undefined)
48
+ continue;
49
+ total += value.byteLength;
50
+ if (total > maxBytes) {
51
+ await reader.cancel().catch(() => undefined);
52
+ throw new ProvisionError('fetch/failed', `响应超过上限 ${String(maxBytes)} 字节(已读 ${String(total)})`);
53
+ }
54
+ chunks.push(value);
55
+ }
56
+ if (Number.isFinite(declared) && declared !== total) {
57
+ throw new ProvisionError('fetch/failed', `响应声明 ${String(declared)} 字节,实际收到 ${String(total)} 字节`);
58
+ }
59
+ const bytes = new Uint8Array(total);
60
+ let offset = 0;
61
+ for (const chunk of chunks) {
62
+ bytes.set(chunk, offset);
63
+ offset += chunk.byteLength;
64
+ }
65
+ return bytes;
66
+ }
67
+ /** `{url}` templates → concrete URLs, official source first. */
68
+ export function candidateUrls(url, mirrors) {
69
+ const candidates = [url];
70
+ for (const template of mirrors ?? []) {
71
+ const candidate = template.includes('{url}') ? template.replaceAll('{url}', url) : `${template}${url}`;
72
+ if (!candidates.includes(candidate))
73
+ candidates.push(candidate);
74
+ }
75
+ return candidates;
76
+ }
77
+ /** Download the first candidate that answers 2xx; throws `fetch/failed` when none does. */
78
+ export async function downloadBytes(ctx, urls, key, onProgress) {
79
+ const problems = [];
80
+ for (const url of urls) {
81
+ try {
82
+ const response = await fetchImplOf(ctx)(url, { signal: signalFor(ctx) });
83
+ if (!response.ok) {
84
+ problems.push(`${url} → HTTP ${String(response.status)}`);
85
+ continue;
86
+ }
87
+ // A short body is a TRANSPORT failure and retries the next mirror, like a bad status or a
88
+ // network error — deliberately unlike an integrity check (those run in the providers and are
89
+ // terminal: complete bytes with the wrong content do not get better at another URL). That
90
+ // distinction IS the invariant; `docs/DESIGN.md` §6 states it in the same words.
91
+ const bytes = await readCapped(response);
92
+ onProgress?.({ key, phase: 'download', loaded: bytes.byteLength, total: bytes.byteLength });
93
+ return { bytes, url };
94
+ }
95
+ catch (error) {
96
+ problems.push(`${url} → ${error instanceof Error ? error.message : String(error)}`);
97
+ }
98
+ }
99
+ throw new ProvisionError('fetch/failed', `所有候选源都失败:${problems.join('; ')}`);
100
+ }
101
+ /** Verify a hex sha256 of an archive. */
102
+ export function verifySha256(bytes, expected) {
103
+ const actual = createHash('sha256').update(bytes).digest('hex');
104
+ if (actual !== expected.toLowerCase()) {
105
+ throw new ProvisionError('archive/integrity-mismatch', `sha256 不匹配:期望 ${expected},实际 ${actual}`);
106
+ }
107
+ }
108
+ /** `${platform}-${arch}`, the pack key (`linux-x64`, `darwin-arm64`, `win32-x64`, …). */
109
+ export function platformKey() {
110
+ return `${process.platform}-${process.arch}`;
111
+ }
112
+ //# sourceMappingURL=net.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"net.js","sourceRoot":"","sources":["../src/net.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Reject a package or peer name that would not stay a safe path segment. */
2
+ export declare function assertPackageName(name: string, what?: string): void;
3
+ //# sourceMappingURL=package-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-name.d.ts","sourceRoot":"","sources":["../src/package-name.ts"],"names":[],"mappings":"AAQA,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAO,GAAG,IAAI,CAIjE"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Package-name validation for names that become path segments; the guard keeps them single, safe segments.
3
+ * @module package-name
4
+ */
5
+ import { ProvisionError } from './errors.js';
6
+ const PACKAGE_NAME = /^(?:@[A-Za-z0-9][A-Za-z0-9._-]*\/)?[A-Za-z0-9][A-Za-z0-9._-]*$/;
7
+ /** Reject a package or peer name that would not stay a safe path segment. */
8
+ export function assertPackageName(name, what = '包名') {
9
+ if (!PACKAGE_NAME.test(name)) {
10
+ throw new ProvisionError('invalid-option', `${what}不是合法的 npm 包标识(会作为路径的一段):${JSON.stringify(name)}`);
11
+ }
12
+ }
13
+ //# sourceMappingURL=package-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-name.js","sourceRoot":"","sources":["../src/package-name.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,YAAY,GAAG,gEAAgE,CAAA;AAErF,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAI,GAAG,IAAI;IACzD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,cAAc,CAAC,gBAAgB,EAAE,GAAG,IAAI,2BAA2B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACtG,CAAC;AACH,CAAC"}
@@ -0,0 +1,46 @@
1
+ export type PresetCheckStatus = 'pass' | 'fail' | 'skip';
2
+ /** One build-time assertion, with a stable id a repo can assert on. */
3
+ export interface PresetCheck {
4
+ readonly id: string;
5
+ readonly status: PresetCheckStatus;
6
+ readonly message: string;
7
+ }
8
+ export interface EnvinitPresetOptions {
9
+ /** The plugin repo root; defaults to `process.cwd()`. */
10
+ readonly cwd?: string;
11
+ /** Extra module names that must stay external (the plugin's own whitelist). */
12
+ readonly external?: readonly string[];
13
+ /** The declared framework range; when given it must equal `peerDependencies`. */
14
+ readonly range?: string;
15
+ /** Assert against this framework copy instead of resolving one from `cwd`. */
16
+ readonly frameworkDir?: string;
17
+ }
18
+ export interface EnvinitPreset {
19
+ /** The framework copy the assertions ran against. */
20
+ readonly frameworkDir: string;
21
+ /** The framework package version found there. */
22
+ readonly frameworkVersion: string;
23
+ /** The plugin's declared range (`peerDependencies`). */
24
+ readonly declaredRange: string;
25
+ /** Names the bundler must keep external. */
26
+ readonly external: readonly string[];
27
+ /** Names the bundler must inline. */
28
+ readonly noExternal: readonly string[];
29
+ readonly checks: readonly PresetCheck[];
30
+ readonly ok: boolean;
31
+ }
32
+ /** Build configuration and build-time assertions. */
33
+ export declare function envinitPreset(options?: EnvinitPresetOptions): EnvinitPreset;
34
+ /** Throw when any assertion failed; the message lists the failing rule ids. */
35
+ export declare function assertEnvinitPreset(preset: EnvinitPreset): void;
36
+ export interface ArtifactAssertOptions {
37
+ /** Server-side artifacts that must inline the bootstrap and keep `.` external. */
38
+ readonly artifacts?: readonly string[];
39
+ /** Client-side artifacts that must not mention the framework at all. */
40
+ readonly clientArtifacts?: readonly string[];
41
+ }
42
+ /** Post-build scan; returns the checks. {@link assertEnvinitPresetChecks} turns failures into a build error. */
43
+ export declare function assertEnvinitArtifacts(options: ArtifactAssertOptions): readonly PresetCheck[];
44
+ /** Turn any failing check into a thrown build error. */
45
+ export declare function assertEnvinitPresetChecks(checks: readonly PresetCheck[]): void;
46
+ //# sourceMappingURL=preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../src/preset.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAExD,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,iDAAiD;IACjD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,wDAAwD;IACxD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAA;IACvC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;CACrB;AAqED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAoH/E;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAE/D;AAED,MAAM,WAAW,qBAAqB;IACpC,kFAAkF;IAClF,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,wEAAwE;IACxE,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7C;AAED,gHAAgH;AAChH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,qBAAqB,GAAG,SAAS,WAAW,EAAE,CAqD7F;AAED,wDAAwD;AACxD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI,CAI9E"}
package/dist/preset.js ADDED
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Build-time preset for a plugin repo.
3
+ * @module preset
4
+ */
5
+ import { existsSync, readFileSync } from 'node:fs';
6
+ import { dirname, join, resolve as resolvePath } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { BOOTSTRAP_SUBPATH, FRAMEWORK_PACKAGE, MIN_INLINING_BEACONS, findFrameworkImports, findInliningBeacons, isBootstrapSpecifier, } from './artifact.js';
9
+ import { VERSION as BOOTSTRAP_VERSION } from './bootstrap.js';
10
+ import { assertRange, satisfiesRange } from './semver.js';
11
+ function builder() {
12
+ const checks = [];
13
+ return {
14
+ checks,
15
+ pass: (id, message) => checks.push({ id, status: 'pass', message }),
16
+ fail: (id, message) => checks.push({ id, status: 'fail', message }),
17
+ skip: (id, message) => checks.push({ id, status: 'skip', message }),
18
+ };
19
+ }
20
+ function readJson(path) {
21
+ try {
22
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
23
+ return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed) ? parsed : undefined;
24
+ }
25
+ catch {
26
+ return undefined;
27
+ }
28
+ }
29
+ function readText(path) {
30
+ try {
31
+ return readFileSync(path, 'utf8');
32
+ }
33
+ catch {
34
+ return undefined;
35
+ }
36
+ }
37
+ function str(value) {
38
+ return typeof value === 'string' && value !== '' ? value : undefined;
39
+ }
40
+ function keyCount(value) {
41
+ return typeof value === 'object' && value !== null && !Array.isArray(value) ? Object.keys(value).length : 0;
42
+ }
43
+ /** The preset's own package root. */
44
+ function ownPackageDir() {
45
+ return dirname(dirname(fileURLToPath(import.meta.url)));
46
+ }
47
+ /**
48
+ * The base copy the PLUGIN's own tree resolves to: walk up from `cwd` looking for
49
+ * `<dir>/node_modules/@avantf/dsh-plugin-base/package.json`.
50
+ *
51
+ * Deliberately NOT `createRequire(...).resolve()`: that also consults the process-wide `NODE_PATH`,
52
+ * which package-manager shims (pnpm's `.bin` shims set it to the virtual store) and developer shells
53
+ * export. A plugin whose own tree has no base would then be reported as `pass` — the exact false
54
+ * green this check exists to catch. Only the plugin's directory chain may answer.
55
+ */
56
+ function resolveFrameworkDir(cwd) {
57
+ let current = resolvePath(cwd);
58
+ for (;;) {
59
+ const candidate = join(current, 'node_modules', FRAMEWORK_PACKAGE);
60
+ if (existsSync(join(candidate, 'package.json')))
61
+ return candidate;
62
+ const parent = dirname(current);
63
+ if (parent === current)
64
+ return undefined;
65
+ current = parent;
66
+ }
67
+ }
68
+ /** Build configuration and build-time assertions. */
69
+ export function envinitPreset(options = {}) {
70
+ const cwd = options.cwd ?? process.cwd();
71
+ const external = [FRAMEWORK_PACKAGE, ...(options.external ?? []).filter(name => name !== FRAMEWORK_PACKAGE)];
72
+ const noExternal = [BOOTSTRAP_SUBPATH];
73
+ const out = builder();
74
+ const frameworkDir = options.frameworkDir ?? resolveFrameworkDir(cwd);
75
+ if (frameworkDir === undefined) {
76
+ out.fail('preset/framework-resolvable', `无法从 ${cwd} 解析 ${FRAMEWORK_PACKAGE}/package.json`);
77
+ return { frameworkDir: '', frameworkVersion: '', declaredRange: '', external, noExternal, checks: out.checks, ok: false };
78
+ }
79
+ const frameworkPkg = readJson(join(frameworkDir, 'package.json'));
80
+ const frameworkVersion = str(frameworkPkg?.['version']);
81
+ if (frameworkPkg === undefined || frameworkVersion === undefined) {
82
+ out.fail('preset/framework-resolvable', `${frameworkDir}/package.json 不可读或缺少 version`);
83
+ return { frameworkDir, frameworkVersion: '', declaredRange: '', external, noExternal, checks: out.checks, ok: false };
84
+ }
85
+ out.pass('preset/framework-resolvable', `${FRAMEWORK_PACKAGE}@${frameworkVersion} @ ${frameworkDir}`);
86
+ // ── preset/package version agreement ───────────────────────────────────────
87
+ const ownPkg = readJson(join(ownPackageDir(), 'package.json'));
88
+ const ownVersion = str(ownPkg?.['version']);
89
+ if (ownVersion === frameworkVersion) {
90
+ out.pass('preset/preset-version-matches-package', `preset ${ownVersion ?? '?'} = 框架包 ${frameworkVersion}`);
91
+ }
92
+ else {
93
+ out.fail('preset/preset-version-matches-package', `预设版本 ${ownVersion ?? '(未知)'} ≠ 框架包版本 ${frameworkVersion}(预设必须与框架同版)`);
94
+ }
95
+ // ── bootstrap/package version agreement ────────────────────────────────────
96
+ if (BOOTSTRAP_VERSION === frameworkVersion) {
97
+ out.pass('preset/bootstrap-version-matches-package', `bootstrap ${BOOTSTRAP_VERSION} = 框架包 ${frameworkVersion}`);
98
+ }
99
+ else {
100
+ out.fail('preset/bootstrap-version-matches-package', `bootstrap 版本常量 ${BOOTSTRAP_VERSION} ≠ 框架包版本 ${frameworkVersion}`);
101
+ }
102
+ // ── base self-containment ──────────────────────────────────────────────────
103
+ // The base is resolved and `import()`ed by the plugin's inlined bootstrap, so it must bring no
104
+ // runtime dependency of its own: `dependencies` stays empty. It has EXACTLY ONE permitted peer —
105
+ // `zod`, which the compatibility gate's typert probe needs and which must be the HOST's copy (two
106
+ // zod copies, even of the same major, have incompatible schema identities). Any dependency, any
107
+ // second peer, means the base is no longer self-contained.
108
+ const runtimeDeps = keyCount(frameworkPkg['dependencies']);
109
+ const peers = frameworkPkg['peerDependencies'];
110
+ const peerNames = typeof peers === 'object' && peers !== null && !Array.isArray(peers) ? Object.keys(peers) : [];
111
+ const unexpectedPeers = peerNames.filter(name => name !== 'zod');
112
+ if (runtimeDeps === 0 && unexpectedPeers.length === 0) {
113
+ out.pass('preset/framework-self-contained', `dependencies 为空;peerDependencies = ${peerNames.length === 0 ? '(空)' : peerNames.join(', ')}`);
114
+ }
115
+ else {
116
+ out.fail('preset/framework-self-contained', `框架包必须自包含:dependencies 必须为空(现有 ${String(runtimeDeps)} 条);peerDependencies 只允许 zod(现有多余 ${unexpectedPeers.join(', ') || '(无)'})`);
117
+ }
118
+ // ── declared range ─────────────────────────────────────────────────────────
119
+ const pluginPkg = readJson(join(cwd, 'package.json'));
120
+ if (pluginPkg === undefined) {
121
+ out.fail('preset/peer-range-declared', `${join(cwd, 'package.json')} 不可读`);
122
+ return { frameworkDir, frameworkVersion, declaredRange: '', external, noExternal, checks: out.checks, ok: false };
123
+ }
124
+ const peer = pluginPkg['peerDependencies'];
125
+ const declaredRange = typeof peer === 'object' && peer !== null ? str(peer[FRAMEWORK_PACKAGE]) : undefined;
126
+ if (declaredRange === undefined) {
127
+ out.fail('preset/peer-range-declared', `插件必须在 peerDependencies 声明 ${FRAMEWORK_PACKAGE} 的区间`);
128
+ return { frameworkDir, frameworkVersion, declaredRange: '', external, noExternal, checks: out.checks, ok: false };
129
+ }
130
+ try {
131
+ assertRange(declaredRange);
132
+ out.pass('preset/peer-range-declared', `peerDependencies["${FRAMEWORK_PACKAGE}"] = ${declaredRange}`);
133
+ }
134
+ catch (error) {
135
+ out.fail('preset/peer-range-declared', `区间不在支持的 semver 子集内:${declaredRange}(${error instanceof Error ? error.message : String(error)})`);
136
+ }
137
+ const dev = pluginPkg['devDependencies'];
138
+ const devRange = typeof dev === 'object' && dev !== null ? str(dev[FRAMEWORK_PACKAGE]) : undefined;
139
+ const rangeProblems = [];
140
+ if (devRange !== declaredRange)
141
+ rangeProblems.push(`devDependencies 是 ${devRange ?? '(缺失)'},应与 peerDependencies 同区间`);
142
+ if (options.range !== undefined && options.range !== declaredRange) {
143
+ rangeProblems.push(`传入的 range 是 ${options.range},应等于 peerDependencies`);
144
+ }
145
+ if (rangeProblems.length === 0) {
146
+ out.pass('preset/range-single-source', `peerDependencies ≡ devDependencies = ${declaredRange}`);
147
+ }
148
+ else {
149
+ out.fail('preset/range-single-source', rangeProblems.join(';'));
150
+ }
151
+ // ── bootstrap version in range ─────────────────────────────────────────────
152
+ if (satisfiesRange(BOOTSTRAP_VERSION, declaredRange)) {
153
+ out.pass('preset/bootstrap-version-in-range', `bootstrap ${BOOTSTRAP_VERSION} ∈ ${declaredRange}`);
154
+ }
155
+ else {
156
+ out.fail('preset/bootstrap-version-in-range', `bootstrap 版本 ${BOOTSTRAP_VERSION} 不在插件声明的区间 ${declaredRange} 内(构建必须失败)`);
157
+ }
158
+ return {
159
+ frameworkDir,
160
+ frameworkVersion,
161
+ declaredRange,
162
+ external,
163
+ noExternal,
164
+ checks: out.checks,
165
+ ok: out.checks.every(check => check.status !== 'fail'),
166
+ };
167
+ }
168
+ /** Throw when any assertion failed; the message lists the failing rule ids. */
169
+ export function assertEnvinitPreset(preset) {
170
+ assertEnvinitPresetChecks(preset.checks);
171
+ }
172
+ /** Post-build scan; returns the checks. {@link assertEnvinitPresetChecks} turns failures into a build error. */
173
+ export function assertEnvinitArtifacts(options) {
174
+ const checks = [];
175
+ const server = options.artifacts ?? [];
176
+ if (server.length === 0) {
177
+ checks.push({ id: 'preset/server-artifacts-external-only', status: 'skip', message: '未提供服务端产物路径' });
178
+ }
179
+ else {
180
+ const offenders = [];
181
+ for (const path of server) {
182
+ const text = readText(path);
183
+ if (text === undefined) {
184
+ offenders.push(`${path}: 不可读`);
185
+ continue;
186
+ }
187
+ for (const found of findFrameworkImports(text)) {
188
+ if (isBootstrapSpecifier(found.specifier)) {
189
+ offenders.push(`${path}: ${found.specifier} 必须被内联,产物里不得留下该 import`);
190
+ }
191
+ }
192
+ const beacons = findInliningBeacons(text);
193
+ if (beacons.length >= MIN_INLINING_BEACONS) {
194
+ offenders.push(`${path}: 框架本包被内联(命中控制面字面量 ${beacons.join(', ')}),\`.\` 必须保持外部`);
195
+ }
196
+ }
197
+ checks.push(offenders.length === 0
198
+ ? { id: 'preset/server-artifacts-external-only', status: 'pass', message: `${String(server.length)} 个服务端产物:bootstrap 已内联、框架本包保持外部` }
199
+ : { id: 'preset/server-artifacts-external-only', status: 'fail', message: offenders.join(';') });
200
+ }
201
+ const client = options.clientArtifacts ?? [];
202
+ if (client.length === 0) {
203
+ checks.push({ id: 'preset/client-artifacts-clean', status: 'skip', message: '未提供 client 产物路径' });
204
+ }
205
+ else {
206
+ const offenders = [];
207
+ for (const path of client) {
208
+ const text = readText(path);
209
+ if (text === undefined) {
210
+ offenders.push(`${path}: 不可读`);
211
+ continue;
212
+ }
213
+ const specifiers = [...new Set(findFrameworkImports(text).map(found => found.specifier))];
214
+ if (specifiers.length > 0)
215
+ offenders.push(`${path}: client 产物不得 import 框架(${specifiers.join(', ')})`);
216
+ }
217
+ checks.push(offenders.length === 0
218
+ ? { id: 'preset/client-artifacts-clean', status: 'pass', message: `${String(client.length)} 个 client 产物:无框架 import` }
219
+ : { id: 'preset/client-artifacts-clean', status: 'fail', message: offenders.join(';') });
220
+ }
221
+ return checks;
222
+ }
223
+ /** Turn any failing check into a thrown build error. */
224
+ export function assertEnvinitPresetChecks(checks) {
225
+ const failed = checks.filter(check => check.status === 'fail');
226
+ if (failed.length === 0)
227
+ return;
228
+ throw new Error(`dsh-plugin-base 产物断言失败:\n${failed.map(check => ` [${check.id}] ${check.message}`).join('\n')}`);
229
+ }
230
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.js","sourceRoot":"","sources":["../src/preset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Provider } from '../types.js';
2
+ export declare const BINARY_ARCHIVE_KIND = "binary-archive";
3
+ /** One platform pack of an archive artifact. */
4
+ export interface ArchivePack {
5
+ readonly url: string;
6
+ readonly sha256: string;
7
+ /** Default `tar.gz`. */
8
+ readonly archive?: 'tar.gz' | 'zip';
9
+ /** Executable name inside the archive; defaults to the spec's. */
10
+ readonly binary?: string;
11
+ }
12
+ /** The `spec` of a `binary-archive` item. */
13
+ export interface BinaryArchiveSpec {
14
+ /** Artifact identity, also the resource name. */
15
+ readonly id: string;
16
+ readonly version: string;
17
+ /** `${platform}-${arch}` → pack. */
18
+ readonly packs: Readonly<Record<string, ArchivePack>>;
19
+ /** The executable name; defaults to `id`. */
20
+ readonly binary?: string;
21
+ /** Explicit path to an already-installed executable (highest probe priority). */
22
+ readonly entry?: string;
23
+ /** Environment variable that overrides the explicit path. */
24
+ readonly envVar?: string;
25
+ /** Arguments for the `--version` probe; defaults to `['--version']`. */
26
+ readonly versionArgs?: readonly string[];
27
+ }
28
+ /** Build the built-in binary-archive provider. */
29
+ export declare function binaryArchiveProvider(options?: {
30
+ readonly id?: string;
31
+ }): Provider;
32
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/providers/archive.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAA+B,QAAQ,EAAuE,MAAM,aAAa,CAAA;AAG7I,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAOnD,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,wBAAwB;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;IACnC,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;IACrD,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,wEAAwE;IACxE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AA2FD,kDAAkD;AAClD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,QAAQ,CAqJtF"}