@shapeshift-labs/frontier-lang-compiler 0.2.156 → 0.2.158

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,16 @@
1
+ import type { JsTsProjectMergeProofLevel } from './js-ts-project-merge-proof-levels.js';
2
+ import type { JsTsProjectSafeMergeMissingEvidenceTelemetry } from './js-ts-project-merge-confidence.js';
3
+
4
+ export interface JsTsProjectSafeMergeSummary {
5
+ readonly files: number; readonly mergedFiles: number; readonly blockedFiles: number; readonly outputFiles: number;
6
+ readonly htmlFiles:number; readonly cssFiles:number; readonly htmlCssFiles:number; readonly htmlMergedFiles:number; readonly cssMergedFiles:number; readonly htmlCssMergedFiles:number; readonly htmlBlockedFiles:number; readonly cssBlockedFiles:number; readonly htmlCssBlockedFiles:number; readonly htmlCssBrowserRuntimeProofs:number;
7
+ readonly projectGraphConflicts: number; readonly projectGraphDeltaEvidenceIncluded: number; readonly outputProjectGraphConflicts:number; readonly projectGraphCssModuleUseSiteConflicts:number; readonly projectGraphDeltaConflicts: number; readonly projectGraphLimitConflicts: number; readonly projectGraphPublicContractConflicts: number; readonly projectGraphSourceSpanConflicts: number;
8
+ readonly projectGraphCompilerTypeConflicts: number; readonly projectGraphRuntimeRegionConflicts: number; readonly projectGraphScopeUseDefConflicts: number; readonly projectGraphJsxPropConflicts: number; readonly projectGraphJsxRenderRiskConflicts: number; readonly projectGraphReExportIdentityConflicts: number; readonly projectGraphModuleDeclarationShapeConflicts: number; readonly projectGraphExportAssignmentShapeConflicts: number;
9
+ readonly projectGraphImportAttributeConflicts: number; readonly projectGraphImportTargetConflicts: number; readonly outputDiagnostics: number; readonly outputDiagnosticConflicts: number; readonly outputDiagnosticErrors: number; readonly outputDiagnosticWarnings: number; readonly outputDeclarations: number; readonly outputDeclarationBytes: number; readonly outputDeclarationConflicts: number; readonly outputDeclarationDiagnosticErrors: number; readonly outputQualityGates: number; readonly outputQualityGateConflicts: number;
10
+ readonly proofEvidenceRecords: number; readonly proofEvidencePassed: number; readonly proofEvidenceFailed: number; readonly proofEvidenceSkipped: number; readonly proofEvidenceUnknown: number; readonly proofEvidenceMissing: number; readonly proofEvidenceMissingLevels: readonly JsTsProjectMergeProofLevel[]; readonly semanticEquivalenceLevel: 'semantic-equivalence-unknown' | string;
11
+ readonly evidenceRecords: number; readonly passedEvidenceRecords: number; readonly failedEvidenceRecords: number; readonly unknownEvidenceRecords: number; readonly confidenceScore: number; readonly confidenceLevel: string; readonly confidenceDimensions: Readonly<Record<string,string>>; readonly missingEvidenceMatrix: JsTsProjectSafeMergeMissingEvidenceTelemetry; readonly missingSignals: number;
12
+ readonly nextMissingEvidenceCode?: string; readonly nextMissingEvidenceKind?: string; readonly nextMissingEvidenceScope?: string; readonly nextMissingProofLevel?: string; readonly nextMissingEvidenceAction?: string; readonly nextMissingEvidenceRouteId?: string; readonly nextMissingEvidenceRouteLane?: string; readonly nextMissingEvidenceRouteNext?: string;
13
+ readonly projectMoveRenameClassifications: number; readonly projectFileMoveRenameClassifications: number; readonly projectSymbolMoveClassifications: number; readonly projectExportedSymbolMoveClassifications: number; readonly projectImportedSymbolMoveClassifications: number; readonly projectSymbolMoveAdmissions: number; readonly projectExportedSymbolMoveAdmissions: number; readonly projectImportedSymbolMoveAdmissions: number; readonly projectCrossFileSymbolRenameClassifications: number; readonly projectCrossFileSymbolRenameAdmissions: number;
14
+ readonly projectSplitMergeClassifications: number; readonly projectModuleSplitClassifications: number; readonly projectModuleMergeClassifications: number; readonly projectClassSplitClassifications: number; readonly projectClassMergeClassifications: number; readonly projectSplitMergeAdmissions: number; readonly projectModuleSplitAdmissions: number; readonly projectModuleMergeAdmissions: number; readonly projectClassSplitAdmissions: number; readonly projectClassMergeAdmissions: number;
15
+ readonly semanticArtifactFiles: number; readonly operations: Readonly<Record<string,number>>;
16
+ }
@@ -12,6 +12,7 @@ import type { JsTsProjectMergeQualityGate as QualityGate, JsTsProjectMergeQualit
12
12
  import type { JsTsProjectMergeProofEvidence, JsTsProjectMergeProofEvidenceStatus, JsTsProjectMergeProofLevel } from './js-ts-project-merge-proof-levels.js';
13
13
  import type { JsTsProjectSafeMergeAdmissionRoute, JsTsProjectSafeMergeAdmissionRouteSummary } from './js-ts-project-merge-admission-routes.js';
14
14
  import type { JsTsProjectSafeMergeConfidenceSummary, JsTsProjectSafeMergeMissingEvidenceTelemetry } from './js-ts-project-merge-confidence.js';
15
+ import type { JsTsProjectSafeMergeSummary } from './js-ts-project-merge-summary.js';
15
16
  import type { JsTsProjectCommonJsRuntimeInteropProof } from './js-ts-project-merge-commonjs-interop.js';
16
17
  import type { JsTsProjectGlobalAugmentationCompatibilityProof } from './js-ts-project-merge-global-augmentation.js'; import type { JsTsProjectJsxRenderReturnBranchProof } from './js-ts-project-merge-jsx-render-branch.js'; import type { JsTsProjectSemanticEquivalenceProof } from './js-ts-project-merge-semantic-equivalence-proof.js';
17
18
  import type { ParserTriviaEvidenceInput } from './source-preservation.js';
@@ -20,12 +21,14 @@ export type { JsTsProjectMergeQualityGate, JsTsProjectMergeQualityGateDecision,
20
21
  export type { JsTsProjectMergeProofEvidence, JsTsProjectMergeProofEvidenceRecord, JsTsProjectMergeProofEvidenceRecordStatus, JsTsProjectMergeProofEvidenceStatus, JsTsProjectMergeProofEvidenceSummary, JsTsProjectMergeProofLevel, JsTsProjectMergeProofMissingEvidence } from './js-ts-project-merge-proof-levels.js';
21
22
  export type { JsTsProjectSafeMergeAdmissionRoute, JsTsProjectSafeMergeAdmissionRouteSummary } from './js-ts-project-merge-admission-routes.js';
22
23
  export type { JsTsProjectSafeMergeConfidenceSummary, JsTsProjectSafeMergeMissingEvidence, JsTsProjectSafeMergeMissingEvidenceRoute, JsTsProjectSafeMergeMissingEvidenceTelemetry, JsTsProjectSafeMergeRecommendedAction } from './js-ts-project-merge-confidence.js';
24
+ export type { JsTsProjectSafeMergeSummary } from './js-ts-project-merge-summary.js';
23
25
  export type { JsTsProjectCommonJsRuntimeInteropProof } from './js-ts-project-merge-commonjs-interop.js';
24
26
  export type { JsTsProjectGlobalAugmentationCompatibilityProof } from './js-ts-project-merge-global-augmentation.js'; export type { JsTsProjectJsxRenderReturnBranchArmOrigin, JsTsProjectJsxRenderReturnBranchControlKind, JsTsProjectJsxRenderReturnBranchProof } from './js-ts-project-merge-jsx-render-branch.js';
25
27
 
26
28
  export type JsTsProjectSafeMergeStatus = 'merged' | 'blocked';
27
29
  export type JsTsProjectSafeMergeFileStatus = 'merged' | 'blocked';
28
30
  export type JsTsProjectSafeMergeFileOperation = 'merged-source' | 'merged-source-and-members' | 'worker-added' | 'head-only' | 'both-added-identical' | 'worker-deleted' | 'head-deleted-worker-unchanged' | 'blocked-merge' | 'blocked-file-presence' | string;
31
+ export type JsTsProjectHtmlCssMergeOptions = Readonly<Record<string, unknown>>;
29
32
 
30
33
  export interface JsTsProjectSafeMergeEvidenceRecord { readonly id: string; readonly kind: string; readonly status: 'passed' | 'failed' | 'skipped' | 'unknown' | string; readonly level?: string; readonly scope?: string; readonly summary?: string; readonly metadata?: Record<string, unknown>; }
31
34
 
@@ -105,6 +108,8 @@ export interface JsTsProjectSafeMergeInput {
105
108
  readonly commonJsRuntimeInteropProofs?: readonly JsTsProjectCommonJsRuntimeInteropProof[];
106
109
  readonly globalAugmentationCompatibilityProof?: JsTsProjectGlobalAugmentationCompatibilityProof;
107
110
  readonly globalAugmentationCompatibilityProofs?: readonly JsTsProjectGlobalAugmentationCompatibilityProof[]; readonly jsxRenderReturnBranchProof?: JsTsProjectJsxRenderReturnBranchProof; readonly jsxRenderReturnBranchProofs?: readonly JsTsProjectJsxRenderReturnBranchProof[]; readonly externalSemanticEquivalenceProof?: JsTsProjectSemanticEquivalenceProof; readonly semanticEquivalenceProof?: JsTsProjectSemanticEquivalenceProof;
111
+ readonly htmlMergeOptions?: JsTsProjectHtmlCssMergeOptions; readonly markupMergeOptions?: JsTsProjectHtmlCssMergeOptions; readonly htmlMergeOptionsByPath?: Readonly<Record<string,JsTsProjectHtmlCssMergeOptions>>; readonly markupMergeOptionsByPath?: Readonly<Record<string,JsTsProjectHtmlCssMergeOptions>>;
112
+ readonly cssMergeOptions?: JsTsProjectHtmlCssMergeOptions; readonly styleMergeOptions?: JsTsProjectHtmlCssMergeOptions; readonly cssMergeOptionsByPath?: Readonly<Record<string,JsTsProjectHtmlCssMergeOptions>>; readonly styleMergeOptionsByPath?: Readonly<Record<string,JsTsProjectHtmlCssMergeOptions>>;
108
113
  readonly moduleResolution?: NativeProjectModuleResolutionOptions;
109
114
  readonly tsconfig?: JsTsProjectTsconfigInput | NativeProjectModuleResolutionOptions;
110
115
  readonly projectReferences?: JsTsProjectReferencesInput;
@@ -169,7 +174,7 @@ export interface JsTsProjectSafeMergeFileResult {
169
174
  readonly baseHash?: string;
170
175
  readonly workerHash?: string;
171
176
  readonly headHash?: string;
172
- readonly result?: JsTsSafeMergeResult;
177
+ readonly result?: JsTsSafeMergeResult | Record<string, unknown>;
173
178
  readonly semanticArtifacts?: JsTsSafeMergeSemanticArtifacts;
174
179
  readonly conflicts: readonly JsTsSafeMergeConflict[];
175
180
  readonly admission: JsTsSafeMergeAdmission;
@@ -272,37 +277,7 @@ export interface JsTsProjectSafeMergeResult {
272
277
  readonly outputQualityGate?: QualityGate;
273
278
  readonly conflicts: readonly JsTsSafeMergeConflict[];
274
279
  readonly admission: JsTsProjectSafeMergeAdmission; readonly proofEvidence: JsTsProjectMergeProofEvidence; readonly confidence: JsTsProjectSafeMergeConfidenceSummary; readonly evidence: readonly JsTsProjectSafeMergeEvidenceRecord[];
275
- readonly summary: {
276
- readonly files: number;
277
- readonly mergedFiles: number;
278
- readonly blockedFiles: number;
279
- readonly outputFiles: number;
280
- readonly projectGraphConflicts: number;
281
- readonly projectGraphDeltaEvidenceIncluded: number;
282
- outputProjectGraphConflicts:number; projectGraphCssModuleUseSiteConflicts:number;
283
- readonly projectGraphDeltaConflicts: number;
284
- readonly projectGraphLimitConflicts: number;
285
- readonly projectGraphPublicContractConflicts: number;
286
- readonly projectGraphSourceSpanConflicts: number;
287
- readonly projectGraphCompilerTypeConflicts: number; readonly projectGraphRuntimeRegionConflicts: number; readonly projectGraphScopeUseDefConflicts: number; readonly projectGraphJsxPropConflicts: number; readonly projectGraphJsxRenderRiskConflicts: number;
288
- readonly projectGraphReExportIdentityConflicts: number; readonly projectGraphModuleDeclarationShapeConflicts: number; readonly projectGraphExportAssignmentShapeConflicts: number;
289
- readonly projectGraphImportAttributeConflicts: number;
290
- readonly projectGraphImportTargetConflicts: number;
291
- readonly outputDiagnostics: number;
292
- readonly outputDiagnosticConflicts: number;
293
- readonly outputDiagnosticErrors: number;
294
- readonly outputDiagnosticWarnings: number;
295
- readonly outputDeclarations: number;
296
- readonly outputDeclarationBytes: number;
297
- readonly outputDeclarationConflicts: number;
298
- readonly outputDeclarationDiagnosticErrors: number;
299
- readonly outputQualityGates: number; readonly outputQualityGateConflicts: number;
300
- readonly proofEvidenceRecords: number; readonly proofEvidencePassed: number; readonly proofEvidenceFailed: number; readonly proofEvidenceSkipped: number; readonly proofEvidenceUnknown: number; readonly proofEvidenceMissing: number; readonly proofEvidenceMissingLevels: readonly JsTsProjectMergeProofLevel[]; readonly semanticEquivalenceLevel: 'semantic-equivalence-unknown' | string; readonly evidenceRecords: number; readonly passedEvidenceRecords: number; readonly failedEvidenceRecords: number; readonly unknownEvidenceRecords: number; readonly confidenceScore: number; readonly confidenceLevel: string; readonly confidenceDimensions: Readonly<Record<string,string>>; readonly missingEvidenceMatrix: JsTsProjectSafeMergeMissingEvidenceTelemetry; readonly missingSignals: number; readonly nextMissingEvidenceCode?: string; readonly nextMissingEvidenceKind?: string; readonly nextMissingEvidenceScope?: string; readonly nextMissingProofLevel?: string; readonly nextMissingEvidenceAction?: string; readonly nextMissingEvidenceRouteId?: string; readonly nextMissingEvidenceRouteLane?: string; readonly nextMissingEvidenceRouteNext?: string;
301
- readonly projectMoveRenameClassifications: number; readonly projectFileMoveRenameClassifications: number; readonly projectSymbolMoveClassifications: number; readonly projectExportedSymbolMoveClassifications: number; readonly projectImportedSymbolMoveClassifications: number; readonly projectSymbolMoveAdmissions: number; readonly projectExportedSymbolMoveAdmissions: number; readonly projectImportedSymbolMoveAdmissions: number; readonly projectCrossFileSymbolRenameClassifications: number; readonly projectCrossFileSymbolRenameAdmissions: number;
302
- readonly projectSplitMergeClassifications: number; readonly projectModuleSplitClassifications: number; readonly projectModuleMergeClassifications: number; readonly projectClassSplitClassifications: number; readonly projectClassMergeClassifications: number; readonly projectSplitMergeAdmissions: number; readonly projectModuleSplitAdmissions: number; readonly projectModuleMergeAdmissions: number; readonly projectClassSplitAdmissions: number; readonly projectClassMergeAdmissions: number;
303
- readonly semanticArtifactFiles: number;
304
- readonly operations: Readonly<Record<string,number>>;
305
- };
280
+ readonly summary: JsTsProjectSafeMergeSummary;
306
281
  readonly metadata?: Record<string, unknown> & {
307
282
  readonly projectMoveRenameClassifications?: {
308
283
  readonly classifications: number;
@@ -0,0 +1,38 @@
1
+ const HtmlCssProjectMergeMissingSignals = Object.freeze({
2
+ htmlStructuralMerge: 'html-structural-merge-proof-blocked',
3
+ cssCascadeMerge: 'css-cascade-merge-proof-blocked',
4
+ htmlCssBrowserRuntimeProof: 'html-css-browser-runtime-proof-not-available'
5
+ });
6
+
7
+ function htmlCssProjectMergeMissingEvidenceRoutes(route, signals) {
8
+ return {
9
+ [signals.htmlStructuralMerge]: route('admit-html-structural-merge', 'layout-markup-graph', 'supply-html-parser-reference-and-boundary-evidence'),
10
+ [signals.cssCascadeMerge]: route('admit-css-cascade-merge', 'layout-style-graph', 'supply-css-parser-cascade-and-scope-evidence'),
11
+ [signals.htmlCssBrowserRuntimeProof]: route('prove-html-css-browser-runtime', 'browser-proof', 'attach-browser-runtime-proof-bundle')
12
+ };
13
+ }
14
+
15
+ function htmlCssProjectMergeAdmissionMatrixRows(matrixRow, signals) {
16
+ return [
17
+ matrixRow('html-structural-merge-admission', 'partial', ['html-structural-merge'], [signals.htmlStructuralMerge]),
18
+ matrixRow('css-cascade-merge-admission', 'partial', ['css-cascade-merge'], [signals.cssCascadeMerge]),
19
+ matrixRow('html-css-browser-runtime-proof', 'bounded-evidence', ['browser-runtime-proof'], [signals.htmlCssBrowserRuntimeProof])
20
+ ];
21
+ }
22
+
23
+ function htmlCssProjectMergeMissingEvidenceItems(summary, signals, missingEvidenceItem) {
24
+ const items = [];
25
+ if (summary.htmlBlockedFiles) items.push(missingEvidenceItem({ code: signals.htmlStructuralMerge, scope: 'layout-markup-graph', kind: 'html-structural-merge-proof', proofLevel: 'html-structural-merge', action: 'review', summary: `HTML project merge has ${summary.htmlBlockedFiles} blocked file(s); supply parser/source-span evidence, stable element identity, and runtime-boundary proof before admission.` }));
26
+ if (summary.cssBlockedFiles) items.push(missingEvidenceItem({ code: signals.cssCascadeMerge, scope: 'layout-style-graph', kind: 'css-cascade-merge-proof', proofLevel: 'css-cascade-merge', action: 'review', summary: `CSS project merge has ${summary.cssBlockedFiles} blocked file(s); supply parser/cascade/scope evidence and keep browser claims false until runtime proof passes.` }));
27
+ if (summary.htmlCssMergedFiles && !summary.htmlCssBrowserRuntimeProofs) items.push(missingEvidenceItem({ code: signals.htmlCssBrowserRuntimeProof, scope: 'browser-proof', kind: 'browser-runtime-proof', proofLevel: 'browser-runtime-proof', action: 'review', summary: 'HTML/CSS structural source merge was available, but browser DOM/cascade/layout/runtime proof was not attached; keep browser equivalence claims false.', suggestedInput: { browserRuntimeProof: true } }));
28
+ return items;
29
+ }
30
+
31
+ function htmlCssProjectMergeMatrixProofStatus(level, summary) {
32
+ if (level === 'html-structural-merge') return summary.htmlFiles ? (summary.htmlBlockedFiles ? 'failed' : summary.htmlMergedFiles ? 'passed' : 'missing') : 'absent';
33
+ if (level === 'css-cascade-merge') return summary.cssFiles ? (summary.cssBlockedFiles ? 'failed' : summary.cssMergedFiles ? 'passed' : 'missing') : 'absent';
34
+ if (level === 'browser-runtime-proof') return summary.htmlCssFiles ? (summary.htmlCssBrowserRuntimeProofs ? 'passed' : 'missing') : 'absent';
35
+ return undefined;
36
+ }
37
+
38
+ export { HtmlCssProjectMergeMissingSignals, htmlCssProjectMergeAdmissionMatrixRows, htmlCssProjectMergeMatrixProofStatus, htmlCssProjectMergeMissingEvidenceItems, htmlCssProjectMergeMissingEvidenceRoutes };
@@ -0,0 +1,21 @@
1
+ function htmlCssProjectSummary(files) {
2
+ const htmlFiles = files.filter(isHtmlProjectFile), cssFiles = files.filter(isCssProjectFile), htmlCssFiles = [...htmlFiles, ...cssFiles];
3
+ return {
4
+ htmlFiles: htmlFiles.length, cssFiles: cssFiles.length, htmlCssFiles: htmlCssFiles.length,
5
+ htmlMergedFiles: htmlFiles.filter(isMerged).length, cssMergedFiles: cssFiles.filter(isMerged).length, htmlCssMergedFiles: htmlCssFiles.filter(isMerged).length,
6
+ htmlBlockedFiles: htmlFiles.filter(isBlocked).length, cssBlockedFiles: cssFiles.filter(isBlocked).length, htmlCssBlockedFiles: htmlCssFiles.filter(isBlocked).length,
7
+ htmlCssBrowserRuntimeProofs: htmlCssFiles.filter(hasBrowserRuntimeProof).length
8
+ };
9
+ }
10
+
11
+ function isHtmlProjectFile(file) { return String(file?.language ?? '').toLowerCase() === 'html' || /\.html?$/i.test(stripQuery(file?.sourcePath)); }
12
+ function isCssProjectFile(file) { return String(file?.language ?? '').toLowerCase() === 'css' || stripQuery(file?.sourcePath).toLowerCase().endsWith('.css'); }
13
+ function isMerged(file) { return file.status === 'merged'; }
14
+ function isBlocked(file) { return file.status === 'blocked'; }
15
+ function stripQuery(sourcePath) { return String(sourcePath ?? '').replace(/[?#].*$/, ''); }
16
+ function hasBrowserRuntimeProof(file) {
17
+ const admission = file?.result?.admission ?? file?.admission ?? {};
18
+ return admission.browserRuntimeEquivalenceClaim === true || admission.browserCascadeEquivalenceClaim === true || admission.browserRenderEquivalenceClaim === true;
19
+ }
20
+
21
+ export { htmlCssProjectSummary };
@@ -0,0 +1,50 @@
1
+ import { safeMergeCssSource } from '@shapeshift-labs/frontier-lang-css';
2
+ import { safeMergeHtmlSource } from '@shapeshift-labs/frontier-lang-html';
3
+ import { compactRecord } from './js-ts-safe-merge-context.js';
4
+ import { hashText, safeId } from './js-ts-safe-project-merge-core.js';
5
+
6
+ function projectFileLanguage(file, input) {
7
+ return file.language ?? inferLanguageFromPath(file.sourcePath) ?? input.language ?? 'typescript';
8
+ }
9
+
10
+ function maybeMergeHtmlCssProjectFile(options) {
11
+ const { file, input, projectId, context, base, worker, head, sourceInput } = options;
12
+ const language = String(context.language ?? '').toLowerCase();
13
+ const merge = language === 'html' ? safeMergeHtmlSource : language === 'css' ? safeMergeCssSource : undefined;
14
+ if (!merge) return undefined;
15
+ const result = merge({ ...sourceInput, ...htmlCssMergeOptionsForProjectFile(input, file.sourcePath, language), ...context, id: `${projectId}_${safeId(file.sourcePath)}`, baseSourceText: base, workerSourceText: worker, headSourceText: head });
16
+ return result.status === 'merged' ? mergedHtmlCssFile(file, context, result, language) : blockedHtmlCssFile(file, context, result);
17
+ }
18
+
19
+ function inferLanguageFromPath(sourcePath) {
20
+ const path = String(sourcePath ?? '').toLowerCase().replace(/[?#].*$/, '');
21
+ if (path.endsWith('.html') || path.endsWith('.htm')) return 'html';
22
+ if (path.endsWith('.css')) return 'css';
23
+ if (path.endsWith('.tsx')) return 'tsx';
24
+ if (path.endsWith('.jsx')) return 'jsx';
25
+ if (path.endsWith('.ts') || path.endsWith('.mts') || path.endsWith('.cts')) return 'typescript';
26
+ if (path.endsWith('.js') || path.endsWith('.mjs') || path.endsWith('.cjs')) return 'javascript';
27
+ return undefined;
28
+ }
29
+
30
+ function htmlCssMergeOptionsForProjectFile(input, sourcePath, language) {
31
+ const byPath = language === 'html' ? input.htmlMergeOptionsByPath ?? input.markupMergeOptionsByPath : input.cssMergeOptionsByPath ?? input.styleMergeOptionsByPath;
32
+ return compactRecord({ ...(language === 'css' ? input.cssMergeOptions ?? input.styleMergeOptions : input.htmlMergeOptions ?? input.markupMergeOptions), ...(byPath?.[sourcePath] ?? {}) });
33
+ }
34
+
35
+ function mergedHtmlCssFile(file, context, result, language) {
36
+ return compactRecord({
37
+ kind: 'frontier.lang.jsTsProjectSafeMergeFile', version: 1, sourcePath: file.sourcePath, language: context.language, status: 'merged', operation: `merged-${language}-source`,
38
+ outputSourceText: result.mergedSourceText, outputHash: hashText(result.mergedSourceText), baseHash: hashText(file.baseSourceText), workerHash: hashText(file.workerSourceText), headHash: hashText(file.headSourceText),
39
+ result, semanticArtifacts: result.semanticArtifacts, conflicts: [], admission: result.admission, summary: result.summary, conflictKeys: [`source#${file.sourcePath}`]
40
+ });
41
+ }
42
+
43
+ function blockedHtmlCssFile(file, context, result) {
44
+ return compactRecord({
45
+ kind: 'frontier.lang.jsTsProjectSafeMergeFile', version: 1, sourcePath: file.sourcePath, language: context.language, status: 'blocked', operation: 'blocked-merge',
46
+ result, conflicts: result.conflicts ?? [], admission: result.admission, summary: result.summary, conflictKeys: [`source#${file.sourcePath}`]
47
+ });
48
+ }
49
+
50
+ export { maybeMergeHtmlCssProjectFile, projectFileLanguage };
@@ -1,3 +1,4 @@
1
+ import { HtmlCssProjectMergeMissingSignals, htmlCssProjectMergeAdmissionMatrixRows, htmlCssProjectMergeMatrixProofStatus, htmlCssProjectMergeMissingEvidenceItems, htmlCssProjectMergeMissingEvidenceRoutes } from './js-ts-safe-project-merge-html-css-matrix.js';
1
2
  const ProjectMergeMissingSignals = Object.freeze({
2
3
  outputDiagnosticsGate: 'output-diagnostics-gate-not-run',
3
4
  declarationGate: 'declaration-gate-not-run',
@@ -10,6 +11,7 @@ const ProjectMergeMissingSignals = Object.freeze({
10
11
  semanticEditReplayProof: 'semantic-edit-replay-proof-not-produced',
11
12
  semanticEditReplayOutputMismatch: 'semantic-edit-replay-proof-output-mismatch',
12
13
  unsupportedJsTsSurface: 'unsupported-js-ts-surface-proof-not-available',
14
+ ...HtmlCssProjectMergeMissingSignals,
13
15
  cssModuleUseSiteGraph: 'css-module-use-site-graph-proof-blocked',
14
16
  semanticEquivalenceProof: 'semantic-equivalence-proof-not-available'
15
17
  });
@@ -26,6 +28,7 @@ const ProjectMergeMissingEvidenceRoutes = Object.freeze({
26
28
  [ProjectMergeMissingSignals.semanticEditReplayProof]: route('produce-semantic-edit-replay-proof', 'source-files', 'run-semantic-edit-replay-diagnostics'),
27
29
  [ProjectMergeMissingSignals.semanticEditReplayOutputMismatch]: route('reject-semantic-edit-replay-output-mismatch', 'source-files', 'inspect-semantic-edit-replay-output-binding'),
28
30
  [ProjectMergeMissingSignals.unsupportedJsTsSurface]: route('prove-unsupported-js-ts-surface', 'semantic-proof', 'supply-unsupported-surface-evidence'),
31
+ ...htmlCssProjectMergeMissingEvidenceRoutes(route, ProjectMergeMissingSignals),
29
32
  [ProjectMergeMissingSignals.cssModuleUseSiteGraph]: route('prove-css-module-use-site-graph', 'layout-style-graph', 'supply-css-module-transform-and-use-site-proof'),
30
33
  [ProjectMergeMissingSignals.semanticEquivalenceProof]: route('external-semantic-equivalence-proof', 'semantic-proof', 'attach-external-equivalence-proof')
31
34
  });
@@ -39,6 +42,7 @@ const ProjectMergeAdmissionMatrixRows = Object.freeze([
39
42
  matrixRow('control-flow-effect-graph', 'partial', ['source-span-roundtrip', 'focused-test-passed'], [ProjectMergeMissingSignals.sourceSpanRoundtrip, ProjectMergeMissingSignals.semanticArtifacts, ProjectMergeMissingSignals.qualityGates, ProjectMergeMissingSignals.focusedTestGate]),
40
43
  matrixRow('generic-semantic-edit-admission', 'partial', ['source-span-roundtrip', 'semantic-edit-replay-clean'], [ProjectMergeMissingSignals.sourceSpanRoundtrip, ProjectMergeMissingSignals.semanticArtifacts, ProjectMergeMissingSignals.semanticEditReplayProof, ProjectMergeMissingSignals.semanticEditReplayOutputMismatch]),
41
44
  matrixRow('unsupported-js-ts-surface-coverage', 'partial', ['unsupported-js-ts-surface-review'], [ProjectMergeMissingSignals.unsupportedJsTsSurface]),
45
+ ...htmlCssProjectMergeAdmissionMatrixRows(matrixRow, ProjectMergeMissingSignals),
42
46
  matrixRow('css-modules-use-site-graph', 'partial', ['css-module-use-site-graph', 'css-module-transform-proof', 'project-graph-evidence'], [ProjectMergeMissingSignals.cssModuleUseSiteGraph]),
43
47
  matrixRow('semantic-equivalence-proof', 'bounded-evidence', ['semantic-equivalence-external', 'semantic-equivalence-unknown'], [ProjectMergeMissingSignals.semanticEquivalenceProof]),
44
48
  matrixRow('cross-file-symbol-rename', 'partial', ['diagnostics-clean', 'declaration-output-stable', 'project-graph-delta'], [ProjectMergeMissingSignals.outputDiagnosticsGate, ProjectMergeMissingSignals.declarationGate, ProjectMergeMissingSignals.projectGraphEvidence, ProjectMergeMissingSignals.projectGraphDeltaEvidence]),
@@ -135,6 +139,7 @@ function missingEvidenceItems(summary, context = {}) {
135
139
  summary: `CSS Module use-site graph has ${summary.projectGraphCssModuleUseSiteConflicts} blocker(s); supply generated class maps, bundler transform identity, source-map proof, and narrow use-site evidence before admission.`,
136
140
  suggestedInput: { includeOutputProjectSymbolGraph: true, cssModuleEvidence: true }
137
141
  }));
142
+ items.push(...htmlCssProjectMergeMissingEvidenceItems(summary, ProjectMergeMissingSignals, missingEvidenceItem));
138
143
  return items;
139
144
  }
140
145
 
@@ -247,6 +252,8 @@ function matrixProofStatuses(proofLevels, summary, proofEvidence) {
247
252
  function matrixProofStatus(level, summary, proofEvidence) {
248
253
  const levelStatuses = proofEvidence?.summary?.levelStatuses ?? summary.proofEvidenceLevelStatuses ?? {};
249
254
  if (levelStatuses[level]) return levelStatuses[level];
255
+ const htmlCssStatus = htmlCssProjectMergeMatrixProofStatus(level, summary);
256
+ if (htmlCssStatus) return htmlCssStatus;
250
257
  if (level === 'project-graph-delta') return summary.projectGraphDeltaEvidenceIncluded ? (summary.projectGraphDeltaConflicts ? 'failed' : 'passed') : 'missing';
251
258
  if (level === 'project-graph-evidence') return summary.projectGraphConflicts ? 'failed' : summary.projectGraphEvidenceIncluded || summary.projectGraphDeltaEvidenceIncluded ? 'passed' : 'missing';
252
259
  if (level === 'css-module-use-site-graph') return summary.projectGraphCssModuleUseSiteConflicts ? 'failed' : summary.projectGraphCssModuleUseSiteGraphs ? 'passed' : summary.projectGraphEvidenceIncluded ? 'absent' : 'missing';
@@ -309,12 +316,4 @@ function compactRecord(record) {
309
316
  return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
310
317
  }
311
318
 
312
- export {
313
- compactMissingEvidenceTelemetry,
314
- confidenceRecommendedAction,
315
- createProjectMergeAdmissionMatrixAudit,
316
- missingEvidenceItems,
317
- missingEvidenceRouteForSignal,
318
- missingEvidenceSignals,
319
- prioritizedMissingEvidence
320
- };
319
+ export { compactMissingEvidenceTelemetry, confidenceRecommendedAction, createProjectMergeAdmissionMatrixAudit, missingEvidenceItems, missingEvidenceRouteForSignal, missingEvidenceSignals, prioritizedMissingEvidence };
@@ -1,5 +1,6 @@
1
1
  import { compactMissingEvidenceTelemetry, confidenceRecommendedAction, createProjectMergeAdmissionMatrixAudit, missingEvidenceItems, missingEvidenceSignals, prioritizedMissingEvidence } from './js-ts-safe-project-merge-missing-evidence.js';
2
2
  import { failedEvidenceMissingItems, fileAdmissionEvidenceRecords } from './js-ts-safe-project-merge-evidence-routing.js'; import { compactProjectMergeRoutingCalibration } from './js-ts-safe-project-merge-routing-calibration.js';
3
+ import { htmlCssProjectSummary } from './js-ts-safe-project-merge-html-css-summary.js';
3
4
 
4
5
  function projectSummary(files, graphConflicts = [], hasProjectGraphDelta = false, outputDiagnosticsGate = undefined, outputDeclarationGate = undefined, outputQualityGate = undefined, moveRenameSummary = undefined, proofEvidence = undefined, symbolRenameSummary = undefined, splitMergeSummary = undefined, projectSymbolGraph = undefined) {
5
6
  const byOperation = {};
@@ -13,6 +14,7 @@ function projectSummary(files, graphConflicts = [], hasProjectGraphDelta = false
13
14
  mergedFiles: files.filter((file) => file.status === 'merged').length,
14
15
  blockedFiles: files.filter((file) => file.status === 'blocked').length,
15
16
  outputFiles: files.filter((file) => typeof file.outputSourceText === 'string').length,
17
+ ...htmlCssProjectSummary(files),
16
18
  projectGraphConflicts: graphConflicts.length,
17
19
  projectGraphDeltaEvidenceIncluded: hasProjectGraphDelta ? 1 : 0, projectGraphEvidenceIncluded: projectSymbolGraph || hasProjectGraphDelta ? 1 : 0,
18
20
  outputProjectGraphConflicts: outputConflicts.length, projectGraphCssModuleUseSiteConflicts: cssModuleConflicts.length,
@@ -285,9 +287,7 @@ function confidenceScore(status, summary, evidence, context) {
285
287
 
286
288
  function confidenceLevel(score, status) {
287
289
  if (status !== 'merged' || score < 35) return 'blocked';
288
- if (score >= 90) return 'high';
289
- if (score >= 70) return 'medium';
290
- return 'low';
290
+ return score >= 90 ? 'high' : score >= 70 ? 'medium' : 'low';
291
291
  }
292
292
 
293
293
  function compactConfidenceDimensions(status, summary, context, routingCalibration = {}) {
@@ -19,6 +19,7 @@ import { applyProjectMoveRenameClassifications, classifyProjectMoveRenames } fro
19
19
  import { applyProjectSymbolRenameClassifications, classifyProjectSymbolRenames } from './js-ts-safe-project-merge-symbol-rename.js';
20
20
  import { applyProjectSplitMergeClassifications, classifyProjectSplitMerges } from './js-ts-safe-project-merge-split-merge.js';
21
21
  import { projectConfidence, projectEvidence, projectSummary, projectSummaryWithConfidenceEvidence } from './js-ts-safe-project-merge-summary.js';
22
+ import { maybeMergeHtmlCssProjectFile, projectFileLanguage } from './js-ts-safe-project-merge-html-css.js';
22
23
 
23
24
  function safeMergeJsTsProject(input = {}) {
24
25
  const id = String(input.id ?? 'js_ts_project_safe_merge');
@@ -215,7 +216,7 @@ function mergeProjectFile(file, input, projectId, projectSymbolRenames) {
215
216
  const base = file.baseSourceText;
216
217
  const worker = file.workerDeleted ? undefined : file.workerSourceText ?? base;
217
218
  const head = file.headDeleted ? undefined : file.headSourceText ?? base;
218
- const context = { sourcePath: file.sourcePath, language: file.language ?? input.language ?? 'typescript' };
219
+ const context = { sourcePath: file.sourcePath, language: projectFileLanguage(file, input) };
219
220
  if (!file.sourcePath) return blockedFile(file, context, 'missing-source-path');
220
221
  const ambientBlock = maybeBlockAmbientProjectFile(file, context, input);
221
222
  if (ambientBlock) return ambientBlock;
@@ -242,6 +243,8 @@ function mergeProjectFile(file, input, projectId, projectSymbolRenames) {
242
243
  ? syntheticFile(file, context, undefined, 'head-deleted-worker-unchanged')
243
244
  : blockedFile(file, context, 'head-file-delete-conflict');
244
245
  }
246
+ const nonJsTsMerge = maybeMergeHtmlCssProjectFile({ file, input, projectId, context, base, worker, head, sourceInput: sourceMergeInputForProjectFile(input) });
247
+ if (nonJsTsMerge) return nonJsTsMerge;
245
248
  const result = safeMergeJsTsSource({
246
249
  ...sourceMergeInputForProjectFile(input),
247
250
  ...context,
@@ -286,17 +289,7 @@ function allowsProjectSymbolRenameForFile(input, projectSymbolRenames, sourcePat
286
289
  }
287
290
 
288
291
  function sourceMergeInputForProjectFile(input) {
289
- const {
290
- outputDiagnostics,
291
- outputSyntaxDiagnostics,
292
- mergedOutputSyntaxDiagnostics,
293
- syntaxDiagnostics,
294
- requireOutputSyntaxDiagnostics,
295
- requireOutputSyntaxGate,
296
- requireMergedOutputSyntaxDiagnostics,
297
- requireSyntaxGate,
298
- ...sourceInput
299
- } = input;
292
+ const { outputDiagnostics, outputSyntaxDiagnostics, mergedOutputSyntaxDiagnostics, syntaxDiagnostics, requireOutputSyntaxDiagnostics, requireOutputSyntaxGate, requireMergedOutputSyntaxDiagnostics, requireSyntaxGate, ...sourceInput } = input;
300
293
  return sourceInput;
301
294
  }
302
295
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shapeshift-labs/frontier-lang-compiler",
3
- "version": "0.2.156",
3
+ "version": "0.2.158",
4
4
  "description": "Compiler facade for Frontier Lang source documents and language projection adapters.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -63,7 +63,8 @@
63
63
  "dependencies": {
64
64
  "@shapeshift-labs/frontier-lang-c": "0.2.9",
65
65
  "@shapeshift-labs/frontier-lang-checker": "0.3.8",
66
- "@shapeshift-labs/frontier-lang-css": "^0.1.5",
66
+ "@shapeshift-labs/frontier-lang-css": "^0.1.6",
67
+ "@shapeshift-labs/frontier-lang-html": "^0.1.4",
67
68
  "@shapeshift-labs/frontier-lang-javascript": "0.2.9",
68
69
  "@shapeshift-labs/frontier-lang-kernel": "0.3.12",
69
70
  "@shapeshift-labs/frontier-lang-parser": "0.3.8",