@shapeshift-labs/frontier-lang-css 0.1.17 → 0.1.18
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.
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface CssModuleContractProof {
|
|
2
|
+
readonly id?: string;
|
|
3
|
+
readonly kind: 'css-source-bound-module-contract-proof' | 'css-module-contract-proof' | 'css-source-bound-css-module-contract-proof' | string;
|
|
4
|
+
readonly status: 'passed' | string;
|
|
5
|
+
readonly sourcePath: string;
|
|
6
|
+
readonly side?: string;
|
|
7
|
+
readonly sides?: readonly string[];
|
|
8
|
+
readonly changeKind?: string;
|
|
9
|
+
readonly changeKinds?: readonly string[];
|
|
10
|
+
readonly contractKey?: string;
|
|
11
|
+
readonly contractKeys?: readonly string[];
|
|
12
|
+
readonly contractKind?: string;
|
|
13
|
+
readonly contractKinds?: readonly string[];
|
|
14
|
+
readonly baseSourceText?: string;
|
|
15
|
+
readonly workerSourceText?: string;
|
|
16
|
+
readonly headSourceText?: string;
|
|
17
|
+
readonly outputSourceText?: string;
|
|
18
|
+
readonly mergedSourceText?: string;
|
|
19
|
+
readonly baseSourceHash?: string;
|
|
20
|
+
readonly workerSourceHash?: string;
|
|
21
|
+
readonly headSourceHash?: string;
|
|
22
|
+
readonly outputSourceHash?: string;
|
|
23
|
+
readonly mergedSourceHash?: string;
|
|
24
|
+
readonly sourceTexts?: Readonly<Record<string,string>>;
|
|
25
|
+
readonly sourceHashes?: Readonly<Record<string,string>>;
|
|
26
|
+
readonly sources?: Readonly<Record<string,string>>;
|
|
27
|
+
readonly hashes?: Readonly<Record<string,string>>;
|
|
28
|
+
readonly moduleHash?: string;
|
|
29
|
+
readonly generatedClassNameMapHash?: string;
|
|
30
|
+
readonly jsTsUseSiteGraphHash?: string;
|
|
31
|
+
readonly cssModuleCompositionGraphHash?: string;
|
|
32
|
+
readonly icssGraphHash?: string;
|
|
33
|
+
readonly contractGraphHashes?: Readonly<Record<string,string>>;
|
|
34
|
+
readonly cssModuleGraphHashes?: Readonly<Record<string,string>>;
|
|
35
|
+
readonly proofLevel?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface CssModuleContractProofRecord {
|
|
39
|
+
readonly id?: string;
|
|
40
|
+
readonly kind: string;
|
|
41
|
+
readonly status: 'passed';
|
|
42
|
+
readonly proofLevel: string;
|
|
43
|
+
readonly sourcePath?: string;
|
|
44
|
+
readonly side: string;
|
|
45
|
+
readonly changeKind: string;
|
|
46
|
+
readonly contractKey: string;
|
|
47
|
+
readonly contractKind: string;
|
|
48
|
+
readonly baseSourceHash?: string;
|
|
49
|
+
readonly workerSourceHash?: string;
|
|
50
|
+
readonly headSourceHash?: string;
|
|
51
|
+
readonly outputSourceHash?: string;
|
|
52
|
+
readonly moduleHash?: string;
|
|
53
|
+
readonly generatedClassNameMapHash?: string;
|
|
54
|
+
readonly jsTsUseSiteGraphHash?: string;
|
|
55
|
+
readonly cssModuleCompositionGraphHash?: string;
|
|
56
|
+
readonly icssGraphHash?: string;
|
|
57
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FrontierLangDocument } from '@shapeshift-labs/frontier-lang-kernel'; import type { CssCascadeRuntimeProof, CssCascadeRuntimeProofRecord } from './cascade-runtime-proof.js'; import type { CssDependencyGraphEvidence, CssDependencyGraphProof, CssDependencyGraphProofRecord } from './dependency-graph.js'; import type { CssSafeMergeShorthandExpansionEvidence, CssShorthandExpansionEvidence } from './shorthand-expansion.js'; export type { CssCascadeRuntimeProof, CssCascadeRuntimeProofRecord } from './cascade-runtime-proof.js'; export type { CssDependencyGraphChange, CssDependencyGraphEvidence, CssDependencyGraphProof, CssDependencyGraphProofRecord } from './dependency-graph.js'; export type { CssSafeMergeChangedShorthandExpansion, CssSafeMergeShorthandExpansionEvidence, CssSafeMergeShorthandExpansionSideEvidence, CssShorthandExpansionEvidence, CssShorthandLonghandExpansion } from './shorthand-expansion.js';
|
|
1
|
+
import type { FrontierLangDocument } from '@shapeshift-labs/frontier-lang-kernel'; import type { CssCascadeRuntimeProof, CssCascadeRuntimeProofRecord } from './cascade-runtime-proof.js'; import type { CssDependencyGraphEvidence, CssDependencyGraphProof, CssDependencyGraphProofRecord } from './dependency-graph.js'; import type { CssModuleContractProof, CssModuleContractProofRecord } from './css-module-contract-proof.js'; import type { CssSafeMergeShorthandExpansionEvidence, CssShorthandExpansionEvidence } from './shorthand-expansion.js'; export type { CssCascadeRuntimeProof, CssCascadeRuntimeProofRecord } from './cascade-runtime-proof.js'; export type { CssDependencyGraphChange, CssDependencyGraphEvidence, CssDependencyGraphProof, CssDependencyGraphProofRecord } from './dependency-graph.js'; export type { CssModuleContractProof, CssModuleContractProofRecord } from './css-module-contract-proof.js'; export type { CssSafeMergeChangedShorthandExpansion, CssSafeMergeShorthandExpansionEvidence, CssSafeMergeShorthandExpansionSideEvidence, CssShorthandExpansionEvidence, CssShorthandLonghandExpansion } from './shorthand-expansion.js';
|
|
2
2
|
|
|
3
3
|
export interface CssProjectionOptions {
|
|
4
4
|
readonly banner?: string;
|
|
@@ -229,6 +229,7 @@ export interface CssSafeMergeAdmission {
|
|
|
229
229
|
readonly browserCascadeEquivalenceClaim?: true;
|
|
230
230
|
readonly cssCascadeRuntimeProofs?: readonly CssCascadeRuntimeProofRecord[];
|
|
231
231
|
readonly cssDependencyGraphProofs?: readonly CssDependencyGraphProofRecord[];
|
|
232
|
+
readonly cssModuleContractProofs?: readonly CssModuleContractProofRecord[];
|
|
232
233
|
}
|
|
233
234
|
|
|
234
235
|
export interface CssSafeMergeResult {
|
|
@@ -243,6 +244,7 @@ export interface CssSafeMergeResult {
|
|
|
243
244
|
readonly workerChangedDeclarations?: number; readonly headChangedDeclarations?: number;
|
|
244
245
|
readonly workerChangedCssModuleContracts?: number; readonly headChangedCssModuleContracts?: number;
|
|
245
246
|
readonly parserEvidence?: CssSafeMergeParserEvidence; readonly shorthandExpansionEvidence?: CssSafeMergeShorthandExpansionEvidence; readonly selectorTargetEvidence?: CssSafeMergeSelectorTargetEvidence; readonly dependencyGraphEvidence?: CssDependencyGraphEvidence;
|
|
247
|
+
readonly cssModuleContractProofs?: readonly CssModuleContractProofRecord[];
|
|
246
248
|
readonly cascadeRuntimeProofs?: readonly CssCascadeRuntimeProofRecord[];
|
|
247
249
|
readonly dependencyGraphProofs?: readonly CssDependencyGraphProofRecord[];
|
|
248
250
|
}
|
|
@@ -287,19 +289,17 @@ export interface CssSelectorTargetEquivalence {
|
|
|
287
289
|
|
|
288
290
|
export interface CssSafeMergeInput {
|
|
289
291
|
readonly id?: string; readonly sourcePath?: string; readonly baseSourceText?: string; readonly workerSourceText?: string; readonly headSourceText?: string;
|
|
290
|
-
readonly cssModule?: boolean; readonly cssModules?: boolean;
|
|
291
|
-
readonly generatedClassNameMap?: Readonly<Record<string, string>>;
|
|
292
|
+
readonly cssModule?: boolean; readonly cssModules?: boolean; readonly generatedClassNameMap?: Readonly<Record<string, string>>;
|
|
292
293
|
readonly generatedClassNameMapHash?: string; readonly jsTsUseSiteGraphHash?: string; readonly cssModuleCompositionGraphHash?: string; readonly icssGraphHash?: string; readonly scopedCascadeGraphHash?: string;
|
|
293
|
-
readonly cssCascadeRuntimeProof?: CssCascadeRuntimeProof; readonly cssCascadeRuntimeProofs?: readonly CssCascadeRuntimeProof[];
|
|
294
|
-
readonly cssCascadeRuntimeProofsByPath?: Readonly<Record<string, CssCascadeRuntimeProof | readonly CssCascadeRuntimeProof[]>>;
|
|
294
|
+
readonly cssCascadeRuntimeProof?: CssCascadeRuntimeProof; readonly cssCascadeRuntimeProofs?: readonly CssCascadeRuntimeProof[]; readonly cssCascadeRuntimeProofsByPath?: Readonly<Record<string, CssCascadeRuntimeProof | readonly CssCascadeRuntimeProof[]>>;
|
|
295
295
|
readonly cssSourceBoundCascadeProof?: CssCascadeRuntimeProof; readonly cssSourceBoundCascadeProofs?: readonly CssCascadeRuntimeProof[];
|
|
296
296
|
readonly cssSourceBoundCascadeProofsByPath?: Readonly<Record<string, CssCascadeRuntimeProof | readonly CssCascadeRuntimeProof[]>>;
|
|
297
297
|
readonly cascadeRuntimeProof?: CssCascadeRuntimeProof; readonly cascadeRuntimeProofs?: readonly CssCascadeRuntimeProof[];
|
|
298
298
|
readonly cascadeRuntimeProofsByPath?: Readonly<Record<string, CssCascadeRuntimeProof | readonly CssCascadeRuntimeProof[]>>;
|
|
299
|
-
readonly sourceBoundCascadeProof?: CssCascadeRuntimeProof; readonly sourceBoundCascadeProofs?: readonly CssCascadeRuntimeProof[];
|
|
300
|
-
readonly sourceBoundCascadeProofsByPath?: Readonly<Record<string, CssCascadeRuntimeProof | readonly CssCascadeRuntimeProof[]>>;
|
|
299
|
+
readonly sourceBoundCascadeProof?: CssCascadeRuntimeProof; readonly sourceBoundCascadeProofs?: readonly CssCascadeRuntimeProof[]; readonly sourceBoundCascadeProofsByPath?: Readonly<Record<string, CssCascadeRuntimeProof | readonly CssCascadeRuntimeProof[]>>;
|
|
301
300
|
readonly cssDependencyGraphProof?: CssDependencyGraphProof; readonly cssDependencyGraphProofs?: readonly CssDependencyGraphProof[]; readonly cssSourceBoundDependencyGraphProof?: CssDependencyGraphProof; readonly cssSourceBoundDependencyGraphProofs?: readonly CssDependencyGraphProof[];
|
|
302
301
|
readonly cssDependencyGraphProofsByPath?: Readonly<Record<string, CssDependencyGraphProof | readonly CssDependencyGraphProof[]>>; readonly cssSourceBoundDependencyGraphProofsByPath?: Readonly<Record<string, CssDependencyGraphProof | readonly CssDependencyGraphProof[]>>;
|
|
302
|
+
readonly cssModuleContractProof?: CssModuleContractProof; readonly cssModuleContractProofs?: readonly CssModuleContractProof[]; readonly cssModuleContractProofsByPath?: Readonly<Record<string, CssModuleContractProof | readonly CssModuleContractProof[]>>; readonly cssSourceBoundModuleContractProof?: CssModuleContractProof; readonly cssSourceBoundModuleContractProofs?: readonly CssModuleContractProof[]; readonly cssSourceBoundModuleContractProofsByPath?: Readonly<Record<string, CssModuleContractProof | readonly CssModuleContractProof[]>>;
|
|
303
303
|
readonly selectorTargetGraphHash?: string; readonly selectorTargetEquivalences?: readonly CssSelectorTargetEquivalence[];
|
|
304
304
|
readonly baseGeneratedClassNameMap?: Readonly<Record<string, string>>; readonly workerGeneratedClassNameMap?: Readonly<Record<string, string>>; readonly headGeneratedClassNameMap?: Readonly<Record<string, string>>;
|
|
305
305
|
readonly baseGeneratedClassNameMapHash?: string; readonly workerGeneratedClassNameMapHash?: string; readonly headGeneratedClassNameMapHash?: string;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
const CssModuleContractProofKinds = new Set(['css-source-bound-module-contract-proof', 'css-module-contract-proof', 'css-source-bound-css-module-contract-proof']);
|
|
2
|
+
|
|
3
|
+
function admitCssModuleContractProofs({ id, sourcePath, input = {}, moduleChanges, binding, hash }) {
|
|
4
|
+
const proofs = cssModuleContractProofCandidates(input, sourcePath);
|
|
5
|
+
const admitted = [];
|
|
6
|
+
const conflicts = [
|
|
7
|
+
...cssModuleOverlapConflicts(id, sourcePath, moduleChanges.worker, moduleChanges.head)
|
|
8
|
+
];
|
|
9
|
+
for (const change of [...moduleChanges.worker, ...moduleChanges.head]) {
|
|
10
|
+
const proof = proofs.find((candidate) => isProofForChange(candidate, change, sourcePath, binding, hash));
|
|
11
|
+
if (proof) admitted.push(proofRecord(proof, change, sourcePath, binding, hash));
|
|
12
|
+
else conflicts.push(...proofConflictsForChange(id, sourcePath, change));
|
|
13
|
+
}
|
|
14
|
+
return { proofs: admitted, conflicts };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function proofConflictsForChange(id, sourcePath, change) {
|
|
18
|
+
const contract = change.after ?? change.before;
|
|
19
|
+
const requiredCodes = contract?.requiredProofGapCodes ?? [];
|
|
20
|
+
const gapConflicts = (change.proofGaps ?? [])
|
|
21
|
+
.filter((gap) => requiredCodes.includes(gap.code))
|
|
22
|
+
.map((gap) => conflict(id, sourcePath, 'css-module-proof-gap-blocked', gap.code, {
|
|
23
|
+
contractKey: change.key,
|
|
24
|
+
contractKind: contract.contractKind,
|
|
25
|
+
side: change.side,
|
|
26
|
+
changeKind: change.kind,
|
|
27
|
+
proofGap: gap
|
|
28
|
+
}));
|
|
29
|
+
if (gapConflicts.length) return gapConflicts;
|
|
30
|
+
return [conflict(id, sourcePath, 'css-module-contract-source-proof-blocked', 'css-module-contract-source-proof-unproved', {
|
|
31
|
+
contractKey: change.key,
|
|
32
|
+
contractKind: contract?.contractKind,
|
|
33
|
+
side: change.side,
|
|
34
|
+
changeKind: change.kind,
|
|
35
|
+
nextProof: 'css-source-bound-module-contract-proof'
|
|
36
|
+
})];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function cssModuleOverlapConflicts(id, sourcePath, workerChanges, headChanges) {
|
|
40
|
+
const headByKey = new Map(headChanges.map((change) => [change.key, change]));
|
|
41
|
+
return workerChanges.flatMap((workerChange) => {
|
|
42
|
+
const headChange = headByKey.get(workerChange.key);
|
|
43
|
+
if (!headChange || sameContractChange(workerChange, headChange)) return [];
|
|
44
|
+
const contract = workerChange.after ?? workerChange.before ?? headChange.after ?? headChange.before;
|
|
45
|
+
return [conflict(id, sourcePath, 'css-module-contract-conflict', 'css-module-contract-conflict', {
|
|
46
|
+
contractKey: workerChange.key,
|
|
47
|
+
contractKind: contract?.contractKind,
|
|
48
|
+
worker: contractChangeDetails(workerChange),
|
|
49
|
+
head: contractChangeDetails(headChange)
|
|
50
|
+
})];
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function isProofForChange(proof, change, sourcePath, binding, hash) {
|
|
55
|
+
const contract = change.after ?? change.before;
|
|
56
|
+
return Boolean(proof && contract && typeof proof === 'object') &&
|
|
57
|
+
CssModuleContractProofKinds.has(proof.kind) &&
|
|
58
|
+
proof.status === 'passed' &&
|
|
59
|
+
proof.sourcePath === sourcePath &&
|
|
60
|
+
proofCoversValue(proof.side, proof.sides, change.side) &&
|
|
61
|
+
proofCoversValue(proof.changeKind, proof.changeKinds, change.kind) &&
|
|
62
|
+
proofCoversValue(proof.contractKey, proof.contractKeys, change.key) &&
|
|
63
|
+
proofCoversValue(proof.contractKind, proof.contractKinds, contract.contractKind) &&
|
|
64
|
+
proofSourceMatches(proof, 'base', binding.base, hash) &&
|
|
65
|
+
proofSourceMatches(proof, 'worker', binding.worker, hash) &&
|
|
66
|
+
proofSourceMatches(proof, 'head', binding.head, hash) &&
|
|
67
|
+
proofSourceMatches(proof, 'output', binding.output, hash) &&
|
|
68
|
+
contractHashesMatch(proof, contract);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function contractHashesMatch(proof, contract) {
|
|
72
|
+
return proofHashMatches(proof, 'moduleHash', contract.moduleHash) &&
|
|
73
|
+
proofHashMatches(proof, 'generatedClassNameMapHash', contract.generatedClassNameMapHash, contract.contractKind === 'css-module-export') &&
|
|
74
|
+
proofHashMatches(proof, 'jsTsUseSiteGraphHash', contract.jsTsUseSiteGraphHash, contract.contractKind === 'css-module-export') &&
|
|
75
|
+
proofHashMatches(proof, 'cssModuleCompositionGraphHash', contract.cssModuleCompositionGraphHash, contract.contractKind === 'css-module-composition') &&
|
|
76
|
+
proofHashMatches(proof, 'icssGraphHash', contract.icssGraphHash, contract.contractKind === 'icss-import' || contract.contractKind === 'icss-export');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function proofHashMatches(proof, field, expected, required = true) {
|
|
80
|
+
if (!required) return true;
|
|
81
|
+
if (!expected) return false;
|
|
82
|
+
return proof[field] === expected || proof.contractGraphHashes?.[field] === expected || proof.cssModuleGraphHashes?.[field] === expected;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function proofSourceMatches(proof, role, sourceText, hash) {
|
|
86
|
+
if (typeof sourceText !== 'string') return false;
|
|
87
|
+
const sourceHash = hash?.(sourceText);
|
|
88
|
+
const textFields = role === 'output' ? ['outputSourceText', 'mergedSourceText'] : [`${role}SourceText`];
|
|
89
|
+
const hashFields = role === 'output' ? ['outputSourceHash', 'mergedSourceHash'] : [`${role}SourceHash`];
|
|
90
|
+
const aliases = role === 'output' ? ['output', 'merged'] : [role];
|
|
91
|
+
return textFields.some((field) => proof[field] === sourceText) ||
|
|
92
|
+
aliases.some((alias) => proof.sourceTexts?.[alias] === sourceText || proof.sources?.[alias] === sourceText) ||
|
|
93
|
+
hashFields.some((field) => sourceHash !== undefined && proof[field] === sourceHash) ||
|
|
94
|
+
aliases.some((alias) => sourceHash !== undefined && (proof.sourceHashes?.[alias] === sourceHash || proof.hashes?.[alias] === sourceHash));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function proofRecord(proof, change, sourcePath, binding, hash) {
|
|
98
|
+
const contract = change.after ?? change.before;
|
|
99
|
+
return {
|
|
100
|
+
id: proof.id,
|
|
101
|
+
kind: proof.kind,
|
|
102
|
+
status: 'passed',
|
|
103
|
+
proofLevel: proof.proofLevel ?? 'css-module-contract-source-bound',
|
|
104
|
+
sourcePath,
|
|
105
|
+
side: change.side,
|
|
106
|
+
changeKind: change.kind,
|
|
107
|
+
contractKey: change.key,
|
|
108
|
+
contractKind: contract.contractKind,
|
|
109
|
+
baseSourceHash: hash?.(binding.base),
|
|
110
|
+
workerSourceHash: hash?.(binding.worker),
|
|
111
|
+
headSourceHash: hash?.(binding.head),
|
|
112
|
+
outputSourceHash: hash?.(binding.output),
|
|
113
|
+
moduleHash: contract.moduleHash,
|
|
114
|
+
generatedClassNameMapHash: contract.generatedClassNameMapHash,
|
|
115
|
+
jsTsUseSiteGraphHash: contract.jsTsUseSiteGraphHash,
|
|
116
|
+
cssModuleCompositionGraphHash: contract.cssModuleCompositionGraphHash,
|
|
117
|
+
icssGraphHash: contract.icssGraphHash
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function cssModuleContractProofCandidates(input = {}, sourcePath) {
|
|
122
|
+
return [
|
|
123
|
+
input.cssModuleContractProof,
|
|
124
|
+
input.cssModuleContractProofs,
|
|
125
|
+
input.cssModuleContractProofsByPath?.[sourcePath],
|
|
126
|
+
input.cssSourceBoundModuleContractProof,
|
|
127
|
+
input.cssSourceBoundModuleContractProofs,
|
|
128
|
+
input.cssSourceBoundModuleContractProofsByPath?.[sourcePath],
|
|
129
|
+
input.cssSourceBoundCssModuleContractProof,
|
|
130
|
+
input.cssSourceBoundCssModuleContractProofs,
|
|
131
|
+
input.cssSourceBoundCssModuleContractProofsByPath?.[sourcePath]
|
|
132
|
+
].flatMap(asArray).filter(Boolean);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function proofCoversValue(single, many, value) {
|
|
136
|
+
if (single !== undefined) return single === value;
|
|
137
|
+
if (Array.isArray(many)) return many.includes(value);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function sameContractChange(left, right) { return (left.after?.hash ?? '') === (right.after?.hash ?? '') && left.kind === right.kind; }
|
|
142
|
+
function contractChangeDetails(change) { return { kind: change.kind, key: change.key, hash: change.after?.hash ?? change.before?.hash }; }
|
|
143
|
+
function asArray(value) { return Array.isArray(value) ? value : value === undefined ? [] : [value]; }
|
|
144
|
+
function conflict(id, sourcePath, code, reasonCode, details = {}) { return { code, gateId: 'css-semantic-merge', sourcePath, details: { reasonCode, conflictKey: `css#${id}#${reasonCode}#${details.contractKey ?? sourcePath ?? 'source'}`, ...details } }; }
|
|
145
|
+
|
|
146
|
+
export { admitCssModuleContractProofs };
|
|
@@ -35,6 +35,7 @@ function cssModuleContractIndex(sheet, hash) {
|
|
|
35
35
|
for (const entry of cssModules.exports ?? []) {
|
|
36
36
|
const contractHash = hash?.({ kind: 'frontier.lang.css.module.export.contract.v1', name: entry.name, generatedName: entry.generatedName });
|
|
37
37
|
contracts.set(`export:${entry.name}`, {
|
|
38
|
+
...contractEvidence(cssModules),
|
|
38
39
|
key: `export:${entry.name}`,
|
|
39
40
|
contractKind: 'css-module-export',
|
|
40
41
|
name: entry.name,
|
|
@@ -45,6 +46,7 @@ function cssModuleContractIndex(sheet, hash) {
|
|
|
45
46
|
for (const entry of cssModules.compositions ?? []) {
|
|
46
47
|
const key = ['composition', entry.localName, entry.sourceKind, entry.source ?? 'local'].join(':');
|
|
47
48
|
contracts.set(key, {
|
|
49
|
+
...contractEvidence(cssModules),
|
|
48
50
|
key,
|
|
49
51
|
contractKind: 'css-module-composition',
|
|
50
52
|
name: entry.localName,
|
|
@@ -55,6 +57,7 @@ function cssModuleContractIndex(sheet, hash) {
|
|
|
55
57
|
for (const entry of cssModules.icssImports ?? []) {
|
|
56
58
|
const key = ['icss-import', entry.source, entry.importedName].join(':');
|
|
57
59
|
contracts.set(key, {
|
|
60
|
+
...contractEvidence(cssModules),
|
|
58
61
|
key,
|
|
59
62
|
contractKind: 'icss-import',
|
|
60
63
|
name: entry.localName,
|
|
@@ -65,6 +68,7 @@ function cssModuleContractIndex(sheet, hash) {
|
|
|
65
68
|
for (const entry of cssModules.icssExports ?? []) {
|
|
66
69
|
const key = `icss-export:${entry.name}`;
|
|
67
70
|
contracts.set(key, {
|
|
71
|
+
...contractEvidence(cssModules),
|
|
68
72
|
key,
|
|
69
73
|
contractKind: 'icss-export',
|
|
70
74
|
name: entry.name,
|
|
@@ -75,6 +79,16 @@ function cssModuleContractIndex(sheet, hash) {
|
|
|
75
79
|
return { contracts, proofGaps: cssModules.proofGaps ?? [], moduleHash: cssModules.moduleHash };
|
|
76
80
|
}
|
|
77
81
|
|
|
82
|
+
function contractEvidence(cssModules) {
|
|
83
|
+
return {
|
|
84
|
+
moduleHash: cssModules.moduleHash,
|
|
85
|
+
generatedClassNameMapHash: cssModules.generatedClassNameMapHash,
|
|
86
|
+
jsTsUseSiteGraphHash: cssModules.jsTsUseSiteGraphHash,
|
|
87
|
+
cssModuleCompositionGraphHash: cssModules.cssModuleCompositionGraphHash,
|
|
88
|
+
icssGraphHash: cssModules.icssGraphHash
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
78
92
|
function changedContracts(baseIndex, currentIndex, side, sheet) {
|
|
79
93
|
const keys = unique([...baseIndex.contracts.keys(), ...currentIndex.contracts.keys()]);
|
|
80
94
|
return keys.flatMap((key) => {
|
package/dist/semantic-merge.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { cssModuleContractChanges,
|
|
1
|
+
import { cssModuleContractChanges, sheetOptions, unsupportedSourceShapeChanges } from './semantic-merge-css-modules.js';
|
|
2
|
+
import { admitCssModuleContractProofs } from './semantic-merge-css-module-proofs.js';
|
|
2
3
|
import { admitCascadeRuntimeProofs } from './semantic-merge-cascade-runtime.js';
|
|
3
4
|
import { admitCssDependencyGraphProofs, mergeCssDependencyGraphEvidence } from './dependency-graph.js';
|
|
4
5
|
import { mergeSelectorTargetEvidence, planSelectorTargetRebase } from './semantic-merge-selector-targets.js';
|
|
@@ -40,7 +41,6 @@ function safeMergeCssSource(input = {}, context = {}) {
|
|
|
40
41
|
...shorthandOverlapConflicts(id, sourcePath, changed.worker, changed.head),
|
|
41
42
|
...atRuleBlockOverlapConflicts(id, sourcePath, blockChanges.worker, blockChanges.head, conflict)
|
|
42
43
|
];
|
|
43
|
-
const moduleConflicts = cssModuleContractConflicts(id, sourcePath, moduleChanges);
|
|
44
44
|
const parserEvidence = mergeParserEvidence(sheets);
|
|
45
45
|
const shorthandExpansionEvidence = mergeShorthandExpansionEvidence(indexes, changed);
|
|
46
46
|
const dependencyGraphEvidence = mergeCssDependencyGraphEvidence(sheets, changed);
|
|
@@ -57,8 +57,9 @@ function safeMergeCssSource(input = {}, context = {}) {
|
|
|
57
57
|
hash
|
|
58
58
|
});
|
|
59
59
|
const dependencyGraphAdmission = admitCssDependencyGraphProofs({ id, sourcePath, input, dependencyGraphEvidence, binding: { base, worker, head, output: mergedSourceText }, hash });
|
|
60
|
-
const
|
|
61
|
-
|
|
60
|
+
const cssModuleAdmission = admitCssModuleContractProofs({ id, sourcePath, input, moduleChanges, binding: { base, worker, head, output: mergedSourceText }, hash });
|
|
61
|
+
const conflicts = [...parserConflicts, ...duplicateCascadeKeyConflicts, ...proofConflicts, ...overlapConflicts, ...cssModuleAdmission.conflicts, ...cascadeRuntimeAdmission.conflicts, ...dependencyGraphAdmission.conflicts, ...selectorTargetPlan.conflicts];
|
|
62
|
+
if (conflicts.length) return blocked(id, sourcePath, 'css-semantic-merge-conflict', conflicts, { parserEvidence, shorthandExpansionEvidence, dependencyGraphEvidence, selectorTargetEvidence: selectorTargetPlan.evidence, cssModuleContractProofs: cssModuleAdmission.proofs, cascadeRuntimeProofs: cascadeRuntimeAdmission.proofs, dependencyGraphProofs: dependencyGraphAdmission.proofs });
|
|
62
63
|
return merged(id, sourcePath, mergedSourceText, 'semantic-declaration-merge', hash, {
|
|
63
64
|
baseSheetHash: sheets.base.sheetHash,
|
|
64
65
|
workerSheetHash: sheets.worker.sheetHash,
|
|
@@ -71,6 +72,7 @@ function safeMergeCssSource(input = {}, context = {}) {
|
|
|
71
72
|
shorthandExpansionEvidence,
|
|
72
73
|
dependencyGraphEvidence,
|
|
73
74
|
selectorTargetEvidence: selectorTargetPlan.evidence,
|
|
75
|
+
cssModuleContractProofs: cssModuleAdmission.proofs,
|
|
74
76
|
cascadeRuntimeProofs: cascadeRuntimeAdmission.proofs,
|
|
75
77
|
dependencyGraphProofs: dependencyGraphAdmission.proofs,
|
|
76
78
|
browserCascadeEquivalenceClaim: cascadeRuntimeAdmission.proofs.length > 0
|
|
@@ -293,7 +295,7 @@ function result(id, sourcePath, status, body) {
|
|
|
293
295
|
reviewRequired: status !== 'merged',
|
|
294
296
|
reasonCodes: unique((body.conflicts ?? []).map((item) => item.details.reasonCode)),
|
|
295
297
|
browserCascadeEquivalenceClaim: browserCascadeEquivalenceClaim || undefined,
|
|
296
|
-
cssCascadeRuntimeProofs: body.cascadeRuntimeProofs?.length ? body.cascadeRuntimeProofs : undefined, cssDependencyGraphProofs: body.dependencyGraphProofs?.length ? body.dependencyGraphProofs : undefined
|
|
298
|
+
cssCascadeRuntimeProofs: body.cascadeRuntimeProofs?.length ? body.cascadeRuntimeProofs : undefined, cssDependencyGraphProofs: body.dependencyGraphProofs?.length ? body.dependencyGraphProofs : undefined, cssModuleContractProofs: body.cssModuleContractProofs?.length ? body.cssModuleContractProofs : undefined
|
|
297
299
|
}
|
|
298
300
|
};
|
|
299
301
|
}
|
package/package.json
CHANGED