@dzhechkov/harness-core 0.8.32 → 0.8.33
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/.dz-manifest.json +97 -37
- package/README.md +30 -0
- package/dist/apply-leg.d.ts +13 -1
- package/dist/apply-leg.d.ts.map +1 -1
- package/dist/apply-leg.js +123 -10
- package/dist/apply-leg.js.map +1 -1
- package/dist/embed-socket-path.d.ts +65 -0
- package/dist/embed-socket-path.d.ts.map +1 -0
- package/dist/embed-socket-path.js +100 -0
- package/dist/embed-socket-path.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +66 -3
- package/dist/operations.js.map +1 -1
- package/dist/packed-install-smoke.d.ts +108 -0
- package/dist/packed-install-smoke.d.ts.map +1 -0
- package/dist/packed-install-smoke.js +172 -0
- package/dist/packed-install-smoke.js.map +1 -0
- package/dist/publish-sibling-drift.d.ts +67 -0
- package/dist/publish-sibling-drift.d.ts.map +1 -0
- package/dist/publish-sibling-drift.js +262 -0
- package/dist/publish-sibling-drift.js.map +1 -0
- package/dist/publish.d.ts +44 -0
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +243 -24
- package/dist/publish.js.map +1 -1
- package/dist/qe-bridge.d.ts +16 -0
- package/dist/qe-bridge.d.ts.map +1 -1
- package/dist/qe-bridge.js +1 -0
- package/dist/qe-bridge.js.map +1 -1
- package/dist/release.d.ts +19 -0
- package/dist/release.d.ts.map +1 -1
- package/dist/release.js +81 -2
- package/dist/release.js.map +1 -1
- package/dist/setup.d.ts +36 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +96 -2
- package/dist/setup.js.map +1 -1
- package/package.json +23 -23
- package/sbom.json +186 -36
- package/src/apply-leg.ts +123 -10
- package/src/embed-socket-path.ts +113 -0
- package/src/index.ts +35 -2
- package/src/operations.ts +67 -3
- package/src/packed-install-smoke.ts +273 -0
- package/src/publish-sibling-drift.ts +293 -0
- package/src/publish.ts +280 -25
- package/src/qe-bridge.ts +14 -0
- package/src/release.ts +103 -2
- package/src/setup.ts +108 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packed-install-smoke.js","sourceRoot":"","sources":["../src/packed-install-smoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sibling-drift gate — feature `publish-sibling-drift-gate`, ADR-001 (Decision 1).
|
|
3
|
+
*
|
|
4
|
+
* `rewriteWorkspaceSpecs` (publish.ts) pins a sibling `workspace:^`/`workspace:~`/`workspace:*`
|
|
5
|
+
* dependency to the EXACT version currently on disk. That version may be published on the
|
|
6
|
+
* registry carrying an OLDER build than the workspace — the sibling changed without a version
|
|
7
|
+
* bump. The pinned range then resolves at install time to a package that does not match the
|
|
8
|
+
* workspace's current behavior, and a fresh `npm install` reproduces whatever regressed.
|
|
9
|
+
*
|
|
10
|
+
* Detection (ADR-001, Decision 1, alternative А3 — accepted): hash every file under the
|
|
11
|
+
* published tarball's `dist/**` plus its `package.json` (with `version`/`gitHead`/`_*` fields
|
|
12
|
+
* stripped, since those legitimately differ between the registry copy and the workspace copy),
|
|
13
|
+
* and compare against the same hash of the workspace copy. Any difference is drift. A published
|
|
14
|
+
* `dist/index.js` missing an export the workspace's `dist/index.js` declares is surfaced as a
|
|
15
|
+
* SECOND, more readable signal (`missingExports`) — the exact shape of the 2026-09-13 incident
|
|
16
|
+
* ("does not provide an export named …") — but the hash comparison is the load-bearing check:
|
|
17
|
+
* it also catches behavior changes that keep every export name intact.
|
|
18
|
+
*
|
|
19
|
+
* Network access is NOT this module's concern (NFR-2: pure, no network, fixture-testable):
|
|
20
|
+
* `fetchPublished` is injected. The CLI implementation packs the sibling from the registry via
|
|
21
|
+
* `npm pack <name>@<version>` into a temp dir; tests inject a local directory. A fetch that
|
|
22
|
+
* returns `null` (offline, 404, timeout) is reported as `'unavailable'` — never silently treated
|
|
23
|
+
* as `'same'` (the "a gate that infers a pass from silence breaks on the next failure path"
|
|
24
|
+
* lesson): the caller decides whether `'unavailable'` blocks or is overridden.
|
|
25
|
+
*
|
|
26
|
+
* @packageDocumentation
|
|
27
|
+
*/
|
|
28
|
+
export type SiblingDriftStatus = 'same' | 'drift' | 'unavailable';
|
|
29
|
+
export interface SiblingDriftResult {
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly version: string;
|
|
32
|
+
readonly status: SiblingDriftStatus;
|
|
33
|
+
/** Relative paths (dist/** or package.json) whose hash differs, or is present on only one side. */
|
|
34
|
+
readonly changedFiles: readonly string[];
|
|
35
|
+
/** Export names the workspace's dist/index.js declares that the published one lacks (А2, secondary signal). */
|
|
36
|
+
readonly missingExports: readonly string[];
|
|
37
|
+
/** Present only when status === 'unavailable'. */
|
|
38
|
+
readonly reason?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface FetchedPublished {
|
|
41
|
+
/** Directory holding the extracted published tarball (contains dist/, package.json). */
|
|
42
|
+
readonly dir: string;
|
|
43
|
+
}
|
|
44
|
+
/** Fetch the published build of `name@version`. `null` = unavailable (network/404/timeout). */
|
|
45
|
+
export type FetchPublished = (name: string, version: string) => FetchedPublished | null;
|
|
46
|
+
export interface DetectSiblingDriftOptions {
|
|
47
|
+
readonly dependencies: Record<string, string> | undefined;
|
|
48
|
+
/** pnpm rewrites `workspace:` in peerDependencies too (mirrors findUnpublishedWorkspaceFloors). */
|
|
49
|
+
readonly peerDependencies?: Record<string, string> | undefined;
|
|
50
|
+
/** AM-3: ships and pins exactly like `dependencies` — checked the same way. */
|
|
51
|
+
readonly optionalDependencies?: Record<string, string> | undefined;
|
|
52
|
+
/** name -> version on DISK, for every package in the workspace. */
|
|
53
|
+
readonly workspaceVersions: ReadonlyMap<string, string>;
|
|
54
|
+
/** name -> absolute package dir on disk, for every package in the workspace. */
|
|
55
|
+
readonly workspaceDirs: ReadonlyMap<string, string>;
|
|
56
|
+
/** Names being published in THIS batch — they publish fresh, so drift cannot be measured against them. */
|
|
57
|
+
readonly batch: ReadonlySet<string>;
|
|
58
|
+
readonly fetchPublished: FetchPublished;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* For every `workspace:`-declared dependency of a package that is NOT part of `batch` (i.e. will
|
|
62
|
+
* be pinned to whatever is already on the registry, not published fresh in this run), compare the
|
|
63
|
+
* build that will be pinned against the workspace copy. Pure: all IO (fetch, fs) is either
|
|
64
|
+
* injected or scoped to reading local dist/package.json files — no network call is made here.
|
|
65
|
+
*/
|
|
66
|
+
export declare function detectSiblingDrift(opts: DetectSiblingDriftOptions): SiblingDriftResult[];
|
|
67
|
+
//# sourceMappingURL=publish-sibling-drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-sibling-drift.d.ts","sourceRoot":"","sources":["../src/publish-sibling-drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAMH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;AAElE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,mGAAmG;IACnG,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,+GAA+G;IAC/G,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,kDAAkD;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,wFAAwF;IACxF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,+FAA+F;AAC/F,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,gBAAgB,GAAG,IAAI,CAAC;AAExF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC1D,mGAAmG;IACnG,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/D,+EAA+E;IAC/E,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACnE,mEAAmE;IACnE,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,gFAAgF;IAChF,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,0GAA0G;IAC1G,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC;AAsID;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,kBAAkB,EAAE,CAqFxF"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sibling-drift gate — feature `publish-sibling-drift-gate`, ADR-001 (Decision 1).
|
|
3
|
+
*
|
|
4
|
+
* `rewriteWorkspaceSpecs` (publish.ts) pins a sibling `workspace:^`/`workspace:~`/`workspace:*`
|
|
5
|
+
* dependency to the EXACT version currently on disk. That version may be published on the
|
|
6
|
+
* registry carrying an OLDER build than the workspace — the sibling changed without a version
|
|
7
|
+
* bump. The pinned range then resolves at install time to a package that does not match the
|
|
8
|
+
* workspace's current behavior, and a fresh `npm install` reproduces whatever regressed.
|
|
9
|
+
*
|
|
10
|
+
* Detection (ADR-001, Decision 1, alternative А3 — accepted): hash every file under the
|
|
11
|
+
* published tarball's `dist/**` plus its `package.json` (with `version`/`gitHead`/`_*` fields
|
|
12
|
+
* stripped, since those legitimately differ between the registry copy and the workspace copy),
|
|
13
|
+
* and compare against the same hash of the workspace copy. Any difference is drift. A published
|
|
14
|
+
* `dist/index.js` missing an export the workspace's `dist/index.js` declares is surfaced as a
|
|
15
|
+
* SECOND, more readable signal (`missingExports`) — the exact shape of the 2026-09-13 incident
|
|
16
|
+
* ("does not provide an export named …") — but the hash comparison is the load-bearing check:
|
|
17
|
+
* it also catches behavior changes that keep every export name intact.
|
|
18
|
+
*
|
|
19
|
+
* Network access is NOT this module's concern (NFR-2: pure, no network, fixture-testable):
|
|
20
|
+
* `fetchPublished` is injected. The CLI implementation packs the sibling from the registry via
|
|
21
|
+
* `npm pack <name>@<version>` into a temp dir; tests inject a local directory. A fetch that
|
|
22
|
+
* returns `null` (offline, 404, timeout) is reported as `'unavailable'` — never silently treated
|
|
23
|
+
* as `'same'` (the "a gate that infers a pass from silence breaks on the next failure path"
|
|
24
|
+
* lesson): the caller decides whether `'unavailable'` blocks or is overridden.
|
|
25
|
+
*
|
|
26
|
+
* @packageDocumentation
|
|
27
|
+
*/
|
|
28
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
29
|
+
import { createHash } from 'node:crypto';
|
|
30
|
+
import { join, relative } from 'node:path';
|
|
31
|
+
function listFilesRecursive(root, dir) {
|
|
32
|
+
if (!existsSync(dir))
|
|
33
|
+
return [];
|
|
34
|
+
const out = [];
|
|
35
|
+
for (const entry of readdirSync(dir).sort()) {
|
|
36
|
+
const abs = join(dir, entry);
|
|
37
|
+
const st = statSync(abs);
|
|
38
|
+
if (st.isDirectory())
|
|
39
|
+
out.push(...listFilesRecursive(root, abs));
|
|
40
|
+
else
|
|
41
|
+
out.push(relative(root, abs));
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
function sha256(data) {
|
|
46
|
+
return createHash('sha256').update(data).digest('hex');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* package.json PARSED and validated. `null` (never `undefined`) means "this side cannot be built
|
|
50
|
+
* at all" — AM-3: a missing or unparseable manifest on EITHER side must surface as `unavailable`,
|
|
51
|
+
* never as an empty/omitted comparison field that a hash-mismatch loop could silently read as
|
|
52
|
+
* "nothing differs here".
|
|
53
|
+
*/
|
|
54
|
+
function readManifest(dir) {
|
|
55
|
+
const p = join(dir, 'package.json');
|
|
56
|
+
if (!existsSync(p))
|
|
57
|
+
return null;
|
|
58
|
+
try {
|
|
59
|
+
const raw = JSON.parse(readFileSync(p, 'utf-8'));
|
|
60
|
+
return raw !== null && typeof raw === 'object' && !Array.isArray(raw) ? raw : null;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** package.json normalized for comparison: strip fields that legitimately differ (version, gitHead, npm-internal `_*`). */
|
|
67
|
+
function normalizedPackageJsonText(raw) {
|
|
68
|
+
// Lead edit after the live dry-run on the hub (2026-09-13 10:40): the packer strips
|
|
69
|
+
// `scripts.prepublishOnly`, drops devDependencies/publishConfig and rewrites `workspace:` specs to
|
|
70
|
+
// pinned versions — every freshly published sibling read as "1 file drifted". Compare only what
|
|
71
|
+
// shapes the SHIPPED behavior: entry points, bins, files, engines, and dependency NAMES (values
|
|
72
|
+
// are the workspace-floor preflight's business, not this gate's).
|
|
73
|
+
//
|
|
74
|
+
// AM-4: `imports`/`browser`/`sideEffects`/`man` added — each one changes what a consumer actually
|
|
75
|
+
// resolves or ships, exactly like `main`/`exports`/`bin` already did; omitting them was a real gap
|
|
76
|
+
// the round-1 review named (finding 4), not a stylistic nicety.
|
|
77
|
+
const SHIPPING_FIELDS = [
|
|
78
|
+
'name', 'type', 'main', 'module', 'types', 'exports', 'imports', 'browser', 'sideEffects', 'man',
|
|
79
|
+
'bin', 'files', 'engines', 'os', 'cpu',
|
|
80
|
+
];
|
|
81
|
+
const DEP_TABLES = ['dependencies', 'peerDependencies', 'optionalDependencies'];
|
|
82
|
+
const kept = {};
|
|
83
|
+
for (const key of SHIPPING_FIELDS)
|
|
84
|
+
if (key in raw)
|
|
85
|
+
kept[key] = raw[key];
|
|
86
|
+
for (const key of DEP_TABLES) {
|
|
87
|
+
const table = raw[key];
|
|
88
|
+
if (table !== null && typeof table === 'object')
|
|
89
|
+
kept[key] = Object.keys(table).sort();
|
|
90
|
+
}
|
|
91
|
+
return JSON.stringify(kept);
|
|
92
|
+
}
|
|
93
|
+
/** Every relative path (from `dir`) that a `bin` field in a parsed manifest resolves to. */
|
|
94
|
+
function binPaths(raw) {
|
|
95
|
+
const bin = raw['bin'];
|
|
96
|
+
if (typeof bin === 'string')
|
|
97
|
+
return [bin.replace(/^\.\//, '')];
|
|
98
|
+
if (bin !== null && typeof bin === 'object' && !Array.isArray(bin)) {
|
|
99
|
+
return Object.values(bin)
|
|
100
|
+
.filter((v) => typeof v === 'string')
|
|
101
|
+
.map((v) => v.replace(/^\.\//, ''));
|
|
102
|
+
}
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* AM-4: the round-1 gate hashed only `dist/**` — a changed bin script, template, or other
|
|
107
|
+
* top-level asset that ships (declared in `package.json#files`, or the `bin` target itself) was
|
|
108
|
+
* invisible to the drift check even though npm ships it byte-for-byte. This is a documented,
|
|
109
|
+
* honest APPROXIMATION of "the whole tarball inventory" (the literal ADR wording), not a full
|
|
110
|
+
* re-implementation of npm's pack-time file-inclusion rules (`.npmignore`, default excludes,
|
|
111
|
+
* nested `.gitignore`): it walks `dist/**` (unconditional — the common case) plus every path
|
|
112
|
+
* named in `files` (directories walked recursively, files hashed directly) plus every resolved
|
|
113
|
+
* `bin` target, deduplicated. A package with no `files` field declared keeps exactly the
|
|
114
|
+
* pre-amendment `dist/**`-only scope, named here rather than silently pretended-away.
|
|
115
|
+
*/
|
|
116
|
+
function shippedInventoryDirs(dir, raw) {
|
|
117
|
+
const rels = new Set(['dist']);
|
|
118
|
+
const files = raw['files'];
|
|
119
|
+
if (Array.isArray(files)) {
|
|
120
|
+
for (const entry of files) {
|
|
121
|
+
if (typeof entry === 'string' && entry.trim() !== '')
|
|
122
|
+
rels.add(entry.replace(/^\.\//, '').replace(/\/+$/, ''));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
for (const bin of binPaths(raw))
|
|
126
|
+
rels.add(bin);
|
|
127
|
+
return [...rels].filter((rel) => existsSync(join(dir, rel)));
|
|
128
|
+
}
|
|
129
|
+
/** Hash the shipped inventory (AM-4) plus the normalized package.json, keyed by a stable relative path. */
|
|
130
|
+
function hashTree(dir, manifest) {
|
|
131
|
+
const map = new Map();
|
|
132
|
+
for (const rel of shippedInventoryDirs(dir, manifest)) {
|
|
133
|
+
const abs = join(dir, rel);
|
|
134
|
+
if (statSync(abs).isDirectory()) {
|
|
135
|
+
for (const sub of listFilesRecursive(abs, abs))
|
|
136
|
+
map.set(join(rel, sub), sha256(readFileSync(join(abs, sub))));
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
map.set(rel, sha256(readFileSync(abs)));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
map.set('package.json', sha256(normalizedPackageJsonText(manifest)));
|
|
143
|
+
return map;
|
|
144
|
+
}
|
|
145
|
+
function extractExportNames(source) {
|
|
146
|
+
const names = new Set();
|
|
147
|
+
for (const m of source.matchAll(/export\s+(?:const|function|class|async\s+function)\s+([A-Za-z0-9_$]+)/g)) {
|
|
148
|
+
names.add(m[1]);
|
|
149
|
+
}
|
|
150
|
+
for (const m of source.matchAll(/export\s*\{([^}]*)\}/g)) {
|
|
151
|
+
for (const part of m[1].split(',')) {
|
|
152
|
+
const name = part.trim().split(/\s+as\s+/).pop()?.trim();
|
|
153
|
+
if (name)
|
|
154
|
+
names.add(name);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return names;
|
|
158
|
+
}
|
|
159
|
+
/** А2 (ADR-001, rejected as the sole signal, kept as a readable second signal). */
|
|
160
|
+
function missingExportNames(publishedDir, workspaceDir) {
|
|
161
|
+
const pubIndex = join(publishedDir, 'dist', 'index.js');
|
|
162
|
+
const wsIndex = join(workspaceDir, 'dist', 'index.js');
|
|
163
|
+
if (!existsSync(pubIndex) || !existsSync(wsIndex))
|
|
164
|
+
return [];
|
|
165
|
+
const pubExports = extractExportNames(readFileSync(pubIndex, 'utf-8'));
|
|
166
|
+
const wsExports = extractExportNames(readFileSync(wsIndex, 'utf-8'));
|
|
167
|
+
return [...wsExports].filter((n) => !pubExports.has(n)).sort();
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* For every `workspace:`-declared dependency of a package that is NOT part of `batch` (i.e. will
|
|
171
|
+
* be pinned to whatever is already on the registry, not published fresh in this run), compare the
|
|
172
|
+
* build that will be pinned against the workspace copy. Pure: all IO (fetch, fs) is either
|
|
173
|
+
* injected or scoped to reading local dist/package.json files — no network call is made here.
|
|
174
|
+
*/
|
|
175
|
+
export function detectSiblingDrift(opts) {
|
|
176
|
+
const results = [];
|
|
177
|
+
const seen = new Set();
|
|
178
|
+
// AM-3: `optionalDependencies` ships and pins EXACTLY like `dependencies`/`peerDependencies` —
|
|
179
|
+
// checking only the first two let a stale optional sibling through untouched (round-1 finding 3).
|
|
180
|
+
const entries = [
|
|
181
|
+
...Object.entries(opts.dependencies ?? {}),
|
|
182
|
+
...Object.entries(opts.peerDependencies ?? {}),
|
|
183
|
+
...Object.entries(opts.optionalDependencies ?? {}),
|
|
184
|
+
];
|
|
185
|
+
for (const [dep, spec] of entries) {
|
|
186
|
+
if (!String(spec).startsWith('workspace:'))
|
|
187
|
+
continue;
|
|
188
|
+
if (seen.has(dep))
|
|
189
|
+
continue;
|
|
190
|
+
seen.add(dep);
|
|
191
|
+
if (opts.batch.has(dep))
|
|
192
|
+
continue; // publishes fresh in this batch — nothing stale to drift from
|
|
193
|
+
const version = opts.workspaceVersions.get(dep);
|
|
194
|
+
const workspaceDir = opts.workspaceDirs.get(dep);
|
|
195
|
+
// AM-3: a `workspace:`-spec'd dependency this caller does not recognize used to be silently
|
|
196
|
+
// SKIPPED — an input this gate cannot build is a HARD gate that cannot say "same", never a
|
|
197
|
+
// quiet pass-through (round-1 finding 3: pnpm would die packing it anyway; die here, named).
|
|
198
|
+
if (version === undefined || workspaceDir === undefined) {
|
|
199
|
+
results.push({
|
|
200
|
+
name: dep,
|
|
201
|
+
version: version ?? '(not in workspace)',
|
|
202
|
+
status: 'unavailable',
|
|
203
|
+
changedFiles: [],
|
|
204
|
+
missingExports: [],
|
|
205
|
+
reason: `${dep} is declared workspace:-protocol but is not a known workspace package`,
|
|
206
|
+
});
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
const fetched = opts.fetchPublished(dep, version);
|
|
210
|
+
if (fetched === null) {
|
|
211
|
+
results.push({
|
|
212
|
+
name: dep,
|
|
213
|
+
version,
|
|
214
|
+
status: 'unavailable',
|
|
215
|
+
changedFiles: [],
|
|
216
|
+
missingExports: [],
|
|
217
|
+
reason: `could not fetch ${dep}@${version} from the registry (network unavailable or the version was not found)`,
|
|
218
|
+
});
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
// AM-3: a missing/unparseable package.json on EITHER side must not silently drop out of the
|
|
222
|
+
// comparison (the old `hashTree` simply omitted the key, which — with an empty/matching
|
|
223
|
+
// `dist/**` on both sides — could report `same` about an input that was never actually read).
|
|
224
|
+
const publishedManifest = readManifest(fetched.dir);
|
|
225
|
+
const workspaceManifest = readManifest(workspaceDir);
|
|
226
|
+
if (publishedManifest === null || workspaceManifest === null) {
|
|
227
|
+
const side = publishedManifest === null ? 'the published tarball' : 'the workspace copy';
|
|
228
|
+
results.push({
|
|
229
|
+
name: dep,
|
|
230
|
+
version,
|
|
231
|
+
status: 'unavailable',
|
|
232
|
+
changedFiles: [],
|
|
233
|
+
missingExports: [],
|
|
234
|
+
reason: `${dep}@${version}: package.json in ${side} is missing or not valid JSON — cannot compare`,
|
|
235
|
+
});
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
const publishedHashes = hashTree(fetched.dir, publishedManifest);
|
|
239
|
+
const workspaceHashes = hashTree(workspaceDir, workspaceManifest);
|
|
240
|
+
const allKeys = new Set([...publishedHashes.keys(), ...workspaceHashes.keys()]);
|
|
241
|
+
const changed = [];
|
|
242
|
+
for (const key of allKeys) {
|
|
243
|
+
if (publishedHashes.get(key) !== workspaceHashes.get(key))
|
|
244
|
+
changed.push(key);
|
|
245
|
+
}
|
|
246
|
+
changed.sort();
|
|
247
|
+
if (changed.length === 0) {
|
|
248
|
+
results.push({ name: dep, version, status: 'same', changedFiles: [], missingExports: [] });
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
results.push({
|
|
252
|
+
name: dep,
|
|
253
|
+
version,
|
|
254
|
+
status: 'drift',
|
|
255
|
+
changedFiles: changed,
|
|
256
|
+
missingExports: missingExportNames(fetched.dir, workspaceDir),
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return results;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=publish-sibling-drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-sibling-drift.js","sourceRoot":"","sources":["../src/publish-sibling-drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAuC3C,SAAS,kBAAkB,CAAC,IAAY,EAAE,GAAW;IACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,EAAE,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;;YAC5D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,MAAM,CAAC,IAAqB;IACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAA+B,CAAC,CAAC,CAAC,IAAI,CAAC;IAClH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,2HAA2H;AAC3H,SAAS,yBAAyB,CAAC,GAA4B;IAC7D,oFAAoF;IACpF,mGAAmG;IACnG,gGAAgG;IAChG,gGAAgG;IAChG,kEAAkE;IAClE,EAAE;IACF,kGAAkG;IAClG,mGAAmG;IACnG,gEAAgE;IAChE,MAAM,eAAe,GAAG;QACtB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK;QAChG,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK;KACvC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,cAAc,EAAE,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;IAChF,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,eAAe;QAAE,IAAI,GAAG,IAAI,GAAG;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACxE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpH,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,4FAA4F;AAC5F,SAAS,QAAQ,CAAC,GAA4B;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/D,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACnE,OAAO,MAAM,CAAC,MAAM,CAAC,GAA8B,CAAC;aACjD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;aACjD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,oBAAoB,CAAC,GAAW,EAAE,GAA4B;IACrE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,2GAA2G;AAC3G,SAAS,QAAQ,CAAC,GAAW,EAAE,QAAiC;IAC9D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3B,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc;IACxC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,wEAAwE,CAAC,EAAE,CAAC;QAC1G,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACzD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC;YACzD,IAAI,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mFAAmF;AACnF,SAAS,kBAAkB,CAAC,YAAoB,EAAE,YAAoB;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7D,MAAM,UAAU,GAAG,kBAAkB,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,kBAAkB,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA+B;IAChE,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,+FAA+F;IAC/F,kGAAkG;IAClG,MAAM,OAAO,GAAG;QACd,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QAC1C,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAC9C,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC;KACnD,CAAC;IACF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,SAAS;QACrD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,8DAA8D;QACjG,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjD,4FAA4F;QAC5F,2FAA2F;QAC3F,6FAA6F;QAC7F,IAAI,OAAO,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,OAAO,IAAI,oBAAoB;gBACxC,MAAM,EAAE,aAAa;gBACrB,YAAY,EAAE,EAAE;gBAChB,cAAc,EAAE,EAAE;gBAClB,MAAM,EAAE,GAAG,GAAG,uEAAuE;aACtF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,GAAG;gBACT,OAAO;gBACP,MAAM,EAAE,aAAa;gBACrB,YAAY,EAAE,EAAE;gBAChB,cAAc,EAAE,EAAE;gBAClB,MAAM,EAAE,mBAAmB,GAAG,IAAI,OAAO,uEAAuE;aACjH,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,4FAA4F;QAC5F,wFAAwF;QACxF,8FAA8F;QAC9F,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,iBAAiB,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QACrD,IAAI,iBAAiB,KAAK,IAAI,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;YAC7D,MAAM,IAAI,GAAG,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB,CAAC;YACzF,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,GAAG;gBACT,OAAO;gBACP,MAAM,EAAE,aAAa;gBACrB,YAAY,EAAE,EAAE;gBAChB,cAAc,EAAE,EAAE;gBAClB,MAAM,EAAE,GAAG,GAAG,IAAI,OAAO,qBAAqB,IAAI,gDAAgD;aACnG,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACjE,MAAM,eAAe,GAAG,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,GAAG;gBACT,OAAO;gBACP,MAAM,EAAE,OAAO;gBACf,YAAY,EAAE,OAAO;gBACrB,cAAc,EAAE,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/publish.d.ts
CHANGED
|
@@ -49,6 +49,30 @@ export interface PublishResult {
|
|
|
49
49
|
* and the CLI prints it. Absent on a real publish, where every gate actually ran.
|
|
50
50
|
*/
|
|
51
51
|
readonly notVerified?: readonly string[] | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* AM-1 (feature publish-sibling-drift-gate): sha256 of the EXACT tarball bytes that were
|
|
54
|
+
* packed-install-smoked AND handed to `npm publish` — present only when `opts.packedTransport`
|
|
55
|
+
* was used for a live (non-dry-run) publish. Printed and audited so "the smoke tested the same
|
|
56
|
+
* bytes that shipped" is a checkable claim, not an architectural assertion.
|
|
57
|
+
*/
|
|
58
|
+
readonly sha256?: string | undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* One package's packed, smoke-eligible artifact — the unit `opts.packedTransport.smoke` receives
|
|
62
|
+
* (AM-1). Produced ONCE per package, after its OWN bump/build/sign steps, from a package.json
|
|
63
|
+
* whose `workspace:` specs are already resolved to each sibling's PINNED version (the same
|
|
64
|
+
* transformation `rewriteWorkspaceSpecs` performs) — so the tarball is exactly what `npm publish
|
|
65
|
+
* <tgzPath>` will later ship, byte for byte.
|
|
66
|
+
*/
|
|
67
|
+
export interface PackedTarballArtifact {
|
|
68
|
+
readonly name: string;
|
|
69
|
+
readonly newVersion: string;
|
|
70
|
+
readonly tgzPath: string;
|
|
71
|
+
readonly sha256: string;
|
|
72
|
+
}
|
|
73
|
+
export interface PackedTransportSmokeVerdict {
|
|
74
|
+
readonly ok: boolean;
|
|
75
|
+
readonly reason?: string | undefined;
|
|
52
76
|
}
|
|
53
77
|
/** Positive read-back evidence returned by the configured public-mirror command. */
|
|
54
78
|
export interface MirrorReceipt {
|
|
@@ -290,6 +314,26 @@ export declare function publishPackages(monorepoRoot: string, opts?: {
|
|
|
290
314
|
probe?: ((name: string, version: string) => boolean | Omit<ProbeOutcome, 'attempt'>) | undefined;
|
|
291
315
|
/** Pause injection between receipt probes. The default blocks for the requested milliseconds. */
|
|
292
316
|
sleep?: ((milliseconds: number) => void) | undefined;
|
|
317
|
+
/**
|
|
318
|
+
* AM-1 (feature publish-sibling-drift-gate). OPT-IN — omitted (the default), this function is
|
|
319
|
+
* byte-identical to its pre-amendment self: every package still publishes via `pnpm publish`
|
|
320
|
+
* FROM ITS DIRECTORY (`publishArgv`), exactly as every existing test of this function expects.
|
|
321
|
+
*
|
|
322
|
+
* When provided, the transport for THIS call's batch changes: each package is packed ONCE
|
|
323
|
+
* (after its own bump/build/sign, workspace: specs resolved to each sibling's PINNED version —
|
|
324
|
+
* a landed batch sibling's NEW version, an out-of-batch sibling's disk version, mirroring what
|
|
325
|
+
* `rewriteWorkspaceSpecs`/pnpm itself would resolve), collected, and `smoke` is called with
|
|
326
|
+
* EVERY package's packed artifact before ANY of them is published. Only on `smoke.ok === true`
|
|
327
|
+
* does each artifact get `npm publish <tgzPath>` — the exact bytes that were smoked (a sha256
|
|
328
|
+
* recheck immediately before that call refuses on any mismatch, defending the "same bytes"
|
|
329
|
+
* claim against anything that could touch the tarball in between).
|
|
330
|
+
*/
|
|
331
|
+
packedTransport?: {
|
|
332
|
+
/** Absolute, pre-created directory to write tarballs into (this function never mkdirs it). */
|
|
333
|
+
readonly packDestDir: string;
|
|
334
|
+
/** Judge the WHOLE batch's packed artifacts together — nothing publishes until this passes. */
|
|
335
|
+
readonly smoke: (artifacts: readonly PackedTarballArtifact[]) => PackedTransportSmokeVerdict;
|
|
336
|
+
} | undefined;
|
|
293
337
|
}): PublishReport;
|
|
294
338
|
export {};
|
|
295
339
|
//# sourceMappingURL=publish.d.ts.map
|
package/dist/publish.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,KAAK,iCAAiC,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
|