@aplaytest/core 0.1.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/dist/.tsbuildinfo +1 -0
- package/dist/config/schema.d.ts +247 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +279 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/evidence/id.d.ts +17 -0
- package/dist/evidence/id.d.ts.map +1 -0
- package/dist/evidence/id.js +20 -0
- package/dist/evidence/id.js.map +1 -0
- package/dist/evidence/redact.d.ts +22 -0
- package/dist/evidence/redact.d.ts.map +1 -0
- package/dist/evidence/redact.js +97 -0
- package/dist/evidence/redact.js.map +1 -0
- package/dist/evidence/store.d.ts +51 -0
- package/dist/evidence/store.d.ts.map +1 -0
- package/dist/evidence/store.js +148 -0
- package/dist/evidence/store.js.map +1 -0
- package/dist/evidence/types.d.ts +183 -0
- package/dist/evidence/types.d.ts.map +1 -0
- package/dist/evidence/types.js +21 -0
- package/dist/evidence/types.js.map +1 -0
- package/dist/history/ingest-playwright.d.ts +26 -0
- package/dist/history/ingest-playwright.d.ts.map +1 -0
- package/dist/history/ingest-playwright.js +73 -0
- package/dist/history/ingest-playwright.js.map +1 -0
- package/dist/history/ingest.d.ts +29 -0
- package/dist/history/ingest.d.ts.map +1 -0
- package/dist/history/ingest.js +86 -0
- package/dist/history/ingest.js.map +1 -0
- package/dist/history/memory-index.d.ts +88 -0
- package/dist/history/memory-index.d.ts.map +1 -0
- package/dist/history/memory-index.js +236 -0
- package/dist/history/memory-index.js.map +1 -0
- package/dist/history/playwright-report.d.ts +102 -0
- package/dist/history/playwright-report.d.ts.map +1 -0
- package/dist/history/playwright-report.js +274 -0
- package/dist/history/playwright-report.js.map +1 -0
- package/dist/history/store.d.ts +73 -0
- package/dist/history/store.d.ts.map +1 -0
- package/dist/history/store.js +243 -0
- package/dist/history/store.js.map +1 -0
- package/dist/history/types.d.ts +69 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +18 -0
- package/dist/history/types.js.map +1 -0
- package/dist/history/url.d.ts +79 -0
- package/dist/history/url.d.ts.map +1 -0
- package/dist/history/url.js +121 -0
- package/dist/history/url.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/locator/stability.d.ts +63 -0
- package/dist/locator/stability.d.ts.map +1 -0
- package/dist/locator/stability.js +127 -0
- package/dist/locator/stability.js.map +1 -0
- package/dist/taxonomy/classify.d.ts +63 -0
- package/dist/taxonomy/classify.d.ts.map +1 -0
- package/dist/taxonomy/classify.js +344 -0
- package/dist/taxonomy/classify.js.map +1 -0
- package/dist/taxonomy/kinds.d.ts +49 -0
- package/dist/taxonomy/kinds.d.ts.map +1 -0
- package/dist/taxonomy/kinds.js +139 -0
- package/dist/taxonomy/kinds.js.map +1 -0
- package/dist/taxonomy/parse-error.d.ts +85 -0
- package/dist/taxonomy/parse-error.d.ts.map +1 -0
- package/dist/taxonomy/parse-error.js +179 -0
- package/dist/taxonomy/parse-error.js.map +1 -0
- package/dist/version.d.ts +10 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/dist-cjs/.tsbuildinfo +1 -0
- package/dist-cjs/config/schema.js +283 -0
- package/dist-cjs/config/schema.js.map +1 -0
- package/dist-cjs/evidence/id.js +24 -0
- package/dist-cjs/evidence/id.js.map +1 -0
- package/dist-cjs/evidence/redact.js +103 -0
- package/dist-cjs/evidence/redact.js.map +1 -0
- package/dist-cjs/evidence/store.js +156 -0
- package/dist-cjs/evidence/store.js.map +1 -0
- package/dist-cjs/evidence/types.js +25 -0
- package/dist-cjs/evidence/types.js.map +1 -0
- package/dist-cjs/history/ingest-playwright.js +76 -0
- package/dist-cjs/history/ingest-playwright.js.map +1 -0
- package/dist-cjs/history/ingest.js +89 -0
- package/dist-cjs/history/ingest.js.map +1 -0
- package/dist-cjs/history/memory-index.js +242 -0
- package/dist-cjs/history/memory-index.js.map +1 -0
- package/dist-cjs/history/playwright-report.js +277 -0
- package/dist-cjs/history/playwright-report.js.map +1 -0
- package/dist-cjs/history/store.js +247 -0
- package/dist-cjs/history/store.js.map +1 -0
- package/dist-cjs/history/types.js +23 -0
- package/dist-cjs/history/types.js.map +1 -0
- package/dist-cjs/history/url.js +127 -0
- package/dist-cjs/history/url.js.map +1 -0
- package/dist-cjs/index.js +88 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/locator/stability.js +134 -0
- package/dist-cjs/locator/stability.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/taxonomy/classify.js +348 -0
- package/dist-cjs/taxonomy/classify.js.map +1 -0
- package/dist-cjs/taxonomy/kinds.js +145 -0
- package/dist-cjs/taxonomy/kinds.js.map +1 -0
- package/dist-cjs/taxonomy/parse-error.js +186 -0
- package/dist-cjs/taxonomy/parse-error.js.map +1 -0
- package/dist-cjs/version.js +13 -0
- package/dist-cjs/version.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Where history lives, expressed as one string.
|
|
4
|
+
*
|
|
5
|
+
* `--db` was already the only knob naming the store, and every consumer — the
|
|
6
|
+
* CLI, the generated workflows, `atest.config.ts` — passes it around as an
|
|
7
|
+
* opaque path. Making it a URL rather than adding `--history-account`,
|
|
8
|
+
* `--history-container` and `--history-prefix` means the blob backend needs no
|
|
9
|
+
* new flag anywhere, and a repo switches from a local file to Azure by
|
|
10
|
+
* changing one repository variable.
|
|
11
|
+
*
|
|
12
|
+
* Parsing lives in core because it is pure string work that the CLI, the
|
|
13
|
+
* Azure driver and `doctor` all need, and because a typo in a container name
|
|
14
|
+
* should fail with a readable message before any credential is acquired. The
|
|
15
|
+
* network code that acts on the result lives in `@aplaytest/store-azure`.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.HistoryUrlError = exports.DEFAULT_BLOB_ENDPOINT_SUFFIX = void 0;
|
|
19
|
+
exports.parseHistoryUrl = parseHistoryUrl;
|
|
20
|
+
exports.describeHistoryTarget = describeHistoryTarget;
|
|
21
|
+
exports.DEFAULT_BLOB_ENDPOINT_SUFFIX = 'blob.core.windows.net';
|
|
22
|
+
/** Azure's rule, enforced here so the failure names the field. */
|
|
23
|
+
const CONTAINER_NAME = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
24
|
+
const ACCOUNT_NAME = /^[a-z0-9]{3,24}$/;
|
|
25
|
+
class HistoryUrlError extends Error {
|
|
26
|
+
constructor(message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = 'HistoryUrlError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.HistoryUrlError = HistoryUrlError;
|
|
32
|
+
function parseWindowDays(params) {
|
|
33
|
+
const raw = params.get('window');
|
|
34
|
+
if (raw === null)
|
|
35
|
+
return null;
|
|
36
|
+
const days = Number.parseInt(raw, 10);
|
|
37
|
+
if (!Number.isInteger(days) || days < 1) {
|
|
38
|
+
throw new HistoryUrlError(`?window= must be a positive integer number of days, got "${raw}".`);
|
|
39
|
+
}
|
|
40
|
+
return days;
|
|
41
|
+
}
|
|
42
|
+
function normalisePrefix(segments) {
|
|
43
|
+
const joined = segments.filter(s => s !== '').join('/');
|
|
44
|
+
return joined === '' ? '' : `${joined}/`;
|
|
45
|
+
}
|
|
46
|
+
function azureTarget(url, serviceUrl, account, segments) {
|
|
47
|
+
const container = segments[0];
|
|
48
|
+
if (container === undefined || container === '') {
|
|
49
|
+
throw new HistoryUrlError(`"${url.href}" names no container. Expected azblob://<account>/<container>[/<prefix>].`);
|
|
50
|
+
}
|
|
51
|
+
if (container.length < 3 || container.length > 63 || !CONTAINER_NAME.test(container)) {
|
|
52
|
+
throw new HistoryUrlError(`"${container}" is not a valid container name — 3-63 chars, lowercase letters, digits and single dashes.`);
|
|
53
|
+
}
|
|
54
|
+
if (!ACCOUNT_NAME.test(account)) {
|
|
55
|
+
throw new HistoryUrlError(`"${account}" is not a valid storage account name — 3-24 lowercase alphanumerics.`);
|
|
56
|
+
}
|
|
57
|
+
const readOnly = url.searchParams.get('readonly');
|
|
58
|
+
return {
|
|
59
|
+
kind: 'azure-blob',
|
|
60
|
+
serviceUrl,
|
|
61
|
+
account,
|
|
62
|
+
container,
|
|
63
|
+
prefix: normalisePrefix(segments.slice(1)),
|
|
64
|
+
windowDays: parseWindowDays(url.searchParams),
|
|
65
|
+
// Present-but-empty (`?readonly`) counts as on, because that is what
|
|
66
|
+
// somebody typing it means. Only an explicit falsy value turns it off.
|
|
67
|
+
readOnly: readOnly !== null && readOnly !== '0' && readOnly !== 'false',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Accepted forms:
|
|
72
|
+
*
|
|
73
|
+
* :memory: throwaway (not the config default)
|
|
74
|
+
* .atest/history.sqlite a local file
|
|
75
|
+
* azblob://<account>/<container>[/<prefix>] Azure, via the DNS suffix
|
|
76
|
+
* https://<account>.blob.core.windows.net/<c>/<p> Azure, fully qualified
|
|
77
|
+
* http://127.0.0.1:10000/<account>/<c>/<p> Azurite, account in path
|
|
78
|
+
*
|
|
79
|
+
* Anything unrecognised is a FILE PATH, not an error. `--db` has always taken
|
|
80
|
+
* one, and a Windows path like `C:\atest\history.sqlite` parses as a URL with
|
|
81
|
+
* scheme `c:` — rejecting unknown schemes would break the case the flag was
|
|
82
|
+
* built for.
|
|
83
|
+
*/
|
|
84
|
+
function parseHistoryUrl(url, options = {}) {
|
|
85
|
+
const trimmed = url.trim();
|
|
86
|
+
if (trimmed === ':memory:' || trimmed === '')
|
|
87
|
+
return { kind: 'memory' };
|
|
88
|
+
if (trimmed.startsWith('azblob://')) {
|
|
89
|
+
const suffix = options.endpointSuffix ?? exports.DEFAULT_BLOB_ENDPOINT_SUFFIX;
|
|
90
|
+
const parsed = new URL(trimmed);
|
|
91
|
+
// `azblob://acct/container` puts the account in the authority, so it is
|
|
92
|
+
// already lowercased and stripped of a path by the URL parser.
|
|
93
|
+
const account = parsed.hostname;
|
|
94
|
+
const segments = parsed.pathname.split('/').filter(s => s !== '');
|
|
95
|
+
return azureTarget(parsed, `https://${account}.${suffix}`, account, segments);
|
|
96
|
+
}
|
|
97
|
+
if (trimmed.startsWith('https://') || trimmed.startsWith('http://')) {
|
|
98
|
+
const parsed = new URL(trimmed);
|
|
99
|
+
const segments = parsed.pathname.split('/').filter(s => s !== '');
|
|
100
|
+
const subdomain = /^([a-z0-9]{3,24})\.blob\./.exec(parsed.hostname);
|
|
101
|
+
if (subdomain !== null && subdomain[1] !== undefined) {
|
|
102
|
+
return azureTarget(parsed, parsed.origin, subdomain[1], segments);
|
|
103
|
+
}
|
|
104
|
+
// Emulator convention: the account is the first path segment because
|
|
105
|
+
// Azurite serves every account from one host.
|
|
106
|
+
const account = segments[0];
|
|
107
|
+
if (account === undefined) {
|
|
108
|
+
throw new HistoryUrlError(`"${trimmed}" is not a blob endpoint. Expected <account>.${exports.DEFAULT_BLOB_ENDPOINT_SUFFIX}/<container>, ` +
|
|
109
|
+
`or an emulator URL with the account as the first path segment.`);
|
|
110
|
+
}
|
|
111
|
+
return azureTarget(parsed, `${parsed.origin}/${account}`, account, segments.slice(1));
|
|
112
|
+
}
|
|
113
|
+
return { kind: 'sqlite', path: trimmed };
|
|
114
|
+
}
|
|
115
|
+
/** Short, log-safe description. Used by `doctor` and every "what am I reading?" line. */
|
|
116
|
+
function describeHistoryTarget(target) {
|
|
117
|
+
switch (target.kind) {
|
|
118
|
+
case 'memory':
|
|
119
|
+
return 'in-memory (discarded when the process exits)';
|
|
120
|
+
case 'sqlite':
|
|
121
|
+
return `sqlite · ${target.path}`;
|
|
122
|
+
case 'azure-blob':
|
|
123
|
+
return (`azure blob · ${target.account}/${target.container}/${target.prefix}` +
|
|
124
|
+
(target.readOnly ? ' (read-only)' : ''));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/history/url.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @aplaytest/core — types, failure taxonomy, locator ranking, and configuration.
|
|
4
|
+
*
|
|
5
|
+
* This package has no Playwright dependency, makes no network calls, and never
|
|
6
|
+
* touches a model. Everything here must be unit-testable in isolation; that
|
|
7
|
+
* constraint is what keeps the engines above it testable too.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.AtestConfigSchema = exports.defineAtestConfig = exports.mapPlaywrightReport = exports.ingestPlaywrightJson = exports.ingestDirectory = exports.DEFAULT_BLOB_ENDPOINT_SUFFIX = exports.HistoryUrlError = exports.describeHistoryTarget = exports.parseHistoryUrl = exports.shardKeyOf = exports.MemoryHistoryStore = exports.HistoryIndex = exports.SqliteHistoryStore = exports.isConclusive = exports.isFailure = exports.RUN_SCHEMA_VERSION = exports.isEvidenceBundle = exports.parseEvidenceBundle = exports.loadRunBundles = exports.SchemaVersionError = exports.EvidenceStore = exports.REDACTED = exports.redactUrl = exports.redactString = exports.redact = exports.isEvidenceId = exports.evidenceId = exports.formatFailingStep = exports.EVIDENCE_SCHEMA_VERSION = exports.ATEST_VERSION = exports.testIdDistance = exports.stabilityDelta = exports.stabilityRankOf = exports.parseLocator = exports.MAX_STABILITY_RANK = exports.STABILITY_RANK = exports.LOCATOR_STRATEGIES = exports.joinErrors = exports.stripCodeFrame = exports.stripAnsi = exports.splitCallLog = exports.parsePlaywrightError = exports.listRules = exports.classify = exports.countsTowardFlakeStats = exports.isHealable = exports.healEligibility = exports.ROUTING = exports.NEVER_HEAL = exports.FAILURE_KINDS = void 0;
|
|
11
|
+
exports.AGGRESSIVENESS_PRESETS = exports.AggressivenessSchema = exports.ExecutionModeSchema = void 0;
|
|
12
|
+
// Taxonomy
|
|
13
|
+
var kinds_js_1 = require("./taxonomy/kinds.js");
|
|
14
|
+
Object.defineProperty(exports, "FAILURE_KINDS", { enumerable: true, get: function () { return kinds_js_1.FAILURE_KINDS; } });
|
|
15
|
+
Object.defineProperty(exports, "NEVER_HEAL", { enumerable: true, get: function () { return kinds_js_1.NEVER_HEAL; } });
|
|
16
|
+
Object.defineProperty(exports, "ROUTING", { enumerable: true, get: function () { return kinds_js_1.ROUTING; } });
|
|
17
|
+
Object.defineProperty(exports, "healEligibility", { enumerable: true, get: function () { return kinds_js_1.healEligibility; } });
|
|
18
|
+
Object.defineProperty(exports, "isHealable", { enumerable: true, get: function () { return kinds_js_1.isHealable; } });
|
|
19
|
+
Object.defineProperty(exports, "countsTowardFlakeStats", { enumerable: true, get: function () { return kinds_js_1.countsTowardFlakeStats; } });
|
|
20
|
+
var classify_js_1 = require("./taxonomy/classify.js");
|
|
21
|
+
Object.defineProperty(exports, "classify", { enumerable: true, get: function () { return classify_js_1.classify; } });
|
|
22
|
+
Object.defineProperty(exports, "listRules", { enumerable: true, get: function () { return classify_js_1.listRules; } });
|
|
23
|
+
var parse_error_js_1 = require("./taxonomy/parse-error.js");
|
|
24
|
+
Object.defineProperty(exports, "parsePlaywrightError", { enumerable: true, get: function () { return parse_error_js_1.parsePlaywrightError; } });
|
|
25
|
+
Object.defineProperty(exports, "splitCallLog", { enumerable: true, get: function () { return parse_error_js_1.splitCallLog; } });
|
|
26
|
+
Object.defineProperty(exports, "stripAnsi", { enumerable: true, get: function () { return parse_error_js_1.stripAnsi; } });
|
|
27
|
+
Object.defineProperty(exports, "stripCodeFrame", { enumerable: true, get: function () { return parse_error_js_1.stripCodeFrame; } });
|
|
28
|
+
Object.defineProperty(exports, "joinErrors", { enumerable: true, get: function () { return parse_error_js_1.joinErrors; } });
|
|
29
|
+
// Locators
|
|
30
|
+
var stability_js_1 = require("./locator/stability.js");
|
|
31
|
+
Object.defineProperty(exports, "LOCATOR_STRATEGIES", { enumerable: true, get: function () { return stability_js_1.LOCATOR_STRATEGIES; } });
|
|
32
|
+
Object.defineProperty(exports, "STABILITY_RANK", { enumerable: true, get: function () { return stability_js_1.STABILITY_RANK; } });
|
|
33
|
+
Object.defineProperty(exports, "MAX_STABILITY_RANK", { enumerable: true, get: function () { return stability_js_1.MAX_STABILITY_RANK; } });
|
|
34
|
+
Object.defineProperty(exports, "parseLocator", { enumerable: true, get: function () { return stability_js_1.parseLocator; } });
|
|
35
|
+
Object.defineProperty(exports, "stabilityRankOf", { enumerable: true, get: function () { return stability_js_1.stabilityRankOf; } });
|
|
36
|
+
Object.defineProperty(exports, "stabilityDelta", { enumerable: true, get: function () { return stability_js_1.stabilityDelta; } });
|
|
37
|
+
Object.defineProperty(exports, "testIdDistance", { enumerable: true, get: function () { return stability_js_1.testIdDistance; } });
|
|
38
|
+
// Identity
|
|
39
|
+
var version_js_1 = require("./version.js");
|
|
40
|
+
Object.defineProperty(exports, "ATEST_VERSION", { enumerable: true, get: function () { return version_js_1.ATEST_VERSION; } });
|
|
41
|
+
// Evidence
|
|
42
|
+
var types_js_1 = require("./evidence/types.js");
|
|
43
|
+
Object.defineProperty(exports, "EVIDENCE_SCHEMA_VERSION", { enumerable: true, get: function () { return types_js_1.EVIDENCE_SCHEMA_VERSION; } });
|
|
44
|
+
Object.defineProperty(exports, "formatFailingStep", { enumerable: true, get: function () { return types_js_1.formatFailingStep; } });
|
|
45
|
+
var id_js_1 = require("./evidence/id.js");
|
|
46
|
+
Object.defineProperty(exports, "evidenceId", { enumerable: true, get: function () { return id_js_1.evidenceId; } });
|
|
47
|
+
Object.defineProperty(exports, "isEvidenceId", { enumerable: true, get: function () { return id_js_1.isEvidenceId; } });
|
|
48
|
+
var redact_js_1 = require("./evidence/redact.js");
|
|
49
|
+
Object.defineProperty(exports, "redact", { enumerable: true, get: function () { return redact_js_1.redact; } });
|
|
50
|
+
Object.defineProperty(exports, "redactString", { enumerable: true, get: function () { return redact_js_1.redactString; } });
|
|
51
|
+
Object.defineProperty(exports, "redactUrl", { enumerable: true, get: function () { return redact_js_1.redactUrl; } });
|
|
52
|
+
Object.defineProperty(exports, "REDACTED", { enumerable: true, get: function () { return redact_js_1.REDACTED; } });
|
|
53
|
+
var store_js_1 = require("./evidence/store.js");
|
|
54
|
+
Object.defineProperty(exports, "EvidenceStore", { enumerable: true, get: function () { return store_js_1.EvidenceStore; } });
|
|
55
|
+
Object.defineProperty(exports, "SchemaVersionError", { enumerable: true, get: function () { return store_js_1.SchemaVersionError; } });
|
|
56
|
+
Object.defineProperty(exports, "loadRunBundles", { enumerable: true, get: function () { return store_js_1.loadRunBundles; } });
|
|
57
|
+
Object.defineProperty(exports, "parseEvidenceBundle", { enumerable: true, get: function () { return store_js_1.parseEvidenceBundle; } });
|
|
58
|
+
Object.defineProperty(exports, "isEvidenceBundle", { enumerable: true, get: function () { return store_js_1.isEvidenceBundle; } });
|
|
59
|
+
// History
|
|
60
|
+
var types_js_2 = require("./history/types.js");
|
|
61
|
+
Object.defineProperty(exports, "RUN_SCHEMA_VERSION", { enumerable: true, get: function () { return types_js_2.RUN_SCHEMA_VERSION; } });
|
|
62
|
+
Object.defineProperty(exports, "isFailure", { enumerable: true, get: function () { return types_js_2.isFailure; } });
|
|
63
|
+
Object.defineProperty(exports, "isConclusive", { enumerable: true, get: function () { return types_js_2.isConclusive; } });
|
|
64
|
+
var store_js_2 = require("./history/store.js");
|
|
65
|
+
Object.defineProperty(exports, "SqliteHistoryStore", { enumerable: true, get: function () { return store_js_2.SqliteHistoryStore; } });
|
|
66
|
+
var memory_index_js_1 = require("./history/memory-index.js");
|
|
67
|
+
Object.defineProperty(exports, "HistoryIndex", { enumerable: true, get: function () { return memory_index_js_1.HistoryIndex; } });
|
|
68
|
+
Object.defineProperty(exports, "MemoryHistoryStore", { enumerable: true, get: function () { return memory_index_js_1.MemoryHistoryStore; } });
|
|
69
|
+
Object.defineProperty(exports, "shardKeyOf", { enumerable: true, get: function () { return memory_index_js_1.shardKeyOf; } });
|
|
70
|
+
var url_js_1 = require("./history/url.js");
|
|
71
|
+
Object.defineProperty(exports, "parseHistoryUrl", { enumerable: true, get: function () { return url_js_1.parseHistoryUrl; } });
|
|
72
|
+
Object.defineProperty(exports, "describeHistoryTarget", { enumerable: true, get: function () { return url_js_1.describeHistoryTarget; } });
|
|
73
|
+
Object.defineProperty(exports, "HistoryUrlError", { enumerable: true, get: function () { return url_js_1.HistoryUrlError; } });
|
|
74
|
+
Object.defineProperty(exports, "DEFAULT_BLOB_ENDPOINT_SUFFIX", { enumerable: true, get: function () { return url_js_1.DEFAULT_BLOB_ENDPOINT_SUFFIX; } });
|
|
75
|
+
var ingest_js_1 = require("./history/ingest.js");
|
|
76
|
+
Object.defineProperty(exports, "ingestDirectory", { enumerable: true, get: function () { return ingest_js_1.ingestDirectory; } });
|
|
77
|
+
var ingest_playwright_js_1 = require("./history/ingest-playwright.js");
|
|
78
|
+
Object.defineProperty(exports, "ingestPlaywrightJson", { enumerable: true, get: function () { return ingest_playwright_js_1.ingestPlaywrightJson; } });
|
|
79
|
+
var playwright_report_js_1 = require("./history/playwright-report.js");
|
|
80
|
+
Object.defineProperty(exports, "mapPlaywrightReport", { enumerable: true, get: function () { return playwright_report_js_1.mapPlaywrightReport; } });
|
|
81
|
+
// Config
|
|
82
|
+
var schema_js_1 = require("./config/schema.js");
|
|
83
|
+
Object.defineProperty(exports, "defineAtestConfig", { enumerable: true, get: function () { return schema_js_1.defineAtestConfig; } });
|
|
84
|
+
Object.defineProperty(exports, "AtestConfigSchema", { enumerable: true, get: function () { return schema_js_1.AtestConfigSchema; } });
|
|
85
|
+
Object.defineProperty(exports, "ExecutionModeSchema", { enumerable: true, get: function () { return schema_js_1.ExecutionModeSchema; } });
|
|
86
|
+
Object.defineProperty(exports, "AggressivenessSchema", { enumerable: true, get: function () { return schema_js_1.AggressivenessSchema; } });
|
|
87
|
+
Object.defineProperty(exports, "AGGRESSIVENESS_PRESETS", { enumerable: true, get: function () { return schema_js_1.AGGRESSIVENESS_PRESETS; } });
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;AAEH,WAAW;AACX,gDAO6B;AAN3B,yGAAA,aAAa,OAAA;AACb,sGAAA,UAAU,OAAA;AACV,mGAAA,OAAO,OAAA;AACP,2GAAA,eAAe,OAAA;AACf,sGAAA,UAAU,OAAA;AACV,kHAAA,sBAAsB,OAAA;AASxB,sDAA6D;AAApD,uGAAA,QAAQ,OAAA;AAAE,wGAAA,SAAS,OAAA;AAG5B,4DAMmC;AALjC,sHAAA,oBAAoB,OAAA;AACpB,8GAAA,YAAY,OAAA;AACZ,2GAAA,SAAS,OAAA;AACT,gHAAA,cAAc,OAAA;AACd,4GAAA,UAAU,OAAA;AAIZ,WAAW;AACX,uDAQgC;AAP9B,kHAAA,kBAAkB,OAAA;AAClB,8GAAA,cAAc,OAAA;AACd,kHAAA,kBAAkB,OAAA;AAClB,4GAAA,YAAY,OAAA;AACZ,+GAAA,eAAe,OAAA;AACf,8GAAA,cAAc,OAAA;AACd,8GAAA,cAAc,OAAA;AAIhB,WAAW;AACX,2CAA6C;AAApC,2GAAA,aAAa,OAAA;AAEtB,WAAW;AACX,gDAAiF;AAAxE,mHAAA,uBAAuB,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AACnD,0CAA4D;AAAnD,mGAAA,UAAU,OAAA;AAAE,qGAAA,YAAY,OAAA;AAEjC,kDAAiF;AAAxE,mGAAA,MAAM,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,sGAAA,SAAS,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAClD,gDAM6B;AAL3B,yGAAA,aAAa,OAAA;AACb,8GAAA,kBAAkB,OAAA;AAClB,0GAAA,cAAc,OAAA;AACd,+GAAA,mBAAmB,OAAA;AACnB,4GAAA,gBAAgB,OAAA;AAelB,UAAU;AACV,+CAAiF;AAAxE,8GAAA,kBAAkB,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,wGAAA,YAAY,OAAA;AAEpD,+CAAwD;AAA/C,8GAAA,kBAAkB,OAAA;AAE3B,6DAAyF;AAAhF,+GAAA,YAAY,OAAA;AAAE,qHAAA,kBAAkB,OAAA;AAAE,6GAAA,UAAU,OAAA;AACrD,2CAK0B;AAJxB,yGAAA,eAAe,OAAA;AACf,+GAAA,qBAAqB,OAAA;AACrB,yGAAA,eAAe,OAAA;AACf,sHAAA,4BAA4B,OAAA;AAO9B,iDAAsD;AAA7C,4GAAA,eAAe,OAAA;AACxB,uEAAsE;AAA7D,4HAAA,oBAAoB,OAAA;AAE7B,uEAAqE;AAA5D,2HAAA,mBAAmB,OAAA;AAa5B,SAAS;AACT,gDAM4B;AAL1B,8GAAA,iBAAiB,OAAA;AACjB,8GAAA,iBAAiB,OAAA;AACjB,gHAAA,mBAAmB,OAAA;AACnB,iHAAA,oBAAoB,OAAA;AACpB,mHAAA,sBAAsB,OAAA"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Locator stability ranking and parsing.
|
|
4
|
+
*
|
|
5
|
+
* A heal that makes a test pass by moving to a WEAKER locator is not a win:
|
|
6
|
+
* replacing a test id with a text match makes the test green and makes it
|
|
7
|
+
* fragile, coupling it to copy that product can change at any time. The engine
|
|
8
|
+
* therefore treats a negative stability delta as a warning that forces human
|
|
9
|
+
* review, and refuses to generate anything below a configured floor.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MAX_STABILITY_RANK = exports.STABILITY_RANK = exports.LOCATOR_STRATEGIES = void 0;
|
|
13
|
+
exports.parseLocator = parseLocator;
|
|
14
|
+
exports.stabilityRankOf = stabilityRankOf;
|
|
15
|
+
exports.stabilityDelta = stabilityDelta;
|
|
16
|
+
exports.testIdDistance = testIdDistance;
|
|
17
|
+
exports.LOCATOR_STRATEGIES = [
|
|
18
|
+
'testid',
|
|
19
|
+
'role',
|
|
20
|
+
'label',
|
|
21
|
+
'placeholder',
|
|
22
|
+
'text',
|
|
23
|
+
'css',
|
|
24
|
+
'xpath',
|
|
25
|
+
];
|
|
26
|
+
/** Lower is more durable. */
|
|
27
|
+
exports.STABILITY_RANK = {
|
|
28
|
+
testid: 0,
|
|
29
|
+
role: 1,
|
|
30
|
+
label: 2,
|
|
31
|
+
placeholder: 3,
|
|
32
|
+
text: 4,
|
|
33
|
+
css: 5,
|
|
34
|
+
xpath: 6,
|
|
35
|
+
};
|
|
36
|
+
exports.MAX_STABILITY_RANK = 6;
|
|
37
|
+
const ROLE_WITH_NAME = /getByRole\(\s*['"`]([^'"`]+)['"`]\s*,\s*\{[^}]*\bname:\s*['"`]([^'"`]+)['"`]/;
|
|
38
|
+
const ROLE_ONLY = /getByRole\(\s*['"`]([^'"`]+)['"`]/;
|
|
39
|
+
const PATTERNS = [
|
|
40
|
+
{ strategy: 'testid', re: /getByTestId\(\s*['"`]([^'"`]+)['"`]/ },
|
|
41
|
+
{ strategy: 'testid', re: /\[data-testid=['"]?([^\]'"]+)['"]?\]/ },
|
|
42
|
+
{ strategy: 'label', re: /getByLabel\(\s*['"`]([^'"`]+)['"`]/ },
|
|
43
|
+
{ strategy: 'placeholder', re: /getByPlaceholder\(\s*['"`]([^'"`]+)['"`]/ },
|
|
44
|
+
{ strategy: 'text', re: /getByText\(\s*['"`]([^'"`]+)['"`]/ },
|
|
45
|
+
{ strategy: 'text', re: /text=(.+)$/ },
|
|
46
|
+
{ strategy: 'xpath', re: /^\s*(?:xpath=)?(\/\/.+)$/ },
|
|
47
|
+
];
|
|
48
|
+
/**
|
|
49
|
+
* Best-effort parse of a Playwright selector or locator expression.
|
|
50
|
+
* Returns null when nothing recognisable is present — callers must handle it
|
|
51
|
+
* rather than assuming a strategy.
|
|
52
|
+
*/
|
|
53
|
+
function parseLocator(expression) {
|
|
54
|
+
if (expression === null || expression === undefined)
|
|
55
|
+
return null;
|
|
56
|
+
const raw = expression.trim();
|
|
57
|
+
if (raw === '')
|
|
58
|
+
return null;
|
|
59
|
+
const namedRole = ROLE_WITH_NAME.exec(raw);
|
|
60
|
+
const role = namedRole?.[1];
|
|
61
|
+
const roleName = namedRole?.[2];
|
|
62
|
+
if (role !== undefined && role !== '' && roleName !== undefined && roleName !== '') {
|
|
63
|
+
return { strategy: 'role', value: role, raw, accessibleName: roleName };
|
|
64
|
+
}
|
|
65
|
+
const bareRole = ROLE_ONLY.exec(raw);
|
|
66
|
+
const bare = bareRole?.[1];
|
|
67
|
+
if (bare !== undefined && bare !== '') {
|
|
68
|
+
return { strategy: 'role', value: bare, raw, accessibleName: null };
|
|
69
|
+
}
|
|
70
|
+
for (const { strategy, re } of PATTERNS) {
|
|
71
|
+
const match = re.exec(raw);
|
|
72
|
+
const captured = match?.[1];
|
|
73
|
+
if (captured !== undefined && captured !== '') {
|
|
74
|
+
return { strategy, value: captured, raw, accessibleName: null };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Anything left that looks like a selector is treated as CSS. This is a
|
|
78
|
+
// deliberate floor, not a guess: CSS ranks low, so an unparsed locator can
|
|
79
|
+
// never be mistaken for a durable one.
|
|
80
|
+
return { strategy: 'css', value: raw, raw, accessibleName: null };
|
|
81
|
+
}
|
|
82
|
+
function stabilityRankOf(strategy) {
|
|
83
|
+
return exports.STABILITY_RANK[strategy];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Positive = the replacement is MORE stable. Negative = less stable, which
|
|
87
|
+
* requires human review regardless of aggressiveness setting.
|
|
88
|
+
*/
|
|
89
|
+
function stabilityDelta(from, to) {
|
|
90
|
+
return exports.STABILITY_RANK[from] - exports.STABILITY_RANK[to];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Positional, prefix-weighted distance between two test ids.
|
|
94
|
+
*
|
|
95
|
+
* Test ids in a component-structured app read outside-in —
|
|
96
|
+
* `<feature>-<component>-<element>` — so the LEADING tokens identify where the
|
|
97
|
+
* element lives and the trailing token identifies what it is. Elements get
|
|
98
|
+
* renamed far more often than they move between features, so disagreement in
|
|
99
|
+
* the prefix is the stronger signal that these are different elements.
|
|
100
|
+
* Weights therefore decay from the front.
|
|
101
|
+
*
|
|
102
|
+
* gym-card-name → gym-card-title 0.17 same place, renamed ← the common heal
|
|
103
|
+
* gym-card-name → gym-card-county 0.17 same place, sibling field
|
|
104
|
+
* gym-card-name → event-card-name 0.50 different feature
|
|
105
|
+
* gym-card-name → checkout-submit 1.00 unrelated
|
|
106
|
+
*
|
|
107
|
+
* Note that a rename and a sibling field score identically. That is honest:
|
|
108
|
+
* nothing in the STRING distinguishes them. Separating the two is exactly the
|
|
109
|
+
* judgement the Tier-1 ranker exists to make, using the failing assertion's
|
|
110
|
+
* domain arguments — which is why Tier 0 hands over candidates rather than
|
|
111
|
+
* picking one.
|
|
112
|
+
*
|
|
113
|
+
* Returns 0 (identical) .. 1 (nothing in common).
|
|
114
|
+
*/
|
|
115
|
+
function testIdDistance(a, b) {
|
|
116
|
+
if (a === b)
|
|
117
|
+
return 0;
|
|
118
|
+
const at = a.split(/[-_.:]/).filter(Boolean);
|
|
119
|
+
const bt = b.split(/[-_.:]/).filter(Boolean);
|
|
120
|
+
if (at.length === 0 || bt.length === 0)
|
|
121
|
+
return 1;
|
|
122
|
+
const length = Math.max(at.length, bt.length);
|
|
123
|
+
let mismatchWeight = 0;
|
|
124
|
+
let totalWeight = 0;
|
|
125
|
+
for (let i = 0; i < length; i++) {
|
|
126
|
+
// Leading tokens weigh most: position 0 of a 3-token id carries 3/6.
|
|
127
|
+
const weight = length - i;
|
|
128
|
+
totalWeight += weight;
|
|
129
|
+
if (at[i] !== bt[i])
|
|
130
|
+
mismatchWeight += weight;
|
|
131
|
+
}
|
|
132
|
+
return totalWeight === 0 ? 1 : Math.min(1, mismatchWeight / totalWeight);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=stability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stability.js","sourceRoot":"","sources":["../../src/locator/stability.ts"],"names":[],"mappings":"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"}
|