@riddledc/riddle-proof 0.7.26 → 0.7.28
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/dist/{chunk-SDSBS64X.js → chunk-NUGGW7NX.js} +232 -2
- package/dist/cli.cjs +232 -2
- package/dist/cli.js +1 -1
- package/dist/index.cjs +232 -2
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/profile.cjs +232 -2
- package/dist/profile.d.cts +19 -2
- package/dist/profile.d.ts +19 -2
- package/dist/profile.js +1 -1
- package/dist/proof-run-engine.d.cts +3 -3
- package/dist/proof-run-engine.d.ts +3 -3
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -8736,6 +8736,9 @@ var RIDDLE_PROOF_PROFILE_CHECK_TYPES = [
|
|
|
8736
8736
|
];
|
|
8737
8737
|
var RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES = [
|
|
8738
8738
|
"click",
|
|
8739
|
+
"fill",
|
|
8740
|
+
"set_input_value",
|
|
8741
|
+
"local_storage",
|
|
8739
8742
|
"wait",
|
|
8740
8743
|
"wait_for_selector",
|
|
8741
8744
|
"wait_for_text"
|
|
@@ -8749,6 +8752,18 @@ function isRecord2(value) {
|
|
|
8749
8752
|
function stringValue5(value) {
|
|
8750
8753
|
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
8751
8754
|
}
|
|
8755
|
+
function hasOwn(value, key) {
|
|
8756
|
+
return Object.prototype.hasOwnProperty.call(value, key);
|
|
8757
|
+
}
|
|
8758
|
+
function stringFromOwn(input, ...keys) {
|
|
8759
|
+
for (const key of keys) {
|
|
8760
|
+
if (hasOwn(input, key)) {
|
|
8761
|
+
const value = input[key];
|
|
8762
|
+
if (value !== void 0 && value !== null) return String(value);
|
|
8763
|
+
}
|
|
8764
|
+
}
|
|
8765
|
+
return void 0;
|
|
8766
|
+
}
|
|
8752
8767
|
function numberValue3(value) {
|
|
8753
8768
|
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
8754
8769
|
}
|
|
@@ -8833,6 +8848,11 @@ function jsonRecord(value) {
|
|
|
8833
8848
|
if (!isRecord2(value)) return void 0;
|
|
8834
8849
|
return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, toJsonValue(child)]));
|
|
8835
8850
|
}
|
|
8851
|
+
function stringRecord(value) {
|
|
8852
|
+
if (!isRecord2(value)) return void 0;
|
|
8853
|
+
const entries = Object.entries(value).map(([key, child]) => [key, String(child)]).filter(([key]) => key.trim());
|
|
8854
|
+
return entries.length ? Object.fromEntries(entries) : void 0;
|
|
8855
|
+
}
|
|
8836
8856
|
function toJsonValue(value) {
|
|
8837
8857
|
if (value === null || value === void 0) return null;
|
|
8838
8858
|
if (typeof value === "string" || typeof value === "boolean") return value;
|
|
@@ -8880,15 +8900,30 @@ function normalizeSetupAction(input, index) {
|
|
|
8880
8900
|
if (!isRecord2(input)) throw new Error(`target.setup_actions[${index}] must be an object.`);
|
|
8881
8901
|
const type = normalizeSetupActionType(stringValue5(input.type), index);
|
|
8882
8902
|
const selector = stringValue5(input.selector);
|
|
8883
|
-
if ((type === "click" || type === "wait_for_selector" || type === "wait_for_text") && !selector) {
|
|
8903
|
+
if ((type === "click" || type === "fill" || type === "set_input_value" || type === "wait_for_selector" || type === "wait_for_text") && !selector) {
|
|
8884
8904
|
throw new Error(`target.setup_actions[${index}] ${type} requires selector.`);
|
|
8885
8905
|
}
|
|
8886
8906
|
if (type === "wait_for_text" && !stringValue5(input.text) && !stringValue5(input.pattern)) {
|
|
8887
8907
|
throw new Error(`target.setup_actions[${index}] wait_for_text requires text or pattern.`);
|
|
8888
8908
|
}
|
|
8909
|
+
const value = stringFromOwn(input, "value", "input_value", "inputValue");
|
|
8910
|
+
const hasJsonValue = hasOwn(input, "value_json") || hasOwn(input, "valueJson") || hasOwn(input, "json");
|
|
8911
|
+
if ((type === "fill" || type === "set_input_value") && value === void 0 && !hasJsonValue) {
|
|
8912
|
+
throw new Error(`target.setup_actions[${index}] ${type} requires value.`);
|
|
8913
|
+
}
|
|
8914
|
+
const key = stringValue5(input.key);
|
|
8915
|
+
if (type === "local_storage" && !key) {
|
|
8916
|
+
throw new Error(`target.setup_actions[${index}] local_storage requires key.`);
|
|
8917
|
+
}
|
|
8918
|
+
if (type === "local_storage" && value === void 0 && !hasJsonValue) {
|
|
8919
|
+
throw new Error(`target.setup_actions[${index}] local_storage requires value.`);
|
|
8920
|
+
}
|
|
8889
8921
|
return {
|
|
8890
8922
|
type,
|
|
8891
8923
|
selector,
|
|
8924
|
+
key,
|
|
8925
|
+
value,
|
|
8926
|
+
value_json: hasJsonValue ? toJsonValue(input.value_json ?? input.valueJson ?? input.json) : void 0,
|
|
8892
8927
|
text: stringValue5(input.text),
|
|
8893
8928
|
pattern: stringValue5(input.pattern),
|
|
8894
8929
|
flags: stringValue5(input.flags),
|
|
@@ -8896,6 +8931,7 @@ function normalizeSetupAction(input, index) {
|
|
|
8896
8931
|
ms: numberValue3(input.ms) ?? numberValue3(input.wait_ms) ?? numberValue3(input.waitMs),
|
|
8897
8932
|
timeout_ms: numberValue3(input.timeout_ms) ?? numberValue3(input.timeoutMs),
|
|
8898
8933
|
after_ms: numberValue3(input.after_ms) ?? numberValue3(input.afterMs),
|
|
8934
|
+
reload: input.reload === true,
|
|
8899
8935
|
continue_on_failure: input.continue_on_failure === true || input.continueOnFailure === true
|
|
8900
8936
|
};
|
|
8901
8937
|
}
|
|
@@ -8904,6 +8940,33 @@ function normalizeSetupActions(value) {
|
|
|
8904
8940
|
if (!Array.isArray(value)) throw new Error("target.setup_actions must be an array.");
|
|
8905
8941
|
return value.map(normalizeSetupAction);
|
|
8906
8942
|
}
|
|
8943
|
+
function normalizeNetworkMock(input, index) {
|
|
8944
|
+
if (!isRecord2(input)) throw new Error(`target.network_mocks[${index}] must be an object.`);
|
|
8945
|
+
const url = stringValue5(input.url) || stringValue5(input.glob) || stringValue5(input.pattern);
|
|
8946
|
+
if (!url) throw new Error(`target.network_mocks[${index}] requires url.`);
|
|
8947
|
+
const status = numberValue3(input.status) ?? 200;
|
|
8948
|
+
if (!Number.isInteger(status) || status < 100 || status > 599) {
|
|
8949
|
+
throw new Error(`target.network_mocks[${index}].status must be an HTTP status code.`);
|
|
8950
|
+
}
|
|
8951
|
+
const body = stringValue5(input.body) ?? stringValue5(input.body_text) ?? stringValue5(input.bodyText);
|
|
8952
|
+
const hasJsonBody = Object.prototype.hasOwnProperty.call(input, "body_json") || Object.prototype.hasOwnProperty.call(input, "bodyJson") || Object.prototype.hasOwnProperty.call(input, "json");
|
|
8953
|
+
return {
|
|
8954
|
+
label: normalizeName(input.label || input.name, `network-mock-${index + 1}`),
|
|
8955
|
+
url,
|
|
8956
|
+
method: stringValue5(input.method)?.toUpperCase(),
|
|
8957
|
+
status,
|
|
8958
|
+
content_type: stringValue5(input.content_type) || stringValue5(input.contentType),
|
|
8959
|
+
headers: stringRecord(input.headers),
|
|
8960
|
+
body,
|
|
8961
|
+
body_json: hasJsonBody ? toJsonValue(input.body_json ?? input.bodyJson ?? input.json) : void 0,
|
|
8962
|
+
required: input.required === false ? false : true
|
|
8963
|
+
};
|
|
8964
|
+
}
|
|
8965
|
+
function normalizeNetworkMocks(value) {
|
|
8966
|
+
if (value === void 0) return void 0;
|
|
8967
|
+
if (!Array.isArray(value)) throw new Error("target.network_mocks must be an array.");
|
|
8968
|
+
return value.map(normalizeNetworkMock);
|
|
8969
|
+
}
|
|
8907
8970
|
function normalizeCheck(input, index) {
|
|
8908
8971
|
if (!isRecord2(input)) throw new Error(`checks[${index}] must be an object.`);
|
|
8909
8972
|
const type = stringValue5(input.type);
|
|
@@ -8973,7 +9036,8 @@ function normalizeRiddleProofProfile(input, options = {}) {
|
|
|
8973
9036
|
timeout_sec: timeoutSecValue(targetInput.timeout_sec) ?? timeoutSecValue(targetInput.timeoutSec) ?? timeoutSecValue(targetInput.riddle_timeout_sec) ?? timeoutSecValue(targetInput.riddleTimeoutSec),
|
|
8974
9037
|
wait_for_selector: stringValue5(targetInput.wait_for_selector) || stringValue5(targetInput.waitForSelector),
|
|
8975
9038
|
wait_ms: numberValue3(targetInput.wait_ms) ?? numberValue3(targetInput.waitMs),
|
|
8976
|
-
setup_actions: normalizeSetupActions(targetInput.setup_actions ?? targetInput.setupActions)
|
|
9039
|
+
setup_actions: normalizeSetupActions(targetInput.setup_actions ?? targetInput.setupActions),
|
|
9040
|
+
network_mocks: normalizeNetworkMocks(targetInput.network_mocks ?? targetInput.networkMocks)
|
|
8977
9041
|
},
|
|
8978
9042
|
checks,
|
|
8979
9043
|
artifacts: Array.isArray(input.artifacts) ? input.artifacts.map((item) => String(item)).filter(Boolean) : ["screenshot", "console", "dom_summary", "proof_json"],
|
|
@@ -9245,6 +9309,50 @@ function assessSetupActionsFromEvidence(profile, evidence) {
|
|
|
9245
9309
|
message: failed.length ? `Setup actions failed in ${failed.length} viewport action(s).` : void 0
|
|
9246
9310
|
};
|
|
9247
9311
|
}
|
|
9312
|
+
function assessNetworkMocksFromEvidence(profile, evidence) {
|
|
9313
|
+
const mocks = profile.target.network_mocks || [];
|
|
9314
|
+
if (!mocks.length) return void 0;
|
|
9315
|
+
const events = evidence.network_mocks || [];
|
|
9316
|
+
const failed = [];
|
|
9317
|
+
const requiredMocks = mocks.filter((mock) => mock.required !== false);
|
|
9318
|
+
for (const mock of requiredMocks) {
|
|
9319
|
+
const hits = events.filter((event) => event.label === mock.label && event.ok !== false).length;
|
|
9320
|
+
if (hits < 1) {
|
|
9321
|
+
failed.push({
|
|
9322
|
+
label: mock.label,
|
|
9323
|
+
url: mock.url,
|
|
9324
|
+
method: mock.method || null,
|
|
9325
|
+
reason: "required_mock_not_hit"
|
|
9326
|
+
});
|
|
9327
|
+
}
|
|
9328
|
+
}
|
|
9329
|
+
for (const event of events) {
|
|
9330
|
+
if (event.ok === false) {
|
|
9331
|
+
failed.push({
|
|
9332
|
+
label: event.label ?? null,
|
|
9333
|
+
url: event.url ?? null,
|
|
9334
|
+
method: event.method ?? null,
|
|
9335
|
+
reason: event.reason ?? event.error ?? "mock_failed"
|
|
9336
|
+
});
|
|
9337
|
+
}
|
|
9338
|
+
}
|
|
9339
|
+
return {
|
|
9340
|
+
type: "network_mocks_succeeded",
|
|
9341
|
+
label: "network mocks succeeded",
|
|
9342
|
+
status: failed.length ? "failed" : "passed",
|
|
9343
|
+
evidence: {
|
|
9344
|
+
mock_count: mocks.length,
|
|
9345
|
+
required_count: requiredMocks.length,
|
|
9346
|
+
hit_count: events.filter((event) => event.ok !== false).length,
|
|
9347
|
+
hits_by_label: Object.fromEntries(mocks.map((mock) => [
|
|
9348
|
+
mock.label,
|
|
9349
|
+
events.filter((event) => event.label === mock.label && event.ok !== false).length
|
|
9350
|
+
])),
|
|
9351
|
+
failed
|
|
9352
|
+
},
|
|
9353
|
+
message: failed.length ? `Network mocks failed or were not hit for ${failed.length} mock(s).` : void 0
|
|
9354
|
+
};
|
|
9355
|
+
}
|
|
9248
9356
|
function profileStatusFromEvidence(profile, evidence, checks) {
|
|
9249
9357
|
if (!evidence) return "proof_insufficient";
|
|
9250
9358
|
const viewports = evidence.viewports || [];
|
|
@@ -9259,6 +9367,7 @@ function profileStatusFromEvidence(profile, evidence, checks) {
|
|
|
9259
9367
|
function assessRiddleProofProfileEvidence(profile, evidence, options = {}) {
|
|
9260
9368
|
const capturedAt = evidence?.captured_at || (/* @__PURE__ */ new Date()).toISOString();
|
|
9261
9369
|
const checks = evidence ? [
|
|
9370
|
+
assessNetworkMocksFromEvidence(profile, evidence),
|
|
9262
9371
|
assessSetupActionsFromEvidence(profile, evidence),
|
|
9263
9372
|
...profile.checks.map((check) => assessCheckFromEvidence(check, evidence))
|
|
9264
9373
|
].filter((check) => Boolean(check)) : [];
|
|
@@ -9475,6 +9584,49 @@ function horizontalBoundsOverflowPx(value) {
|
|
|
9475
9584
|
function assessProfile(profile, evidence) {
|
|
9476
9585
|
const checks = [];
|
|
9477
9586
|
const viewports = evidence.viewports || [];
|
|
9587
|
+
if (profile.target && Array.isArray(profile.target.network_mocks) && profile.target.network_mocks.length) {
|
|
9588
|
+
const events = evidence.network_mocks || [];
|
|
9589
|
+
const requiredMocks = profile.target.network_mocks.filter((mock) => mock && mock.required !== false);
|
|
9590
|
+
const failed = [];
|
|
9591
|
+
for (const mock of requiredMocks) {
|
|
9592
|
+
const hits = events.filter((event) => event && event.label === mock.label && event.ok !== false).length;
|
|
9593
|
+
if (hits < 1) {
|
|
9594
|
+
failed.push({
|
|
9595
|
+
label: mock.label,
|
|
9596
|
+
url: mock.url,
|
|
9597
|
+
method: mock.method || null,
|
|
9598
|
+
reason: "required_mock_not_hit",
|
|
9599
|
+
});
|
|
9600
|
+
}
|
|
9601
|
+
}
|
|
9602
|
+
for (const event of events) {
|
|
9603
|
+
if (event && event.ok === false) {
|
|
9604
|
+
failed.push({
|
|
9605
|
+
label: event.label || null,
|
|
9606
|
+
url: event.url || null,
|
|
9607
|
+
method: event.method || null,
|
|
9608
|
+
reason: event.reason || event.error || "mock_failed",
|
|
9609
|
+
});
|
|
9610
|
+
}
|
|
9611
|
+
}
|
|
9612
|
+
const hitsByLabel = {};
|
|
9613
|
+
for (const mock of profile.target.network_mocks) {
|
|
9614
|
+
hitsByLabel[mock.label] = events.filter((event) => event && event.label === mock.label && event.ok !== false).length;
|
|
9615
|
+
}
|
|
9616
|
+
checks.push({
|
|
9617
|
+
type: "network_mocks_succeeded",
|
|
9618
|
+
label: "network mocks succeeded",
|
|
9619
|
+
status: failed.length ? "failed" : "passed",
|
|
9620
|
+
evidence: {
|
|
9621
|
+
mock_count: profile.target.network_mocks.length,
|
|
9622
|
+
required_count: requiredMocks.length,
|
|
9623
|
+
hit_count: events.filter((event) => event && event.ok !== false).length,
|
|
9624
|
+
hits_by_label: hitsByLabel,
|
|
9625
|
+
failed,
|
|
9626
|
+
},
|
|
9627
|
+
message: failed.length ? "Network mocks failed or were not hit for " + failed.length + " mock(s)." : undefined,
|
|
9628
|
+
});
|
|
9629
|
+
}
|
|
9478
9630
|
if (profile.target && Array.isArray(profile.target.setup_actions) && profile.target.setup_actions.length) {
|
|
9479
9631
|
const actionCount = profile.target.setup_actions.length;
|
|
9480
9632
|
const failed = [];
|
|
@@ -9664,6 +9816,7 @@ const profileSlug = ${serializableSlug};
|
|
|
9664
9816
|
const capturedAt = new Date().toISOString();
|
|
9665
9817
|
const consoleEvents = [];
|
|
9666
9818
|
const pageErrors = [];
|
|
9819
|
+
const networkMockEvents = [];
|
|
9667
9820
|
page.on("console", (message) => {
|
|
9668
9821
|
const type = message.type();
|
|
9669
9822
|
if (type === "error" || type === "warning" || type === "assert") {
|
|
@@ -9699,6 +9852,14 @@ function setupTextMatches(sample, action) {
|
|
|
9699
9852
|
}
|
|
9700
9853
|
return String(sample || "").includes(action.text || "");
|
|
9701
9854
|
}
|
|
9855
|
+
function setupHasOwn(action, key) {
|
|
9856
|
+
return Boolean(action) && Object.keys(action).includes(key);
|
|
9857
|
+
}
|
|
9858
|
+
function setupActionValue(action) {
|
|
9859
|
+
if (setupHasOwn(action, "value_json")) return JSON.stringify(action.value_json);
|
|
9860
|
+
if (setupHasOwn(action, "value")) return String(action.value ?? "");
|
|
9861
|
+
return "";
|
|
9862
|
+
}
|
|
9702
9863
|
async function setupLocatorText(locator, index) {
|
|
9703
9864
|
return await locator.nth(index).textContent({ timeout: 1000 }).catch(() => "");
|
|
9704
9865
|
}
|
|
@@ -9710,6 +9871,49 @@ function compactSetupResultText(value) {
|
|
|
9710
9871
|
async function setupLocatorVisible(locator, index) {
|
|
9711
9872
|
return await locator.nth(index).isVisible({ timeout: 1000 }).catch(() => false);
|
|
9712
9873
|
}
|
|
9874
|
+
async function registerNetworkMocks(mocks) {
|
|
9875
|
+
for (const mock of mocks || []) {
|
|
9876
|
+
await page.route(mock.url, async (route) => {
|
|
9877
|
+
const request = route.request();
|
|
9878
|
+
const method = request.method ? request.method() : "";
|
|
9879
|
+
if (mock.method && method.toUpperCase() !== String(mock.method).toUpperCase()) {
|
|
9880
|
+
await route.continue();
|
|
9881
|
+
return;
|
|
9882
|
+
}
|
|
9883
|
+
try {
|
|
9884
|
+
const headers = { ...(mock.headers || {}) };
|
|
9885
|
+
let body = mock.body || "";
|
|
9886
|
+
let contentType = mock.content_type || headers["content-type"] || headers["Content-Type"] || "text/plain";
|
|
9887
|
+
if (mock.body_json !== undefined) {
|
|
9888
|
+
body = JSON.stringify(mock.body_json);
|
|
9889
|
+
contentType = mock.content_type || headers["content-type"] || headers["Content-Type"] || "application/json";
|
|
9890
|
+
}
|
|
9891
|
+
networkMockEvents.push({
|
|
9892
|
+
ok: true,
|
|
9893
|
+
label: mock.label,
|
|
9894
|
+
url: request.url(),
|
|
9895
|
+
method,
|
|
9896
|
+
status: mock.status || 200,
|
|
9897
|
+
});
|
|
9898
|
+
await route.fulfill({
|
|
9899
|
+
status: mock.status || 200,
|
|
9900
|
+
headers,
|
|
9901
|
+
contentType,
|
|
9902
|
+
body,
|
|
9903
|
+
});
|
|
9904
|
+
} catch (error) {
|
|
9905
|
+
networkMockEvents.push({
|
|
9906
|
+
ok: false,
|
|
9907
|
+
label: mock.label,
|
|
9908
|
+
url: request.url(),
|
|
9909
|
+
method,
|
|
9910
|
+
error: String(error && error.message ? error.message : error).slice(0, 1000),
|
|
9911
|
+
});
|
|
9912
|
+
throw error;
|
|
9913
|
+
}
|
|
9914
|
+
});
|
|
9915
|
+
}
|
|
9916
|
+
}
|
|
9713
9917
|
async function executeSetupAction(action, ordinal) {
|
|
9714
9918
|
const type = setupActionType(action);
|
|
9715
9919
|
const base = { ok: false, action: type || "unknown", ordinal, selector: action.selector || null };
|
|
@@ -9724,6 +9928,16 @@ async function executeSetupAction(action, ordinal) {
|
|
|
9724
9928
|
await page.waitForSelector(action.selector, { state: "visible", timeout });
|
|
9725
9929
|
return { ...base, ok: true, timeout_ms: timeout };
|
|
9726
9930
|
}
|
|
9931
|
+
if (type === "local_storage") {
|
|
9932
|
+
const value = setupActionValue(action);
|
|
9933
|
+
await page.evaluate(({ key, value }) => {
|
|
9934
|
+
window.localStorage.setItem(key, value);
|
|
9935
|
+
}, { key: action.key, value });
|
|
9936
|
+
if (action.reload === true) {
|
|
9937
|
+
await page.reload({ waitUntil: "domcontentloaded", timeout: 45000 });
|
|
9938
|
+
}
|
|
9939
|
+
return { ...base, ok: true, key: action.key, value_length: value.length, reload: action.reload === true };
|
|
9940
|
+
}
|
|
9727
9941
|
if (type === "click") {
|
|
9728
9942
|
const locator = page.locator(action.selector);
|
|
9729
9943
|
const count = await locator.count();
|
|
@@ -9756,6 +9970,16 @@ async function executeSetupAction(action, ordinal) {
|
|
|
9756
9970
|
await locator.nth(targetIndex).click({ timeout });
|
|
9757
9971
|
return { ...base, ok: true, count, target_index: targetIndex, text: matchedText };
|
|
9758
9972
|
}
|
|
9973
|
+
if (type === "fill" || type === "set_input_value") {
|
|
9974
|
+
const locator = page.locator(action.selector);
|
|
9975
|
+
const count = await locator.count();
|
|
9976
|
+
if (!count) return { ...base, reason: "selector_not_found", count };
|
|
9977
|
+
const targetIndex = Number.isInteger(action.index) ? action.index : 0;
|
|
9978
|
+
if (targetIndex < 0 || targetIndex >= count) return { ...base, reason: "index_out_of_range", count, target_index: targetIndex };
|
|
9979
|
+
const value = setupActionValue(action);
|
|
9980
|
+
await locator.nth(targetIndex).fill(value, { timeout });
|
|
9981
|
+
return { ...base, ok: true, count, target_index: targetIndex, value_length: value.length };
|
|
9982
|
+
}
|
|
9759
9983
|
if (type === "wait_for_text") {
|
|
9760
9984
|
const locator = page.locator(action.selector);
|
|
9761
9985
|
const startedAt = Date.now();
|
|
@@ -9971,6 +10195,7 @@ function buildProfileEvidence(currentViewports) {
|
|
|
9971
10195
|
fatal_count: consoleEvents.filter((event) => event.type === "error" || event.type === "assert").length,
|
|
9972
10196
|
},
|
|
9973
10197
|
page_errors: pageErrors,
|
|
10198
|
+
network_mocks: networkMockEvents.slice(),
|
|
9974
10199
|
dom_summary: {
|
|
9975
10200
|
expected_viewport_count: expectedViewportCount,
|
|
9976
10201
|
viewport_count: currentViewports.length,
|
|
@@ -9980,6 +10205,8 @@ function buildProfileEvidence(currentViewports) {
|
|
|
9980
10205
|
overflow_px: currentViewports.map((viewport) => viewport.overflow_px),
|
|
9981
10206
|
bounds_overflow_px: currentViewports.map((viewport) => viewport.bounds_overflow_px),
|
|
9982
10207
|
overflow_offender_counts: currentViewports.map((viewport) => (viewport.overflow_offenders || []).length),
|
|
10208
|
+
network_mock_count: (profile.target.network_mocks || []).length,
|
|
10209
|
+
network_mock_hit_count: networkMockEvents.filter((event) => event.ok !== false).length,
|
|
9983
10210
|
},
|
|
9984
10211
|
};
|
|
9985
10212
|
}
|
|
@@ -9993,6 +10220,9 @@ async function saveProfileArtifacts(currentViewports) {
|
|
|
9993
10220
|
}
|
|
9994
10221
|
return result;
|
|
9995
10222
|
}
|
|
10223
|
+
await registerNetworkMocks(profile.target.network_mocks || []);
|
|
10224
|
+
consoleEvents.length = 0;
|
|
10225
|
+
pageErrors.length = 0;
|
|
9996
10226
|
let result = await saveProfileArtifacts(viewports);
|
|
9997
10227
|
for (const viewport of profile.target.viewports || []) {
|
|
9998
10228
|
viewports.push(await captureViewport(viewport));
|
package/dist/index.d.cts
CHANGED
|
@@ -10,5 +10,5 @@ export { CreateCaptureDiagnosticInput, DEFAULT_DIAGNOSTIC_ARRAY_LIMIT, DEFAULT_D
|
|
|
10
10
|
export { BuildVisualProofSessionInput, RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION, RIDDLE_PROOF_VISUAL_SESSION_VERSION, VisualProofSessionMismatch, buildVisualProofSession, compareVisualProofSessionFingerprint, parseVisualProofSession, visualSessionFingerprint, visualSessionFingerprintBasis } from './proof-session.cjs';
|
|
11
11
|
export { AssessPlayabilityOptions, RIDDLE_PROOF_PLAYABILITY_ASSESSMENT_VERSION, RIDDLE_PROOF_PLAYABILITY_VERSION, RiddleProofPlayabilityAssessment, RiddleProofPlayabilityEvidence, assessPlayabilityEvidence, extractPlayabilityEvidence, isRiddleProofPlayabilityMode } from './playability.cjs';
|
|
12
12
|
export { AssessBasicGameplayOptions, AttachBasicGameplayArtifactOptions, BASIC_GAMEPLAY_ACTION_TYPES, BASIC_GAMEPLAY_PROGRESS_CHECK_TYPES, BasicGameplayActionResult, BasicGameplayActionType, BasicGameplayArtifactResolution, BasicGameplayAssessmentSummary, BasicGameplayBoundsOffender, BasicGameplayCanvasState, BasicGameplayCatchRecord, BasicGameplayChangeSummary, BasicGameplayFailureCode, BasicGameplayFixReference, BasicGameplayMetric, BasicGameplayMobileEvidence, BasicGameplayProgressCheckType, BasicGameplayProgressionCheck, BasicGameplayProofArtifact, BasicGameplayResponsiveViewportEvidence, BasicGameplayRouteReference, BasicGameplaySnapshot, BasicGameplaySuiteFailure, BasicGameplayWarningCode, CreateBasicGameplayCatchSummaryInput, RIDDLE_PROOF_BASIC_GAMEPLAY_ASSESSMENT_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_CATCH_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_VERSION, RiddleProofBasicGameplayAssessment, RiddleProofBasicGameplayCatchSummary, RiddleProofBasicGameplayEvidence, RiddleProofBasicGameplayRouteAssessment, RiddleProofBasicGameplayRouteEvidence, assessBasicGameplayEvidence, assessBasicGameplayProgressionCheck, assessBasicGameplayProgressionChecks, assessBasicGameplayRoute, attachBasicGameplayArtifactScreenshotHashes, augmentBasicGameplayAssessmentWithProgressionChecks, compactBasicGameplayText, createBasicGameplayCatchRecords, createBasicGameplayCatchSummary, extractBasicGameplayEvidence, resolveBasicGameplayProgressionCheckWithArtifactScreenshots, sanitizeBasicGameplayJsonString } from './basic-gameplay.cjs';
|
|
13
|
-
export { NormalizeRiddleProofProfileOptions, RIDDLE_PROOF_PROFILE_CHECK_TYPES, RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION, RIDDLE_PROOF_PROFILE_RESULT_VERSION, RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES, RIDDLE_PROOF_PROFILE_STATUSES, RIDDLE_PROOF_PROFILE_VERSION, RiddleProofProfile, RiddleProofProfileArtifactRef, RiddleProofProfileBaselinePolicy, RiddleProofProfileBoundsOffender, RiddleProofProfileCheck, RiddleProofProfileCheckResult, RiddleProofProfileCheckType, RiddleProofProfileEvidence, RiddleProofProfileFailureAction, RiddleProofProfileResult, RiddleProofProfileRouteEvidence, RiddleProofProfileRunner, RiddleProofProfileSetupAction, RiddleProofProfileSetupActionType, RiddleProofProfileStatus, RiddleProofProfileTarget, RiddleProofProfileViewport, RiddleProofProfileViewportEvidence, assessRiddleProofProfileEvidence, buildRiddleProofProfileScript, collectRiddleProfileArtifactRefs, createRiddleProofProfileConfigurationError, createRiddleProofProfileEnvironmentBlockedResult, createRiddleProofProfileInsufficientResult, extractRiddleProofProfileResult, normalizeRiddleProofProfile, profileStatusExitCode, resolveRiddleProofProfileRouteUrl, resolveRiddleProofProfileTargetUrl, resolveRiddleProofProfileTimeoutSec, slugifyRiddleProofProfileName, summarizeRiddleProofProfileResult } from './profile.cjs';
|
|
13
|
+
export { NormalizeRiddleProofProfileOptions, RIDDLE_PROOF_PROFILE_CHECK_TYPES, RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION, RIDDLE_PROOF_PROFILE_RESULT_VERSION, RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES, RIDDLE_PROOF_PROFILE_STATUSES, RIDDLE_PROOF_PROFILE_VERSION, RiddleProofProfile, RiddleProofProfileArtifactRef, RiddleProofProfileBaselinePolicy, RiddleProofProfileBoundsOffender, RiddleProofProfileCheck, RiddleProofProfileCheckResult, RiddleProofProfileCheckType, RiddleProofProfileEvidence, RiddleProofProfileFailureAction, RiddleProofProfileNetworkMock, RiddleProofProfileResult, RiddleProofProfileRouteEvidence, RiddleProofProfileRunner, RiddleProofProfileSetupAction, RiddleProofProfileSetupActionType, RiddleProofProfileStatus, RiddleProofProfileTarget, RiddleProofProfileViewport, RiddleProofProfileViewportEvidence, assessRiddleProofProfileEvidence, buildRiddleProofProfileScript, collectRiddleProfileArtifactRefs, createRiddleProofProfileConfigurationError, createRiddleProofProfileEnvironmentBlockedResult, createRiddleProofProfileInsufficientResult, extractRiddleProofProfileResult, normalizeRiddleProofProfile, profileStatusExitCode, resolveRiddleProofProfileRouteUrl, resolveRiddleProofProfileTargetUrl, resolveRiddleProofProfileTimeoutSec, slugifyRiddleProofProfileName, summarizeRiddleProofProfileResult } from './profile.cjs';
|
|
14
14
|
export { DEFAULT_RIDDLE_API_BASE_URL, DEFAULT_RIDDLE_API_KEY_FILE, RiddleApiError, RiddleClientConfig, RiddleFetch, RiddlePollJobOptions, RiddlePollJobResult, RiddlePollProgressSnapshot, RiddlePollSummary, RiddlePreviewDeployResult, RiddleRunScriptInput, RiddleServerPreviewInput, RiddleServerPreviewResult, createRiddleApiClient, deployRiddleStaticPreview, isTerminalRiddleJobStatus, parseRiddleViewport, pollRiddleJob, resolveRiddleApiKey, riddleRequestJson, runRiddleScript, runRiddleServerPreview } from './riddle-client.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -10,5 +10,5 @@ export { CreateCaptureDiagnosticInput, DEFAULT_DIAGNOSTIC_ARRAY_LIMIT, DEFAULT_D
|
|
|
10
10
|
export { BuildVisualProofSessionInput, RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION, RIDDLE_PROOF_VISUAL_SESSION_VERSION, VisualProofSessionMismatch, buildVisualProofSession, compareVisualProofSessionFingerprint, parseVisualProofSession, visualSessionFingerprint, visualSessionFingerprintBasis } from './proof-session.js';
|
|
11
11
|
export { AssessPlayabilityOptions, RIDDLE_PROOF_PLAYABILITY_ASSESSMENT_VERSION, RIDDLE_PROOF_PLAYABILITY_VERSION, RiddleProofPlayabilityAssessment, RiddleProofPlayabilityEvidence, assessPlayabilityEvidence, extractPlayabilityEvidence, isRiddleProofPlayabilityMode } from './playability.js';
|
|
12
12
|
export { AssessBasicGameplayOptions, AttachBasicGameplayArtifactOptions, BASIC_GAMEPLAY_ACTION_TYPES, BASIC_GAMEPLAY_PROGRESS_CHECK_TYPES, BasicGameplayActionResult, BasicGameplayActionType, BasicGameplayArtifactResolution, BasicGameplayAssessmentSummary, BasicGameplayBoundsOffender, BasicGameplayCanvasState, BasicGameplayCatchRecord, BasicGameplayChangeSummary, BasicGameplayFailureCode, BasicGameplayFixReference, BasicGameplayMetric, BasicGameplayMobileEvidence, BasicGameplayProgressCheckType, BasicGameplayProgressionCheck, BasicGameplayProofArtifact, BasicGameplayResponsiveViewportEvidence, BasicGameplayRouteReference, BasicGameplaySnapshot, BasicGameplaySuiteFailure, BasicGameplayWarningCode, CreateBasicGameplayCatchSummaryInput, RIDDLE_PROOF_BASIC_GAMEPLAY_ASSESSMENT_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_CATCH_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_VERSION, RiddleProofBasicGameplayAssessment, RiddleProofBasicGameplayCatchSummary, RiddleProofBasicGameplayEvidence, RiddleProofBasicGameplayRouteAssessment, RiddleProofBasicGameplayRouteEvidence, assessBasicGameplayEvidence, assessBasicGameplayProgressionCheck, assessBasicGameplayProgressionChecks, assessBasicGameplayRoute, attachBasicGameplayArtifactScreenshotHashes, augmentBasicGameplayAssessmentWithProgressionChecks, compactBasicGameplayText, createBasicGameplayCatchRecords, createBasicGameplayCatchSummary, extractBasicGameplayEvidence, resolveBasicGameplayProgressionCheckWithArtifactScreenshots, sanitizeBasicGameplayJsonString } from './basic-gameplay.js';
|
|
13
|
-
export { NormalizeRiddleProofProfileOptions, RIDDLE_PROOF_PROFILE_CHECK_TYPES, RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION, RIDDLE_PROOF_PROFILE_RESULT_VERSION, RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES, RIDDLE_PROOF_PROFILE_STATUSES, RIDDLE_PROOF_PROFILE_VERSION, RiddleProofProfile, RiddleProofProfileArtifactRef, RiddleProofProfileBaselinePolicy, RiddleProofProfileBoundsOffender, RiddleProofProfileCheck, RiddleProofProfileCheckResult, RiddleProofProfileCheckType, RiddleProofProfileEvidence, RiddleProofProfileFailureAction, RiddleProofProfileResult, RiddleProofProfileRouteEvidence, RiddleProofProfileRunner, RiddleProofProfileSetupAction, RiddleProofProfileSetupActionType, RiddleProofProfileStatus, RiddleProofProfileTarget, RiddleProofProfileViewport, RiddleProofProfileViewportEvidence, assessRiddleProofProfileEvidence, buildRiddleProofProfileScript, collectRiddleProfileArtifactRefs, createRiddleProofProfileConfigurationError, createRiddleProofProfileEnvironmentBlockedResult, createRiddleProofProfileInsufficientResult, extractRiddleProofProfileResult, normalizeRiddleProofProfile, profileStatusExitCode, resolveRiddleProofProfileRouteUrl, resolveRiddleProofProfileTargetUrl, resolveRiddleProofProfileTimeoutSec, slugifyRiddleProofProfileName, summarizeRiddleProofProfileResult } from './profile.js';
|
|
13
|
+
export { NormalizeRiddleProofProfileOptions, RIDDLE_PROOF_PROFILE_CHECK_TYPES, RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION, RIDDLE_PROOF_PROFILE_RESULT_VERSION, RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES, RIDDLE_PROOF_PROFILE_STATUSES, RIDDLE_PROOF_PROFILE_VERSION, RiddleProofProfile, RiddleProofProfileArtifactRef, RiddleProofProfileBaselinePolicy, RiddleProofProfileBoundsOffender, RiddleProofProfileCheck, RiddleProofProfileCheckResult, RiddleProofProfileCheckType, RiddleProofProfileEvidence, RiddleProofProfileFailureAction, RiddleProofProfileNetworkMock, RiddleProofProfileResult, RiddleProofProfileRouteEvidence, RiddleProofProfileRunner, RiddleProofProfileSetupAction, RiddleProofProfileSetupActionType, RiddleProofProfileStatus, RiddleProofProfileTarget, RiddleProofProfileViewport, RiddleProofProfileViewportEvidence, assessRiddleProofProfileEvidence, buildRiddleProofProfileScript, collectRiddleProfileArtifactRefs, createRiddleProofProfileConfigurationError, createRiddleProofProfileEnvironmentBlockedResult, createRiddleProofProfileInsufficientResult, extractRiddleProofProfileResult, normalizeRiddleProofProfile, profileStatusExitCode, resolveRiddleProofProfileRouteUrl, resolveRiddleProofProfileTargetUrl, resolveRiddleProofProfileTimeoutSec, slugifyRiddleProofProfileName, summarizeRiddleProofProfileResult } from './profile.js';
|
|
14
14
|
export { DEFAULT_RIDDLE_API_BASE_URL, DEFAULT_RIDDLE_API_KEY_FILE, RiddleApiError, RiddleClientConfig, RiddleFetch, RiddlePollJobOptions, RiddlePollJobResult, RiddlePollProgressSnapshot, RiddlePollSummary, RiddlePreviewDeployResult, RiddleRunScriptInput, RiddleServerPreviewInput, RiddleServerPreviewResult, createRiddleApiClient, deployRiddleStaticPreview, isTerminalRiddleJobStatus, parseRiddleViewport, pollRiddleJob, resolveRiddleApiKey, riddleRequestJson, runRiddleScript, runRiddleServerPreview } from './riddle-client.js';
|
package/dist/index.js
CHANGED
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
resolveRiddleProofProfileTimeoutSec,
|
|
59
59
|
slugifyRiddleProofProfileName,
|
|
60
60
|
summarizeRiddleProofProfileResult
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-NUGGW7NX.js";
|
|
62
62
|
import {
|
|
63
63
|
DEFAULT_RIDDLE_API_BASE_URL,
|
|
64
64
|
DEFAULT_RIDDLE_API_KEY_FILE,
|