@dailephd/my-frontend-observer 0.8.1
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/CHANGELOG.md +397 -0
- package/LICENSE +21 -0
- package/README.md +255 -0
- package/dist/application/browserCaptureService.d.ts +11 -0
- package/dist/application/browserCaptureService.js +12 -0
- package/dist/application/browserCaptureService.js.map +1 -0
- package/dist/application/comparisonService.d.ts +56 -0
- package/dist/application/comparisonService.js +77 -0
- package/dist/application/comparisonService.js.map +1 -0
- package/dist/application/externalReferencePersistenceService.d.ts +75 -0
- package/dist/application/externalReferencePersistenceService.js +182 -0
- package/dist/application/externalReferencePersistenceService.js.map +1 -0
- package/dist/application/frontendContractEvaluationService.d.ts +49 -0
- package/dist/application/frontendContractEvaluationService.js +112 -0
- package/dist/application/frontendContractEvaluationService.js.map +1 -0
- package/dist/application/frontendContractPersistenceService.d.ts +56 -0
- package/dist/application/frontendContractPersistenceService.js +91 -0
- package/dist/application/frontendContractPersistenceService.js.map +1 -0
- package/dist/application/observationPersistence.d.ts +59 -0
- package/dist/application/observationPersistence.js +79 -0
- package/dist/application/observationPersistence.js.map +1 -0
- package/dist/application/projectCheckService.d.ts +3 -0
- package/dist/application/projectCheckService.js +169 -0
- package/dist/application/projectCheckService.js.map +1 -0
- package/dist/application/projectWorkflowService.d.ts +46 -0
- package/dist/application/projectWorkflowService.js +92 -0
- package/dist/application/projectWorkflowService.js.map +1 -0
- package/dist/application/referenceFidelityEvaluationService.d.ts +28 -0
- package/dist/application/referenceFidelityEvaluationService.js +45 -0
- package/dist/application/referenceFidelityEvaluationService.js.map +1 -0
- package/dist/artifacts/artifactReader.d.ts +19 -0
- package/dist/artifacts/artifactReader.js +36 -0
- package/dist/artifacts/artifactReader.js.map +1 -0
- package/dist/artifacts/artifactWriter.d.ts +25 -0
- package/dist/artifacts/artifactWriter.js +68 -0
- package/dist/artifacts/artifactWriter.js.map +1 -0
- package/dist/artifacts/comparisonArtifactReader.d.ts +18 -0
- package/dist/artifacts/comparisonArtifactReader.js +35 -0
- package/dist/artifacts/comparisonArtifactReader.js.map +1 -0
- package/dist/artifacts/comparisonArtifactWriter.d.ts +41 -0
- package/dist/artifacts/comparisonArtifactWriter.js +67 -0
- package/dist/artifacts/comparisonArtifactWriter.js.map +1 -0
- package/dist/artifacts/externalReferenceArtifactReader.d.ts +18 -0
- package/dist/artifacts/externalReferenceArtifactReader.js +35 -0
- package/dist/artifacts/externalReferenceArtifactReader.js.map +1 -0
- package/dist/artifacts/externalReferenceArtifactWriter.d.ts +44 -0
- package/dist/artifacts/externalReferenceArtifactWriter.js +77 -0
- package/dist/artifacts/externalReferenceArtifactWriter.js.map +1 -0
- package/dist/artifacts/frontendContractArtifactReader.d.ts +24 -0
- package/dist/artifacts/frontendContractArtifactReader.js +47 -0
- package/dist/artifacts/frontendContractArtifactReader.js.map +1 -0
- package/dist/artifacts/frontendContractArtifactWriter.d.ts +34 -0
- package/dist/artifacts/frontendContractArtifactWriter.js +70 -0
- package/dist/artifacts/frontendContractArtifactWriter.js.map +1 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.d.ts +17 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.js +34 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.js.map +1 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.d.ts +32 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.js +58 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.js.map +1 -0
- package/dist/artifacts/types.d.ts +17 -0
- package/dist/artifacts/types.js +2 -0
- package/dist/artifacts/types.js.map +1 -0
- package/dist/browser/chromiumAdapter.d.ts +21 -0
- package/dist/browser/chromiumAdapter.js +204 -0
- package/dist/browser/chromiumAdapter.js.map +1 -0
- package/dist/browser/evidenceCapture.d.ts +62 -0
- package/dist/browser/evidenceCapture.js +500 -0
- package/dist/browser/evidenceCapture.js.map +1 -0
- package/dist/browser/scrollCapture.d.ts +32 -0
- package/dist/browser/scrollCapture.js +163 -0
- package/dist/browser/scrollCapture.js.map +1 -0
- package/dist/browser/types.d.ts +24 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +2411 -0
- package/dist/cli.js.map +1 -0
- package/dist/domain/boundedAgentContext.d.ts +226 -0
- package/dist/domain/boundedAgentContext.js +355 -0
- package/dist/domain/boundedAgentContext.js.map +1 -0
- package/dist/domain/boundedAgentContextCorrelation.d.ts +74 -0
- package/dist/domain/boundedAgentContextCorrelation.js +441 -0
- package/dist/domain/boundedAgentContextCorrelation.js.map +1 -0
- package/dist/domain/boundedAgentContextIdentity.d.ts +26 -0
- package/dist/domain/boundedAgentContextIdentity.js +69 -0
- package/dist/domain/boundedAgentContextIdentity.js.map +1 -0
- package/dist/domain/boundedAgentContextProjection.d.ts +71 -0
- package/dist/domain/boundedAgentContextProjection.js +477 -0
- package/dist/domain/boundedAgentContextProjection.js.map +1 -0
- package/dist/domain/comparison.d.ts +220 -0
- package/dist/domain/comparison.js +350 -0
- package/dist/domain/comparison.js.map +1 -0
- package/dist/domain/comparisonEngine.d.ts +76 -0
- package/dist/domain/comparisonEngine.js +734 -0
- package/dist/domain/comparisonEngine.js.map +1 -0
- package/dist/domain/comparisonIdentity.d.ts +13 -0
- package/dist/domain/comparisonIdentity.js +46 -0
- package/dist/domain/comparisonIdentity.js.map +1 -0
- package/dist/domain/completion.d.ts +30 -0
- package/dist/domain/completion.js +22 -0
- package/dist/domain/completion.js.map +1 -0
- package/dist/domain/diagnostics.d.ts +17 -0
- package/dist/domain/diagnostics.js +77 -0
- package/dist/domain/diagnostics.js.map +1 -0
- package/dist/domain/evidence.d.ts +29 -0
- package/dist/domain/evidence.js +59 -0
- package/dist/domain/evidence.js.map +1 -0
- package/dist/domain/explicitState.d.ts +40 -0
- package/dist/domain/explicitState.js +54 -0
- package/dist/domain/explicitState.js.map +1 -0
- package/dist/domain/externalReference.d.ts +158 -0
- package/dist/domain/externalReference.js +167 -0
- package/dist/domain/externalReference.js.map +1 -0
- package/dist/domain/externalReferenceApplicability.d.ts +43 -0
- package/dist/domain/externalReferenceApplicability.js +52 -0
- package/dist/domain/externalReferenceApplicability.js.map +1 -0
- package/dist/domain/externalReferenceCompatibility.d.ts +40 -0
- package/dist/domain/externalReferenceCompatibility.js +48 -0
- package/dist/domain/externalReferenceCompatibility.js.map +1 -0
- package/dist/domain/externalReferenceFidelity.d.ts +171 -0
- package/dist/domain/externalReferenceFidelity.js +419 -0
- package/dist/domain/externalReferenceFidelity.js.map +1 -0
- package/dist/domain/externalReferenceIdentity.d.ts +38 -0
- package/dist/domain/externalReferenceIdentity.js +70 -0
- package/dist/domain/externalReferenceIdentity.js.map +1 -0
- package/dist/domain/externalReferenceImage.d.ts +35 -0
- package/dist/domain/externalReferenceImage.js +160 -0
- package/dist/domain/externalReferenceImage.js.map +1 -0
- package/dist/domain/externalReferenceRegionRelationships.d.ts +63 -0
- package/dist/domain/externalReferenceRegionRelationships.js +98 -0
- package/dist/domain/externalReferenceRegionRelationships.js.map +1 -0
- package/dist/domain/externalReferenceRegions.d.ts +65 -0
- package/dist/domain/externalReferenceRegions.js +105 -0
- package/dist/domain/externalReferenceRegions.js.map +1 -0
- package/dist/domain/externalReferenceRequirementIdentity.d.ts +12 -0
- package/dist/domain/externalReferenceRequirementIdentity.js +35 -0
- package/dist/domain/externalReferenceRequirementIdentity.js.map +1 -0
- package/dist/domain/externalReferenceRequirements.d.ts +215 -0
- package/dist/domain/externalReferenceRequirements.js +401 -0
- package/dist/domain/externalReferenceRequirements.js.map +1 -0
- package/dist/domain/externalReferenceRuntimeBinding.d.ts +146 -0
- package/dist/domain/externalReferenceRuntimeBinding.js +183 -0
- package/dist/domain/externalReferenceRuntimeBinding.js.map +1 -0
- package/dist/domain/frontendContractEvaluation.d.ts +57 -0
- package/dist/domain/frontendContractEvaluation.js +454 -0
- package/dist/domain/frontendContractEvaluation.js.map +1 -0
- package/dist/domain/frontendContractEvaluationArtifact.d.ts +65 -0
- package/dist/domain/frontendContractEvaluationArtifact.js +108 -0
- package/dist/domain/frontendContractEvaluationArtifact.js.map +1 -0
- package/dist/domain/frontendContractIdentity.d.ts +39 -0
- package/dist/domain/frontendContractIdentity.js +70 -0
- package/dist/domain/frontendContractIdentity.js.map +1 -0
- package/dist/domain/frontendContracts.d.ts +188 -0
- package/dist/domain/frontendContracts.js +260 -0
- package/dist/domain/frontendContracts.js.map +1 -0
- package/dist/domain/identity.d.ts +21 -0
- package/dist/domain/identity.js +47 -0
- package/dist/domain/identity.js.map +1 -0
- package/dist/domain/referenceCorrectionIdentity.d.ts +40 -0
- package/dist/domain/referenceCorrectionIdentity.js +77 -0
- package/dist/domain/referenceCorrectionIdentity.js.map +1 -0
- package/dist/domain/referenceCorrectionWorkflow.d.ts +160 -0
- package/dist/domain/referenceCorrectionWorkflow.js +165 -0
- package/dist/domain/referenceCorrectionWorkflow.js.map +1 -0
- package/dist/domain/referenceFidelityProjection.d.ts +65 -0
- package/dist/domain/referenceFidelityProjection.js +135 -0
- package/dist/domain/referenceFidelityProjection.js.map +1 -0
- package/dist/domain/relationships.d.ts +210 -0
- package/dist/domain/relationships.js +352 -0
- package/dist/domain/relationships.js.map +1 -0
- package/dist/domain/schema.d.ts +269 -0
- package/dist/domain/schema.js +442 -0
- package/dist/domain/schema.js.map +1 -0
- package/dist/domain/scrollEvidence.d.ts +51 -0
- package/dist/domain/scrollEvidence.js +134 -0
- package/dist/domain/scrollEvidence.js.map +1 -0
- package/dist/index.d.ts +114 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/projectWorkflow/aliasCatalog.d.ts +21 -0
- package/dist/projectWorkflow/aliasCatalog.js +67 -0
- package/dist/projectWorkflow/aliasCatalog.js.map +1 -0
- package/dist/projectWorkflow/checkAcceptance.d.ts +25 -0
- package/dist/projectWorkflow/checkAcceptance.js +55 -0
- package/dist/projectWorkflow/checkAcceptance.js.map +1 -0
- package/dist/projectWorkflow/checkResult.d.ts +85 -0
- package/dist/projectWorkflow/checkResult.js +101 -0
- package/dist/projectWorkflow/checkResult.js.map +1 -0
- package/dist/projectWorkflow/projectConfig.d.ts +43 -0
- package/dist/projectWorkflow/projectConfig.js +84 -0
- package/dist/projectWorkflow/projectConfig.js.map +1 -0
- package/dist/projectWorkflow/projectDiscovery.d.ts +9 -0
- package/dist/projectWorkflow/projectDiscovery.js +20 -0
- package/dist/projectWorkflow/projectDiscovery.js.map +1 -0
- package/dist/projectWorkflow/projectPaths.d.ts +8 -0
- package/dist/projectWorkflow/projectPaths.js +23 -0
- package/dist/projectWorkflow/projectPaths.js.map +1 -0
- package/dist/request/paths.d.ts +14 -0
- package/dist/request/paths.js +33 -0
- package/dist/request/paths.js.map +1 -0
- package/dist/request/request.d.ts +111 -0
- package/dist/request/request.js +464 -0
- package/dist/request/request.js.map +1 -0
- package/dist/safety/policy.d.ts +14 -0
- package/dist/safety/policy.js +81 -0
- package/dist/safety/policy.js.map +1 -0
- package/dist/viewer/assets/index-CN_yb9Uf.css +1 -0
- package/dist/viewer/assets/index-D98S1_2d.js +9 -0
- package/dist/viewer/icons/icon-192.png +0 -0
- package/dist/viewer/icons/icon-512.png +0 -0
- package/dist/viewer/index.html +15 -0
- package/dist/viewer/manifest.webmanifest +1 -0
- package/dist/viewer/registerSW.js +1 -0
- package/dist/viewer/sw.js +1 -0
- package/dist/viewer/workbox-9c191d2f.js +1 -0
- package/dist/viewerServer/context.d.ts +48 -0
- package/dist/viewerServer/context.js +60 -0
- package/dist/viewerServer/context.js.map +1 -0
- package/dist/viewerServer/evidence/classify.d.ts +59 -0
- package/dist/viewerServer/evidence/classify.js +124 -0
- package/dist/viewerServer/evidence/classify.js.map +1 -0
- package/dist/viewerServer/evidence/comparisonView.d.ts +28 -0
- package/dist/viewerServer/evidence/comparisonView.js +43 -0
- package/dist/viewerServer/evidence/comparisonView.js.map +1 -0
- package/dist/viewerServer/evidence/contextSourceView.d.ts +25 -0
- package/dist/viewerServer/evidence/contextSourceView.js +20 -0
- package/dist/viewerServer/evidence/contextSourceView.js.map +1 -0
- package/dist/viewerServer/evidence/discovery.d.ts +31 -0
- package/dist/viewerServer/evidence/discovery.js +78 -0
- package/dist/viewerServer/evidence/discovery.js.map +1 -0
- package/dist/viewerServer/evidence/evaluationView.d.ts +32 -0
- package/dist/viewerServer/evidence/evaluationView.js +50 -0
- package/dist/viewerServer/evidence/evaluationView.js.map +1 -0
- package/dist/viewerServer/evidence/handles.d.ts +21 -0
- package/dist/viewerServer/evidence/handles.js +43 -0
- package/dist/viewerServer/evidence/handles.js.map +1 -0
- package/dist/viewerServer/evidence/index.d.ts +41 -0
- package/dist/viewerServer/evidence/index.js +82 -0
- package/dist/viewerServer/evidence/index.js.map +1 -0
- package/dist/viewerServer/evidence/limits.d.ts +27 -0
- package/dist/viewerServer/evidence/limits.js +28 -0
- package/dist/viewerServer/evidence/limits.js.map +1 -0
- package/dist/viewerServer/evidence/linkedEvidence.d.ts +43 -0
- package/dist/viewerServer/evidence/linkedEvidence.js +151 -0
- package/dist/viewerServer/evidence/linkedEvidence.js.map +1 -0
- package/dist/viewerServer/evidence/mediaResolver.d.ts +16 -0
- package/dist/viewerServer/evidence/mediaResolver.js +85 -0
- package/dist/viewerServer/evidence/mediaResolver.js.map +1 -0
- package/dist/viewerServer/evidence/observationView.d.ts +29 -0
- package/dist/viewerServer/evidence/observationView.js +46 -0
- package/dist/viewerServer/evidence/observationView.js.map +1 -0
- package/dist/viewerServer/evidence/pathSafety.d.ts +11 -0
- package/dist/viewerServer/evidence/pathSafety.js +31 -0
- package/dist/viewerServer/evidence/pathSafety.js.map +1 -0
- package/dist/viewerServer/evidence/projection.d.ts +55 -0
- package/dist/viewerServer/evidence/projection.js +152 -0
- package/dist/viewerServer/evidence/projection.js.map +1 -0
- package/dist/viewerServer/evidence/referenceView.d.ts +133 -0
- package/dist/viewerServer/evidence/referenceView.js +169 -0
- package/dist/viewerServer/evidence/referenceView.js.map +1 -0
- package/dist/viewerServer/httpServer.d.ts +27 -0
- package/dist/viewerServer/httpServer.js +381 -0
- package/dist/viewerServer/httpServer.js.map +1 -0
- package/dist/viewerServer/openBrowser.d.ts +7 -0
- package/dist/viewerServer/openBrowser.js +32 -0
- package/dist/viewerServer/openBrowser.js.map +1 -0
- package/dist/viewerServer/port.d.ts +16 -0
- package/dist/viewerServer/port.js +19 -0
- package/dist/viewerServer/port.js.map +1 -0
- package/dist/viewerServer/viewerService.d.ts +62 -0
- package/dist/viewerServer/viewerService.js +88 -0
- package/dist/viewerServer/viewerService.js.map +1 -0
- package/docs/ARCHITECTURE.md +1286 -0
- package/docs/CI_CD.md +250 -0
- package/docs/COMMANDS.md +972 -0
- package/docs/CONTRACTS.md +1856 -0
- package/docs/CURRENT_STATE.md +1049 -0
- package/docs/DEVELOPMENT.md +202 -0
- package/docs/DOCUMENTATION_PRESERVATION_POLICY.md +50 -0
- package/docs/PROJECT_DESCRIPTION.md +2221 -0
- package/docs/PROJECT_MILESTONES.md +2526 -0
- package/docs/PROJECT_OVERVIEW.md +150 -0
- package/docs/QUICKSTART.md +83 -0
- package/docs/RELEASE.md +27 -0
- package/docs/ROADMAP.md +641 -0
- package/docs/SECURITY.md +218 -0
- package/docs/WORKFLOWS.md +642 -0
- package/docs/plans/v0.8-implementation-plan.md +655 -0
- package/docs/plans/v0.8.1-cli-usability-patch-plan.md +505 -0
- package/docs/reports/v0.7-bounded-fidelity-context-prompt7.md +243 -0
- package/docs/reports/v0.7-implementation-completeness-documentation-reconciliation.md +497 -0
- package/docs/reports/v0.7-pre-release-readiness.md +337 -0
- package/docs/reports/v0.7-reference-binding-prompt5.md +223 -0
- package/docs/reports/v0.7-reference-compatibility-prompt4.md +234 -0
- package/docs/reports/v0.7-reference-correction-workflow-prompt8.md +222 -0
- package/docs/reports/v0.7-reference-fidelity-prompt6.md +216 -0
- package/docs/reports/v0.7-reference-foundation-prompt1.md +151 -0
- package/docs/reports/v0.7-reference-regions-prompt2.md +195 -0
- package/docs/reports/v0.7-reference-requirements-prompt3.md +217 -0
- package/docs/reports/v0.7-release-prep.md +423 -0
- package/docs/reports/v0.8-binding-fidelity-interaction-batch6.md +279 -0
- package/docs/reports/v0.8-bounded-context-correlation-batch7.md +233 -0
- package/docs/reports/v0.8-comparison-contract-inspection-batch4.md +279 -0
- package/docs/reports/v0.8-evidence-index-readers-batch2.md +247 -0
- package/docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md +741 -0
- package/docs/reports/v0.8-integrated-viewer-acceptance-batch8.md +128 -0
- package/docs/reports/v0.8-observation-svg-inspection-batch3.md +223 -0
- package/docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md +687 -0
- package/docs/reports/v0.8-reference-candidate-inspection-batch5.md +232 -0
- package/docs/reports/v0.8-viewer-runtime-pwa-batch1.md +278 -0
- package/docs/reports/v0.8.1-check-orchestration-prompt2.md +69 -0
- package/docs/reports/v0.8.1-implementation-completeness-documentation-reconciliation.md +114 -0
- package/docs/reports/v0.8.1-prerelease-readiness-cross-platform-security-code-rot.md +170 -0
- package/docs/reports/v0.8.1-project-workflow-foundation-prompt1.md +66 -0
- package/package.json +58 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v0.4 Batch 1 comparison contract. Frozen here as pure
|
|
3
|
+
* types/constants/structural validators only - comparison is downstream of
|
|
4
|
+
* observation (real Chromium -> ObservationArtifact -> relationship
|
|
5
|
+
* derivation -> comparability analysis -> comparison -> ComparisonArtifact,
|
|
6
|
+
* see docs/ARCHITECTURE.md) and this batch implements neither relationship
|
|
7
|
+
* derivation, real comparison, nor persistence. Batch 2 owns relationship
|
|
8
|
+
* derivation; Batch 3 owns `compareObservations()` and comparison
|
|
9
|
+
* persistence; Batch 4 owns CLI exposure.
|
|
10
|
+
*
|
|
11
|
+
* Comparison and observation are different evidence products: this module
|
|
12
|
+
* never reuses `ARTIFACT_KIND`/`SCHEMA_VERSION` from `./schema.js`, and
|
|
13
|
+
* `isValidComparisonArtifact` never delegates to `isValidObservationArtifact`.
|
|
14
|
+
*/
|
|
15
|
+
import { PRODUCER_NAME, SCHEMA_VERSION as OBSERVATION_SCHEMA_VERSION } from './schema.js';
|
|
16
|
+
import type { Diagnostic } from './diagnostics.js';
|
|
17
|
+
import type { EvidenceReference, LayoutRelationshipGraph, PageLevelRelationshipKind, PairwiseRelationshipKind } from './relationships.js';
|
|
18
|
+
export declare const COMPARISON_ARTIFACT_KIND: "my-frontend-observer/comparison";
|
|
19
|
+
export declare const COMPARISON_SCHEMA_VERSION: "1.0.0";
|
|
20
|
+
/**
|
|
21
|
+
* Geometry tolerance is owned by domain/relationships.ts (the relationship
|
|
22
|
+
* derivation engine needs it directly, and that module must not import this
|
|
23
|
+
* one back - relationships.ts is the lower-level module). Re-exported here
|
|
24
|
+
* unchanged so every pre-Batch-2 consumer of these names from
|
|
25
|
+
* domain/comparison.ts keeps working.
|
|
26
|
+
*/
|
|
27
|
+
export { GEOMETRY_TOLERANCE_DEFAULT_PX, GEOMETRY_TOLERANCE_MIN_PX, GEOMETRY_TOLERANCE_MAX_PX, isValidGeometryTolerancePx } from './relationships.js';
|
|
28
|
+
export declare const DEPENDENCY_PROPERTIES: readonly ["x", "y", "width", "height"];
|
|
29
|
+
export type DependencyProperty = (typeof DEPENDENCY_PROPERTIES)[number];
|
|
30
|
+
export declare const DEPENDENCY_DIRECTIONS: readonly ["increase", "decrease", "change", "unchanged"];
|
|
31
|
+
export type DependencyDirection = (typeof DEPENDENCY_DIRECTIONS)[number];
|
|
32
|
+
/** The observer never generates a dependency declaration from co-change; every declaration must explicitly identify that it was supplied externally. */
|
|
33
|
+
export declare const EXPECTED_DEPENDENCY_SOURCES: readonly ["explicit-config"];
|
|
34
|
+
export type ExpectedDependencySource = (typeof EXPECTED_DEPENDENCY_SOURCES)[number];
|
|
35
|
+
export interface DependencyTermDeclaration {
|
|
36
|
+
target: string;
|
|
37
|
+
property: DependencyProperty;
|
|
38
|
+
direction: DependencyDirection;
|
|
39
|
+
}
|
|
40
|
+
/** A bounded, explicitly-declared expected layout dependency (e.g. "navigation.width decreases -> workspace.width increases") - never inferred from co-change. */
|
|
41
|
+
export interface ExpectedDependencyDeclaration {
|
|
42
|
+
cause: DependencyTermDeclaration;
|
|
43
|
+
effect: DependencyTermDeclaration;
|
|
44
|
+
source: ExpectedDependencySource;
|
|
45
|
+
}
|
|
46
|
+
export declare function isValidExpectedDependencyDeclaration(value: unknown): value is ExpectedDependencyDeclaration;
|
|
47
|
+
/**
|
|
48
|
+
* Non-causal evaluation outcomes only - describes the relationship between a
|
|
49
|
+
* declared expectation and observed differences, never an implementation
|
|
50
|
+
* verdict (no PASS/FAIL/approved/regression/allowed/protected vocabulary).
|
|
51
|
+
*/
|
|
52
|
+
export declare const DEPENDENCY_EVIDENCE_OUTCOMES: readonly ["consistent", "not-observed", "contradictory-to-declaration", "unavailable"];
|
|
53
|
+
export type DependencyEvidenceOutcome = (typeof DEPENDENCY_EVIDENCE_OUTCOMES)[number];
|
|
54
|
+
export interface ExpectedDependencyEvidence {
|
|
55
|
+
declaration: ExpectedDependencyDeclaration;
|
|
56
|
+
outcome: DependencyEvidenceOutcome;
|
|
57
|
+
supportingEvidence: EvidenceReference[];
|
|
58
|
+
}
|
|
59
|
+
export declare function isValidExpectedDependencyEvidence(value: unknown): value is ExpectedDependencyEvidence;
|
|
60
|
+
/** Deliberately excludes any v0.5+ contract/change-scope field (requestedChanges, protected, preserved, allowedChanges, passThreshold, failThreshold, baseline, approval). */
|
|
61
|
+
export interface ComparisonConfig {
|
|
62
|
+
geometryTolerancePx: number;
|
|
63
|
+
expectedDependencies?: ExpectedDependencyDeclaration[];
|
|
64
|
+
}
|
|
65
|
+
export declare function isValidComparisonConfig(value: unknown): value is ComparisonConfig;
|
|
66
|
+
export declare const COMPARABILITY_STATES: readonly ["comparable", "comparable-with-warnings", "incomparable"];
|
|
67
|
+
export type ComparabilityState = (typeof COMPARABILITY_STATES)[number];
|
|
68
|
+
/**
|
|
69
|
+
* Hard-incompatibility reason codes are `blocking` (force `incomparable`
|
|
70
|
+
* unless the repository can prove a dimension cannot be evaluated
|
|
71
|
+
* reliably); warning-only differences are `warning` (do not by themselves
|
|
72
|
+
* prevent useful page-level comparison); dimensions the observer does not
|
|
73
|
+
* yet model (theme/authenticated-state/application-state identity) are
|
|
74
|
+
* `unassessed` and never claimed identical without evidence.
|
|
75
|
+
*/
|
|
76
|
+
export declare const COMPARABILITY_REASON_CODES: readonly ["artifact-kind-mismatch", "schema-version-mismatch", "page-url-mismatch", "viewport-mismatch", "viewport-unassessed", "scroll-scenario-mismatch", "browser-engine-mismatch", "producer-version-mismatch", "browser-version-mismatch", "target-set-mismatch", "target-locator-mismatch", "theme-mismatch", "theme-unassessed", "authenticated-state-mismatch", "authenticated-state-unassessed", "application-state-mismatch", "application-state-unassessed"];
|
|
77
|
+
export type ComparabilityReasonCode = (typeof COMPARABILITY_REASON_CODES)[number];
|
|
78
|
+
export type ComparabilityReasonSeverity = 'blocking' | 'warning' | 'unassessed';
|
|
79
|
+
/**
|
|
80
|
+
* v0.7 Prompt 4 additions: `viewport-unassessed` (a reference need not
|
|
81
|
+
* declare an applicable viewport - see externalReferenceApplicability.ts -
|
|
82
|
+
* whereas an ObservationArtifact's viewport is always present, so v0.4's own
|
|
83
|
+
* comparability never needed this variant before), `theme-mismatch`,
|
|
84
|
+
* `authenticated-state-mismatch`, `application-state-mismatch` (blocking -
|
|
85
|
+
* these three dimensions are now assessed, not merely unassessed, whenever
|
|
86
|
+
* explicit state is present on both sides being compared - see
|
|
87
|
+
* comparisonEngine.ts#assessOptionalComparabilityDimension). The
|
|
88
|
+
* corresponding `-unassessed` variants are unchanged and still apply
|
|
89
|
+
* whenever explicit state is missing from either side.
|
|
90
|
+
*/
|
|
91
|
+
export declare const COMPARABILITY_REASON_SEVERITY: Record<ComparabilityReasonCode, ComparabilityReasonSeverity>;
|
|
92
|
+
export interface ComparabilityReason {
|
|
93
|
+
code: ComparabilityReasonCode;
|
|
94
|
+
severity: ComparabilityReasonSeverity;
|
|
95
|
+
message: string;
|
|
96
|
+
/**
|
|
97
|
+
* v0.7 Prompt 4 addition (additive, optional - existing v0.4
|
|
98
|
+
* before/after-observation reasons never set these; they already embed
|
|
99
|
+
* both values in `message`). Used by reference/candidate compatibility
|
|
100
|
+
* reasons (externalReferenceCompatibility.ts) to expose the two compared
|
|
101
|
+
* values structurally, not just as prose - e.g. `"one-dark"`/`"one-light"`
|
|
102
|
+
* for a theme mismatch, or `"480x620"` for a viewport dimension.
|
|
103
|
+
*/
|
|
104
|
+
referenceValue?: string;
|
|
105
|
+
candidateValue?: string;
|
|
106
|
+
}
|
|
107
|
+
export interface ComparabilityResult {
|
|
108
|
+
state: ComparabilityState;
|
|
109
|
+
reasons: ComparabilityReason[];
|
|
110
|
+
}
|
|
111
|
+
/** `incomparable` requires at least one `blocking` reason; a `blocking` reason forces `incomparable` - the two invariants are enforced together. */
|
|
112
|
+
export declare function isValidComparabilityResult(value: unknown): value is ComparabilityResult;
|
|
113
|
+
export declare const TARGET_CONFIGURATION_CHANGE_KINDS: readonly ["added", "removed", "locator-changed"];
|
|
114
|
+
export type TargetConfigurationChangeKind = (typeof TARGET_CONFIGURATION_CHANGE_KINDS)[number];
|
|
115
|
+
export interface TargetConfigurationChange {
|
|
116
|
+
kind: TargetConfigurationChangeKind;
|
|
117
|
+
target: string;
|
|
118
|
+
}
|
|
119
|
+
export declare function isValidTargetConfigurationChange(value: unknown): value is TargetConfigurationChange;
|
|
120
|
+
export declare const DIFFERENCE_KINDS: readonly ["appeared", "disappeared", "moved", "resized", "visibility-changed", "clipping-changed", "containment-changed", "horizontal-overflow-changed", "vertical-overflow-changed", "page-size-changed", "scroll-owner-changed", "relative-position-changed", "relationship-changed"];
|
|
121
|
+
export type DifferenceKind = (typeof DIFFERENCE_KINDS)[number];
|
|
122
|
+
export type ComparisonDifferenceSubject = {
|
|
123
|
+
type: 'target';
|
|
124
|
+
target: string;
|
|
125
|
+
} | {
|
|
126
|
+
type: 'relationship';
|
|
127
|
+
kind: PairwiseRelationshipKind | PageLevelRelationshipKind;
|
|
128
|
+
subjectTarget?: string;
|
|
129
|
+
relatedTarget?: string;
|
|
130
|
+
} | {
|
|
131
|
+
type: 'page';
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Bounded structured difference record - never prose-only, never a
|
|
135
|
+
* severity/pass-fail score (there is no severity model yet). `before`/
|
|
136
|
+
* `after`/`delta` are intentionally untyped here: their shape depends on
|
|
137
|
+
* `kind` (e.g. numeric geometry for `moved`/`resized`, boolean for
|
|
138
|
+
* `visibility-changed`) and is validated at the point of construction by
|
|
139
|
+
* whichever batch actually produces these records.
|
|
140
|
+
*/
|
|
141
|
+
export interface ComparisonDifference {
|
|
142
|
+
kind: DifferenceKind;
|
|
143
|
+
subject: ComparisonDifferenceSubject;
|
|
144
|
+
before: unknown;
|
|
145
|
+
after: unknown;
|
|
146
|
+
delta?: unknown;
|
|
147
|
+
classification: string;
|
|
148
|
+
beforeObservationId: string;
|
|
149
|
+
afterObservationId: string;
|
|
150
|
+
evidence: EvidenceReference[];
|
|
151
|
+
}
|
|
152
|
+
export declare function isValidComparisonDifference(value: unknown): value is ComparisonDifference;
|
|
153
|
+
/** One before/after transition of a single derived relationship - distinct from `ComparisonDifference` so the relationship graph's own vocabulary stays authoritative. `'unavailable'` covers a pair/page relationship that could not be evaluated on one side. */
|
|
154
|
+
export interface RelationshipChangeRecord {
|
|
155
|
+
scope: 'pairwise' | 'page';
|
|
156
|
+
kind: PairwiseRelationshipKind | PageLevelRelationshipKind;
|
|
157
|
+
subjectTarget?: string;
|
|
158
|
+
relatedTarget?: string;
|
|
159
|
+
before: PairwiseRelationshipKind | PageLevelRelationshipKind | 'unavailable';
|
|
160
|
+
after: PairwiseRelationshipKind | PageLevelRelationshipKind | 'unavailable';
|
|
161
|
+
beforeObservationId: string;
|
|
162
|
+
afterObservationId: string;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Enough logical identity to trace a comparison back to its authoritative
|
|
166
|
+
* source observations without embedding the full ObservationArtifact,
|
|
167
|
+
* copying screenshot bytes, or persisting a filesystem path as semantic
|
|
168
|
+
* identity.
|
|
169
|
+
*/
|
|
170
|
+
export interface ComparisonSourceObservationReference {
|
|
171
|
+
observationId: string;
|
|
172
|
+
requestId: string;
|
|
173
|
+
producer: {
|
|
174
|
+
name: typeof PRODUCER_NAME;
|
|
175
|
+
version: string;
|
|
176
|
+
};
|
|
177
|
+
observationSchemaVersion: typeof OBSERVATION_SCHEMA_VERSION;
|
|
178
|
+
screenshot: {
|
|
179
|
+
path: string;
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
export declare function isValidComparisonSourceObservationReference(value: unknown): value is ComparisonSourceObservationReference;
|
|
183
|
+
/** Comparison is ordered: `before`/`after` are distinct fields (never a swappable pair) so `compare(A, B) !== compare(B, A)` for both identity and difference direction. */
|
|
184
|
+
export interface ComparisonArtifact {
|
|
185
|
+
artifactKind: typeof COMPARISON_ARTIFACT_KIND;
|
|
186
|
+
schemaVersion: typeof COMPARISON_SCHEMA_VERSION;
|
|
187
|
+
comparisonId: string;
|
|
188
|
+
comparisonRequestId: string;
|
|
189
|
+
producer: {
|
|
190
|
+
name: typeof PRODUCER_NAME;
|
|
191
|
+
version: string;
|
|
192
|
+
};
|
|
193
|
+
provenance: {
|
|
194
|
+
comparedAt: string;
|
|
195
|
+
};
|
|
196
|
+
before: ComparisonSourceObservationReference;
|
|
197
|
+
after: ComparisonSourceObservationReference;
|
|
198
|
+
config: ComparisonConfig;
|
|
199
|
+
comparability: ComparabilityResult;
|
|
200
|
+
configurationChanges: TargetConfigurationChange[];
|
|
201
|
+
relationshipsBefore: LayoutRelationshipGraph;
|
|
202
|
+
relationshipsAfter: LayoutRelationshipGraph;
|
|
203
|
+
differences: ComparisonDifference[];
|
|
204
|
+
relationshipChanges: RelationshipChangeRecord[];
|
|
205
|
+
expectedDependencyEvidence: ExpectedDependencyEvidence[];
|
|
206
|
+
diagnostics: Diagnostic[];
|
|
207
|
+
limits: {
|
|
208
|
+
truncated: boolean;
|
|
209
|
+
omittedFields: string[];
|
|
210
|
+
omittedTargetPairs: string[];
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export type ComparisonSchemaValidationResult = {
|
|
214
|
+
valid: true;
|
|
215
|
+
} | {
|
|
216
|
+
valid: false;
|
|
217
|
+
reason: string;
|
|
218
|
+
};
|
|
219
|
+
/** Structural validator for the frozen ComparisonArtifact contract. Never delegates to `isValidObservationArtifact` - comparison and observation are different artifact kinds/schemas. */
|
|
220
|
+
export declare function isValidComparisonArtifact(value: unknown): ComparisonSchemaValidationResult;
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v0.4 Batch 1 comparison contract. Frozen here as pure
|
|
3
|
+
* types/constants/structural validators only - comparison is downstream of
|
|
4
|
+
* observation (real Chromium -> ObservationArtifact -> relationship
|
|
5
|
+
* derivation -> comparability analysis -> comparison -> ComparisonArtifact,
|
|
6
|
+
* see docs/ARCHITECTURE.md) and this batch implements neither relationship
|
|
7
|
+
* derivation, real comparison, nor persistence. Batch 2 owns relationship
|
|
8
|
+
* derivation; Batch 3 owns `compareObservations()` and comparison
|
|
9
|
+
* persistence; Batch 4 owns CLI exposure.
|
|
10
|
+
*
|
|
11
|
+
* Comparison and observation are different evidence products: this module
|
|
12
|
+
* never reuses `ARTIFACT_KIND`/`SCHEMA_VERSION` from `./schema.js`, and
|
|
13
|
+
* `isValidComparisonArtifact` never delegates to `isValidObservationArtifact`.
|
|
14
|
+
*/
|
|
15
|
+
import { PRODUCER_NAME, SCHEMA_VERSION as OBSERVATION_SCHEMA_VERSION } from './schema.js';
|
|
16
|
+
import { DIAGNOSTIC_CODES, DIAGNOSTIC_SEVERITY } from './diagnostics.js';
|
|
17
|
+
import { PAGE_LEVEL_RELATIONSHIP_KINDS, PAIRWISE_RELATIONSHIP_KINDS, isValidEvidenceReference, isValidLayoutRelationshipGraph, isValidGeometryTolerancePx, } from './relationships.js';
|
|
18
|
+
function isPlainObject(value) {
|
|
19
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
20
|
+
}
|
|
21
|
+
function isEvidenceReferenceArray(value) {
|
|
22
|
+
return Array.isArray(value) && value.every((entry) => isValidEvidenceReference(entry));
|
|
23
|
+
}
|
|
24
|
+
export const COMPARISON_ARTIFACT_KIND = 'my-frontend-observer/comparison';
|
|
25
|
+
export const COMPARISON_SCHEMA_VERSION = '1.0.0';
|
|
26
|
+
/**
|
|
27
|
+
* Geometry tolerance is owned by domain/relationships.ts (the relationship
|
|
28
|
+
* derivation engine needs it directly, and that module must not import this
|
|
29
|
+
* one back - relationships.ts is the lower-level module). Re-exported here
|
|
30
|
+
* unchanged so every pre-Batch-2 consumer of these names from
|
|
31
|
+
* domain/comparison.ts keeps working.
|
|
32
|
+
*/
|
|
33
|
+
export { GEOMETRY_TOLERANCE_DEFAULT_PX, GEOMETRY_TOLERANCE_MIN_PX, GEOMETRY_TOLERANCE_MAX_PX, isValidGeometryTolerancePx } from './relationships.js';
|
|
34
|
+
// --- Expected dependency declarations (explicit, non-causal) ---------------
|
|
35
|
+
export const DEPENDENCY_PROPERTIES = ['x', 'y', 'width', 'height'];
|
|
36
|
+
export const DEPENDENCY_DIRECTIONS = ['increase', 'decrease', 'change', 'unchanged'];
|
|
37
|
+
/** The observer never generates a dependency declaration from co-change; every declaration must explicitly identify that it was supplied externally. */
|
|
38
|
+
export const EXPECTED_DEPENDENCY_SOURCES = ['explicit-config'];
|
|
39
|
+
const DEPENDENCY_TARGET_NAME_RE = /^[A-Za-z0-9_-]{1,64}$/;
|
|
40
|
+
function isValidDependencyTermDeclaration(value) {
|
|
41
|
+
if (!isPlainObject(value))
|
|
42
|
+
return false;
|
|
43
|
+
if (typeof value.target !== 'string' || !DEPENDENCY_TARGET_NAME_RE.test(value.target))
|
|
44
|
+
return false;
|
|
45
|
+
if (typeof value.property !== 'string' || !DEPENDENCY_PROPERTIES.includes(value.property))
|
|
46
|
+
return false;
|
|
47
|
+
return typeof value.direction === 'string' && DEPENDENCY_DIRECTIONS.includes(value.direction);
|
|
48
|
+
}
|
|
49
|
+
export function isValidExpectedDependencyDeclaration(value) {
|
|
50
|
+
if (!isPlainObject(value))
|
|
51
|
+
return false;
|
|
52
|
+
if (!isValidDependencyTermDeclaration(value.cause) || !isValidDependencyTermDeclaration(value.effect))
|
|
53
|
+
return false;
|
|
54
|
+
return typeof value.source === 'string' && EXPECTED_DEPENDENCY_SOURCES.includes(value.source);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Non-causal evaluation outcomes only - describes the relationship between a
|
|
58
|
+
* declared expectation and observed differences, never an implementation
|
|
59
|
+
* verdict (no PASS/FAIL/approved/regression/allowed/protected vocabulary).
|
|
60
|
+
*/
|
|
61
|
+
export const DEPENDENCY_EVIDENCE_OUTCOMES = ['consistent', 'not-observed', 'contradictory-to-declaration', 'unavailable'];
|
|
62
|
+
export function isValidExpectedDependencyEvidence(value) {
|
|
63
|
+
if (!isPlainObject(value))
|
|
64
|
+
return false;
|
|
65
|
+
if (!isValidExpectedDependencyDeclaration(value.declaration))
|
|
66
|
+
return false;
|
|
67
|
+
if (typeof value.outcome !== 'string' || !DEPENDENCY_EVIDENCE_OUTCOMES.includes(value.outcome))
|
|
68
|
+
return false;
|
|
69
|
+
return isEvidenceReferenceArray(value.supportingEvidence);
|
|
70
|
+
}
|
|
71
|
+
const COMPARISON_CONFIG_KEYS = ['geometryTolerancePx', 'expectedDependencies'];
|
|
72
|
+
export function isValidComparisonConfig(value) {
|
|
73
|
+
if (!isPlainObject(value))
|
|
74
|
+
return false;
|
|
75
|
+
if (!Object.keys(value).every((key) => COMPARISON_CONFIG_KEYS.includes(key)))
|
|
76
|
+
return false;
|
|
77
|
+
if (!isValidGeometryTolerancePx(value.geometryTolerancePx))
|
|
78
|
+
return false;
|
|
79
|
+
if ('expectedDependencies' in value && value.expectedDependencies !== undefined) {
|
|
80
|
+
if (!Array.isArray(value.expectedDependencies) || !value.expectedDependencies.every((d) => isValidExpectedDependencyDeclaration(d))) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
// --- Comparability -----------------------------------------------------------
|
|
87
|
+
export const COMPARABILITY_STATES = ['comparable', 'comparable-with-warnings', 'incomparable'];
|
|
88
|
+
/**
|
|
89
|
+
* Hard-incompatibility reason codes are `blocking` (force `incomparable`
|
|
90
|
+
* unless the repository can prove a dimension cannot be evaluated
|
|
91
|
+
* reliably); warning-only differences are `warning` (do not by themselves
|
|
92
|
+
* prevent useful page-level comparison); dimensions the observer does not
|
|
93
|
+
* yet model (theme/authenticated-state/application-state identity) are
|
|
94
|
+
* `unassessed` and never claimed identical without evidence.
|
|
95
|
+
*/
|
|
96
|
+
export const COMPARABILITY_REASON_CODES = [
|
|
97
|
+
'artifact-kind-mismatch',
|
|
98
|
+
'schema-version-mismatch',
|
|
99
|
+
'page-url-mismatch',
|
|
100
|
+
'viewport-mismatch',
|
|
101
|
+
'viewport-unassessed',
|
|
102
|
+
'scroll-scenario-mismatch',
|
|
103
|
+
'browser-engine-mismatch',
|
|
104
|
+
'producer-version-mismatch',
|
|
105
|
+
'browser-version-mismatch',
|
|
106
|
+
'target-set-mismatch',
|
|
107
|
+
'target-locator-mismatch',
|
|
108
|
+
'theme-mismatch',
|
|
109
|
+
'theme-unassessed',
|
|
110
|
+
'authenticated-state-mismatch',
|
|
111
|
+
'authenticated-state-unassessed',
|
|
112
|
+
'application-state-mismatch',
|
|
113
|
+
'application-state-unassessed',
|
|
114
|
+
];
|
|
115
|
+
/**
|
|
116
|
+
* v0.7 Prompt 4 additions: `viewport-unassessed` (a reference need not
|
|
117
|
+
* declare an applicable viewport - see externalReferenceApplicability.ts -
|
|
118
|
+
* whereas an ObservationArtifact's viewport is always present, so v0.4's own
|
|
119
|
+
* comparability never needed this variant before), `theme-mismatch`,
|
|
120
|
+
* `authenticated-state-mismatch`, `application-state-mismatch` (blocking -
|
|
121
|
+
* these three dimensions are now assessed, not merely unassessed, whenever
|
|
122
|
+
* explicit state is present on both sides being compared - see
|
|
123
|
+
* comparisonEngine.ts#assessOptionalComparabilityDimension). The
|
|
124
|
+
* corresponding `-unassessed` variants are unchanged and still apply
|
|
125
|
+
* whenever explicit state is missing from either side.
|
|
126
|
+
*/
|
|
127
|
+
export const COMPARABILITY_REASON_SEVERITY = {
|
|
128
|
+
'artifact-kind-mismatch': 'blocking',
|
|
129
|
+
'schema-version-mismatch': 'blocking',
|
|
130
|
+
'page-url-mismatch': 'blocking',
|
|
131
|
+
'viewport-mismatch': 'blocking',
|
|
132
|
+
'viewport-unassessed': 'unassessed',
|
|
133
|
+
'scroll-scenario-mismatch': 'blocking',
|
|
134
|
+
'browser-engine-mismatch': 'blocking',
|
|
135
|
+
'producer-version-mismatch': 'warning',
|
|
136
|
+
'browser-version-mismatch': 'warning',
|
|
137
|
+
'target-set-mismatch': 'warning',
|
|
138
|
+
'target-locator-mismatch': 'warning',
|
|
139
|
+
'theme-mismatch': 'blocking',
|
|
140
|
+
'theme-unassessed': 'unassessed',
|
|
141
|
+
'authenticated-state-mismatch': 'blocking',
|
|
142
|
+
'authenticated-state-unassessed': 'unassessed',
|
|
143
|
+
'application-state-mismatch': 'blocking',
|
|
144
|
+
'application-state-unassessed': 'unassessed',
|
|
145
|
+
};
|
|
146
|
+
function isValidComparabilityReason(value) {
|
|
147
|
+
if (!isPlainObject(value))
|
|
148
|
+
return false;
|
|
149
|
+
const code = value.code;
|
|
150
|
+
if (typeof code !== 'string' || !COMPARABILITY_REASON_CODES.includes(code))
|
|
151
|
+
return false;
|
|
152
|
+
if (value.severity !== COMPARABILITY_REASON_SEVERITY[code])
|
|
153
|
+
return false;
|
|
154
|
+
if (typeof value.message !== 'string')
|
|
155
|
+
return false;
|
|
156
|
+
if ('referenceValue' in value && value.referenceValue !== undefined && typeof value.referenceValue !== 'string')
|
|
157
|
+
return false;
|
|
158
|
+
if ('candidateValue' in value && value.candidateValue !== undefined && typeof value.candidateValue !== 'string')
|
|
159
|
+
return false;
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
/** `incomparable` requires at least one `blocking` reason; a `blocking` reason forces `incomparable` - the two invariants are enforced together. */
|
|
163
|
+
export function isValidComparabilityResult(value) {
|
|
164
|
+
if (!isPlainObject(value))
|
|
165
|
+
return false;
|
|
166
|
+
if (typeof value.state !== 'string' || !COMPARABILITY_STATES.includes(value.state))
|
|
167
|
+
return false;
|
|
168
|
+
if (!Array.isArray(value.reasons) || !value.reasons.every((r) => isValidComparabilityReason(r)))
|
|
169
|
+
return false;
|
|
170
|
+
const reasons = value.reasons;
|
|
171
|
+
const hasBlocking = reasons.some((r) => r.severity === 'blocking');
|
|
172
|
+
if (value.state === 'incomparable' && !hasBlocking)
|
|
173
|
+
return false;
|
|
174
|
+
if (value.state !== 'incomparable' && hasBlocking)
|
|
175
|
+
return false;
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
// --- Target-configuration change (never conflated with appeared/disappeared) --
|
|
179
|
+
export const TARGET_CONFIGURATION_CHANGE_KINDS = ['added', 'removed', 'locator-changed'];
|
|
180
|
+
export function isValidTargetConfigurationChange(value) {
|
|
181
|
+
if (!isPlainObject(value))
|
|
182
|
+
return false;
|
|
183
|
+
if (typeof value.kind !== 'string' || !TARGET_CONFIGURATION_CHANGE_KINDS.includes(value.kind))
|
|
184
|
+
return false;
|
|
185
|
+
return typeof value.target === 'string' && value.target.length > 0;
|
|
186
|
+
}
|
|
187
|
+
// --- Difference vocabulary ---------------------------------------------------
|
|
188
|
+
export const DIFFERENCE_KINDS = [
|
|
189
|
+
'appeared',
|
|
190
|
+
'disappeared',
|
|
191
|
+
'moved',
|
|
192
|
+
'resized',
|
|
193
|
+
'visibility-changed',
|
|
194
|
+
'clipping-changed',
|
|
195
|
+
'containment-changed',
|
|
196
|
+
'horizontal-overflow-changed',
|
|
197
|
+
'vertical-overflow-changed',
|
|
198
|
+
'page-size-changed',
|
|
199
|
+
'scroll-owner-changed',
|
|
200
|
+
'relative-position-changed',
|
|
201
|
+
'relationship-changed',
|
|
202
|
+
];
|
|
203
|
+
function isValidComparisonDifferenceSubject(value) {
|
|
204
|
+
if (!isPlainObject(value))
|
|
205
|
+
return false;
|
|
206
|
+
if (value.type === 'target')
|
|
207
|
+
return typeof value.target === 'string' && value.target.length > 0;
|
|
208
|
+
if (value.type === 'page')
|
|
209
|
+
return Object.keys(value).length === 1;
|
|
210
|
+
if (value.type === 'relationship') {
|
|
211
|
+
const allKinds = [...PAIRWISE_RELATIONSHIP_KINDS, ...PAGE_LEVEL_RELATIONSHIP_KINDS];
|
|
212
|
+
if (typeof value.kind !== 'string' || !allKinds.includes(value.kind))
|
|
213
|
+
return false;
|
|
214
|
+
if ('subjectTarget' in value && value.subjectTarget !== undefined && typeof value.subjectTarget !== 'string')
|
|
215
|
+
return false;
|
|
216
|
+
if ('relatedTarget' in value && value.relatedTarget !== undefined && typeof value.relatedTarget !== 'string')
|
|
217
|
+
return false;
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
export function isValidComparisonDifference(value) {
|
|
223
|
+
if (!isPlainObject(value))
|
|
224
|
+
return false;
|
|
225
|
+
if (typeof value.kind !== 'string' || !DIFFERENCE_KINDS.includes(value.kind))
|
|
226
|
+
return false;
|
|
227
|
+
if (!isValidComparisonDifferenceSubject(value.subject))
|
|
228
|
+
return false;
|
|
229
|
+
if (!('before' in value) || !('after' in value))
|
|
230
|
+
return false;
|
|
231
|
+
if (typeof value.classification !== 'string' || value.classification.length === 0)
|
|
232
|
+
return false;
|
|
233
|
+
if (typeof value.beforeObservationId !== 'string' || value.beforeObservationId.length === 0)
|
|
234
|
+
return false;
|
|
235
|
+
if (typeof value.afterObservationId !== 'string' || value.afterObservationId.length === 0)
|
|
236
|
+
return false;
|
|
237
|
+
return isEvidenceReferenceArray(value.evidence);
|
|
238
|
+
}
|
|
239
|
+
function isValidRelationshipChangeRecord(value) {
|
|
240
|
+
if (!isPlainObject(value))
|
|
241
|
+
return false;
|
|
242
|
+
if (value.scope !== 'pairwise' && value.scope !== 'page')
|
|
243
|
+
return false;
|
|
244
|
+
const allKinds = [...PAIRWISE_RELATIONSHIP_KINDS, ...PAGE_LEVEL_RELATIONSHIP_KINDS];
|
|
245
|
+
const allValues = [...allKinds, 'unavailable'];
|
|
246
|
+
if (typeof value.kind !== 'string' || !allKinds.includes(value.kind))
|
|
247
|
+
return false;
|
|
248
|
+
if (value.scope === 'pairwise') {
|
|
249
|
+
if (typeof value.subjectTarget !== 'string' || value.subjectTarget.length === 0)
|
|
250
|
+
return false;
|
|
251
|
+
if (typeof value.relatedTarget !== 'string' || value.relatedTarget.length === 0)
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
else if ('subjectTarget' in value || 'relatedTarget' in value) {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
if (typeof value.before !== 'string' || !allValues.includes(value.before))
|
|
258
|
+
return false;
|
|
259
|
+
if (typeof value.after !== 'string' || !allValues.includes(value.after))
|
|
260
|
+
return false;
|
|
261
|
+
if (typeof value.beforeObservationId !== 'string' || value.beforeObservationId.length === 0)
|
|
262
|
+
return false;
|
|
263
|
+
return typeof value.afterObservationId === 'string' && value.afterObservationId.length > 0;
|
|
264
|
+
}
|
|
265
|
+
export function isValidComparisonSourceObservationReference(value) {
|
|
266
|
+
if (!isPlainObject(value))
|
|
267
|
+
return false;
|
|
268
|
+
if (typeof value.observationId !== 'string' || value.observationId.length === 0)
|
|
269
|
+
return false;
|
|
270
|
+
if (typeof value.requestId !== 'string' || value.requestId.length === 0)
|
|
271
|
+
return false;
|
|
272
|
+
if (!isPlainObject(value.producer) || value.producer.name !== PRODUCER_NAME || typeof value.producer.version !== 'string' || value.producer.version.length === 0) {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
if (value.observationSchemaVersion !== OBSERVATION_SCHEMA_VERSION)
|
|
276
|
+
return false;
|
|
277
|
+
return isPlainObject(value.screenshot) && typeof value.screenshot.path === 'string' && value.screenshot.path.length > 0;
|
|
278
|
+
}
|
|
279
|
+
function isValidDiagnostic(value) {
|
|
280
|
+
if (!isPlainObject(value))
|
|
281
|
+
return false;
|
|
282
|
+
const code = value.code;
|
|
283
|
+
if (typeof code !== 'string' || !DIAGNOSTIC_CODES.includes(code))
|
|
284
|
+
return false;
|
|
285
|
+
if (value.severity !== DIAGNOSTIC_SEVERITY[code])
|
|
286
|
+
return false;
|
|
287
|
+
if (typeof value.message !== 'string')
|
|
288
|
+
return false;
|
|
289
|
+
if ('targetName' in value && value.targetName !== undefined && typeof value.targetName !== 'string')
|
|
290
|
+
return false;
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
/** Structural validator for the frozen ComparisonArtifact contract. Never delegates to `isValidObservationArtifact` - comparison and observation are different artifact kinds/schemas. */
|
|
294
|
+
export function isValidComparisonArtifact(value) {
|
|
295
|
+
if (!isPlainObject(value))
|
|
296
|
+
return { valid: false, reason: 'artifact must be an object' };
|
|
297
|
+
if (value.artifactKind !== COMPARISON_ARTIFACT_KIND)
|
|
298
|
+
return { valid: false, reason: 'artifactKind mismatch' };
|
|
299
|
+
if (value.schemaVersion !== COMPARISON_SCHEMA_VERSION)
|
|
300
|
+
return { valid: false, reason: 'schemaVersion mismatch' };
|
|
301
|
+
if (typeof value.comparisonId !== 'string' || value.comparisonId.length === 0)
|
|
302
|
+
return { valid: false, reason: 'comparisonId must be a non-empty string' };
|
|
303
|
+
if (typeof value.comparisonRequestId !== 'string' || value.comparisonRequestId.length === 0) {
|
|
304
|
+
return { valid: false, reason: 'comparisonRequestId must be a non-empty string' };
|
|
305
|
+
}
|
|
306
|
+
if (!isPlainObject(value.producer) || value.producer.name !== PRODUCER_NAME || typeof value.producer.version !== 'string' || value.producer.version.length === 0) {
|
|
307
|
+
return { valid: false, reason: 'producer must be { name: "my-frontend-observer", version: string }' };
|
|
308
|
+
}
|
|
309
|
+
if (!isPlainObject(value.provenance) || typeof value.provenance.comparedAt !== 'string' || value.provenance.comparedAt.length === 0) {
|
|
310
|
+
return { valid: false, reason: 'provenance.comparedAt must be a non-empty string' };
|
|
311
|
+
}
|
|
312
|
+
if (!isValidComparisonSourceObservationReference(value.before))
|
|
313
|
+
return { valid: false, reason: 'before source observation reference is invalid' };
|
|
314
|
+
if (!isValidComparisonSourceObservationReference(value.after))
|
|
315
|
+
return { valid: false, reason: 'after source observation reference is invalid' };
|
|
316
|
+
if (!isValidComparisonConfig(value.config))
|
|
317
|
+
return { valid: false, reason: 'config is invalid' };
|
|
318
|
+
if (!isValidComparabilityResult(value.comparability))
|
|
319
|
+
return { valid: false, reason: 'comparability is invalid' };
|
|
320
|
+
if (!Array.isArray(value.configurationChanges) || !value.configurationChanges.every((c) => isValidTargetConfigurationChange(c))) {
|
|
321
|
+
return { valid: false, reason: 'configurationChanges must be an array of valid TargetConfigurationChange values' };
|
|
322
|
+
}
|
|
323
|
+
if (!isValidLayoutRelationshipGraph(value.relationshipsBefore))
|
|
324
|
+
return { valid: false, reason: 'relationshipsBefore is invalid' };
|
|
325
|
+
if (!isValidLayoutRelationshipGraph(value.relationshipsAfter))
|
|
326
|
+
return { valid: false, reason: 'relationshipsAfter is invalid' };
|
|
327
|
+
if (!Array.isArray(value.differences) || !value.differences.every((d) => isValidComparisonDifference(d))) {
|
|
328
|
+
return { valid: false, reason: 'differences must be an array of valid ComparisonDifference values' };
|
|
329
|
+
}
|
|
330
|
+
if (!Array.isArray(value.relationshipChanges) || !value.relationshipChanges.every((r) => isValidRelationshipChangeRecord(r))) {
|
|
331
|
+
return { valid: false, reason: 'relationshipChanges must be an array of valid RelationshipChangeRecord values' };
|
|
332
|
+
}
|
|
333
|
+
if (!Array.isArray(value.expectedDependencyEvidence) || !value.expectedDependencyEvidence.every((e) => isValidExpectedDependencyEvidence(e))) {
|
|
334
|
+
return { valid: false, reason: 'expectedDependencyEvidence must be an array of valid ExpectedDependencyEvidence values' };
|
|
335
|
+
}
|
|
336
|
+
if (!Array.isArray(value.diagnostics) || !value.diagnostics.every((d) => isValidDiagnostic(d))) {
|
|
337
|
+
return { valid: false, reason: 'diagnostics must be an array of valid Diagnostic values' };
|
|
338
|
+
}
|
|
339
|
+
const limits = value.limits;
|
|
340
|
+
if (!isPlainObject(limits) ||
|
|
341
|
+
typeof limits.truncated !== 'boolean' ||
|
|
342
|
+
!Array.isArray(limits.omittedFields) ||
|
|
343
|
+
!limits.omittedFields.every((f) => typeof f === 'string') ||
|
|
344
|
+
!Array.isArray(limits.omittedTargetPairs) ||
|
|
345
|
+
!limits.omittedTargetPairs.every((f) => typeof f === 'string')) {
|
|
346
|
+
return { valid: false, reason: 'limits must be { truncated: boolean; omittedFields: string[]; omittedTargetPairs: string[] }' };
|
|
347
|
+
}
|
|
348
|
+
return { valid: true };
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=comparison.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparison.js","sourceRoot":"","sources":["../../src/domain/comparison.ts"],"names":[],"mappings":"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"}
|