my-frontend-observer 0.1.0 → 0.3.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 +82 -1
- package/README.md +30 -7
- package/dist/application/observationPersistence.js +1 -0
- package/dist/application/observationPersistence.js.map +1 -1
- package/dist/browser/chromiumAdapter.js +58 -4
- package/dist/browser/chromiumAdapter.js.map +1 -1
- package/dist/browser/evidenceCapture.d.ts +46 -3
- package/dist/browser/evidenceCapture.js +393 -94
- 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 +165 -7
- package/dist/cli.js.map +1 -1
- package/dist/domain/diagnostics.d.ts +1 -1
- package/dist/domain/diagnostics.js +2 -0
- package/dist/domain/diagnostics.js.map +1 -1
- package/dist/domain/identity.d.ts +8 -3
- package/dist/domain/identity.js +10 -4
- package/dist/domain/identity.js.map +1 -1
- package/dist/domain/schema.d.ts +164 -6
- package/dist/domain/schema.js +314 -4
- 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 +4 -4
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/request/request.d.ts +57 -1
- package/dist/request/request.js +292 -14
- package/dist/request/request.js.map +1 -1
- package/docs/ARCHITECTURE.md +62 -1
- package/docs/CI_CD.md +49 -8
- package/docs/COMMANDS.md +184 -9
- package/docs/CONTRACTS.md +135 -6
- package/docs/CURRENT_STATE.md +128 -6
- package/docs/DEVELOPMENT.md +41 -3
- package/docs/PROJECT_OVERVIEW.md +12 -6
- package/docs/QUICKSTART.md +3 -1
- package/docs/RELEASE.md +12 -5
- package/docs/ROADMAP.md +9 -0
- package/docs/SECURITY.md +6 -2
- package/docs/WORKFLOWS.md +41 -14
- package/package.json +1 -1
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { deriveOverflowEvidence, deriveViewportRelation } from '../domain/scrollEvidence.js';
|
|
2
|
+
function browserField(value) {
|
|
3
|
+
return { state: 'available', source: 'browser', value };
|
|
4
|
+
}
|
|
5
|
+
function computedField(value) {
|
|
6
|
+
return { state: 'available', source: 'computed-browser', value };
|
|
7
|
+
}
|
|
8
|
+
function derivedField(value, derivedFrom) {
|
|
9
|
+
return { state: 'available', source: 'derived', value, derivedFrom };
|
|
10
|
+
}
|
|
11
|
+
function unavailableField(reason) {
|
|
12
|
+
return { state: 'unavailable', reason };
|
|
13
|
+
}
|
|
14
|
+
function notApplicableField(reason) {
|
|
15
|
+
return { state: 'not-applicable', reason };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* `document.scrollingElement` (falling back to `documentElement`, which is
|
|
19
|
+
* what `scrollingElement` resolves to for any standards-mode document) is
|
|
20
|
+
* the browser's own answer to "which element actually scrolls the page" -
|
|
21
|
+
* that becomes `document.root`. `documentElement` is included as its own
|
|
22
|
+
* field only when it is a *different* element from the scrolling root
|
|
23
|
+
* (legacy quirks-mode pages, not exercised by this repository's fixtures);
|
|
24
|
+
* otherwise it would just duplicate `root`'s own metrics. `body` is always
|
|
25
|
+
* a distinct DOM element from `documentElement` when present, so its own
|
|
26
|
+
* metrics are genuine measurement, not fabrication, even when numerically
|
|
27
|
+
* equal to `root`.
|
|
28
|
+
*/
|
|
29
|
+
async function captureWindowAndDocument(page) {
|
|
30
|
+
return page.evaluate(() => {
|
|
31
|
+
const metricsOf = (el) => ({
|
|
32
|
+
scrollTop: el.scrollTop,
|
|
33
|
+
scrollLeft: el.scrollLeft,
|
|
34
|
+
scrollWidth: el.scrollWidth,
|
|
35
|
+
scrollHeight: el.scrollHeight,
|
|
36
|
+
clientWidth: el.clientWidth,
|
|
37
|
+
clientHeight: el.clientHeight,
|
|
38
|
+
});
|
|
39
|
+
const scrollingElement = document.scrollingElement ?? document.documentElement;
|
|
40
|
+
const rootStyle = getComputedStyle(scrollingElement);
|
|
41
|
+
const body = document.body;
|
|
42
|
+
return {
|
|
43
|
+
scrollX: window.scrollX,
|
|
44
|
+
scrollY: window.scrollY,
|
|
45
|
+
root: metricsOf(scrollingElement),
|
|
46
|
+
rootOverflowX: rootStyle.overflowX,
|
|
47
|
+
rootOverflowY: rootStyle.overflowY,
|
|
48
|
+
documentElement: scrollingElement !== document.documentElement ? metricsOf(document.documentElement) : undefined,
|
|
49
|
+
body: body ? metricsOf(body) : undefined,
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** Same hidden-element convention as `evidenceCapture.ts#captureResolvedTargetRecord`: `display:none`/`visibility:hidden`/zero-size all mean "not visibly rendered". */
|
|
54
|
+
async function captureTargetScrollMeasurement(handle) {
|
|
55
|
+
return handle.evaluate((el) => {
|
|
56
|
+
const rect = el.getBoundingClientRect();
|
|
57
|
+
const computed = getComputedStyle(el);
|
|
58
|
+
return {
|
|
59
|
+
metrics: {
|
|
60
|
+
scrollTop: el.scrollTop,
|
|
61
|
+
scrollLeft: el.scrollLeft,
|
|
62
|
+
scrollWidth: el.scrollWidth,
|
|
63
|
+
scrollHeight: el.scrollHeight,
|
|
64
|
+
clientWidth: el.clientWidth,
|
|
65
|
+
clientHeight: el.clientHeight,
|
|
66
|
+
},
|
|
67
|
+
overflowX: computed.overflowX,
|
|
68
|
+
overflowY: computed.overflowY,
|
|
69
|
+
rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height, right: rect.right, bottom: rect.bottom },
|
|
70
|
+
visible: computed.display !== 'none' && computed.visibility !== 'hidden' && rect.width > 0 && rect.height > 0,
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Builds one bounded `TargetScrollRuntimeState` for a single already-resolved
|
|
76
|
+
* configured target. Metrics/overflow/boundingRect are reported as real
|
|
77
|
+
* browser measurement (even when zero, for a hidden element) - consistent
|
|
78
|
+
* with how `evidenceCapture.ts` already reports geometry for hidden v0.2
|
|
79
|
+
* targets - but `viewportRelation` is `not-applicable` for a hidden target
|
|
80
|
+
* (Batch 1 Section 20/24: hidden is not the same claim as offscreen, so a
|
|
81
|
+
* hidden target must never receive ordinary above/below/intersecting
|
|
82
|
+
* geometry).
|
|
83
|
+
*/
|
|
84
|
+
async function captureTargetScrollRuntimeState(info, viewport) {
|
|
85
|
+
if (info.status !== 'matched' || !info.handle) {
|
|
86
|
+
const reason = info.unavailableReason ?? `target itself did not resolve (status: ${info.status})`;
|
|
87
|
+
return {
|
|
88
|
+
metrics: unavailableField(reason),
|
|
89
|
+
overflow: unavailableField(reason),
|
|
90
|
+
boundingRect: unavailableField(reason),
|
|
91
|
+
viewportRelation: unavailableField(reason),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const raw = await captureTargetScrollMeasurement(info.handle);
|
|
95
|
+
const overflow = deriveOverflowEvidence(raw.metrics, raw.overflowX, raw.overflowY);
|
|
96
|
+
const viewportRelation = raw.visible
|
|
97
|
+
? derivedField(deriveViewportRelation(raw.rect, viewport), ['boundingRect', 'viewport'])
|
|
98
|
+
: notApplicableField('target is hidden or non-rendered; viewport relation is not meaningful');
|
|
99
|
+
return {
|
|
100
|
+
metrics: browserField(raw.metrics),
|
|
101
|
+
overflow: computedField(overflow),
|
|
102
|
+
boundingRect: browserField(raw.rect),
|
|
103
|
+
viewportRelation,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Captures one point-in-time bounded `ScrollRuntimeSnapshot` (Batch 1 frozen
|
|
108
|
+
* contract) from the live page, using already-resolved target handles -
|
|
109
|
+
* never re-resolving targets itself. Called twice by the scenario lifecycle
|
|
110
|
+
* (once before the scroll action, once after stabilization) against the
|
|
111
|
+
* exact same `resolved` set, so "which browser element is target X" is
|
|
112
|
+
* answered exactly once per observation's scenario capture.
|
|
113
|
+
*/
|
|
114
|
+
export async function captureScrollRuntimeSnapshot(page, resolved, viewport) {
|
|
115
|
+
const raw = await captureWindowAndDocument(page);
|
|
116
|
+
const rootOverflow = deriveOverflowEvidence(raw.root, raw.rootOverflowX, raw.rootOverflowY);
|
|
117
|
+
const targets = {};
|
|
118
|
+
for (const info of resolved) {
|
|
119
|
+
targets[info.name] = await captureTargetScrollRuntimeState(info, viewport);
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
window: { scrollX: raw.scrollX, scrollY: raw.scrollY },
|
|
123
|
+
document: {
|
|
124
|
+
root: raw.root,
|
|
125
|
+
rootOverflow,
|
|
126
|
+
...(raw.documentElement ? { documentElement: raw.documentElement } : {}),
|
|
127
|
+
...(raw.body ? { body: raw.body } : {}),
|
|
128
|
+
},
|
|
129
|
+
targets,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Immediate, non-smooth window scroll using the Batch 1 normalized delta.
|
|
134
|
+
* `behavior: 'instant'` guarantees no smooth-scroll animation regardless of
|
|
135
|
+
* any `scroll-behavior: smooth` the observed page's own CSS declares - the
|
|
136
|
+
* position change is synchronous within this one `evaluate()` call.
|
|
137
|
+
*/
|
|
138
|
+
export async function performWindowScrollBy(page, deltaX, deltaY) {
|
|
139
|
+
await page.evaluate(({ deltaX, deltaY }) => {
|
|
140
|
+
window.scrollBy({ left: deltaX, top: deltaY, behavior: 'instant' });
|
|
141
|
+
}, { deltaX, deltaY });
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Immediate, non-smooth scroll of one uniquely-resolved configured target
|
|
145
|
+
* element, using the same `behavior: 'instant'` primitive as
|
|
146
|
+
* {@link performWindowScrollBy} - one stabilization/execution contract for
|
|
147
|
+
* both action kinds, never a forked one. `element.scrollBy` is a real,
|
|
148
|
+
* browser-native immediate-scroll method on every `Element` (no dependency
|
|
149
|
+
* on the target actually being scrollable - a non-overflowing target simply
|
|
150
|
+
* produces no position change, which is a valid, honestly-reported outcome).
|
|
151
|
+
*/
|
|
152
|
+
export async function performTargetScrollBy(handle, deltaX, deltaY) {
|
|
153
|
+
await handle.evaluate((el, { deltaX, deltaY }) => {
|
|
154
|
+
el.scrollBy({ left: deltaX, top: deltaY, behavior: 'instant' });
|
|
155
|
+
}, { deltaX, deltaY });
|
|
156
|
+
}
|
|
157
|
+
/** The Batch 1 frozen stabilization contract: exactly two `requestAnimationFrame` cycles on the live page, no timers/sleeps/network-idle substitutes. */
|
|
158
|
+
export async function waitTwoAnimationFrames(page) {
|
|
159
|
+
await page.evaluate(() => new Promise((resolve) => {
|
|
160
|
+
requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=scrollCapture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollCapture.js","sourceRoot":"","sources":["../../src/browser/scrollCapture.ts"],"names":[],"mappings":"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"}
|
package/dist/browser/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Diagnostic } from '../domain/diagnostics.js';
|
|
2
2
|
import type { EvidenceField } from '../domain/evidence.js';
|
|
3
|
-
import type { TargetEvidenceRecord } from '../domain/schema.js';
|
|
3
|
+
import type { TargetEvidenceRecord, ScrollScenarioEvidence } from '../domain/schema.js';
|
|
4
4
|
export interface BrowserProvenance {
|
|
5
5
|
engine: string;
|
|
6
6
|
version: string;
|
|
@@ -16,6 +16,8 @@ export type BrowserCaptureResult = {
|
|
|
16
16
|
pageEvidence: Record<string, EvidenceField<unknown>>;
|
|
17
17
|
targetEvidence: Record<string, TargetEvidenceRecord>;
|
|
18
18
|
diagnostics: Diagnostic[];
|
|
19
|
+
/** v0.3 Batch 2: present only when the request configured a scrollScenario. */
|
|
20
|
+
scrollScenarioEvidence?: ScrollScenarioEvidence;
|
|
19
21
|
} | {
|
|
20
22
|
ok: false;
|
|
21
23
|
diagnostics: Diagnostic[];
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { realpathSync } from 'node:fs';
|
|
2
|
+
import { realpathSync, readFileSync } from 'node:fs';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { normalizeRequest } from './request/request.js';
|
|
5
5
|
import { getProducerInfo } from './domain/schema.js';
|
|
@@ -35,10 +35,34 @@ Required:
|
|
|
35
35
|
|
|
36
36
|
Options:
|
|
37
37
|
--viewport <WIDTHxHEIGHT> Viewport size, e.g. 1280x720.
|
|
38
|
-
--target <id=selector> An explicit observation target.
|
|
39
|
-
Parsed on the first "=" only, so
|
|
40
|
-
containing "=" (e.g.
|
|
41
|
-
are preserved
|
|
38
|
+
--target <id=selector> An explicit CSS-shorthand observation target.
|
|
39
|
+
Repeatable. Parsed on the first "=" only, so
|
|
40
|
+
selectors containing "=" (e.g.
|
|
41
|
+
button[data-state="active"]) are preserved
|
|
42
|
+
intact. Cannot be combined with --targets-file.
|
|
43
|
+
--targets-file <json-file> Loads structured semantic observation targets
|
|
44
|
+
from a local JSON file: { "targets": [ { "name":
|
|
45
|
+
"...", "locators": [ { "kind": "role"|"id"|
|
|
46
|
+
"data-attribute"|"semantic-element"|"css"|"text",
|
|
47
|
+
... } ] } ] }. Locator order within a target is
|
|
48
|
+
the fallback order. Relative paths resolve from
|
|
49
|
+
the current working directory; the file path
|
|
50
|
+
itself is never persisted into the artifact or
|
|
51
|
+
included in the observation's request identity.
|
|
52
|
+
Cannot be combined with --target.
|
|
53
|
+
--scroll-scenario-file <json-file>
|
|
54
|
+
Loads one bounded runtime scroll scenario from a
|
|
55
|
+
local JSON file: { "action": { "kind":
|
|
56
|
+
"window-scroll-by"|"target-scroll-by", ...,
|
|
57
|
+
"deltaX": <int>, "deltaY": <int> } }.
|
|
58
|
+
"target-scroll-by" additionally requires a
|
|
59
|
+
"target" naming a configured stable target.
|
|
60
|
+
Exactly zero or one scenario per observation.
|
|
61
|
+
Relative paths resolve from the current working
|
|
62
|
+
directory; the file path itself is never
|
|
63
|
+
persisted into the artifact or included in the
|
|
64
|
+
observation's request identity. May be combined
|
|
65
|
+
with either --target or --targets-file.
|
|
42
66
|
--output <directory> Portable, relative output location for the
|
|
43
67
|
observation artifact.
|
|
44
68
|
--timeout <ms> Overall request timeout in milliseconds.
|
|
@@ -71,6 +95,10 @@ function parseObserveArgs(argv) {
|
|
|
71
95
|
const targets = [];
|
|
72
96
|
let outputLocation;
|
|
73
97
|
let timeoutMs;
|
|
98
|
+
let targetsFilePath;
|
|
99
|
+
let targetsFileFlagCount = 0;
|
|
100
|
+
let scrollScenarioFilePath;
|
|
101
|
+
let scrollScenarioFileFlagCount = 0;
|
|
74
102
|
for (let i = 0; i < argv.length; i += 1) {
|
|
75
103
|
const arg = argv[i];
|
|
76
104
|
switch (arg) {
|
|
@@ -99,6 +127,34 @@ function parseObserveArgs(argv) {
|
|
|
99
127
|
}
|
|
100
128
|
break;
|
|
101
129
|
}
|
|
130
|
+
case '--targets-file': {
|
|
131
|
+
const value = argv[(i += 1)];
|
|
132
|
+
targetsFileFlagCount += 1;
|
|
133
|
+
if (value === undefined) {
|
|
134
|
+
errors.push('--targets-file requires a file path argument');
|
|
135
|
+
}
|
|
136
|
+
else if (targetsFileFlagCount > 1) {
|
|
137
|
+
errors.push('--targets-file may only be specified once');
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
targetsFilePath = value;
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
case '--scroll-scenario-file': {
|
|
145
|
+
const value = argv[(i += 1)];
|
|
146
|
+
scrollScenarioFileFlagCount += 1;
|
|
147
|
+
if (value === undefined) {
|
|
148
|
+
errors.push('--scroll-scenario-file requires a file path argument');
|
|
149
|
+
}
|
|
150
|
+
else if (scrollScenarioFileFlagCount > 1) {
|
|
151
|
+
errors.push('--scroll-scenario-file may only be specified once');
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
scrollScenarioFilePath = value;
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
102
158
|
case '--output':
|
|
103
159
|
outputLocation = argv[(i += 1)];
|
|
104
160
|
break;
|
|
@@ -119,6 +175,9 @@ function parseObserveArgs(argv) {
|
|
|
119
175
|
}
|
|
120
176
|
if (targetUrl === undefined)
|
|
121
177
|
errors.push('--url is required');
|
|
178
|
+
if (targets.length > 0 && targetsFilePath !== undefined) {
|
|
179
|
+
errors.push('--target and --targets-file cannot be combined; use one or the other');
|
|
180
|
+
}
|
|
122
181
|
if (errors.length > 0)
|
|
123
182
|
return { ok: false, errors };
|
|
124
183
|
const raw = {
|
|
@@ -128,7 +187,87 @@ function parseObserveArgs(argv) {
|
|
|
128
187
|
...(outputLocation === undefined ? {} : { outputLocation }),
|
|
129
188
|
...(timeoutMs === undefined ? {} : { timeoutMs }),
|
|
130
189
|
};
|
|
131
|
-
return {
|
|
190
|
+
return {
|
|
191
|
+
ok: true,
|
|
192
|
+
raw,
|
|
193
|
+
...(targetsFilePath === undefined ? {} : { targetsFilePath }),
|
|
194
|
+
...(scrollScenarioFilePath === undefined ? {} : { scrollScenarioFilePath }),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
const TARGETS_FILE_ALLOWED_ROOT_FIELDS = new Set(['targets']);
|
|
198
|
+
/**
|
|
199
|
+
* CLI/input-boundary-only responsibility: read one local JSON file, validate
|
|
200
|
+
* only the root wrapper this file format owns (object root, exactly the
|
|
201
|
+
* "targets" field, nothing else), and hand the still-unvalidated `targets`
|
|
202
|
+
* value to the existing `normalizeRequest()` - every target/locator-internal
|
|
203
|
+
* rule (bounds, locator kinds, per-kind fields) stays owned there, not
|
|
204
|
+
* duplicated here. The file path itself is never returned to the caller
|
|
205
|
+
* beyond this function, so it can never reach the persisted request/artifact.
|
|
206
|
+
*/
|
|
207
|
+
function loadTargetsFile(filePath) {
|
|
208
|
+
let rawText;
|
|
209
|
+
try {
|
|
210
|
+
rawText = readFileSync(filePath, 'utf8');
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
214
|
+
return { ok: false, error: `--targets-file could not be read: ${message}` };
|
|
215
|
+
}
|
|
216
|
+
let parsed;
|
|
217
|
+
try {
|
|
218
|
+
parsed = JSON.parse(rawText);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
222
|
+
return { ok: false, error: `--targets-file is not valid JSON: ${message}` };
|
|
223
|
+
}
|
|
224
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
225
|
+
return { ok: false, error: '--targets-file root must be a JSON object' };
|
|
226
|
+
}
|
|
227
|
+
const record = parsed;
|
|
228
|
+
const unknownFields = Object.keys(record).filter((key) => !TARGETS_FILE_ALLOWED_ROOT_FIELDS.has(key));
|
|
229
|
+
if (unknownFields.length > 0) {
|
|
230
|
+
return { ok: false, error: `--targets-file has unsupported top-level field(s): ${unknownFields.join(', ')}` };
|
|
231
|
+
}
|
|
232
|
+
if (!('targets' in record)) {
|
|
233
|
+
return { ok: false, error: '--targets-file must have a "targets" property' };
|
|
234
|
+
}
|
|
235
|
+
return { ok: true, targets: record.targets };
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* CLI/input-boundary-only responsibility, mirroring `loadTargetsFile`: read
|
|
239
|
+
* one local JSON file and validate only the root shape this file format
|
|
240
|
+
* owns (plain, non-array object) - the file supplies the value of
|
|
241
|
+
* `RawObservationRequest.scrollScenario` directly (no wrapper field), so
|
|
242
|
+
* there is no root-field allowlist to enforce here the way
|
|
243
|
+
* `loadTargetsFile` enforces `{ "targets": [...] }`. Every scenario/action
|
|
244
|
+
* rule (supported kind, required action, delta types/bounds, the both-zero
|
|
245
|
+
* rule, stable target reference, unknown fields) stays owned by
|
|
246
|
+
* `normalizeRequest()`, not duplicated here. The file path itself is never
|
|
247
|
+
* returned to the caller beyond this function, so it can never reach the
|
|
248
|
+
* persisted request/artifact.
|
|
249
|
+
*/
|
|
250
|
+
function loadScrollScenarioFile(filePath) {
|
|
251
|
+
let rawText;
|
|
252
|
+
try {
|
|
253
|
+
rawText = readFileSync(filePath, 'utf8');
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
257
|
+
return { ok: false, error: `--scroll-scenario-file could not be read: ${message}` };
|
|
258
|
+
}
|
|
259
|
+
let parsed;
|
|
260
|
+
try {
|
|
261
|
+
parsed = JSON.parse(rawText);
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
265
|
+
return { ok: false, error: `--scroll-scenario-file is not valid JSON: ${message}` };
|
|
266
|
+
}
|
|
267
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
268
|
+
return { ok: false, error: '--scroll-scenario-file root must be a JSON object' };
|
|
269
|
+
}
|
|
270
|
+
return { ok: true, scenario: parsed };
|
|
132
271
|
}
|
|
133
272
|
function formatDiagnostic(diagnostic) {
|
|
134
273
|
const target = diagnostic.targetName === undefined ? '' : ` (target: ${diagnostic.targetName})`;
|
|
@@ -148,7 +287,26 @@ async function runObserveCommand(argv, io) {
|
|
|
148
287
|
io.stderr(OBSERVE_HELP);
|
|
149
288
|
return 1;
|
|
150
289
|
}
|
|
151
|
-
|
|
290
|
+
let raw = parsedArgs.raw;
|
|
291
|
+
if (parsedArgs.targetsFilePath !== undefined) {
|
|
292
|
+
const loaded = loadTargetsFile(parsedArgs.targetsFilePath);
|
|
293
|
+
if (!loaded.ok) {
|
|
294
|
+
io.stderr(`error: ${loaded.error}\n`);
|
|
295
|
+
io.stderr(OBSERVE_HELP);
|
|
296
|
+
return 1;
|
|
297
|
+
}
|
|
298
|
+
raw = { ...raw, targets: loaded.targets };
|
|
299
|
+
}
|
|
300
|
+
if (parsedArgs.scrollScenarioFilePath !== undefined) {
|
|
301
|
+
const loaded = loadScrollScenarioFile(parsedArgs.scrollScenarioFilePath);
|
|
302
|
+
if (!loaded.ok) {
|
|
303
|
+
io.stderr(`error: ${loaded.error}\n`);
|
|
304
|
+
io.stderr(OBSERVE_HELP);
|
|
305
|
+
return 1;
|
|
306
|
+
}
|
|
307
|
+
raw = { ...raw, scrollScenario: loaded.scenario };
|
|
308
|
+
}
|
|
309
|
+
const normalized = normalizeRequest(raw);
|
|
152
310
|
if (!normalized.ok) {
|
|
153
311
|
for (const diagnostic of normalized.diagnostics)
|
|
154
312
|
io.stderr(`${formatDiagnostic(diagnostic)}\n`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAOlE,MAAM,SAAS,GAAU;IACvB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;CActB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CpB,CAAC;AAEF,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACvD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAMD,0HAA0H;AAC1H,SAAS,gBAAgB,CAAC,IAAuB;IAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAA6B,CAAC;IAClC,IAAI,QAAuD,CAAC;IAC5D,MAAM,OAAO,GAAyC,EAAE,CAAC;IACzD,IAAI,cAAkC,CAAC;IACvC,IAAI,SAA6B,CAAC;IAClC,IAAI,eAAmC,CAAC;IACxC,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,sBAA0C,CAAC;IAC/C,IAAI,2BAA2B,GAAG,CAAC,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,OAAO;gBACV,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACtE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,wDAAwD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC/F,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,MAAM,CAAC;gBACpB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACpE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,yCAAyC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAChF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,oBAAoB,IAAI,CAAC,CAAC;gBAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBAC9D,CAAC;qBAAM,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;gBAC3D,CAAC;qBAAM,CAAC;oBACN,eAAe,GAAG,KAAK,CAAC;gBAC1B,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,wBAAwB,CAAC,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,2BAA2B,IAAI,CAAC,CAAC;gBACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;gBACtE,CAAC;qBAAM,IAAI,2BAA2B,GAAG,CAAC,EAAE,CAAC;oBAC3C,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;gBACnE,CAAC;qBAAM,CAAC;oBACN,sBAAsB,GAAG,KAAK,CAAC;gBACjC,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,UAAU;gBACb,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBACnC,MAAM,CAAC,IAAI,CAAC,mDAAmD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC1F,CAAC;qBAAM,CAAC;oBACN,SAAS,GAAG,YAAY,CAAC;gBAC3B,CAAC;gBACD,MAAM;YACR,CAAC;YACD;gBACE,MAAM,CAAC,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAEpD,MAAM,GAAG,GAA0B;QACjC,SAAS;QACT,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;QAC3D,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;KAClD,CAAC;IACF,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG;QACH,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;QAC7D,GAAG,CAAC,sBAAsB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED,MAAM,gCAAgC,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAI9D;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,OAAO,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,OAAO,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;IAC3E,CAAC;IAED,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,gCAAgC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtG,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sDAAsD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAChH,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC;IAC/E,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AAC/C,CAAC;AAID;;;;;;;;;;;;GAYG;AACH,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,OAAO,EAAE,EAAE,CAAC;IACtF,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,OAAO,EAAE,EAAE,CAAC;IACtF,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mDAAmD,EAAE,CAAC;IACnF,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAsB;IAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,UAAU,CAAC,UAAU,GAAG,CAAC;IAChG,OAAO,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;AAC/D,CAAC;AAED,wIAAwI;AACxI,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAE5E,KAAK,UAAU,iBAAiB,CAAC,IAAuB,EAAE,EAAS;IACjE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM;YAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;QACtE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;IACzB,IAAI,UAAU,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,EAAE,CAAC,MAAM,CAAC,UAAU,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YACtC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC5C,CAAC;IACD,IAAI,UAAU,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,EAAE,CAAC,MAAM,CAAC,UAAU,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YACtC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,WAAW;YAAE,EAAE,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,4FAA4F;IAC5F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW;YAAE,EAAE,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5F,OAAO,CAAC,CAAC;IACX,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,gBAAgB,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;IACpD,EAAE,CAAC,MAAM,CAAC,UAAU,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;IACjD,EAAE,CAAC,MAAM,CAAC,aAAa,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;IAChD,EAAE,CAAC,MAAM,CAAC,YAAY,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;IAC9C,EAAE,CAAC,MAAM,CAAC,gBAAgB,MAAM,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;IAEzD,OAAO,6BAA6B,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAuB,EAAE,KAAY,SAAS;IACzE,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAEhC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC1B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7C,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC1B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC5B,EAAE,CAAC,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,gCAAgC,OAAO,KAAK,CAAC,CAAC;IACxD,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC1B,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,YAAY,EAAE,EAAE,CAAC;IACnB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC9C,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const DIAGNOSTIC_CODES: readonly ["invalid-request", "unsupported-configuration", "unsafe-url", "prohibited-navigation", "prohibited-redirect", "prohibited-subresource-request", "readiness-timeout", "navigation-failure", "target-missing", "target-ambiguous", "browser-evidence-unavailable", "partial-evidence", "bounded-truncated-evidence", "artifact-write-failure", "browser-runtime-failure"];
|
|
1
|
+
export declare const DIAGNOSTIC_CODES: readonly ["invalid-request", "unsupported-configuration", "unsafe-url", "prohibited-navigation", "prohibited-redirect", "prohibited-subresource-request", "readiness-timeout", "navigation-failure", "target-missing", "target-ambiguous", "target-hidden", "browser-evidence-unavailable", "partial-evidence", "bounded-truncated-evidence", "artifact-write-failure", "browser-runtime-failure"];
|
|
2
2
|
export type DiagnosticCode = (typeof DIAGNOSTIC_CODES)[number];
|
|
3
3
|
export type DiagnosticSeverity = 'error' | 'warning';
|
|
4
4
|
/** Single source of truth for code->severity; ordering/completion logic must consult this, never a duplicated mapping. */
|
|
@@ -9,6 +9,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
9
9
|
'navigation-failure',
|
|
10
10
|
'target-missing',
|
|
11
11
|
'target-ambiguous',
|
|
12
|
+
'target-hidden',
|
|
12
13
|
'browser-evidence-unavailable',
|
|
13
14
|
'partial-evidence',
|
|
14
15
|
'bounded-truncated-evidence',
|
|
@@ -27,6 +28,7 @@ export const DIAGNOSTIC_SEVERITY = {
|
|
|
27
28
|
'navigation-failure': 'error',
|
|
28
29
|
'target-missing': 'warning',
|
|
29
30
|
'target-ambiguous': 'warning',
|
|
31
|
+
'target-hidden': 'warning',
|
|
30
32
|
'browser-evidence-unavailable': 'warning',
|
|
31
33
|
'partial-evidence': 'warning',
|
|
32
34
|
'bounded-truncated-evidence': 'warning',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/domain/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,iBAAiB;IACjB,2BAA2B;IAC3B,YAAY;IACZ,uBAAuB;IACvB,qBAAqB;IACrB,gCAAgC;IAChC,mBAAmB;IACnB,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,8BAA8B;IAC9B,kBAAkB;IAClB,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;CACjB,CAAC;AAMX,0HAA0H;AAC1H,MAAM,CAAC,MAAM,mBAAmB,GAA+C;IAC7E,iBAAiB,EAAE,OAAO;IAC1B,2BAA2B,EAAE,OAAO;IACpC,YAAY,EAAE,OAAO;IACrB,uBAAuB,EAAE,OAAO;IAChC,qBAAqB,EAAE,OAAO;IAC9B,gCAAgC,EAAE,OAAO;IACzC,mBAAmB,EAAE,SAAS;IAC9B,oBAAoB,EAAE,OAAO;IAC7B,gBAAgB,EAAE,SAAS;IAC3B,kBAAkB,EAAE,SAAS;IAC7B,8BAA8B,EAAE,SAAS;IACzC,kBAAkB,EAAE,SAAS;IAC7B,4BAA4B,EAAE,SAAS;IACvC,wBAAwB,EAAE,OAAO;IACjC,yBAAyB,EAAE,OAAO;CACnC,CAAC;AAUF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAkC;IACjE,MAAM,YAAY,GAAG,CAAC,CAAa,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QACpC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QACnC,IAAI,OAAO,KAAK,OAAO;YAAE,OAAO,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/domain/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,iBAAiB;IACjB,2BAA2B;IAC3B,YAAY;IACZ,uBAAuB;IACvB,qBAAqB;IACrB,gCAAgC;IAChC,mBAAmB;IACnB,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,8BAA8B;IAC9B,kBAAkB;IAClB,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;CACjB,CAAC;AAMX,0HAA0H;AAC1H,MAAM,CAAC,MAAM,mBAAmB,GAA+C;IAC7E,iBAAiB,EAAE,OAAO;IAC1B,2BAA2B,EAAE,OAAO;IACpC,YAAY,EAAE,OAAO;IACrB,uBAAuB,EAAE,OAAO;IAChC,qBAAqB,EAAE,OAAO;IAC9B,gCAAgC,EAAE,OAAO;IACzC,mBAAmB,EAAE,SAAS;IAC9B,oBAAoB,EAAE,OAAO;IAC7B,gBAAgB,EAAE,SAAS;IAC3B,kBAAkB,EAAE,SAAS;IAC7B,eAAe,EAAE,SAAS;IAC1B,8BAA8B,EAAE,SAAS;IACzC,kBAAkB,EAAE,SAAS;IAC7B,4BAA4B,EAAE,SAAS;IACvC,wBAAwB,EAAE,OAAO;IACjC,yBAAyB,EAAE,OAAO;CACnC,CAAC;AAUF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAkC;IACjE,MAAM,YAAY,GAAG,CAAC,CAAa,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QACpC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QACnC,IAAI,OAAO,KAAK,OAAO;YAAE,OAAO,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { NormalizedObservationRequest } from '../request/request.js';
|
|
2
2
|
/**
|
|
3
3
|
* Pure function of {targetUrl, viewport, targets (order preserved -
|
|
4
|
-
* semantic), readiness.condition} only. timeoutMs,
|
|
5
|
-
* outputLocation never affect the result - this is
|
|
6
|
-
* "same configuration" for this batch.
|
|
4
|
+
* semantic), readiness.condition, scrollScenario} only. timeoutMs,
|
|
5
|
+
* readiness.timeoutMs, and outputLocation never affect the result - this is
|
|
6
|
+
* the frozen definition of "same configuration" for this batch. A request
|
|
7
|
+
* with no `scrollScenario` omits the key entirely (rather than setting it to
|
|
8
|
+
* `undefined`) so the v0.2 identity for scenario-less requests is unchanged
|
|
9
|
+
* by this v0.3 extension. Only the requested action configuration
|
|
10
|
+
* participates - never runtime scroll results, movement success/failure, or
|
|
11
|
+
* scroll-owner interpretation, which are runtime evidence, not identity.
|
|
7
12
|
*/
|
|
8
13
|
export declare function buildRequestIdentity(request: NormalizedObservationRequest): string;
|
|
9
14
|
/**
|
package/dist/domain/identity.js
CHANGED
|
@@ -12,16 +12,22 @@ function canonicalize(value) {
|
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* Pure function of {targetUrl, viewport, targets (order preserved -
|
|
15
|
-
* semantic), readiness.condition} only. timeoutMs,
|
|
16
|
-
* outputLocation never affect the result - this is
|
|
17
|
-
* "same configuration" for this batch.
|
|
15
|
+
* semantic), readiness.condition, scrollScenario} only. timeoutMs,
|
|
16
|
+
* readiness.timeoutMs, and outputLocation never affect the result - this is
|
|
17
|
+
* the frozen definition of "same configuration" for this batch. A request
|
|
18
|
+
* with no `scrollScenario` omits the key entirely (rather than setting it to
|
|
19
|
+
* `undefined`) so the v0.2 identity for scenario-less requests is unchanged
|
|
20
|
+
* by this v0.3 extension. Only the requested action configuration
|
|
21
|
+
* participates - never runtime scroll results, movement success/failure, or
|
|
22
|
+
* scroll-owner interpretation, which are runtime evidence, not identity.
|
|
18
23
|
*/
|
|
19
24
|
export function buildRequestIdentity(request) {
|
|
20
25
|
const semanticView = {
|
|
21
26
|
targetUrl: request.targetUrl,
|
|
22
27
|
viewport: { width: request.viewport.width, height: request.viewport.height },
|
|
23
|
-
targets: request.targets.map((target) => ({ name: target.name.toLowerCase(),
|
|
28
|
+
targets: request.targets.map((target) => ({ name: target.name.toLowerCase(), locators: target.locators })),
|
|
24
29
|
readinessCondition: request.readiness.condition,
|
|
30
|
+
...(request.scrollScenario ? { scrollScenario: request.scrollScenario } : {}),
|
|
25
31
|
};
|
|
26
32
|
const serialized = JSON.stringify(canonicalize(semanticView));
|
|
27
33
|
return createHash('sha256').update(serialized).digest('hex');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/domain/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGtD,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAChD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,UAAU,CAAC,CAAU,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/domain/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGtD,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAChD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,UAAU,CAAC,CAAU,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqC;IACxE,MAAM,YAAY,GAAG;QACnB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC5E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1G,kBAAkB,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS;QAC/C,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,eAAuB;IAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,GAAG,eAAe,IAAI,KAAK,EAAE,CAAC;AACvC,CAAC"}
|