Some checks failed
Main Confidence / confidence (push) Failing after 45s
## Summary - introduce surface-aware compressed governance outcomes and reuse the shared truth/explanation seams for operator-first summaries - apply the compressed outcome hierarchy across baseline, evidence, review, review-pack, canonical review/evidence, and artifact-oriented operation-run surfaces - expand spec 214 fixtures and Pest coverage, and fix tenant-panel route assertions by generating explicit tenant-panel URLs in the affected Filament tests ## Validation - `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` - focused governance compression suite from `specs/214-governance-outcome-compression/quickstart.md` passed (`68` tests, `445` assertions) - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Filament/InventoryItemResourceTest.php tests/Feature/Filament/BackupSetUiEnforcementTest.php tests/Feature/Filament/RestoreRunUiEnforcementTest.php` passed (`18` tests, `81` assertions) Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #253
158 lines
6.0 KiB
Plaintext
158 lines
6.0 KiB
Plaintext
"use strict";
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __export = (target, all) => {
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
var __copyProps = (to, from, except, desc) => {
|
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
for (let key of __getOwnPropNames(from))
|
|
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
}
|
|
return to;
|
|
};
|
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
var recorderUtils_exports = {};
|
|
__export(recorderUtils_exports, {
|
|
buildFullSelector: () => buildFullSelector,
|
|
collapseActions: () => collapseActions,
|
|
frameForAction: () => frameForAction,
|
|
generateFrameSelector: () => generateFrameSelector,
|
|
mainFrameForAction: () => mainFrameForAction,
|
|
metadataToCallLog: () => metadataToCallLog,
|
|
shouldMergeAction: () => shouldMergeAction
|
|
});
|
|
module.exports = __toCommonJS(recorderUtils_exports);
|
|
var import_protocolFormatter = require("../../utils/isomorphic/protocolFormatter");
|
|
var import_utils = require("../../utils");
|
|
var import_timeoutRunner = require("../../utils/isomorphic/timeoutRunner");
|
|
function buildFullSelector(framePath, selector) {
|
|
return [...framePath, selector].join(" >> internal:control=enter-frame >> ");
|
|
}
|
|
function metadataToCallLog(metadata, status) {
|
|
const title = (0, import_protocolFormatter.renderTitleForCall)(metadata);
|
|
if (metadata.error)
|
|
status = "error";
|
|
const params = {
|
|
url: metadata.params?.url,
|
|
selector: metadata.params?.selector
|
|
};
|
|
let duration = metadata.endTime ? metadata.endTime - metadata.startTime : void 0;
|
|
if (typeof duration === "number" && metadata.pauseStartTime && metadata.pauseEndTime) {
|
|
duration -= metadata.pauseEndTime - metadata.pauseStartTime;
|
|
duration = Math.max(duration, 0);
|
|
}
|
|
const callLog = {
|
|
id: metadata.id,
|
|
messages: metadata.log,
|
|
title: title ?? "",
|
|
status,
|
|
error: metadata.error?.error?.message,
|
|
params,
|
|
duration
|
|
};
|
|
return callLog;
|
|
}
|
|
function mainFrameForAction(pageAliases, actionInContext) {
|
|
const pageAlias = actionInContext.frame.pageAlias;
|
|
const page = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)?.[0];
|
|
if (!page)
|
|
throw new Error(`Internal error: page ${pageAlias} not found in [${[...pageAliases.values()]}]`);
|
|
return page.mainFrame();
|
|
}
|
|
async function frameForAction(pageAliases, actionInContext, action) {
|
|
const pageAlias = actionInContext.frame.pageAlias;
|
|
const page = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)?.[0];
|
|
if (!page)
|
|
throw new Error("Internal error: page not found");
|
|
const fullSelector = buildFullSelector(actionInContext.frame.framePath, action.selector);
|
|
const result = await page.mainFrame().selectors.resolveFrameForSelector(fullSelector);
|
|
if (!result)
|
|
throw new Error("Internal error: frame not found");
|
|
return result.frame;
|
|
}
|
|
function isSameAction(a, b) {
|
|
return a.action.name === b.action.name && a.frame.pageAlias === b.frame.pageAlias && a.frame.framePath.join("|") === b.frame.framePath.join("|");
|
|
}
|
|
function isSameSelector(action, lastAction) {
|
|
return "selector" in action.action && "selector" in lastAction.action && action.action.selector === lastAction.action.selector;
|
|
}
|
|
function isShortlyAfter(action, lastAction) {
|
|
return action.startTime - lastAction.startTime < 500;
|
|
}
|
|
function shouldMergeAction(action, lastAction) {
|
|
if (!lastAction)
|
|
return false;
|
|
switch (action.action.name) {
|
|
case "fill":
|
|
return isSameAction(action, lastAction) && isSameSelector(action, lastAction);
|
|
case "navigate":
|
|
return isSameAction(action, lastAction);
|
|
case "click":
|
|
return isSameAction(action, lastAction) && isSameSelector(action, lastAction) && isShortlyAfter(action, lastAction) && action.action.clickCount > lastAction.action.clickCount;
|
|
}
|
|
return false;
|
|
}
|
|
function collapseActions(actions) {
|
|
const result = [];
|
|
for (const action of actions) {
|
|
const lastAction = result[result.length - 1];
|
|
const shouldMerge = shouldMergeAction(action, lastAction);
|
|
if (!shouldMerge) {
|
|
result.push(action);
|
|
continue;
|
|
}
|
|
const startTime = result[result.length - 1].startTime;
|
|
result[result.length - 1] = action;
|
|
result[result.length - 1].startTime = startTime;
|
|
}
|
|
return result;
|
|
}
|
|
async function generateFrameSelector(frame) {
|
|
const selectorPromises = [];
|
|
while (frame) {
|
|
const parent = frame.parentFrame();
|
|
if (!parent)
|
|
break;
|
|
selectorPromises.push(generateFrameSelectorInParent(parent, frame));
|
|
frame = parent;
|
|
}
|
|
const result = await Promise.all(selectorPromises);
|
|
return result.reverse();
|
|
}
|
|
async function generateFrameSelectorInParent(parent, frame) {
|
|
const result = await (0, import_timeoutRunner.raceAgainstDeadline)(async () => {
|
|
try {
|
|
const frameElement = await frame.frameElement();
|
|
if (!frameElement || !parent)
|
|
return;
|
|
const utility = await parent._utilityContext();
|
|
const injected = await utility.injectedScript();
|
|
const selector = await injected.evaluate((injected2, element) => {
|
|
return injected2.generateSelectorSimple(element);
|
|
}, frameElement);
|
|
return selector;
|
|
} catch (e) {
|
|
}
|
|
}, (0, import_utils.monotonicTime)() + 2e3);
|
|
if (!result.timedOut && result.result)
|
|
return result.result;
|
|
if (frame.name())
|
|
return `iframe[name=${(0, import_utils.quoteCSSAttributeValue)(frame.name())}]`;
|
|
return `iframe[src=${(0, import_utils.quoteCSSAttributeValue)(frame.url())}]`;
|
|
}
|
|
// Annotate the CommonJS export names for ESM import in node:
|
|
0 && (module.exports = {
|
|
buildFullSelector,
|
|
collapseActions,
|
|
frameForAction,
|
|
generateFrameSelector,
|
|
mainFrameForAction,
|
|
metadataToCallLog,
|
|
shouldMergeAction
|
|
});
|