@ia-qa/self-healing 1.3.4 → 1.3.5
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/browser/discover.d.ts +28 -0
- package/dist/browser/discover.js +107 -0
- package/dist/browser/discover.js.map +1 -0
- package/dist/cli/baseline.js +13 -9
- package/dist/cli/baseline.js.map +1 -1
- package/dist/cli/diff.js +14 -1
- package/dist/cli/diff.js.map +1 -1
- package/dist/cli/discover.d.ts +17 -0
- package/dist/cli/discover.js +121 -0
- package/dist/cli/discover.js.map +1 -0
- package/dist/cli/index.js +16 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/map.d.ts +1 -0
- package/dist/cli/map.js +12 -0
- package/dist/cli/map.js.map +1 -1
- package/dist/cli/run.js +12 -2
- package/dist/cli/run.js.map +1 -1
- package/dist/crawl.d.ts +42 -0
- package/dist/crawl.js +124 -0
- package/dist/crawl.js.map +1 -0
- package/dist/discovery/safety.d.ts +69 -0
- package/dist/discovery/safety.js +129 -0
- package/dist/discovery/safety.js.map +1 -0
- package/dist/discovery/sitemap.d.ts +48 -0
- package/dist/discovery/sitemap.js +123 -0
- package/dist/discovery/sitemap.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractLocs = extractLocs;
|
|
4
|
+
exports.isSitemapIndex = isSitemapIndex;
|
|
5
|
+
exports.sitemapsFromRobots = sitemapsFromRobots;
|
|
6
|
+
exports.discoverFromSitemap = discoverFromSitemap;
|
|
7
|
+
const safety_1 = require("./safety");
|
|
8
|
+
const LOC_RE = /<loc>\s*([^<\s][^<]*?)\s*<\/loc>/gi;
|
|
9
|
+
/** Pull every `<loc>` out of a sitemap or sitemap-index document. Pure. */
|
|
10
|
+
function extractLocs(xml) {
|
|
11
|
+
const out = [];
|
|
12
|
+
let m;
|
|
13
|
+
LOC_RE.lastIndex = 0;
|
|
14
|
+
while ((m = LOC_RE.exec(xml)) !== null) {
|
|
15
|
+
const loc = decodeEntities(m[1].trim());
|
|
16
|
+
if (loc)
|
|
17
|
+
out.push(loc);
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
/** A sitemap index points at other sitemaps rather than at pages. */
|
|
22
|
+
function isSitemapIndex(xml) {
|
|
23
|
+
return /<sitemapindex[\s>]/i.test(xml);
|
|
24
|
+
}
|
|
25
|
+
function decodeEntities(s) {
|
|
26
|
+
return s
|
|
27
|
+
.replace(/&/g, '&')
|
|
28
|
+
.replace(/</g, '<')
|
|
29
|
+
.replace(/>/g, '>')
|
|
30
|
+
.replace(/"/g, '"')
|
|
31
|
+
.replace(/'/g, "'");
|
|
32
|
+
}
|
|
33
|
+
/** `Sitemap:` directives in a robots.txt — the standard way to advertise one. */
|
|
34
|
+
function sitemapsFromRobots(robots) {
|
|
35
|
+
const out = [];
|
|
36
|
+
for (const line of robots.split(/\r?\n/)) {
|
|
37
|
+
const m = /^\s*sitemap:\s*(\S+)/i.exec(line);
|
|
38
|
+
if (m)
|
|
39
|
+
out.push(m[1].trim());
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Discover candidate pages from a site's sitemap(s).
|
|
45
|
+
*
|
|
46
|
+
* Resolution: the explicit `sitemapUrl` if given, else `/sitemap.xml`; if that
|
|
47
|
+
* 404s, the `Sitemap:` lines in `/robots.txt`. A sitemap index is followed one
|
|
48
|
+
* level into its child sitemaps (bounded by `maxSitemaps`). Everything is filtered
|
|
49
|
+
* through `toCandidate`, so off-origin, unsafe, and download URLs never survive.
|
|
50
|
+
*
|
|
51
|
+
* Never throws on a missing or malformed sitemap: absence is the common case
|
|
52
|
+
* (SPAs, staging), and it is a "found nothing", not an error.
|
|
53
|
+
*/
|
|
54
|
+
async function discoverFromSitemap(baseUrl, options = {}) {
|
|
55
|
+
const fetchImpl = options.fetchImpl || globalThis.fetch;
|
|
56
|
+
if (!fetchImpl)
|
|
57
|
+
throw new Error('No fetch implementation available (Node 18+ or pass fetchImpl).');
|
|
58
|
+
const maxUrls = options.maxUrls ?? 200;
|
|
59
|
+
const maxSitemaps = options.maxSitemaps ?? 20;
|
|
60
|
+
const roots = options.sitemapUrl
|
|
61
|
+
? [options.sitemapUrl]
|
|
62
|
+
: await resolveSitemapUrls(baseUrl, fetchImpl);
|
|
63
|
+
const seenSitemaps = new Set();
|
|
64
|
+
const pageUrls = [];
|
|
65
|
+
const queue = [...roots];
|
|
66
|
+
while (queue.length > 0 && seenSitemaps.size < maxSitemaps && pageUrls.length < maxUrls) {
|
|
67
|
+
const url = queue.shift();
|
|
68
|
+
if (seenSitemaps.has(url))
|
|
69
|
+
continue;
|
|
70
|
+
seenSitemaps.add(url);
|
|
71
|
+
const xml = await safeText(fetchImpl, url);
|
|
72
|
+
if (!xml)
|
|
73
|
+
continue;
|
|
74
|
+
if (isSitemapIndex(xml)) {
|
|
75
|
+
for (const child of extractLocs(xml)) {
|
|
76
|
+
if (!seenSitemaps.has(child))
|
|
77
|
+
queue.push(child);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
pageUrls.push(...extractLocs(xml));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const candidates = [];
|
|
85
|
+
const seenPaths = new Set();
|
|
86
|
+
for (const raw of pageUrls) {
|
|
87
|
+
const candidate = (0, safety_1.toCandidate)(raw, baseUrl, 'sitemap');
|
|
88
|
+
if (!candidate)
|
|
89
|
+
continue;
|
|
90
|
+
if (seenPaths.has(candidate.url))
|
|
91
|
+
continue;
|
|
92
|
+
seenPaths.add(candidate.url);
|
|
93
|
+
candidates.push(candidate);
|
|
94
|
+
if (candidates.length >= maxUrls)
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
return candidates;
|
|
98
|
+
}
|
|
99
|
+
async function resolveSitemapUrls(baseUrl, fetchImpl) {
|
|
100
|
+
const primary = new URL('/sitemap.xml', baseUrl).toString();
|
|
101
|
+
const head = await safeText(fetchImpl, primary);
|
|
102
|
+
if (head)
|
|
103
|
+
return [primary];
|
|
104
|
+
const robots = await safeText(fetchImpl, new URL('/robots.txt', baseUrl).toString());
|
|
105
|
+
if (robots) {
|
|
106
|
+
const advertised = sitemapsFromRobots(robots);
|
|
107
|
+
if (advertised.length > 0)
|
|
108
|
+
return advertised;
|
|
109
|
+
}
|
|
110
|
+
return [primary];
|
|
111
|
+
}
|
|
112
|
+
async function safeText(fetchImpl, url) {
|
|
113
|
+
try {
|
|
114
|
+
const res = await fetchImpl(url);
|
|
115
|
+
if (!res.ok)
|
|
116
|
+
return null;
|
|
117
|
+
return await res.text();
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=sitemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../src/discovery/sitemap.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,6 +9,12 @@ export type { MappedElement, PageMapping } from './aom';
|
|
|
9
9
|
export { renderPageContract, saveMarkdown, markdownPath } from './markdown';
|
|
10
10
|
export { mapUrl, pageNameFromUrl } from './mapUrl';
|
|
11
11
|
export { resolvePageName } from './pageName';
|
|
12
|
+
export { isSafeCandidateUrl, normalizedPath, toCandidate, mergePages, UNSAFE_URL_RE, } from './discovery/safety';
|
|
13
|
+
export type { Candidate } from './discovery/safety';
|
|
14
|
+
export { discoverFromSitemap, extractLocs, isSitemapIndex, sitemapsFromRobots, } from './discovery/sitemap';
|
|
15
|
+
export type { SitemapOptions, FetchLike } from './discovery/sitemap';
|
|
16
|
+
export { crawlApp } from './crawl';
|
|
17
|
+
export type { CrawlOptions } from './crawl';
|
|
12
18
|
export type { PageNameResolution } from './pageName';
|
|
13
19
|
export { scanText, ingestPaths, saveUsage, loadUsage, usageFiles, usagePath } from './ingest';
|
|
14
20
|
export type { Usage, SelectorSite, SelectorShape } from './ingest';
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.NAVIGATION_SVG_FILENAME = exports.NAVIGATION_FILENAME = exports.OVERVIEW_FILENAME = exports.navigationSvgPath = exports.navigationPath = exports.overviewPath = exports.writeOverview = void 0;
|
|
3
|
+
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.crawlApp = exports.sitemapsFromRobots = exports.isSitemapIndex = exports.extractLocs = exports.discoverFromSitemap = exports.UNSAFE_URL_RE = exports.mergePages = exports.toCandidate = exports.normalizedPath = exports.isSafeCandidateUrl = exports.resolvePageName = exports.pageNameFromUrl = exports.mapUrl = exports.markdownPath = exports.saveMarkdown = exports.renderPageContract = exports.saveMapping = exports.loadMapping = exports.extractInteractiveElements = exports.renderModelList = exports.defaultKeyEnv = exports.findProvider = exports.AI_PROVIDERS = exports.parseModelJson = exports.buildPrompt = exports.prefilter = exports.aiResolve = exports.createAiResolver = exports.llmResolverStub = exports.aiFill = exports.aiClick = void 0;
|
|
4
|
+
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 = void 0;
|
|
5
5
|
var healer_1 = require("./playwright/healer");
|
|
6
6
|
Object.defineProperty(exports, "aiClick", { enumerable: true, get: function () { return healer_1.aiClick; } });
|
|
7
7
|
Object.defineProperty(exports, "aiFill", { enumerable: true, get: function () { return healer_1.aiFill; } });
|
|
@@ -30,6 +30,19 @@ Object.defineProperty(exports, "mapUrl", { enumerable: true, get: function () {
|
|
|
30
30
|
Object.defineProperty(exports, "pageNameFromUrl", { enumerable: true, get: function () { return mapUrl_1.pageNameFromUrl; } });
|
|
31
31
|
var pageName_1 = require("./pageName");
|
|
32
32
|
Object.defineProperty(exports, "resolvePageName", { enumerable: true, get: function () { return pageName_1.resolvePageName; } });
|
|
33
|
+
var safety_1 = require("./discovery/safety");
|
|
34
|
+
Object.defineProperty(exports, "isSafeCandidateUrl", { enumerable: true, get: function () { return safety_1.isSafeCandidateUrl; } });
|
|
35
|
+
Object.defineProperty(exports, "normalizedPath", { enumerable: true, get: function () { return safety_1.normalizedPath; } });
|
|
36
|
+
Object.defineProperty(exports, "toCandidate", { enumerable: true, get: function () { return safety_1.toCandidate; } });
|
|
37
|
+
Object.defineProperty(exports, "mergePages", { enumerable: true, get: function () { return safety_1.mergePages; } });
|
|
38
|
+
Object.defineProperty(exports, "UNSAFE_URL_RE", { enumerable: true, get: function () { return safety_1.UNSAFE_URL_RE; } });
|
|
39
|
+
var sitemap_1 = require("./discovery/sitemap");
|
|
40
|
+
Object.defineProperty(exports, "discoverFromSitemap", { enumerable: true, get: function () { return sitemap_1.discoverFromSitemap; } });
|
|
41
|
+
Object.defineProperty(exports, "extractLocs", { enumerable: true, get: function () { return sitemap_1.extractLocs; } });
|
|
42
|
+
Object.defineProperty(exports, "isSitemapIndex", { enumerable: true, get: function () { return sitemap_1.isSitemapIndex; } });
|
|
43
|
+
Object.defineProperty(exports, "sitemapsFromRobots", { enumerable: true, get: function () { return sitemap_1.sitemapsFromRobots; } });
|
|
44
|
+
var crawl_1 = require("./crawl");
|
|
45
|
+
Object.defineProperty(exports, "crawlApp", { enumerable: true, get: function () { return crawl_1.crawlApp; } });
|
|
33
46
|
var ingest_1 = require("./ingest");
|
|
34
47
|
Object.defineProperty(exports, "scanText", { enumerable: true, get: function () { return ingest_1.scanText; } });
|
|
35
48
|
Object.defineProperty(exports, "ingestPaths", { enumerable: true, get: function () { return ingest_1.ingestPaths; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,8CAAyF;AAAhF,iGAAA,OAAO,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAE3D,0CAAkF;AAAzE,qGAAA,SAAS,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,0GAAA,cAAc,OAAA;AAE1D,sCAAyF;AAAhF,sGAAA,YAAY,OAAA;AAAE,sGAAA,YAAY,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,yGAAA,eAAe,OAAA;AAEnE,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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,8CAAyF;AAAhF,iGAAA,OAAO,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAE3D,0CAAkF;AAAzE,qGAAA,SAAS,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,0GAAA,cAAc,OAAA;AAE1D,sCAAyF;AAAhF,sGAAA,YAAY,OAAA;AAAE,sGAAA,YAAY,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,yGAAA,eAAe,OAAA;AAEnE,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;AACxB,6CAM4B;AAL1B,4GAAA,kBAAkB,OAAA;AAClB,wGAAA,cAAc,OAAA;AACd,qGAAA,WAAW,OAAA;AACX,oGAAA,UAAU,OAAA;AACV,uGAAA,aAAa,OAAA;AAGf,+CAK6B;AAJ3B,8GAAA,mBAAmB,OAAA;AACnB,sGAAA,WAAW,OAAA;AACX,yGAAA,cAAc,OAAA;AACd,6GAAA,kBAAkB,OAAA;AAGpB,iCAAmC;AAA1B,iGAAA,QAAQ,OAAA;AAGjB,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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ia-qa/self-healing",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.5",
|
|
4
4
|
"description": "Local-first self-healing for UI tests: a local MCP server + CLI that map your app's pages to a role/name/selector contract, diff selector drift (PASS/FIX/BLOCK), and apply deterministic fixes to Cypress/Playwright/Selenium tests. Runs on your machine — nothing leaves it.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"self-healing",
|