my-frontend-observer 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +102 -0
- package/README.md +51 -13
- 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/observationPersistence.js +1 -0
- package/dist/application/observationPersistence.js.map +1 -1
- 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/comparisonArtifactWriter.d.ts +41 -0
- package/dist/artifacts/comparisonArtifactWriter.js +67 -0
- package/dist/artifacts/comparisonArtifactWriter.js.map +1 -0
- package/dist/browser/chromiumAdapter.js +58 -4
- package/dist/browser/chromiumAdapter.js.map +1 -1
- package/dist/browser/evidenceCapture.d.ts +29 -2
- package/dist/browser/evidenceCapture.js +43 -19
- package/dist/browser/evidenceCapture.js.map +1 -1
- 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 +3 -1
- package/dist/cli.js +299 -2
- package/dist/cli.js.map +1 -1
- package/dist/domain/comparison.d.ts +198 -0
- package/dist/domain/comparison.js +324 -0
- package/dist/domain/comparison.js.map +1 -0
- package/dist/domain/comparisonEngine.d.ts +48 -0
- package/dist/domain/comparisonEngine.js +694 -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/evidence.d.ts +2 -0
- package/dist/domain/evidence.js +4 -0
- package/dist/domain/evidence.js.map +1 -1
- package/dist/domain/identity.d.ts +8 -3
- package/dist/domain/identity.js +9 -3
- package/dist/domain/identity.js.map +1 -1
- package/dist/domain/relationships.d.ts +168 -0
- package/dist/domain/relationships.js +343 -0
- package/dist/domain/relationships.js.map +1 -0
- package/dist/domain/schema.d.ts +116 -2
- package/dist/domain/schema.js +186 -2
- package/dist/domain/schema.js.map +1 -1
- 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 +17 -4
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/request/request.d.ts +29 -0
- package/dist/request/request.js +108 -0
- package/dist/request/request.js.map +1 -1
- package/docs/ARCHITECTURE.md +110 -4
- package/docs/CI_CD.md +62 -6
- package/docs/COMMANDS.md +247 -6
- package/docs/CONTRACTS.md +172 -7
- package/docs/CURRENT_STATE.md +148 -10
- package/docs/DEVELOPMENT.md +52 -12
- package/docs/PROJECT_OVERVIEW.md +18 -11
- package/docs/QUICKSTART.md +7 -1
- package/docs/RELEASE.md +14 -7
- package/docs/ROADMAP.md +9 -0
- package/docs/SECURITY.md +14 -1
- package/docs/WORKFLOWS.md +90 -22
- package/package.json +1 -1
|
@@ -0,0 +1,324 @@
|
|
|
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
|
+
'scroll-scenario-mismatch',
|
|
102
|
+
'browser-engine-mismatch',
|
|
103
|
+
'producer-version-mismatch',
|
|
104
|
+
'browser-version-mismatch',
|
|
105
|
+
'target-set-mismatch',
|
|
106
|
+
'target-locator-mismatch',
|
|
107
|
+
'theme-unassessed',
|
|
108
|
+
'authenticated-state-unassessed',
|
|
109
|
+
'application-state-unassessed',
|
|
110
|
+
];
|
|
111
|
+
export const COMPARABILITY_REASON_SEVERITY = {
|
|
112
|
+
'artifact-kind-mismatch': 'blocking',
|
|
113
|
+
'schema-version-mismatch': 'blocking',
|
|
114
|
+
'page-url-mismatch': 'blocking',
|
|
115
|
+
'viewport-mismatch': 'blocking',
|
|
116
|
+
'scroll-scenario-mismatch': 'blocking',
|
|
117
|
+
'browser-engine-mismatch': 'blocking',
|
|
118
|
+
'producer-version-mismatch': 'warning',
|
|
119
|
+
'browser-version-mismatch': 'warning',
|
|
120
|
+
'target-set-mismatch': 'warning',
|
|
121
|
+
'target-locator-mismatch': 'warning',
|
|
122
|
+
'theme-unassessed': 'unassessed',
|
|
123
|
+
'authenticated-state-unassessed': 'unassessed',
|
|
124
|
+
'application-state-unassessed': 'unassessed',
|
|
125
|
+
};
|
|
126
|
+
function isValidComparabilityReason(value) {
|
|
127
|
+
if (!isPlainObject(value))
|
|
128
|
+
return false;
|
|
129
|
+
const code = value.code;
|
|
130
|
+
if (typeof code !== 'string' || !COMPARABILITY_REASON_CODES.includes(code))
|
|
131
|
+
return false;
|
|
132
|
+
if (value.severity !== COMPARABILITY_REASON_SEVERITY[code])
|
|
133
|
+
return false;
|
|
134
|
+
return typeof value.message === 'string';
|
|
135
|
+
}
|
|
136
|
+
/** `incomparable` requires at least one `blocking` reason; a `blocking` reason forces `incomparable` - the two invariants are enforced together. */
|
|
137
|
+
export function isValidComparabilityResult(value) {
|
|
138
|
+
if (!isPlainObject(value))
|
|
139
|
+
return false;
|
|
140
|
+
if (typeof value.state !== 'string' || !COMPARABILITY_STATES.includes(value.state))
|
|
141
|
+
return false;
|
|
142
|
+
if (!Array.isArray(value.reasons) || !value.reasons.every((r) => isValidComparabilityReason(r)))
|
|
143
|
+
return false;
|
|
144
|
+
const reasons = value.reasons;
|
|
145
|
+
const hasBlocking = reasons.some((r) => r.severity === 'blocking');
|
|
146
|
+
if (value.state === 'incomparable' && !hasBlocking)
|
|
147
|
+
return false;
|
|
148
|
+
if (value.state !== 'incomparable' && hasBlocking)
|
|
149
|
+
return false;
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
// --- Target-configuration change (never conflated with appeared/disappeared) --
|
|
153
|
+
export const TARGET_CONFIGURATION_CHANGE_KINDS = ['added', 'removed', 'locator-changed'];
|
|
154
|
+
export function isValidTargetConfigurationChange(value) {
|
|
155
|
+
if (!isPlainObject(value))
|
|
156
|
+
return false;
|
|
157
|
+
if (typeof value.kind !== 'string' || !TARGET_CONFIGURATION_CHANGE_KINDS.includes(value.kind))
|
|
158
|
+
return false;
|
|
159
|
+
return typeof value.target === 'string' && value.target.length > 0;
|
|
160
|
+
}
|
|
161
|
+
// --- Difference vocabulary ---------------------------------------------------
|
|
162
|
+
export const DIFFERENCE_KINDS = [
|
|
163
|
+
'appeared',
|
|
164
|
+
'disappeared',
|
|
165
|
+
'moved',
|
|
166
|
+
'resized',
|
|
167
|
+
'visibility-changed',
|
|
168
|
+
'clipping-changed',
|
|
169
|
+
'containment-changed',
|
|
170
|
+
'horizontal-overflow-changed',
|
|
171
|
+
'vertical-overflow-changed',
|
|
172
|
+
'page-size-changed',
|
|
173
|
+
'scroll-owner-changed',
|
|
174
|
+
'relative-position-changed',
|
|
175
|
+
'relationship-changed',
|
|
176
|
+
];
|
|
177
|
+
function isValidComparisonDifferenceSubject(value) {
|
|
178
|
+
if (!isPlainObject(value))
|
|
179
|
+
return false;
|
|
180
|
+
if (value.type === 'target')
|
|
181
|
+
return typeof value.target === 'string' && value.target.length > 0;
|
|
182
|
+
if (value.type === 'page')
|
|
183
|
+
return Object.keys(value).length === 1;
|
|
184
|
+
if (value.type === 'relationship') {
|
|
185
|
+
const allKinds = [...PAIRWISE_RELATIONSHIP_KINDS, ...PAGE_LEVEL_RELATIONSHIP_KINDS];
|
|
186
|
+
if (typeof value.kind !== 'string' || !allKinds.includes(value.kind))
|
|
187
|
+
return false;
|
|
188
|
+
if ('subjectTarget' in value && value.subjectTarget !== undefined && typeof value.subjectTarget !== 'string')
|
|
189
|
+
return false;
|
|
190
|
+
if ('relatedTarget' in value && value.relatedTarget !== undefined && typeof value.relatedTarget !== 'string')
|
|
191
|
+
return false;
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
export function isValidComparisonDifference(value) {
|
|
197
|
+
if (!isPlainObject(value))
|
|
198
|
+
return false;
|
|
199
|
+
if (typeof value.kind !== 'string' || !DIFFERENCE_KINDS.includes(value.kind))
|
|
200
|
+
return false;
|
|
201
|
+
if (!isValidComparisonDifferenceSubject(value.subject))
|
|
202
|
+
return false;
|
|
203
|
+
if (!('before' in value) || !('after' in value))
|
|
204
|
+
return false;
|
|
205
|
+
if (typeof value.classification !== 'string' || value.classification.length === 0)
|
|
206
|
+
return false;
|
|
207
|
+
if (typeof value.beforeObservationId !== 'string' || value.beforeObservationId.length === 0)
|
|
208
|
+
return false;
|
|
209
|
+
if (typeof value.afterObservationId !== 'string' || value.afterObservationId.length === 0)
|
|
210
|
+
return false;
|
|
211
|
+
return isEvidenceReferenceArray(value.evidence);
|
|
212
|
+
}
|
|
213
|
+
function isValidRelationshipChangeRecord(value) {
|
|
214
|
+
if (!isPlainObject(value))
|
|
215
|
+
return false;
|
|
216
|
+
if (value.scope !== 'pairwise' && value.scope !== 'page')
|
|
217
|
+
return false;
|
|
218
|
+
const allKinds = [...PAIRWISE_RELATIONSHIP_KINDS, ...PAGE_LEVEL_RELATIONSHIP_KINDS];
|
|
219
|
+
const allValues = [...allKinds, 'unavailable'];
|
|
220
|
+
if (typeof value.kind !== 'string' || !allKinds.includes(value.kind))
|
|
221
|
+
return false;
|
|
222
|
+
if (value.scope === 'pairwise') {
|
|
223
|
+
if (typeof value.subjectTarget !== 'string' || value.subjectTarget.length === 0)
|
|
224
|
+
return false;
|
|
225
|
+
if (typeof value.relatedTarget !== 'string' || value.relatedTarget.length === 0)
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
else if ('subjectTarget' in value || 'relatedTarget' in value) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
if (typeof value.before !== 'string' || !allValues.includes(value.before))
|
|
232
|
+
return false;
|
|
233
|
+
if (typeof value.after !== 'string' || !allValues.includes(value.after))
|
|
234
|
+
return false;
|
|
235
|
+
if (typeof value.beforeObservationId !== 'string' || value.beforeObservationId.length === 0)
|
|
236
|
+
return false;
|
|
237
|
+
return typeof value.afterObservationId === 'string' && value.afterObservationId.length > 0;
|
|
238
|
+
}
|
|
239
|
+
export function isValidComparisonSourceObservationReference(value) {
|
|
240
|
+
if (!isPlainObject(value))
|
|
241
|
+
return false;
|
|
242
|
+
if (typeof value.observationId !== 'string' || value.observationId.length === 0)
|
|
243
|
+
return false;
|
|
244
|
+
if (typeof value.requestId !== 'string' || value.requestId.length === 0)
|
|
245
|
+
return false;
|
|
246
|
+
if (!isPlainObject(value.producer) || value.producer.name !== PRODUCER_NAME || typeof value.producer.version !== 'string' || value.producer.version.length === 0) {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
if (value.observationSchemaVersion !== OBSERVATION_SCHEMA_VERSION)
|
|
250
|
+
return false;
|
|
251
|
+
return isPlainObject(value.screenshot) && typeof value.screenshot.path === 'string' && value.screenshot.path.length > 0;
|
|
252
|
+
}
|
|
253
|
+
function isValidDiagnostic(value) {
|
|
254
|
+
if (!isPlainObject(value))
|
|
255
|
+
return false;
|
|
256
|
+
const code = value.code;
|
|
257
|
+
if (typeof code !== 'string' || !DIAGNOSTIC_CODES.includes(code))
|
|
258
|
+
return false;
|
|
259
|
+
if (value.severity !== DIAGNOSTIC_SEVERITY[code])
|
|
260
|
+
return false;
|
|
261
|
+
if (typeof value.message !== 'string')
|
|
262
|
+
return false;
|
|
263
|
+
if ('targetName' in value && value.targetName !== undefined && typeof value.targetName !== 'string')
|
|
264
|
+
return false;
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
/** Structural validator for the frozen ComparisonArtifact contract. Never delegates to `isValidObservationArtifact` - comparison and observation are different artifact kinds/schemas. */
|
|
268
|
+
export function isValidComparisonArtifact(value) {
|
|
269
|
+
if (!isPlainObject(value))
|
|
270
|
+
return { valid: false, reason: 'artifact must be an object' };
|
|
271
|
+
if (value.artifactKind !== COMPARISON_ARTIFACT_KIND)
|
|
272
|
+
return { valid: false, reason: 'artifactKind mismatch' };
|
|
273
|
+
if (value.schemaVersion !== COMPARISON_SCHEMA_VERSION)
|
|
274
|
+
return { valid: false, reason: 'schemaVersion mismatch' };
|
|
275
|
+
if (typeof value.comparisonId !== 'string' || value.comparisonId.length === 0)
|
|
276
|
+
return { valid: false, reason: 'comparisonId must be a non-empty string' };
|
|
277
|
+
if (typeof value.comparisonRequestId !== 'string' || value.comparisonRequestId.length === 0) {
|
|
278
|
+
return { valid: false, reason: 'comparisonRequestId must be a non-empty string' };
|
|
279
|
+
}
|
|
280
|
+
if (!isPlainObject(value.producer) || value.producer.name !== PRODUCER_NAME || typeof value.producer.version !== 'string' || value.producer.version.length === 0) {
|
|
281
|
+
return { valid: false, reason: 'producer must be { name: "my-frontend-observer", version: string }' };
|
|
282
|
+
}
|
|
283
|
+
if (!isPlainObject(value.provenance) || typeof value.provenance.comparedAt !== 'string' || value.provenance.comparedAt.length === 0) {
|
|
284
|
+
return { valid: false, reason: 'provenance.comparedAt must be a non-empty string' };
|
|
285
|
+
}
|
|
286
|
+
if (!isValidComparisonSourceObservationReference(value.before))
|
|
287
|
+
return { valid: false, reason: 'before source observation reference is invalid' };
|
|
288
|
+
if (!isValidComparisonSourceObservationReference(value.after))
|
|
289
|
+
return { valid: false, reason: 'after source observation reference is invalid' };
|
|
290
|
+
if (!isValidComparisonConfig(value.config))
|
|
291
|
+
return { valid: false, reason: 'config is invalid' };
|
|
292
|
+
if (!isValidComparabilityResult(value.comparability))
|
|
293
|
+
return { valid: false, reason: 'comparability is invalid' };
|
|
294
|
+
if (!Array.isArray(value.configurationChanges) || !value.configurationChanges.every((c) => isValidTargetConfigurationChange(c))) {
|
|
295
|
+
return { valid: false, reason: 'configurationChanges must be an array of valid TargetConfigurationChange values' };
|
|
296
|
+
}
|
|
297
|
+
if (!isValidLayoutRelationshipGraph(value.relationshipsBefore))
|
|
298
|
+
return { valid: false, reason: 'relationshipsBefore is invalid' };
|
|
299
|
+
if (!isValidLayoutRelationshipGraph(value.relationshipsAfter))
|
|
300
|
+
return { valid: false, reason: 'relationshipsAfter is invalid' };
|
|
301
|
+
if (!Array.isArray(value.differences) || !value.differences.every((d) => isValidComparisonDifference(d))) {
|
|
302
|
+
return { valid: false, reason: 'differences must be an array of valid ComparisonDifference values' };
|
|
303
|
+
}
|
|
304
|
+
if (!Array.isArray(value.relationshipChanges) || !value.relationshipChanges.every((r) => isValidRelationshipChangeRecord(r))) {
|
|
305
|
+
return { valid: false, reason: 'relationshipChanges must be an array of valid RelationshipChangeRecord values' };
|
|
306
|
+
}
|
|
307
|
+
if (!Array.isArray(value.expectedDependencyEvidence) || !value.expectedDependencyEvidence.every((e) => isValidExpectedDependencyEvidence(e))) {
|
|
308
|
+
return { valid: false, reason: 'expectedDependencyEvidence must be an array of valid ExpectedDependencyEvidence values' };
|
|
309
|
+
}
|
|
310
|
+
if (!Array.isArray(value.diagnostics) || !value.diagnostics.every((d) => isValidDiagnostic(d))) {
|
|
311
|
+
return { valid: false, reason: 'diagnostics must be an array of valid Diagnostic values' };
|
|
312
|
+
}
|
|
313
|
+
const limits = value.limits;
|
|
314
|
+
if (!isPlainObject(limits) ||
|
|
315
|
+
typeof limits.truncated !== 'boolean' ||
|
|
316
|
+
!Array.isArray(limits.omittedFields) ||
|
|
317
|
+
!limits.omittedFields.every((f) => typeof f === 'string') ||
|
|
318
|
+
!Array.isArray(limits.omittedTargetPairs) ||
|
|
319
|
+
!limits.omittedTargetPairs.every((f) => typeof f === 'string')) {
|
|
320
|
+
return { valid: false, reason: 'limits must be { truncated: boolean; omittedFields: string[]; omittedTargetPairs: string[] }' };
|
|
321
|
+
}
|
|
322
|
+
return { valid: true };
|
|
323
|
+
}
|
|
324
|
+
//# 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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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ObservationArtifact } from './schema.js';
|
|
2
|
+
import type { ComparisonConfig, ComparabilityResult, TargetConfigurationChange, ExpectedDependencyDeclaration, ExpectedDependencyEvidence, ComparisonArtifact } from './comparison.js';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration-change evidence: `removed`/`locator-changed` in before's
|
|
5
|
+
* configured order, then `added` in after's configured order (Batch 1's
|
|
6
|
+
* frozen ordering guidance) - never a source of appeared/disappeared
|
|
7
|
+
* rendered-state differences by itself.
|
|
8
|
+
*/
|
|
9
|
+
export declare function compareTargetConfiguration(before: ObservationArtifact, after: ObservationArtifact): TargetConfigurationChange[];
|
|
10
|
+
/**
|
|
11
|
+
* Evaluates comparability before any rendered difference is calculated
|
|
12
|
+
* (Batch 1's frozen `ComparabilityResult`/reason vocabulary). Hard
|
|
13
|
+
* incompatibilities (`blocking`) force `incomparable`; producer/browser
|
|
14
|
+
* version and target-configuration mismatches are `warning`-only; the three
|
|
15
|
+
* state dimensions the observer never models (theme, authenticated-state,
|
|
16
|
+
* application-state) are always recorded as `unassessed` - never silently
|
|
17
|
+
* claimed identical.
|
|
18
|
+
*/
|
|
19
|
+
export declare function evaluateComparability(before: ObservationArtifact, after: ObservationArtifact): ComparabilityResult;
|
|
20
|
+
/**
|
|
21
|
+
* Evaluates only explicitly-declared dependencies (`config.expectedDependencies`,
|
|
22
|
+
* in declared order) - never synthesizes a declaration from observed
|
|
23
|
+
* co-change (Batch 1's hard non-causal boundary). Each declared side is
|
|
24
|
+
* evaluated independently from the target's own before/after geometry;
|
|
25
|
+
* `unavailable` when either side's required property evidence cannot be
|
|
26
|
+
* read, `contradictory-to-declaration` when either side's actual direction
|
|
27
|
+
* is the strict opposite of what was declared, `consistent` when both sides
|
|
28
|
+
* match their declared direction, `not-observed` otherwise. No causal claim
|
|
29
|
+
* is ever produced.
|
|
30
|
+
*/
|
|
31
|
+
export declare function evaluateExpectedDependencies(before: ObservationArtifact, after: ObservationArtifact, declarations: readonly ExpectedDependencyDeclaration[], tolerance: number): ExpectedDependencyEvidence[];
|
|
32
|
+
export type CompareObservationsResult = {
|
|
33
|
+
ok: true;
|
|
34
|
+
artifact: ComparisonArtifact;
|
|
35
|
+
} | {
|
|
36
|
+
ok: false;
|
|
37
|
+
reason: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* The one canonical pure comparison entry point (real Chromium ->
|
|
41
|
+
* ObservationArtifact -> relationship derivation -> **comparability ->
|
|
42
|
+
* comparison** -> ComparisonArtifact, see docs/ARCHITECTURE.md). Comparison
|
|
43
|
+
* is ordered: `compareObservations(a, b)` and `compareObservations(b, a)`
|
|
44
|
+
* produce different `comparisonRequestId`s and reversed-sign
|
|
45
|
+
* moved/resized deltas - `before`/`after` are never treated as an
|
|
46
|
+
* unordered pair.
|
|
47
|
+
*/
|
|
48
|
+
export declare function compareObservations(before: ObservationArtifact, after: ObservationArtifact, configInput?: Partial<ComparisonConfig>): CompareObservationsResult;
|