@ia-qa/self-healing 0.9.0 → 0.10.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/README.md +35 -2
- package/TUTORIAL.md +25 -0
- package/dist/aom.d.ts +11 -0
- package/dist/aom.js +16 -1
- package/dist/aom.js.map +1 -1
- package/dist/browser/contract.js +40 -8
- package/dist/browser/contract.js.map +1 -1
- package/dist/browser/extract.js +67 -6
- package/dist/browser/extract.js.map +1 -1
- package/dist/browser/match.d.ts +2 -1
- package/dist/browser/match.js +14 -10
- package/dist/browser/match.js.map +1 -1
- package/dist/captureMerge.d.ts +35 -0
- package/dist/captureMerge.js +152 -0
- package/dist/captureMerge.js.map +1 -0
- package/dist/cli/baseline.js +2 -0
- package/dist/cli/baseline.js.map +1 -1
- package/dist/cli/diff.d.ts +71 -0
- package/dist/cli/diff.js +119 -41
- package/dist/cli/diff.js.map +1 -1
- package/dist/cli/fix.js +27 -4
- package/dist/cli/fix.js.map +1 -1
- package/dist/cli/index.js +20 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ingest.d.ts +13 -0
- package/dist/cli/ingest.js +105 -0
- package/dist/cli/ingest.js.map +1 -0
- package/dist/cli/init.js +21 -0
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/run.d.ts +15 -0
- package/dist/cli/run.js +157 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.js.map +1 -1
- package/dist/fixEngine.d.ts +2 -0
- package/dist/fixEngine.js +3 -2
- package/dist/fixEngine.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/ingest.d.ts +46 -0
- package/dist/ingest.js +0 -0
- package/dist/ingest.js.map +1 -0
- package/dist/mapUrl.d.ts +1 -1
- package/dist/mapUrl.js +5 -13
- package/dist/mapUrl.js.map +1 -1
- package/dist/pageName.d.ts +31 -0
- package/dist/pageName.js +38 -0
- package/dist/pageName.js.map +1 -0
- package/dist/playwright/capture.d.ts +27 -0
- package/dist/playwright/capture.js +187 -0
- package/dist/playwright/capture.js.map +1 -0
- package/dist/playwright/healer.js +14 -15
- package/dist/playwright/healer.js.map +1 -1
- package/package.json +16 -1
package/dist/fixEngine.js
CHANGED
|
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PW_ACTIONS = void 0;
|
|
36
37
|
exports.computeLocatorRewrites = computeLocatorRewrites;
|
|
37
38
|
exports.locatorExpression = locatorExpression;
|
|
38
39
|
exports.computeRewrites = computeRewrites;
|
|
@@ -85,7 +86,7 @@ function locatorExpression(t) {
|
|
|
85
86
|
return `getByRole('${t.role}', { name: ${JSON.stringify(t.name)}, exact: true })`;
|
|
86
87
|
}
|
|
87
88
|
/** Playwright shorthands that take a selector as their first argument. */
|
|
88
|
-
|
|
89
|
+
exports.PW_ACTIONS = [
|
|
89
90
|
'click', 'dblclick', 'fill', 'check', 'uncheck', 'hover', 'focus',
|
|
90
91
|
'press', 'type', 'selectOption', 'tap', 'clear', 'setInputFiles', 'textContent', 'inputValue', 'isVisible', 'isChecked', 'isEnabled', 'getAttribute', 'waitForSelector',
|
|
91
92
|
];
|
|
@@ -123,7 +124,7 @@ function applyRewritesToText(text, rewrites, locators) {
|
|
|
123
124
|
for (const q of QUOTES) {
|
|
124
125
|
const lit = q + from + q;
|
|
125
126
|
variants.push({ needle: `.locator(${lit})`, replacement: `.${expr}`, pair });
|
|
126
|
-
for (const a of PW_ACTIONS) {
|
|
127
|
+
for (const a of exports.PW_ACTIONS) {
|
|
127
128
|
variants.push({ needle: `.${a}(${lit})`, replacement: `.${expr}.${a}()`, pair });
|
|
128
129
|
variants.push({ needle: `.${a}(${lit}, `, replacement: `.${expr}.${a}(`, pair });
|
|
129
130
|
}
|
package/dist/fixEngine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixEngine.js","sourceRoot":"","sources":["../src/fixEngine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fixEngine.js","sourceRoot":"","sources":["../src/fixEngine.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,12 @@ export { extractInteractiveElements, loadMapping, saveMapping } from './aom';
|
|
|
4
4
|
export type { MappedElement, PageMapping } from './aom';
|
|
5
5
|
export { renderPageContract, saveMarkdown, markdownPath } from './markdown';
|
|
6
6
|
export { mapUrl, pageNameFromUrl } from './mapUrl';
|
|
7
|
+
export { resolvePageName } from './pageName';
|
|
8
|
+
export type { PageNameResolution } from './pageName';
|
|
9
|
+
export { scanText, ingestPaths, saveUsage, loadUsage, usageFiles, usagePath } from './ingest';
|
|
10
|
+
export type { Usage, SelectorSite, SelectorShape } from './ingest';
|
|
11
|
+
export { mergeCaptures, unionElements, captureDir, CAPTURE_DIRNAME } from './captureMerge';
|
|
12
|
+
export type { CaptureShard, CaptureShardPage, MergeResult } from './captureMerge';
|
|
7
13
|
export { launchBrowser } from './launcher';
|
|
8
14
|
export type { BrowserChoice, LaunchedBrowser } from './launcher';
|
|
9
15
|
export type { MapUrlOptions, MapUrlResult } from './mapUrl';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NAVIGATION_SVG_FILENAME = exports.NAVIGATION_FILENAME = exports.OVERVIEW_FILENAME = exports.navigationSvgPath = exports.navigationPath = exports.overviewPath = exports.writeOverview = exports.navigationGraph = exports.layoutGraph = exports.renderNavigationSvg = exports.renderNavigation = exports.renderOverview = exports.buildOverview = exports.minPagesForLayout = exports.stripLayoutFromPages = exports.extractLayout = exports.LAYOUT_DIRNAME = exports.layoutPath = exports.layoutDir = exports.resolveSecret = exports.loadConfig = exports.replaceQuoted = exports.collectFiles = exports.applyRewrites = exports.computeRewrites = exports.launchBrowser = exports.pageNameFromUrl = exports.mapUrl = exports.markdownPath = exports.saveMarkdown = exports.renderPageContract = exports.saveMapping = exports.loadMapping = exports.extractInteractiveElements = exports.llmResolverStub = exports.aiFill = exports.aiClick = void 0;
|
|
3
|
+
exports.NAVIGATION_SVG_FILENAME = exports.NAVIGATION_FILENAME = exports.OVERVIEW_FILENAME = exports.navigationSvgPath = exports.navigationPath = exports.overviewPath = exports.writeOverview = exports.navigationGraph = exports.layoutGraph = exports.renderNavigationSvg = exports.renderNavigation = exports.renderOverview = exports.buildOverview = exports.minPagesForLayout = exports.stripLayoutFromPages = exports.extractLayout = exports.LAYOUT_DIRNAME = exports.layoutPath = exports.layoutDir = exports.resolveSecret = exports.loadConfig = exports.replaceQuoted = exports.collectFiles = exports.applyRewrites = exports.computeRewrites = exports.launchBrowser = exports.CAPTURE_DIRNAME = exports.captureDir = exports.unionElements = exports.mergeCaptures = exports.usagePath = exports.usageFiles = exports.loadUsage = exports.saveUsage = exports.ingestPaths = exports.scanText = exports.resolvePageName = exports.pageNameFromUrl = exports.mapUrl = exports.markdownPath = exports.saveMarkdown = exports.renderPageContract = exports.saveMapping = exports.loadMapping = exports.extractInteractiveElements = exports.llmResolverStub = exports.aiFill = exports.aiClick = void 0;
|
|
4
4
|
var healer_1 = require("./playwright/healer");
|
|
5
5
|
Object.defineProperty(exports, "aiClick", { enumerable: true, get: function () { return healer_1.aiClick; } });
|
|
6
6
|
Object.defineProperty(exports, "aiFill", { enumerable: true, get: function () { return healer_1.aiFill; } });
|
|
@@ -16,6 +16,20 @@ Object.defineProperty(exports, "markdownPath", { enumerable: true, get: function
|
|
|
16
16
|
var mapUrl_1 = require("./mapUrl");
|
|
17
17
|
Object.defineProperty(exports, "mapUrl", { enumerable: true, get: function () { return mapUrl_1.mapUrl; } });
|
|
18
18
|
Object.defineProperty(exports, "pageNameFromUrl", { enumerable: true, get: function () { return mapUrl_1.pageNameFromUrl; } });
|
|
19
|
+
var pageName_1 = require("./pageName");
|
|
20
|
+
Object.defineProperty(exports, "resolvePageName", { enumerable: true, get: function () { return pageName_1.resolvePageName; } });
|
|
21
|
+
var ingest_1 = require("./ingest");
|
|
22
|
+
Object.defineProperty(exports, "scanText", { enumerable: true, get: function () { return ingest_1.scanText; } });
|
|
23
|
+
Object.defineProperty(exports, "ingestPaths", { enumerable: true, get: function () { return ingest_1.ingestPaths; } });
|
|
24
|
+
Object.defineProperty(exports, "saveUsage", { enumerable: true, get: function () { return ingest_1.saveUsage; } });
|
|
25
|
+
Object.defineProperty(exports, "loadUsage", { enumerable: true, get: function () { return ingest_1.loadUsage; } });
|
|
26
|
+
Object.defineProperty(exports, "usageFiles", { enumerable: true, get: function () { return ingest_1.usageFiles; } });
|
|
27
|
+
Object.defineProperty(exports, "usagePath", { enumerable: true, get: function () { return ingest_1.usagePath; } });
|
|
28
|
+
var captureMerge_1 = require("./captureMerge");
|
|
29
|
+
Object.defineProperty(exports, "mergeCaptures", { enumerable: true, get: function () { return captureMerge_1.mergeCaptures; } });
|
|
30
|
+
Object.defineProperty(exports, "unionElements", { enumerable: true, get: function () { return captureMerge_1.unionElements; } });
|
|
31
|
+
Object.defineProperty(exports, "captureDir", { enumerable: true, get: function () { return captureMerge_1.captureDir; } });
|
|
32
|
+
Object.defineProperty(exports, "CAPTURE_DIRNAME", { enumerable: true, get: function () { return captureMerge_1.CAPTURE_DIRNAME; } });
|
|
19
33
|
var launcher_1 = require("./launcher");
|
|
20
34
|
Object.defineProperty(exports, "launchBrowser", { enumerable: true, get: function () { return launcher_1.launchBrowser; } });
|
|
21
35
|
var fixEngine_1 = require("./fixEngine");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,8CAAuE;AAA9D,iGAAA,OAAO,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,yGAAA,eAAe,OAAA;AAEzC,6BAA6E;AAApE,iHAAA,0BAA0B,OAAA;AAAE,kGAAA,WAAW,OAAA;AAAE,kGAAA,WAAW,OAAA;AAE7D,uCAA4E;AAAnE,8GAAA,kBAAkB,OAAA;AAAE,wGAAA,YAAY,OAAA;AAAE,wGAAA,YAAY,OAAA;AACvD,mCAAmD;AAA1C,gGAAA,MAAM,OAAA;AAAE,yGAAA,eAAe,OAAA;AAChC,uCAA2C;AAAlC,yGAAA,aAAa,OAAA;AAGtB,yCAA0F;AAAjF,4GAAA,eAAe,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,0GAAA,aAAa,OAAA;AACpE,mCAA4F;AAAnF,oGAAA,UAAU,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,wGAAA,cAAc,OAAA;AAEzE,mCAAkF;AAAzE,uGAAA,aAAa,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAE/D,uCAcoB;AAblB,yGAAA,aAAa,OAAA;AACb,0GAAA,cAAc,OAAA;AACd,4GAAA,gBAAgB,OAAA;AAChB,+GAAA,mBAAmB,OAAA;AACnB,uGAAA,WAAW,OAAA;AACX,2GAAA,eAAe,OAAA;AACf,yGAAA,aAAa,OAAA;AACb,wGAAA,YAAY,OAAA;AACZ,0GAAA,cAAc,OAAA;AACd,6GAAA,iBAAiB,OAAA;AACjB,6GAAA,iBAAiB,OAAA;AACjB,+GAAA,mBAAmB,OAAA;AACnB,mHAAA,uBAAuB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,8CAAuE;AAA9D,iGAAA,OAAO,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,yGAAA,eAAe,OAAA;AAEzC,6BAA6E;AAApE,iHAAA,0BAA0B,OAAA;AAAE,kGAAA,WAAW,OAAA;AAAE,kGAAA,WAAW,OAAA;AAE7D,uCAA4E;AAAnE,8GAAA,kBAAkB,OAAA;AAAE,wGAAA,YAAY,OAAA;AAAE,wGAAA,YAAY,OAAA;AACvD,mCAAmD;AAA1C,gGAAA,MAAM,OAAA;AAAE,yGAAA,eAAe,OAAA;AAChC,uCAA6C;AAApC,2GAAA,eAAe,OAAA;AAExB,mCAA8F;AAArF,kGAAA,QAAQ,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,mGAAA,SAAS,OAAA;AAE3E,+CAA2F;AAAlF,6GAAA,aAAa,OAAA;AAAE,6GAAA,aAAa,OAAA;AAAE,0GAAA,UAAU,OAAA;AAAE,+GAAA,eAAe,OAAA;AAElE,uCAA2C;AAAlC,yGAAA,aAAa,OAAA;AAGtB,yCAA0F;AAAjF,4GAAA,eAAe,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,0GAAA,aAAa,OAAA;AACpE,mCAA4F;AAAnF,oGAAA,UAAU,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,wGAAA,cAAc,OAAA;AAEzE,mCAAkF;AAAzE,uGAAA,aAAa,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAE/D,uCAcoB;AAblB,yGAAA,aAAa,OAAA;AACb,0GAAA,cAAc,OAAA;AACd,4GAAA,gBAAgB,OAAA;AAChB,+GAAA,mBAAmB,OAAA;AACnB,uGAAA,WAAW,OAAA;AACX,2GAAA,eAAe,OAAA;AACf,yGAAA,aAAa,OAAA;AACb,wGAAA,YAAY,OAAA;AACZ,0GAAA,cAAc,OAAA;AACd,6GAAA,iBAAiB,OAAA;AACjB,6GAAA,iBAAiB,OAAA;AACjB,+GAAA,mBAAmB,OAAA;AACnB,mHAAA,uBAAuB,OAAA"}
|
package/dist/ingest.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static selector inventory — `ia-qa-heal ingest`.
|
|
3
|
+
*
|
|
4
|
+
* Scans the user's test/POM files for the selectors they actually use and writes
|
|
5
|
+
* `.ia-qa/usage.json`. The contract knows every element on a page; the suite only
|
|
6
|
+
* ever touches some of them. Without this file, `diff` weighs a drifted element
|
|
7
|
+
* nobody tests the same as one that breaks the suite, and `fix` cannot run
|
|
8
|
+
* without being handed the test paths every time.
|
|
9
|
+
*
|
|
10
|
+
* Purely static and deterministic: quoted literals in known call shapes, no
|
|
11
|
+
* execution, no AST. A selector built by string concatenation is invisible here —
|
|
12
|
+
* acceptable, because such a selector is invisible to `fix`'s literal rewrite too.
|
|
13
|
+
*/
|
|
14
|
+
export type SelectorShape = 'playwright' | 'cypress' | 'selenium' | 'pom';
|
|
15
|
+
export interface SelectorSite {
|
|
16
|
+
file: string;
|
|
17
|
+
line: number;
|
|
18
|
+
shape: SelectorShape;
|
|
19
|
+
}
|
|
20
|
+
export interface Usage {
|
|
21
|
+
generatedAt: string;
|
|
22
|
+
/** Number of files scanned (sites reference only the files that matched). */
|
|
23
|
+
scanned: number;
|
|
24
|
+
selectors: Record<string, SelectorSite[]>;
|
|
25
|
+
}
|
|
26
|
+
export declare const USAGE_FILENAME = "usage.json";
|
|
27
|
+
export declare function usagePath(cwd?: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Shared call shapes (`.type`, `.press`, `.fill`…) take text in one framework and
|
|
30
|
+
* a selector in another, so a captured literal is only recorded when it *reads*
|
|
31
|
+
* like a selector. A bare tag (`click('button')`) is the accepted miss.
|
|
32
|
+
*/
|
|
33
|
+
export declare function plausibleSelector(value: string): boolean;
|
|
34
|
+
export declare function scanText(text: string, file: string): Array<{
|
|
35
|
+
selector: string;
|
|
36
|
+
site: SelectorSite;
|
|
37
|
+
}>;
|
|
38
|
+
export interface IngestResult {
|
|
39
|
+
usage: Usage;
|
|
40
|
+
skipped: string[];
|
|
41
|
+
}
|
|
42
|
+
export declare function ingestPaths(paths: string[], cwd?: string): IngestResult;
|
|
43
|
+
export declare function saveUsage(usage: Usage, cwd?: string): string;
|
|
44
|
+
export declare function loadUsage(cwd?: string): Usage | null;
|
|
45
|
+
/** The files `fix` should edit when no test paths are given: the ones that hold selectors. */
|
|
46
|
+
export declare function usageFiles(usage: Usage, cwd?: string): string[];
|
package/dist/ingest.js
ADDED
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../src/ingest.ts"],"names":[],"mappings":"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"}
|
package/dist/mapUrl.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export interface MapUrlResult {
|
|
|
34
34
|
/** Which browser was actually used (bundled, system channel, explicit path). */
|
|
35
35
|
browser: string;
|
|
36
36
|
}
|
|
37
|
-
export
|
|
37
|
+
export { pageNameFromUrl } from './pageName';
|
|
38
38
|
export declare function mapUrl(url: string, options?: MapUrlOptions): Promise<MapUrlResult>;
|
|
39
39
|
/** Convenience for logs: a relative path when possible. */
|
|
40
40
|
export declare function rel(p: string): string;
|
package/dist/mapUrl.js
CHANGED
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.pageNameFromUrl =
|
|
36
|
+
exports.pageNameFromUrl = void 0;
|
|
37
37
|
exports.mapUrl = mapUrl;
|
|
38
38
|
exports.rel = rel;
|
|
39
39
|
const path = __importStar(require("path"));
|
|
@@ -41,19 +41,11 @@ const aom_1 = require("./aom");
|
|
|
41
41
|
const markdown_1 = require("./markdown");
|
|
42
42
|
const config_1 = require("./config");
|
|
43
43
|
const launcher_1 = require("./launcher");
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
pathname = new URL(url).pathname;
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
/* fall through to default */
|
|
51
|
-
}
|
|
52
|
-
const slug = pathname.replace(/^\/+|\/+$/g, '').replace(/\//g, '-');
|
|
53
|
-
return slug || 'home';
|
|
54
|
-
}
|
|
44
|
+
const pageName_1 = require("./pageName");
|
|
45
|
+
var pageName_2 = require("./pageName");
|
|
46
|
+
Object.defineProperty(exports, "pageNameFromUrl", { enumerable: true, get: function () { return pageName_2.pageNameFromUrl; } });
|
|
55
47
|
async function mapUrl(url, options = {}) {
|
|
56
|
-
const pageName = options.pageName || pageNameFromUrl(url);
|
|
48
|
+
const pageName = options.pageName || (0, pageName_1.pageNameFromUrl)(url);
|
|
57
49
|
const waitUntil = options.waitUntil || 'networkidle';
|
|
58
50
|
const timeout = options.timeout ?? 30000;
|
|
59
51
|
const { browser, using } = await (0, launcher_1.launchBrowser)(options);
|
package/dist/mapUrl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapUrl.js","sourceRoot":"","sources":["../src/mapUrl.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapUrl.js","sourceRoot":"","sources":["../src/mapUrl.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,wBAmCC;AAGD,kBAEC;AAtFD,2CAA6B;AAC7B,+BAA4F;AAC5F,yCAA0C;AAC1C,qCAAsC;AACtC,yCAA0D;AAC1D,yCAA6C;AAuC7C,uCAA6C;AAApC,2GAAA,eAAe,OAAA;AAEjB,KAAK,UAAU,MAAM,CAAC,GAAW,EAAE,UAAyB,EAAE;IACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAA,0BAAe,EAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,aAAa,CAAC;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IAEzC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM;YACpB,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;YACtC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,QAAQ,GAAoB,MAAM,IAAA,gCAA0B,EAAC,IAAI,CAAC,CAAC;QACzE,MAAM,OAAO,GAAgB;YAC3B,IAAI,EAAE,QAAQ;YACd,GAAG;YACH,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,QAAQ;SACT,CAAC;QAEF,MAAM,MAAM,GAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACzD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,IAAA,mBAAU,GAAE,CAAC;YAC3C,MAAM,CAAC,QAAQ,GAAG,IAAA,iBAAW,EAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,GAAG,IAAA,uBAAY,EAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,SAAgB,GAAG,CAAC,CAAS;IAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { IaQaConfig } from './config';
|
|
2
|
+
/**
|
|
3
|
+
* URL → logical page name, the one resolver every capture path must share.
|
|
4
|
+
*
|
|
5
|
+
* `diff` pairs baseline/ and mapping/ by filename, so two features that name the
|
|
6
|
+
* same page differently produce contracts that never meet: every page becomes a
|
|
7
|
+
* phantom lost/new pair and the diff is garbage. The healer, `map`, and run-time
|
|
8
|
+
* capture all funnel through here for exactly that reason.
|
|
9
|
+
*/
|
|
10
|
+
export declare function pageNameFromUrl(url: string): string;
|
|
11
|
+
export type PageNameResolution =
|
|
12
|
+
/** The URL is a configured page — use the name its contract already has. */
|
|
13
|
+
{
|
|
14
|
+
kind: 'configured';
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
/** No config, or the URL is not in it — a slug is the best available name. */
|
|
18
|
+
| {
|
|
19
|
+
kind: 'unconfigured';
|
|
20
|
+
name: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The URL is claimed by configured views reached through `steps`. Several of
|
|
24
|
+
* them share it, so the URL alone cannot say which one is on screen — naming
|
|
25
|
+
* a contract here would be a guess written to disk.
|
|
26
|
+
*/
|
|
27
|
+
| {
|
|
28
|
+
kind: 'steps';
|
|
29
|
+
candidates: string[];
|
|
30
|
+
};
|
|
31
|
+
export declare function resolvePageName(url: string, config: IaQaConfig | null): PageNameResolution;
|
package/dist/pageName.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pageNameFromUrl = pageNameFromUrl;
|
|
4
|
+
exports.resolvePageName = resolvePageName;
|
|
5
|
+
/**
|
|
6
|
+
* URL → logical page name, the one resolver every capture path must share.
|
|
7
|
+
*
|
|
8
|
+
* `diff` pairs baseline/ and mapping/ by filename, so two features that name the
|
|
9
|
+
* same page differently produce contracts that never meet: every page becomes a
|
|
10
|
+
* phantom lost/new pair and the diff is garbage. The healer, `map`, and run-time
|
|
11
|
+
* capture all funnel through here for exactly that reason.
|
|
12
|
+
*/
|
|
13
|
+
function pageNameFromUrl(url) {
|
|
14
|
+
let pathname = '/';
|
|
15
|
+
try {
|
|
16
|
+
pathname = new URL(url).pathname;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
/* fall through to default */
|
|
20
|
+
}
|
|
21
|
+
const slug = pathname.replace(/^\/+|\/+$/g, '').replace(/\//g, '-');
|
|
22
|
+
return slug || 'home';
|
|
23
|
+
}
|
|
24
|
+
function resolvePageName(url, config) {
|
|
25
|
+
if (!config)
|
|
26
|
+
return { kind: 'unconfigured', name: pageNameFromUrl(url) };
|
|
27
|
+
const currentPath = new URL(url).pathname.replace(/\/+$/, '') || '/';
|
|
28
|
+
const samePath = (p) => (new URL(p.url, config.baseUrl).pathname.replace(/\/+$/, '') || '/') === currentPath;
|
|
29
|
+
const match = config.pages.find((p) => !p.steps?.length && samePath(p));
|
|
30
|
+
if (match)
|
|
31
|
+
return { kind: 'configured', name: match.name };
|
|
32
|
+
const behindSteps = config.pages.filter((p) => p.steps?.length && samePath(p));
|
|
33
|
+
if (behindSteps.length > 0) {
|
|
34
|
+
return { kind: 'steps', candidates: behindSteps.map((p) => p.name) };
|
|
35
|
+
}
|
|
36
|
+
return { kind: 'unconfigured', name: pageNameFromUrl(url) };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=pageName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageName.js","sourceRoot":"","sources":["../src/pageName.ts"],"names":[],"mappings":";;AAWA,0CASC;AAcD,0CAgBC;AAhDD;;;;;;;GAOG;AAEH,SAAgB,eAAe,CAAC,GAAW;IACzC,IAAI,QAAQ,GAAG,GAAG,CAAC;IACnB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpE,OAAO,IAAI,IAAI,MAAM,CAAC;AACxB,CAAC;AAcD,SAAgB,eAAe,CAAC,GAAW,EAAE,MAAyB;IACpE,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAEzE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAC,CAAa,EAAE,EAAE,CACjC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,WAAW,CAAC;IAEvF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAE3D,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capture the page contracts *during* the user's own test run.
|
|
3
|
+
*
|
|
4
|
+
* `map` only reaches what a URL plus a scripted login can reach. The user's
|
|
5
|
+
* suite already walks the rich states — post-login, modals, wizards — with
|
|
6
|
+
* credentials it already manages. One line in a spec borrows that walk:
|
|
7
|
+
*
|
|
8
|
+
* import { test, expect } from '@ia-qa/self-healing/capture';
|
|
9
|
+
*
|
|
10
|
+
* (or `withCapture(myExtendedTest)` for suites with their own fixtures).
|
|
11
|
+
*
|
|
12
|
+
* Inert unless IAQA_CAPTURE=1 — a normal run pays nothing. When armed, each
|
|
13
|
+
* worker records what it saw into `.ia-qa/mapping/.capture/worker-<n>.json`;
|
|
14
|
+
* the next CLI verb merges the shards into real contracts (see captureMerge.ts).
|
|
15
|
+
* Nothing here may ever fail or slow the user's suite beyond the extraction
|
|
16
|
+
* itself: every capture path swallows its own errors.
|
|
17
|
+
*/
|
|
18
|
+
export declare const CAPTURE_ENV = "IAQA_CAPTURE";
|
|
19
|
+
export declare function captureEnabled(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Wrap an already-extended `test` (for suites with their own fixtures).
|
|
22
|
+
* Returns it untouched when capture is not armed.
|
|
23
|
+
*/
|
|
24
|
+
export declare function withCapture<T>(baseTest: T): T;
|
|
25
|
+
/** Drop-in for `import { test, expect } from '@playwright/test'`. */
|
|
26
|
+
export declare const test: unknown;
|
|
27
|
+
export declare const expect: unknown;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.expect = exports.test = exports.CAPTURE_ENV = void 0;
|
|
37
|
+
exports.captureEnabled = captureEnabled;
|
|
38
|
+
exports.withCapture = withCapture;
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const config_1 = require("../config");
|
|
42
|
+
const aom_1 = require("../aom");
|
|
43
|
+
const pageName_1 = require("../pageName");
|
|
44
|
+
const captureMerge_1 = require("../captureMerge");
|
|
45
|
+
/**
|
|
46
|
+
* Capture the page contracts *during* the user's own test run.
|
|
47
|
+
*
|
|
48
|
+
* `map` only reaches what a URL plus a scripted login can reach. The user's
|
|
49
|
+
* suite already walks the rich states — post-login, modals, wizards — with
|
|
50
|
+
* credentials it already manages. One line in a spec borrows that walk:
|
|
51
|
+
*
|
|
52
|
+
* import { test, expect } from '@ia-qa/self-healing/capture';
|
|
53
|
+
*
|
|
54
|
+
* (or `withCapture(myExtendedTest)` for suites with their own fixtures).
|
|
55
|
+
*
|
|
56
|
+
* Inert unless IAQA_CAPTURE=1 — a normal run pays nothing. When armed, each
|
|
57
|
+
* worker records what it saw into `.ia-qa/mapping/.capture/worker-<n>.json`;
|
|
58
|
+
* the next CLI verb merges the shards into real contracts (see captureMerge.ts).
|
|
59
|
+
* Nothing here may ever fail or slow the user's suite beyond the extraction
|
|
60
|
+
* itself: every capture path swallows its own errors.
|
|
61
|
+
*/
|
|
62
|
+
exports.CAPTURE_ENV = 'IAQA_CAPTURE';
|
|
63
|
+
function captureEnabled() {
|
|
64
|
+
return process.env[exports.CAPTURE_ENV] === '1';
|
|
65
|
+
}
|
|
66
|
+
const DEBOUNCE_MS = 300;
|
|
67
|
+
const state = { config: null, configLoaded: false, pages: new Map() };
|
|
68
|
+
function config() {
|
|
69
|
+
if (!state.configLoaded) {
|
|
70
|
+
state.configLoaded = true;
|
|
71
|
+
try {
|
|
72
|
+
state.config = (0, config_1.loadConfig)();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
state.config = null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return state.config;
|
|
79
|
+
}
|
|
80
|
+
async function capturePage(page) {
|
|
81
|
+
try {
|
|
82
|
+
const url = page.url();
|
|
83
|
+
if (!url || url === 'about:blank')
|
|
84
|
+
return;
|
|
85
|
+
const resolved = (0, pageName_1.resolvePageName)(url, config());
|
|
86
|
+
// Step-reached views share a URL, so a run-time capture cannot know which
|
|
87
|
+
// one it is looking at — naming a contract here would be a guess. `map`
|
|
88
|
+
// stays the path for those.
|
|
89
|
+
if (resolved.kind === 'steps')
|
|
90
|
+
return;
|
|
91
|
+
const elements = await (0, aom_1.extractInteractiveElements)(page);
|
|
92
|
+
if (elements.length === 0)
|
|
93
|
+
return;
|
|
94
|
+
const prev = state.pages.get(resolved.name);
|
|
95
|
+
state.pages.set(resolved.name, {
|
|
96
|
+
url,
|
|
97
|
+
elements: prev ? (0, captureMerge_1.unionElements)(prev.elements, elements) : elements,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
/* the user's test must never fail because of the capture */
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function writeShard() {
|
|
105
|
+
try {
|
|
106
|
+
if (state.pages.size === 0)
|
|
107
|
+
return;
|
|
108
|
+
const dir = (0, captureMerge_1.captureDir)();
|
|
109
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
110
|
+
const worker = process.env.TEST_WORKER_INDEX ?? String(process.pid);
|
|
111
|
+
const pages = Array.from(state.pages, ([name, c]) => ({
|
|
112
|
+
page: name,
|
|
113
|
+
url: c.url,
|
|
114
|
+
elements: c.elements,
|
|
115
|
+
}));
|
|
116
|
+
fs.writeFileSync(path.join(dir, `worker-${worker}.json`), JSON.stringify({ pages }, null, 2) + '\n', 'utf8');
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
/* a failed shard write loses one worker's capture, never the test run */
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Wrap an already-extended `test` (for suites with their own fixtures).
|
|
124
|
+
* Returns it untouched when capture is not armed.
|
|
125
|
+
*/
|
|
126
|
+
function withCapture(baseTest) {
|
|
127
|
+
if (!captureEnabled())
|
|
128
|
+
return baseTest;
|
|
129
|
+
return baseTest.extend({
|
|
130
|
+
page: async ({ page }, use) => {
|
|
131
|
+
let timer;
|
|
132
|
+
const onNavigated = (frame) => {
|
|
133
|
+
try {
|
|
134
|
+
if (frame !== page.mainFrame())
|
|
135
|
+
return;
|
|
136
|
+
if (timer)
|
|
137
|
+
clearTimeout(timer);
|
|
138
|
+
// Debounced: SPAs navigate in bursts, and the settled state is the one
|
|
139
|
+
// worth a contract.
|
|
140
|
+
timer = setTimeout(() => void capturePage(page), DEBOUNCE_MS);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
/* never the test's problem */
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
page.on('framenavigated', onNavigated);
|
|
147
|
+
try {
|
|
148
|
+
await use(page);
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
if (timer)
|
|
152
|
+
clearTimeout(timer);
|
|
153
|
+
try {
|
|
154
|
+
page.off('framenavigated', onNavigated);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
/* page may already be closed */
|
|
158
|
+
}
|
|
159
|
+
// Final state — the modal or wizard step the test ended on, which no
|
|
160
|
+
// navigation event will ever announce.
|
|
161
|
+
await capturePage(page);
|
|
162
|
+
writeShard();
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function playwrightTest() {
|
|
168
|
+
// Resolved from the suite's own directory first: the `test` object must be the
|
|
169
|
+
// *same instance* the consumer's runner uses, or Playwright sees fixtures from
|
|
170
|
+
// a foreign runner. With this package npm-linked, a plain require() would walk
|
|
171
|
+
// up from the package's real path and pick a different Playwright.
|
|
172
|
+
for (const id of ['@playwright/test', 'playwright/test']) {
|
|
173
|
+
try {
|
|
174
|
+
return require(require.resolve(id, { paths: [process.cwd(), __dirname] }));
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
/* try the next id */
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
throw new Error(`@ia-qa/self-healing/capture needs Playwright's test runner ('@playwright/test' or ` +
|
|
181
|
+
`'playwright' >= 1.40) installed in the project running the suite.`);
|
|
182
|
+
}
|
|
183
|
+
const pw = playwrightTest();
|
|
184
|
+
/** Drop-in for `import { test, expect } from '@playwright/test'`. */
|
|
185
|
+
exports.test = withCapture(pw.test);
|
|
186
|
+
exports.expect = pw.expect;
|
|
187
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/playwright/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ exports.inferPageName = inferPageName;
|
|
|
7
7
|
const config_1 = require("../config");
|
|
8
8
|
const aom_1 = require("../aom");
|
|
9
9
|
const match_1 = require("../browser/match");
|
|
10
|
+
const pageName_1 = require("../pageName");
|
|
10
11
|
const DEFAULT_TIMEOUT = 5000;
|
|
11
12
|
async function aiClick(page, selector, options = {}) {
|
|
12
13
|
const timeout = options.timeout ?? DEFAULT_TIMEOUT;
|
|
@@ -67,22 +68,20 @@ async function llmResolverStub(_target, _candidates) {
|
|
|
67
68
|
return null;
|
|
68
69
|
}
|
|
69
70
|
function inferPageName(page) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
throw new Error(`Cannot infer the mapping name for ${page.url()}: ${behindSteps.length} configured ` +
|
|
83
|
-
`${behindSteps.length === 1 ? 'view shares' : 'views share'} this URL and are reached by ` +
|
|
71
|
+
// Resolution is shared with run-time capture (`resolvePageName`): the healer and
|
|
72
|
+
// the capture naming the same URL differently would produce contracts that
|
|
73
|
+
// never pair up in a diff. Only the consequences differ — capture skips or
|
|
74
|
+
// slugs, the healer must refuse out loud, because healing against the wrong
|
|
75
|
+
// contract is silent.
|
|
76
|
+
const resolved = (0, pageName_1.resolvePageName)(page.url(), (0, config_1.loadConfig)());
|
|
77
|
+
if (resolved.kind === 'configured')
|
|
78
|
+
return resolved.name;
|
|
79
|
+
if (resolved.kind === 'steps') {
|
|
80
|
+
const names = resolved.candidates;
|
|
81
|
+
throw new Error(`Cannot infer the mapping name for ${page.url()}: ${names.length} configured ` +
|
|
82
|
+
`${names.length === 1 ? 'view shares' : 'views share'} this URL and are reached by ` +
|
|
84
83
|
`clicking, so the URL alone cannot say which one you are on. Pass the view explicitly — ` +
|
|
85
|
-
`{ page: '${
|
|
84
|
+
`{ page: '${names[0]}' } — choosing from: ${names.join(', ')}.`);
|
|
86
85
|
}
|
|
87
86
|
throw new Error(`Cannot infer the mapping name for ${page.url()} — no entry in config.pages matches this path. Pass { page: '<name>' } explicitly.`);
|
|
88
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"healer.js","sourceRoot":"","sources":["../../src/playwright/healer.ts"],"names":[],"mappings":";;AAyCA,0BAYC;AAED,wBAaC;AAyDD,0CAKC;AAED,
|
|
1
|
+
{"version":3,"file":"healer.js","sourceRoot":"","sources":["../../src/playwright/healer.ts"],"names":[],"mappings":"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"}
|