@clossys/launcher 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1328 -60
- package/contracts/conversation-contract.md +2 -1
- package/contracts/product-ci-workflow.yml +74 -0
- package/contracts/repository-inventory.json +53 -0
- package/dist/admission-fixture.d.ts +168 -0
- package/dist/admission-fixture.d.ts.map +1 -0
- package/dist/admission-fixture.js +453 -0
- package/dist/admission-fixture.js.map +1 -0
- package/dist/admission.d.ts +124 -0
- package/dist/admission.d.ts.map +1 -0
- package/dist/admission.js +799 -0
- package/dist/admission.js.map +1 -0
- package/dist/agents-guide.d.ts +9 -0
- package/dist/agents-guide.d.ts.map +1 -0
- package/dist/agents-guide.js +26 -0
- package/dist/agents-guide.js.map +1 -0
- package/dist/apply-command-options.check.d.ts +12 -0
- package/dist/apply-command-options.check.d.ts.map +1 -0
- package/dist/apply-command-options.check.js +20 -0
- package/dist/apply-command-options.check.js.map +1 -0
- package/dist/apply-plan-cli.d.ts +39 -1
- package/dist/apply-plan-cli.d.ts.map +1 -1
- package/dist/apply-plan-cli.js +432 -15
- package/dist/apply-plan-cli.js.map +1 -1
- package/dist/apply-plan.d.ts +46 -59
- package/dist/apply-plan.d.ts.map +1 -1
- package/dist/apply-plan.js +112 -97
- package/dist/apply-plan.js.map +1 -1
- package/dist/apply-step-fixture.d.ts +87 -0
- package/dist/apply-step-fixture.d.ts.map +1 -0
- package/dist/apply-step-fixture.js +199 -0
- package/dist/apply-step-fixture.js.map +1 -0
- package/dist/apply-store.d.ts +93 -0
- package/dist/apply-store.d.ts.map +1 -0
- package/dist/apply-store.js +625 -0
- package/dist/apply-store.js.map +1 -0
- package/dist/approval-sheet.d.ts +21 -0
- package/dist/approval-sheet.d.ts.map +1 -0
- package/dist/approval-sheet.js +157 -0
- package/dist/approval-sheet.js.map +1 -0
- package/dist/body-command.d.ts +42 -0
- package/dist/body-command.d.ts.map +1 -0
- package/dist/body-command.js +143 -0
- package/dist/body-command.js.map +1 -0
- package/dist/change-set-contract.d.ts +381 -0
- package/dist/change-set-contract.d.ts.map +1 -0
- package/dist/change-set-contract.js +738 -0
- package/dist/change-set-contract.js.map +1 -0
- package/dist/change-set-digest.d.ts +28 -0
- package/dist/change-set-digest.d.ts.map +1 -0
- package/dist/change-set-digest.js +65 -0
- package/dist/change-set-digest.js.map +1 -0
- package/dist/check-cli.d.ts.map +1 -1
- package/dist/check-cli.js +14 -3
- package/dist/check-cli.js.map +1 -1
- package/dist/cli.d.ts +17 -6
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +84 -23
- package/dist/cli.js.map +1 -1
- package/dist/core.d.ts +79 -22
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +843 -268
- package/dist/core.js.map +1 -1
- package/dist/dry-materialize.d.ts +63 -0
- package/dist/dry-materialize.d.ts.map +1 -0
- package/dist/dry-materialize.js +330 -0
- package/dist/dry-materialize.js.map +1 -0
- package/dist/generated/contract-schema.generated.d.ts +97 -0
- package/dist/generated/contract-schema.generated.d.ts.map +1 -0
- package/dist/generated/contract-schema.generated.js +496 -0
- package/dist/generated/contract-schema.generated.js.map +1 -0
- package/dist/generated/package-scope.generated.d.ts +6 -0
- package/dist/generated/package-scope.generated.d.ts.map +1 -0
- package/dist/generated/package-scope.generated.js +10 -0
- package/dist/generated/package-scope.generated.js.map +1 -0
- package/dist/generated/plan-contracts.generated.d.ts +3 -0
- package/dist/generated/plan-contracts.generated.d.ts.map +1 -0
- package/dist/generated/plan-contracts.generated.js +2840 -0
- package/dist/generated/plan-contracts.generated.js.map +1 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +11 -0
- package/dist/host.js.map +1 -1
- package/dist/identity.d.ts +15 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +48 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +34 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/inventory-adoption.d.ts +24 -5
- package/dist/inventory-adoption.d.ts.map +1 -1
- package/dist/inventory-adoption.js +70 -25
- package/dist/inventory-adoption.js.map +1 -1
- package/dist/inventory-choice.d.ts +40 -0
- package/dist/inventory-choice.d.ts.map +1 -0
- package/dist/inventory-choice.js +156 -0
- package/dist/inventory-choice.js.map +1 -0
- package/dist/inventory-contract.d.ts +89 -0
- package/dist/inventory-contract.d.ts.map +1 -0
- package/dist/inventory-contract.js +121 -0
- package/dist/inventory-contract.js.map +1 -0
- package/dist/key-editor.d.ts +30 -0
- package/dist/key-editor.d.ts.map +1 -0
- package/dist/key-editor.js +445 -0
- package/dist/key-editor.js.map +1 -0
- package/dist/ledger-contract.d.ts +187 -0
- package/dist/ledger-contract.d.ts.map +1 -0
- package/dist/ledger-contract.js +532 -0
- package/dist/ledger-contract.js.map +1 -0
- package/dist/ledger-trust.d.ts +90 -0
- package/dist/ledger-trust.d.ts.map +1 -0
- package/dist/ledger-trust.js +198 -0
- package/dist/ledger-trust.js.map +1 -0
- package/dist/lockfile-invariants.d.ts +48 -0
- package/dist/lockfile-invariants.d.ts.map +1 -0
- package/dist/lockfile-invariants.js +375 -0
- package/dist/lockfile-invariants.js.map +1 -0
- package/dist/lockfile-readers.d.ts +72 -0
- package/dist/lockfile-readers.d.ts.map +1 -0
- package/dist/lockfile-readers.js +713 -0
- package/dist/lockfile-readers.js.map +1 -0
- package/dist/lockfile-regen.d.ts +106 -0
- package/dist/lockfile-regen.d.ts.map +1 -0
- package/dist/lockfile-regen.js +760 -0
- package/dist/lockfile-regen.js.map +1 -0
- package/dist/lockfile-tool-env.d.ts +29 -0
- package/dist/lockfile-tool-env.d.ts.map +1 -0
- package/dist/lockfile-tool-env.js +111 -0
- package/dist/lockfile-tool-env.js.map +1 -0
- package/dist/materialize.d.ts +113 -0
- package/dist/materialize.d.ts.map +1 -0
- package/dist/materialize.js +840 -0
- package/dist/materialize.js.map +1 -0
- package/dist/observe-repository.d.ts +90 -0
- package/dist/observe-repository.d.ts.map +1 -0
- package/dist/observe-repository.js +1367 -0
- package/dist/observe-repository.js.map +1 -0
- package/dist/plan-bundle-setup-fixture.d.ts +68 -0
- package/dist/plan-bundle-setup-fixture.d.ts.map +1 -0
- package/dist/plan-bundle-setup-fixture.js +167 -0
- package/dist/plan-bundle-setup-fixture.js.map +1 -0
- package/dist/plan-bundle.d.ts +250 -0
- package/dist/plan-bundle.d.ts.map +1 -0
- package/dist/plan-bundle.js +827 -0
- package/dist/plan-bundle.js.map +1 -0
- package/dist/plan-command.d.ts +29 -0
- package/dist/plan-command.d.ts.map +1 -0
- package/dist/plan-command.js +493 -0
- package/dist/plan-command.js.map +1 -0
- package/dist/plan-contract.d.ts +153 -0
- package/dist/plan-contract.d.ts.map +1 -0
- package/dist/plan-contract.js +61 -0
- package/dist/plan-contract.js.map +1 -0
- package/dist/plan-digest.d.ts +25 -0
- package/dist/plan-digest.d.ts.map +1 -0
- package/dist/plan-digest.js +106 -0
- package/dist/plan-digest.js.map +1 -0
- package/dist/plan-rules.d.ts +23 -0
- package/dist/plan-rules.d.ts.map +1 -0
- package/dist/plan-rules.js +177 -0
- package/dist/plan-rules.js.map +1 -0
- package/dist/planned-bundle.d.ts +20 -0
- package/dist/planned-bundle.d.ts.map +1 -0
- package/dist/planned-bundle.js +191 -0
- package/dist/planned-bundle.js.map +1 -0
- package/dist/product-repository.d.ts +4 -0
- package/dist/product-repository.d.ts.map +1 -1
- package/dist/product-repository.js +9 -1
- package/dist/product-repository.js.map +1 -1
- package/dist/provenance-gate.d.ts +48 -0
- package/dist/provenance-gate.d.ts.map +1 -0
- package/dist/provenance-gate.js +324 -0
- package/dist/provenance-gate.js.map +1 -0
- package/dist/pull-request-body.d.ts +45 -0
- package/dist/pull-request-body.d.ts.map +1 -0
- package/dist/pull-request-body.js +232 -0
- package/dist/pull-request-body.js.map +1 -0
- package/dist/registry-snapshot.d.ts +141 -0
- package/dist/registry-snapshot.d.ts.map +1 -0
- package/dist/registry-snapshot.js +483 -0
- package/dist/registry-snapshot.js.map +1 -0
- package/dist/release-age-edit.d.ts +52 -0
- package/dist/release-age-edit.d.ts.map +1 -0
- package/dist/release-age-edit.js +413 -0
- package/dist/release-age-edit.js.map +1 -0
- package/dist/root-entries.d.ts +36 -0
- package/dist/root-entries.d.ts.map +1 -0
- package/dist/root-entries.js +80 -0
- package/dist/root-entries.js.map +1 -0
- package/dist/setup-template-scripts.d.ts +34 -0
- package/dist/setup-template-scripts.d.ts.map +1 -0
- package/dist/setup-template-scripts.js +557 -0
- package/dist/setup-template-scripts.js.map +1 -0
- package/dist/setup-templates.d.ts +54 -0
- package/dist/setup-templates.d.ts.map +1 -0
- package/dist/setup-templates.js +427 -0
- package/dist/setup-templates.js.map +1 -0
- package/dist/skills.d.ts +34 -1
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +129 -17
- package/dist/skills.js.map +1 -1
- package/dist/status.d.ts +63 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +539 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +151 -13
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -5
- package/skeleton/README.md +14 -9
- package/skeleton/package.json +2 -1
- package/skill/SKILL.md +20 -16
- package/skill-catalogue/advisor/SKILL.md +100 -11
- package/skill-catalogue/architect/SKILL.md +2 -13
- package/skill-catalogue/bouncer/SKILL.md +2 -13
- package/skill-catalogue/builder/SKILL.md +2 -13
- package/skill-catalogue/butler/SKILL.md +2 -13
- package/skill-catalogue/controller/SKILL.md +2 -13
- package/skill-catalogue/customer/SKILL.md +4 -13
- package/skill-catalogue/designer/SKILL.md +9 -14
- package/skill-catalogue/giver/SKILL.md +2 -13
- package/skill-catalogue/influencer/SKILL.md +2 -13
- package/skill-catalogue/inspector/SKILL.md +2 -13
- package/skill-catalogue/integrator/SKILL.md +2 -13
- package/skill-catalogue/keeper/SKILL.md +2 -13
- package/skill-catalogue/launcher/SKILL.md +20 -16
- package/skill-catalogue/locksmith/SKILL.md +2 -13
- package/skill-catalogue/messenger/SKILL.md +2 -13
- package/skill-catalogue/observer/SKILL.md +2 -13
- package/skill-catalogue/publisher/SKILL.md +11 -17
- package/skill-catalogue/starter/SKILL.md +3 -13
- package/skill-catalogue/strategist/SKILL.md +14 -17
- package/skill-catalogue/writer/SKILL.md +7 -14
- package/src/admission-fixture.ts +572 -0
- package/src/admission.ts +816 -0
- package/src/agents-guide.ts +29 -0
- package/src/apply-command-options.check.ts +27 -0
- package/src/apply-plan-cli.ts +454 -14
- package/src/apply-plan.ts +112 -124
- package/src/apply-step-fixture.ts +236 -0
- package/src/apply-store.ts +584 -0
- package/src/approval-sheet.ts +164 -0
- package/src/body-command.ts +162 -0
- package/src/change-set-contract.ts +937 -0
- package/src/change-set-digest.ts +70 -0
- package/src/check-cli.ts +14 -3
- package/src/cli.ts +90 -22
- package/src/core.ts +973 -275
- package/src/dry-materialize.ts +353 -0
- package/src/generated/contract-schema.generated.ts +520 -0
- package/src/generated/package-scope.generated.ts +10 -0
- package/src/generated/plan-contracts.generated.ts +2840 -0
- package/src/host.ts +10 -0
- package/src/identity.ts +51 -0
- package/src/index.ts +72 -3
- package/src/inventory-adoption.ts +107 -29
- package/src/inventory-choice.ts +172 -0
- package/src/inventory-contract.ts +166 -0
- package/src/key-editor.ts +446 -0
- package/src/ledger-contract.ts +637 -0
- package/src/ledger-trust.ts +267 -0
- package/src/lockfile-invariants.ts +421 -0
- package/src/lockfile-readers.ts +749 -0
- package/src/lockfile-regen.ts +851 -0
- package/src/lockfile-tool-env.ts +131 -0
- package/src/materialize.ts +886 -0
- package/src/observe-repository.ts +1365 -0
- package/src/plan-bundle-setup-fixture.ts +200 -0
- package/src/plan-bundle.ts +964 -0
- package/src/plan-command.ts +509 -0
- package/src/plan-contract.ts +179 -0
- package/src/plan-digest.ts +102 -0
- package/src/plan-rules.ts +188 -0
- package/src/planned-bundle.ts +211 -0
- package/src/product-repository.ts +10 -1
- package/src/provenance-gate.ts +352 -0
- package/src/pull-request-body.ts +261 -0
- package/src/registry-snapshot.ts +534 -0
- package/src/release-age-edit.ts +430 -0
- package/src/root-entries.ts +81 -0
- package/src/setup-template-scripts.ts +571 -0
- package/src/setup-templates.ts +471 -0
- package/src/skills.ts +161 -18
- package/src/status.ts +557 -0
- package/src/types.ts +148 -13
- package/CHANGELOG.md +0 -131
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { compareCodeUnits } from "./change-set-contract.js";
|
|
2
|
+
import { PACKAGE_SCOPE } from "./generated/package-scope.generated.js";
|
|
3
|
+
import { isUnreadable, readLockfile } from "./lockfile-readers.js";
|
|
4
|
+
const LAST_RESORT = { verdict: "indeterminate", reason: "lockfile-unreadable", side: "regenerated" };
|
|
5
|
+
function entryKey(name, version) {
|
|
6
|
+
return `${name}\u0000${version}`;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Every distinct `name@version` in `entries`, as `entryKey` strings. A versionless npm link entry (fix 7)
|
|
10
|
+
* is never a `name@version` and is excluded here; I5 inspects link entries separately, by key.
|
|
11
|
+
*/
|
|
12
|
+
function entryKeySet(entries) {
|
|
13
|
+
const keys = new Set();
|
|
14
|
+
for (const entry of entries)
|
|
15
|
+
if (entry.version !== null)
|
|
16
|
+
keys.add(entryKey(entry.name, entry.version));
|
|
17
|
+
return keys;
|
|
18
|
+
}
|
|
19
|
+
function setsEqual(left, right) {
|
|
20
|
+
if (left.size !== right.size)
|
|
21
|
+
return false;
|
|
22
|
+
for (const value of left)
|
|
23
|
+
if (!right.has(value))
|
|
24
|
+
return false;
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
/** `added`/`removed` distinct `name@version` between the two entry lists. Counted, never refused. */
|
|
28
|
+
function computeTransitiveCounts(base, regenerated) {
|
|
29
|
+
const baseKeys = entryKeySet(base.entries);
|
|
30
|
+
const regeneratedKeys = entryKeySet(regenerated.entries);
|
|
31
|
+
let added = 0;
|
|
32
|
+
for (const key of regeneratedKeys)
|
|
33
|
+
if (!baseKeys.has(key))
|
|
34
|
+
added += 1;
|
|
35
|
+
let removed = 0;
|
|
36
|
+
for (const key of baseKeys)
|
|
37
|
+
if (!regeneratedKeys.has(key))
|
|
38
|
+
removed += 1;
|
|
39
|
+
return { added, removed };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* I1: every input package resolves in the regenerated root exactly, under its own placement and no other.
|
|
43
|
+
* A pnpm `(patch_hash=...)` group on the raw version is also a mismatch (fix 8): stripping it (as `version`
|
|
44
|
+
* already does, same as any peer-group suffix) would otherwise let a patched install through even though a
|
|
45
|
+
* patch changes the installed content.
|
|
46
|
+
*/
|
|
47
|
+
function checkI1(input, regenerated) {
|
|
48
|
+
const violations = [];
|
|
49
|
+
for (const pkg of input.packages) {
|
|
50
|
+
const sameName = regenerated.root.filter((dep) => dep.name === pkg.name);
|
|
51
|
+
const exact = sameName.find((dep) => dep.placement === pkg.placement);
|
|
52
|
+
const patched = exact?.rawVersion?.includes("patch_hash=") ?? false;
|
|
53
|
+
const exactMismatch = !exact || exact.specifier !== pkg.version || exact.version !== pkg.version || exact.integrity !== pkg.integrity || exact.link || patched;
|
|
54
|
+
const otherPlacement = sameName.some((dep) => dep.placement !== pkg.placement);
|
|
55
|
+
if (exactMismatch || otherPlacement)
|
|
56
|
+
violations.push({ invariant: "I1", name: pkg.name });
|
|
57
|
+
}
|
|
58
|
+
return violations;
|
|
59
|
+
}
|
|
60
|
+
/** Lockfile entry key for one root dependency's resolved package row. npm: always `node_modules/<name>` (versionless link entries included). pnpm: `name@version`, or null when version is absent. */
|
|
61
|
+
function rootPackageEntryKey(format, dep) {
|
|
62
|
+
if (format === "npm")
|
|
63
|
+
return `node_modules/${dep.name}`;
|
|
64
|
+
if (dep.version === null)
|
|
65
|
+
return null;
|
|
66
|
+
return `${dep.name}@${dep.version}`;
|
|
67
|
+
}
|
|
68
|
+
/** I2: every root dep not among the input package names is unchanged, keyed by (placement, name). */
|
|
69
|
+
function checkI2(input, base, regenerated) {
|
|
70
|
+
const inputNames = new Set(input.packages.map((pkg) => pkg.name));
|
|
71
|
+
const rootKey = (dep) => `${dep.placement}\u0000${dep.name}`;
|
|
72
|
+
const baseRoot = new Map(base.root.filter((dep) => !inputNames.has(dep.name)).map((dep) => [rootKey(dep), dep]));
|
|
73
|
+
const regeneratedRoot = new Map(regenerated.root.filter((dep) => !inputNames.has(dep.name)).map((dep) => [rootKey(dep), dep]));
|
|
74
|
+
const baseEntriesByKey = new Map(base.entries.map((entry) => [entry.key, entry]));
|
|
75
|
+
const regeneratedEntriesByKey = new Map(regenerated.entries.map((entry) => [entry.key, entry]));
|
|
76
|
+
const violations = [];
|
|
77
|
+
const allKeys = new Set([...baseRoot.keys(), ...regeneratedRoot.keys()]);
|
|
78
|
+
for (const key of allKeys) {
|
|
79
|
+
const beforeDep = baseRoot.get(key);
|
|
80
|
+
const afterDep = regeneratedRoot.get(key);
|
|
81
|
+
const name = (beforeDep ?? afterDep).name;
|
|
82
|
+
if (!beforeDep || !afterDep) {
|
|
83
|
+
violations.push({ invariant: "I2", name });
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (beforeDep.specifier !== afterDep.specifier ||
|
|
87
|
+
beforeDep.version !== afterDep.version ||
|
|
88
|
+
beforeDep.integrity !== afterDep.integrity ||
|
|
89
|
+
beforeDep.link !== afterDep.link) {
|
|
90
|
+
violations.push({ invariant: "I2", name });
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const beforeEntryKey = rootPackageEntryKey(input.format, beforeDep);
|
|
94
|
+
const afterEntryKey = rootPackageEntryKey(input.format, afterDep);
|
|
95
|
+
if (beforeEntryKey === null || afterEntryKey === null || beforeEntryKey !== afterEntryKey) {
|
|
96
|
+
violations.push({ invariant: "I2", name });
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const beforeEntry = baseEntriesByKey.get(beforeEntryKey);
|
|
100
|
+
const afterEntry = regeneratedEntriesByKey.get(afterEntryKey);
|
|
101
|
+
if (beforeEntry === undefined || afterEntry === undefined || !entryMatchesAtKey(beforeEntry, afterEntry)) {
|
|
102
|
+
violations.push({ invariant: "I2", name });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return violations;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* I3: no `name@version` present in both entry lists changes its set of integrity strings. A versionless
|
|
109
|
+
* npm link entry (fix 7) never participates: it is not a `name@version`.
|
|
110
|
+
*/
|
|
111
|
+
function checkI3(base, regenerated) {
|
|
112
|
+
const violations = [];
|
|
113
|
+
const baseByName = new Map();
|
|
114
|
+
for (const entry of base.entries) {
|
|
115
|
+
if (entry.version === null)
|
|
116
|
+
continue;
|
|
117
|
+
let versions = baseByName.get(entry.name);
|
|
118
|
+
if (!versions) {
|
|
119
|
+
versions = new Map();
|
|
120
|
+
baseByName.set(entry.name, versions);
|
|
121
|
+
}
|
|
122
|
+
let integrities = versions.get(entry.version);
|
|
123
|
+
if (!integrities) {
|
|
124
|
+
integrities = new Set();
|
|
125
|
+
versions.set(entry.version, integrities);
|
|
126
|
+
}
|
|
127
|
+
integrities.add(entry.integrity);
|
|
128
|
+
}
|
|
129
|
+
const regeneratedByName = new Map();
|
|
130
|
+
for (const entry of regenerated.entries) {
|
|
131
|
+
if (entry.version === null)
|
|
132
|
+
continue;
|
|
133
|
+
let versions = regeneratedByName.get(entry.name);
|
|
134
|
+
if (!versions) {
|
|
135
|
+
versions = new Map();
|
|
136
|
+
regeneratedByName.set(entry.name, versions);
|
|
137
|
+
}
|
|
138
|
+
let integrities = versions.get(entry.version);
|
|
139
|
+
if (!integrities) {
|
|
140
|
+
integrities = new Set();
|
|
141
|
+
versions.set(entry.version, integrities);
|
|
142
|
+
}
|
|
143
|
+
integrities.add(entry.integrity);
|
|
144
|
+
}
|
|
145
|
+
for (const [name, regeneratedVersions] of regeneratedByName) {
|
|
146
|
+
const baseVersions = baseByName.get(name);
|
|
147
|
+
if (!baseVersions)
|
|
148
|
+
continue;
|
|
149
|
+
for (const [version, regeneratedIntegrities] of regeneratedVersions) {
|
|
150
|
+
const baseIntegrities = baseVersions.get(version);
|
|
151
|
+
if (!baseIntegrities)
|
|
152
|
+
continue;
|
|
153
|
+
if (!setsEqual(baseIntegrities, regeneratedIntegrities))
|
|
154
|
+
violations.push({ invariant: "I3", name });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return violations;
|
|
158
|
+
}
|
|
159
|
+
/** Whether one newly-appearing scoped entry resolves to the publishing registry, per format. */
|
|
160
|
+
function resolvesToRegistry(entry, format, registryOrigin) {
|
|
161
|
+
if (entry.integrity === null || !entry.integrity.startsWith("sha512-"))
|
|
162
|
+
return false;
|
|
163
|
+
if (format === "npm") {
|
|
164
|
+
if (entry.link || entry.tarball === null)
|
|
165
|
+
return false;
|
|
166
|
+
try {
|
|
167
|
+
const url = new URL(entry.tarball);
|
|
168
|
+
return url.origin === registryOrigin && url.pathname.startsWith(`/${entry.name}/-/`);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (entry.otherResolutionKeys.length > 0)
|
|
175
|
+
return false;
|
|
176
|
+
if (entry.tarball === null)
|
|
177
|
+
return true;
|
|
178
|
+
try {
|
|
179
|
+
return new URL(entry.tarball).origin === registryOrigin;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/** Strips a trailing `(...)` peer-group (or patch-hash) suffix from a pnpm dependency-map value, the same way the reader strips a root dependency's `version`. */
|
|
186
|
+
function stripParenSuffix(value) {
|
|
187
|
+
const parenIndex = value.indexOf("(");
|
|
188
|
+
return parenIndex === -1 ? value : value.slice(0, parenIndex);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Whether a pnpm dependency-map value (after stripping any peer-group/patch-hash suffix) is an alias, a
|
|
192
|
+
* link, or a file reference (fix 6) rather than a plain resolved version. A plain version never contains
|
|
193
|
+
* `@`; an alias is exactly `<name>@<version>`, and even a scoped alias name's own leading `@` still leaves
|
|
194
|
+
* a second `@` as the name/version separator, so a bare `includes("@")` check is enough.
|
|
195
|
+
*/
|
|
196
|
+
function isSuspiciousPnpmDependencyValue(core) {
|
|
197
|
+
return core.startsWith("link:") || core.startsWith("file:") || core.includes("@");
|
|
198
|
+
}
|
|
199
|
+
function resolutionKeysEqual(left, right) {
|
|
200
|
+
if (left.length !== right.length)
|
|
201
|
+
return false;
|
|
202
|
+
for (let index = 0; index < left.length; index += 1)
|
|
203
|
+
if (left[index] !== right[index])
|
|
204
|
+
return false;
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
/** Whether one base entry at the same key matches every resolution field on `entry`. */
|
|
208
|
+
function entryMatchesAtKey(baseEntry, entry) {
|
|
209
|
+
return (baseEntry.name === entry.name &&
|
|
210
|
+
baseEntry.installedName === entry.installedName &&
|
|
211
|
+
baseEntry.version === entry.version &&
|
|
212
|
+
baseEntry.integrity === entry.integrity &&
|
|
213
|
+
baseEntry.tarball === entry.tarball &&
|
|
214
|
+
baseEntry.link === entry.link &&
|
|
215
|
+
resolutionKeysEqual(baseEntry.otherResolutionKeys, entry.otherResolutionKeys));
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Tarball from a base entry with this declared `name@version` that has no link and no extra pnpm resolution
|
|
219
|
+
* keys (fix round 4). Undefined when the base has no such entry.
|
|
220
|
+
*/
|
|
221
|
+
function canonicalBaseTarballForNameVersion(name, version, baseEntries, format, registryOrigin) {
|
|
222
|
+
for (const baseEntry of baseEntries) {
|
|
223
|
+
if (baseEntry.version === null || baseEntry.installedName !== baseEntry.name)
|
|
224
|
+
continue;
|
|
225
|
+
if (baseEntry.name !== name || baseEntry.version !== version)
|
|
226
|
+
continue;
|
|
227
|
+
if (baseEntry.link || baseEntry.otherResolutionKeys.length > 0)
|
|
228
|
+
continue;
|
|
229
|
+
if (registryOrigin === undefined || !resolvesToRegistry(baseEntry, format, registryOrigin))
|
|
230
|
+
continue;
|
|
231
|
+
return baseEntry.tarball;
|
|
232
|
+
}
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Whether a versioned entry is already represented in the base. npm alias entries need key-level equality
|
|
237
|
+
* (fix round 3). The `name@version` shortcut (fix round 4) applies only for a plain registry tarball match.
|
|
238
|
+
*/
|
|
239
|
+
function isUnchangedVersionedEntry(entry, baseVersionedKeys, baseEntriesByKey, baseEntries, format, registryOrigin) {
|
|
240
|
+
if (entry.version === null)
|
|
241
|
+
return false;
|
|
242
|
+
if (entry.installedName !== entry.name) {
|
|
243
|
+
const baseEntry = baseEntriesByKey.get(entry.key);
|
|
244
|
+
if (baseEntry === undefined)
|
|
245
|
+
return false;
|
|
246
|
+
return entryMatchesAtKey(baseEntry, entry);
|
|
247
|
+
}
|
|
248
|
+
const baseAtKey = baseEntriesByKey.get(entry.key);
|
|
249
|
+
if (baseAtKey !== undefined && entryMatchesAtKey(baseAtKey, entry))
|
|
250
|
+
return true;
|
|
251
|
+
if (!entry.link &&
|
|
252
|
+
entry.otherResolutionKeys.length === 0 &&
|
|
253
|
+
baseVersionedKeys.has(entryKey(entry.name, entry.version))) {
|
|
254
|
+
const canonicalTarball = canonicalBaseTarballForNameVersion(entry.name, entry.version, baseEntries, format, registryOrigin);
|
|
255
|
+
if (canonicalTarball !== undefined && entry.tarball === canonicalTarball)
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* I5: every regenerated entry newly resolving a scoped package name comes from the publishing registry.
|
|
262
|
+
*
|
|
263
|
+
* Checks both the installed (alias) name and the declared name (fix 6): an entry that is new and scoped
|
|
264
|
+
* under either name must have the two agree, since an alias into or out of the scope is itself a
|
|
265
|
+
* violation, in addition to resolving to the publishing registry as before. A link entry under the scope
|
|
266
|
+
* (fix 7) is its own violation unless the base already holds an identical link at the same key. For pnpm,
|
|
267
|
+
* every importer's and snapshot's dependency-map value naming a scoped package is also checked directly
|
|
268
|
+
* (fix 6): a value that is an alias, a `link:` or a `file:` reference is a violation unless the base holds
|
|
269
|
+
* the identical name and value at the same place -- this catches an alias hidden inside a snapshot's
|
|
270
|
+
* dependency map, which never appears as its own `packages` entry under the scope.
|
|
271
|
+
*
|
|
272
|
+
* Fails closed when the publishing registry does not parse as a URL (fix 10): every new scoped entry is a
|
|
273
|
+
* violation, or, when there is none at all, a single violation named `""`.
|
|
274
|
+
*/
|
|
275
|
+
function checkI5(input, base, regenerated, publishing) {
|
|
276
|
+
const violations = [];
|
|
277
|
+
const scopePrefix = `${publishing.scope}/`;
|
|
278
|
+
const baseVersionedKeys = entryKeySet(base.entries);
|
|
279
|
+
const baseEntriesByKey = new Map(base.entries.map((entry) => [entry.key, entry]));
|
|
280
|
+
const baseLinksByKey = new Map(base.entries.filter((entry) => entry.version === null).map((entry) => [entry.key, entry]));
|
|
281
|
+
let registryOrigin;
|
|
282
|
+
try {
|
|
283
|
+
registryOrigin = new URL(publishing.registry).origin;
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
registryOrigin = undefined;
|
|
287
|
+
}
|
|
288
|
+
let anyNewScoped = false;
|
|
289
|
+
for (const entry of regenerated.entries) {
|
|
290
|
+
const scoped = entry.name.startsWith(scopePrefix) || entry.installedName.startsWith(scopePrefix);
|
|
291
|
+
if (!scoped)
|
|
292
|
+
continue;
|
|
293
|
+
if (entry.version === null) {
|
|
294
|
+
const baseLink = baseLinksByKey.get(entry.key);
|
|
295
|
+
if (baseLink !== undefined && baseLink.tarball === entry.tarball)
|
|
296
|
+
continue; // the identical link already in base
|
|
297
|
+
anyNewScoped = true;
|
|
298
|
+
violations.push({ invariant: "I5", name: entry.name });
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (isUnchangedVersionedEntry(entry, baseVersionedKeys, baseEntriesByKey, base.entries, input.format, registryOrigin))
|
|
302
|
+
continue; // not new
|
|
303
|
+
anyNewScoped = true;
|
|
304
|
+
if (registryOrigin === undefined) {
|
|
305
|
+
violations.push({ invariant: "I5", name: entry.name });
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
if (entry.installedName !== entry.name) {
|
|
309
|
+
violations.push({ invariant: "I5", name: entry.name });
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
if (!resolvesToRegistry(entry, input.format, registryOrigin))
|
|
313
|
+
violations.push({ invariant: "I5", name: entry.name });
|
|
314
|
+
}
|
|
315
|
+
if (input.format === "pnpm") {
|
|
316
|
+
const baseRefs = new Map(base.dependencyRefs.map((ref) => [`${ref.place}\u0000${ref.name}`, ref.value]));
|
|
317
|
+
for (const ref of regenerated.dependencyRefs) {
|
|
318
|
+
if (!ref.name.startsWith(scopePrefix))
|
|
319
|
+
continue;
|
|
320
|
+
if (!isSuspiciousPnpmDependencyValue(stripParenSuffix(ref.value)))
|
|
321
|
+
continue;
|
|
322
|
+
if (baseRefs.get(`${ref.place}\u0000${ref.name}`) === ref.value)
|
|
323
|
+
continue; // identical name and value at the same place as the base
|
|
324
|
+
anyNewScoped = true;
|
|
325
|
+
violations.push({ invariant: "I5", name: ref.name });
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (registryOrigin === undefined && !anyNewScoped)
|
|
329
|
+
violations.push({ invariant: "I5", name: "" });
|
|
330
|
+
return violations;
|
|
331
|
+
}
|
|
332
|
+
function finalizeViolations(violations) {
|
|
333
|
+
const deduped = new Map();
|
|
334
|
+
for (const violation of violations)
|
|
335
|
+
deduped.set(`${violation.invariant}\u0000${violation.name}`, violation);
|
|
336
|
+
return [...deduped.values()].sort((left, right) => compareCodeUnits(left.invariant, right.invariant) || compareCodeUnits(left.name, right.name));
|
|
337
|
+
}
|
|
338
|
+
function checkAgainstReadable(input, base, regenerated) {
|
|
339
|
+
const publishing = input.publishing ?? PACKAGE_SCOPE;
|
|
340
|
+
const violations = [];
|
|
341
|
+
if (base.lockfileVersion !== regenerated.lockfileVersion)
|
|
342
|
+
violations.push({ invariant: "I4", name: "" });
|
|
343
|
+
violations.push(...checkI1(input, regenerated));
|
|
344
|
+
violations.push(...checkI2(input, base, regenerated));
|
|
345
|
+
violations.push(...checkI3(base, regenerated));
|
|
346
|
+
violations.push(...checkI5(input, base, regenerated, publishing));
|
|
347
|
+
const transitive = computeTransitiveCounts(base, regenerated);
|
|
348
|
+
const deduped = finalizeViolations(violations);
|
|
349
|
+
return deduped.length === 0
|
|
350
|
+
? { verdict: "satisfied", violations: [], transitive }
|
|
351
|
+
: { verdict: "violated", violations: deduped, transitive };
|
|
352
|
+
}
|
|
353
|
+
function checkLockfileInvariantsUnsafe(input) {
|
|
354
|
+
const base = readLockfile(input.format, input.base);
|
|
355
|
+
if (isUnreadable(base))
|
|
356
|
+
return { verdict: "indeterminate", reason: base.reason, side: "base" };
|
|
357
|
+
const regenerated = readLockfile(input.format, input.regenerated);
|
|
358
|
+
if (isUnreadable(regenerated)) {
|
|
359
|
+
if (regenerated.reason === "lockfile-format-unsupported") {
|
|
360
|
+
return { verdict: "violated", violations: [{ invariant: "I4", name: "" }], transitive: { added: 0, removed: 0 } };
|
|
361
|
+
}
|
|
362
|
+
return { verdict: "indeterminate", reason: regenerated.reason, side: "regenerated" };
|
|
363
|
+
}
|
|
364
|
+
return checkAgainstReadable(input, base, regenerated);
|
|
365
|
+
}
|
|
366
|
+
/** Checks I1 to I5 between a base and a regenerated lockfile. Pure; never throws. */
|
|
367
|
+
export function checkLockfileInvariants(input) {
|
|
368
|
+
try {
|
|
369
|
+
return checkLockfileInvariantsUnsafe(input);
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
return LAST_RESORT;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=lockfile-invariants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile-invariants.js","sourceRoot":"","sources":["../src/lockfile-invariants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** Lockfile formats this module can read. Yarn is not one of them (RFC section 4.3, Yarn note). */
|
|
2
|
+
export type LockfileFormat = "npm" | "pnpm";
|
|
3
|
+
/** The root placements the invariants inspect. npm's `peerDependencies` is read for npm only. */
|
|
4
|
+
export type RootPlacement = "dependencies" | "devDependencies" | "optionalDependencies" | "peerDependencies";
|
|
5
|
+
/** One direct dependency of the repository root. */
|
|
6
|
+
export interface RootDependency {
|
|
7
|
+
readonly placement: RootPlacement;
|
|
8
|
+
readonly name: string;
|
|
9
|
+
/** npm: `packages[""][placement][name]`; pnpm: `importers["."][placement][name].specifier`. */
|
|
10
|
+
readonly specifier: string;
|
|
11
|
+
/** npm: `packages["node_modules/<name>"].version`; pnpm: the `version` text before any `(` peer suffix. Null when absent. */
|
|
12
|
+
readonly version: string | null;
|
|
13
|
+
/** pnpm: the full `version` field text, before any peer-suffix stripping (fix 8: a `(patch_hash=...)` group must survive here even though `version` strips it). Always equal to `version` for npm. */
|
|
14
|
+
readonly rawVersion: string | null;
|
|
15
|
+
/** npm: `packages["node_modules/<name>"].integrity`; pnpm: `packages["<name>@<version>"].resolution.integrity`. Null when absent. */
|
|
16
|
+
readonly integrity: string | null;
|
|
17
|
+
/** npm: the `node_modules/<name>` entry has `link: true`; pnpm: `version` starts `link:` or `file:`. */
|
|
18
|
+
readonly link: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** One resolved package entry, transitive included. */
|
|
21
|
+
export interface LockfileEntry {
|
|
22
|
+
/** npm: the `packages` path (`node_modules/a/node_modules/b`); pnpm: the `packages` key (`name@version`). */
|
|
23
|
+
readonly key: string;
|
|
24
|
+
/** The package's declared identity: npm `value.name` (falling back to the installed name); pnpm the `packages` key's name. */
|
|
25
|
+
readonly name: string;
|
|
26
|
+
/** The name actually installed at `key` (fix 6): npm the text after the key's last `node_modules/`, regardless of a mismatched declared `name` (an alias); always equal to `name` for pnpm, which has no per-entry alias concept. */
|
|
27
|
+
readonly installedName: string;
|
|
28
|
+
/** Null for an npm link entry with no `version` field (fix 7: link entries are kept, not skipped). Always a string for pnpm. */
|
|
29
|
+
readonly version: string | null;
|
|
30
|
+
readonly integrity: string | null;
|
|
31
|
+
/** npm: `resolved` (also the link target for a link entry); pnpm: `resolution.tarball`. Null when absent. */
|
|
32
|
+
readonly tarball: string | null;
|
|
33
|
+
/** npm: `link: true`. Always false for pnpm. */
|
|
34
|
+
readonly link: boolean;
|
|
35
|
+
/** pnpm: every `resolution` key other than `integrity` and `tarball` (for example `type`, `directory`, `repo`, `commit`), sorted. Always empty for npm. */
|
|
36
|
+
readonly otherResolutionKeys: readonly string[];
|
|
37
|
+
}
|
|
38
|
+
/** One dependency reference inside an importer's or a snapshot's dependency map (fix 6, pnpm only). */
|
|
39
|
+
export interface LockfileDependencyRef {
|
|
40
|
+
/** Where this reference was read, for comparing the same location between base and regenerated -- for example `importers['.'].dependencies` or `snapshots['a@1.0.0'].dependencies`. */
|
|
41
|
+
readonly place: string;
|
|
42
|
+
/** The dependency's installed name (the map key). */
|
|
43
|
+
readonly name: string;
|
|
44
|
+
/** The raw, unquoted `version` field text: a plain version (optionally with a `(...)` peer suffix) when not aliased, or `<other name>@<version>`, `link:...` or `file:...` when it is. */
|
|
45
|
+
readonly value: string;
|
|
46
|
+
}
|
|
47
|
+
/** The normalized view of one lockfile. */
|
|
48
|
+
export interface LockfileView {
|
|
49
|
+
readonly format: LockfileFormat;
|
|
50
|
+
/** npm: the number; pnpm: the string. */
|
|
51
|
+
readonly lockfileVersion: number | string;
|
|
52
|
+
/** Root direct dependencies, sorted by (placement, name) with compareCodeUnits. */
|
|
53
|
+
readonly root: readonly RootDependency[];
|
|
54
|
+
/** Every package entry, sorted by key with compareCodeUnits. */
|
|
55
|
+
readonly entries: readonly LockfileEntry[];
|
|
56
|
+
/** Every importer's and snapshot's dependency reference (fix 6). Always empty for npm. */
|
|
57
|
+
readonly dependencyRefs: readonly LockfileDependencyRef[];
|
|
58
|
+
}
|
|
59
|
+
export type LockfileUnreadableReason = "lockfile-format-unsupported" | "lockfile-unreadable";
|
|
60
|
+
export interface LockfileUnreadable {
|
|
61
|
+
readonly unreadable: true;
|
|
62
|
+
readonly reason: LockfileUnreadableReason;
|
|
63
|
+
}
|
|
64
|
+
export type LockfileReadResult = LockfileView | LockfileUnreadable;
|
|
65
|
+
export declare function isUnreadable(result: LockfileReadResult): result is LockfileUnreadable;
|
|
66
|
+
/** Reads a `package-lock.json` of lockfileVersion 2 or 3. Never throws. */
|
|
67
|
+
export declare function readNpmLockfile(text: string): LockfileReadResult;
|
|
68
|
+
/** Reads a `pnpm-lock.yaml` of lockfileVersion `'9.0'`. Never throws. */
|
|
69
|
+
export declare function readPnpmLockfile(text: string): LockfileReadResult;
|
|
70
|
+
/** Reads a lockfile of the given format. Never throws. */
|
|
71
|
+
export declare function readLockfile(format: LockfileFormat, text: string): LockfileReadResult;
|
|
72
|
+
//# sourceMappingURL=lockfile-readers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile-readers.d.ts","sourceRoot":"","sources":["../src/lockfile-readers.ts"],"names":[],"mappings":"AAEA,mGAAmG;AACnG,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,CAAC;AAE5C,iGAAiG;AACjG,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,iBAAiB,GAAG,sBAAsB,GAAG,kBAAkB,CAAC;AAE7G,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+FAA+F;IAC/F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6HAA6H;IAC7H,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,sMAAsM;IACtM,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qIAAqI;IACrI,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,wGAAwG;IACxG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,6GAA6G;IAC7G,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8HAA8H;IAC9H,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qOAAqO;IACrO,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,gIAAgI;IAChI,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,6GAA6G;IAC7G,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,2JAA2J;IAC3J,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED,uGAAuG;AACvG,MAAM,WAAW,qBAAqB;IACpC,uLAAuL;IACvL,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0LAA0L;IAC1L,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,yCAAyC;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1C,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;IACzC,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,0FAA0F;IAC1F,QAAQ,CAAC,cAAc,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC3D;AAED,MAAM,MAAM,wBAAwB,GAAG,6BAA6B,GAAG,qBAAqB,CAAC;AAE7F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;CAC3C;AAED,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,kBAAkB,CAAC;AAEnE,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,IAAI,kBAAkB,CAErF;AA0MD,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAkEhE;AAqYD,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAOjE;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAErF"}
|