@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) => {
@@ -1,4 +1,5 @@
1
- import { cssModuleContractChanges, cssModuleContractConflicts, sheetOptions, unsupportedSourceShapeChanges } from './semantic-merge-css-modules.js';
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 conflicts = [...parserConflicts, ...duplicateCascadeKeyConflicts, ...proofConflicts, ...overlapConflicts, ...moduleConflicts, ...cascadeRuntimeAdmission.conflicts, ...dependencyGraphAdmission.conflicts, ...selectorTargetPlan.conflicts];
61
- if (conflicts.length) return blocked(id, sourcePath, 'css-semantic-merge-conflict', conflicts, { parserEvidence, shorthandExpansionEvidence, dependencyGraphEvidence, selectorTargetEvidence: selectorTargetPlan.evidence, cascadeRuntimeProofs: cascadeRuntimeAdmission.proofs, dependencyGraphProofs: dependencyGraphAdmission.proofs });
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shapeshift-labs/frontier-lang-css",
3
- "version": "0.1.17",
3
+ "version": "0.1.18",
4
4
  "description": "CSS semantic merge evidence and projection adapter for Frontier Lang semantic source documents.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",