@ia-qa/self-healing 0.2.1 → 0.3.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/browser/contract.d.ts +5 -0
- package/dist/browser/contract.js +58 -0
- package/dist/browser/contract.js.map +1 -1
- package/dist/cli/diff.d.ts +7 -4
- package/dist/cli/diff.js +161 -5
- package/dist/cli/diff.js.map +1 -1
- package/dist/cli/fix.d.ts +9 -8
- package/dist/cli/fix.js +132 -8
- package/dist/cli/fix.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/map.d.ts +3 -0
- package/dist/cli/map.js +53 -0
- package/dist/cli/map.js.map +1 -1
- package/dist/config.d.ts +15 -0
- package/dist/config.js +11 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/layout.d.ts +54 -0
- package/dist/layout.js +183 -0
- package/dist/layout.js.map +1 -0
- package/dist/markdown.d.ts +5 -2
- package/dist/markdown.js +14 -1
- package/dist/markdown.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1,6 @@
|
|
|
1
1
|
export function renderPageContract(mapping: any): string;
|
|
2
|
+
/**
|
|
3
|
+
* Render a layout mapping as Markdown. Same table format as a page contract,
|
|
4
|
+
* but the header identifies it as a shared layout component.
|
|
5
|
+
*/
|
|
6
|
+
export function renderLayoutContract(mapping: any): string;
|
package/dist/browser/contract.js
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.renderPageContract = renderPageContract;
|
|
19
|
+
exports.renderLayoutContract = renderLayoutContract;
|
|
19
20
|
const ROLE_ORDER = [
|
|
20
21
|
'textbox',
|
|
21
22
|
'combobox',
|
|
@@ -104,4 +105,61 @@ function renderPageContract(mapping) {
|
|
|
104
105
|
}
|
|
105
106
|
return lines.join('\n');
|
|
106
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Render a layout mapping as Markdown. Same table format as a page contract,
|
|
110
|
+
* but the header identifies it as a shared layout component.
|
|
111
|
+
*/
|
|
112
|
+
function renderLayoutContract(mapping) {
|
|
113
|
+
const name = mapping.layout || 'layout';
|
|
114
|
+
const description = mapping.description || '';
|
|
115
|
+
const capturedAt = mapping.capturedAt || '';
|
|
116
|
+
const sourcePages = mapping.sourcePages || 0;
|
|
117
|
+
const elements = (mapping && mapping.elements) || [];
|
|
118
|
+
const groups = groupByRole(elements);
|
|
119
|
+
const lines = [];
|
|
120
|
+
lines.push('# Layout — ' + name);
|
|
121
|
+
lines.push('');
|
|
122
|
+
if (description) {
|
|
123
|
+
lines.push('> ' + description);
|
|
124
|
+
lines.push('');
|
|
125
|
+
}
|
|
126
|
+
lines.push('- **Source pages:** ' + sourcePages);
|
|
127
|
+
lines.push('- **Captured:** ' + capturedAt);
|
|
128
|
+
lines.push('- **Shared elements:** ' + elements.length);
|
|
129
|
+
lines.push('');
|
|
130
|
+
lines.push('> This file is a **layout component** — elements shared across many pages (navbar,');
|
|
131
|
+
lines.push('> footer, search, cookie consent…). It is auto-detected by `@ia-qa/self-healing`.');
|
|
132
|
+
lines.push('> Page-specific elements are in each page\\\'s own contract. When a layout element changes,');
|
|
133
|
+
lines.push('> fix it here once instead of in every page.');
|
|
134
|
+
lines.push('');
|
|
135
|
+
if (elements.length === 0) {
|
|
136
|
+
lines.push('_No shared interactive elements were detected for this layout._');
|
|
137
|
+
lines.push('');
|
|
138
|
+
return lines.join('\n');
|
|
139
|
+
}
|
|
140
|
+
const anyContext = elements.some((el) => el.context);
|
|
141
|
+
for (const [role, els] of groups) {
|
|
142
|
+
lines.push('## ' + role + ' (' + els.length + ')');
|
|
143
|
+
lines.push('');
|
|
144
|
+
if (anyContext) {
|
|
145
|
+
lines.push('| Accessible name | Context | Selector |');
|
|
146
|
+
lines.push('| --- | --- | --- |');
|
|
147
|
+
for (const el of els) {
|
|
148
|
+
const ename = el.name ? escapeCell(el.name) : '_(no accessible name)_';
|
|
149
|
+
const ctx = el.context ? escapeCell(el.context) : '—';
|
|
150
|
+
lines.push('| ' + ename + ' | ' + ctx + ' | `' + escapeCell(el.selector) + '` |');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
lines.push('| Accessible name | Selector |');
|
|
155
|
+
lines.push('| --- | --- |');
|
|
156
|
+
for (const el of els) {
|
|
157
|
+
const ename = el.name ? escapeCell(el.name) : '_(no accessible name)_';
|
|
158
|
+
lines.push('| ' + ename + ' | `' + escapeCell(el.selector) + '` |');
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
lines.push('');
|
|
162
|
+
}
|
|
163
|
+
return lines.join('\n');
|
|
164
|
+
}
|
|
107
165
|
//# sourceMappingURL=contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/browser/contract.js"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAsCH,gDAoDC;
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/browser/contract.js"],"names":[],"mappings":"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"}
|
package/dist/cli/diff.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `ia-qa-heal diff <baseline.json> <current.json
|
|
2
|
+
* `ia-qa-heal diff <baseline.json> <current.json> [--strict] [--json] [--dir]`
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Two modes:
|
|
5
|
+
* file mode (default) — diffs two individual mapping files.
|
|
6
|
+
* directory mode (`--dir`) — both args are directories of mapping files.
|
|
7
|
+
* Finds matching pairs by filename, diffs each, and produces an aggregate
|
|
8
|
+
* verdict. Layouts in `_layouts/` are diffed first (once instead of N
|
|
9
|
+
* times), then individual pages. Use this for a full-suite CI gate.
|
|
7
10
|
*
|
|
8
11
|
* Exit codes (so a pipeline can gate on it):
|
|
9
12
|
* 0 — PASS, or FIX without `--strict`
|
package/dist/cli/diff.js
CHANGED
|
@@ -38,11 +38,14 @@ const fs = __importStar(require("fs"));
|
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const match_1 = require("../browser/match");
|
|
40
40
|
/**
|
|
41
|
-
* `ia-qa-heal diff <baseline.json> <current.json
|
|
41
|
+
* `ia-qa-heal diff <baseline.json> <current.json> [--strict] [--json] [--dir]`
|
|
42
42
|
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
43
|
+
* Two modes:
|
|
44
|
+
* file mode (default) — diffs two individual mapping files.
|
|
45
|
+
* directory mode (`--dir`) — both args are directories of mapping files.
|
|
46
|
+
* Finds matching pairs by filename, diffs each, and produces an aggregate
|
|
47
|
+
* verdict. Layouts in `_layouts/` are diffed first (once instead of N
|
|
48
|
+
* times), then individual pages. Use this for a full-suite CI gate.
|
|
46
49
|
*
|
|
47
50
|
* Exit codes (so a pipeline can gate on it):
|
|
48
51
|
* 0 — PASS, or FIX without `--strict`
|
|
@@ -52,12 +55,18 @@ const match_1 = require("../browser/match");
|
|
|
52
55
|
async function runDiff(args) {
|
|
53
56
|
const strict = args.includes('--strict');
|
|
54
57
|
const json = args.includes('--json');
|
|
58
|
+
const dirMode = args.includes('--dir');
|
|
55
59
|
const files = args.filter((a) => !a.startsWith('--'));
|
|
56
60
|
if (files.length !== 2) {
|
|
57
|
-
|
|
61
|
+
const mode = dirMode ? '<baseline-dir> <current-dir>' : '<baseline.json> <current.json>';
|
|
62
|
+
console.error(`Usage: ia-qa-heal diff ${mode} [--strict] [--json]${dirMode ? '' : ' [--dir]'}`);
|
|
58
63
|
process.exitCode = 2;
|
|
59
64
|
return;
|
|
60
65
|
}
|
|
66
|
+
if (dirMode) {
|
|
67
|
+
await runDirDiff(files[0], files[1], { strict, json });
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
61
70
|
const [baseline, current] = files.map((f) => readMapping(f));
|
|
62
71
|
const report = (0, match_1.diffMappings)(baseline, current);
|
|
63
72
|
if (json) {
|
|
@@ -69,6 +78,153 @@ async function runDiff(args) {
|
|
|
69
78
|
const failing = report.verdict === 'BLOCK' || (strict && report.verdict === 'FIX');
|
|
70
79
|
process.exitCode = failing ? 1 : 0;
|
|
71
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Directory-level diff. Walks two directories of mapping files, finds
|
|
83
|
+
* matching pairs by filename, and diffs each. Layouts (in `_layouts/`) are
|
|
84
|
+
* diffed first — one diff instead of N per page.
|
|
85
|
+
*/
|
|
86
|
+
async function runDirDiff(baselineDir, currentDir, opts) {
|
|
87
|
+
if (!fs.existsSync(baselineDir) || !fs.statSync(baselineDir).isDirectory()) {
|
|
88
|
+
console.error(`❌ "${baselineDir}" is not a directory.`);
|
|
89
|
+
process.exit(2);
|
|
90
|
+
}
|
|
91
|
+
if (!fs.existsSync(currentDir) || !fs.statSync(currentDir).isDirectory()) {
|
|
92
|
+
console.error(`❌ "${currentDir}" is not a directory.`);
|
|
93
|
+
process.exit(2);
|
|
94
|
+
}
|
|
95
|
+
const reports = [];
|
|
96
|
+
// Diff layouts first
|
|
97
|
+
const layoutsDir = path.join(baselineDir, '_layouts');
|
|
98
|
+
if (fs.existsSync(layoutsDir)) {
|
|
99
|
+
const layoutFiles = fs.readdirSync(layoutsDir).filter((f) => f.endsWith('.json'));
|
|
100
|
+
for (const file of layoutFiles) {
|
|
101
|
+
const name = file.replace('.json', '');
|
|
102
|
+
const baselineFile = path.join(baselineDir, '_layouts', file);
|
|
103
|
+
const currentFile = path.join(currentDir, '_layouts', file);
|
|
104
|
+
if (!fs.existsSync(baselineFile) || !fs.existsSync(currentFile))
|
|
105
|
+
continue;
|
|
106
|
+
try {
|
|
107
|
+
const baseline = readMapping(baselineFile);
|
|
108
|
+
const current = readMapping(currentFile);
|
|
109
|
+
const report = (0, match_1.diffMappings)(baseline, current);
|
|
110
|
+
reports.push({ name: `_layouts/${name}`, report, isLayout: true });
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
console.error(`⚠ Skipping _layouts/${name}: ${e instanceof Error ? e.message : String(e)}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Diff page mappings
|
|
118
|
+
const baselineFiles = fs.readdirSync(baselineDir)
|
|
119
|
+
.filter((f) => f.endsWith('.json') && !f.startsWith('.'));
|
|
120
|
+
for (const file of baselineFiles) {
|
|
121
|
+
const baselineFile = path.join(baselineDir, file);
|
|
122
|
+
const currentFile = path.join(currentDir, file);
|
|
123
|
+
if (!fs.existsSync(currentFile)) {
|
|
124
|
+
console.error(`⚠ No current mapping for "${file}" — skipping.`);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const name = file.replace('.json', '');
|
|
128
|
+
try {
|
|
129
|
+
const baseline = readMapping(baselineFile);
|
|
130
|
+
const current = readMapping(currentFile);
|
|
131
|
+
const report = (0, match_1.diffMappings)(baseline, current);
|
|
132
|
+
reports.push({ name, report, isLayout: false });
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
console.error(`⚠ Skipping ${name}: ${e instanceof Error ? e.message : String(e)}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (reports.length === 0) {
|
|
139
|
+
console.error('❌ No matching mapping pairs found.');
|
|
140
|
+
process.exitCode = 2;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// Aggregate verdict
|
|
144
|
+
const aggregate = aggregateReports(reports);
|
|
145
|
+
if (opts.json) {
|
|
146
|
+
console.log(JSON.stringify(aggregate, null, 2));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
printAggregate(aggregate, reports, baselineDir, currentDir);
|
|
150
|
+
}
|
|
151
|
+
const failing = aggregate.verdict === 'BLOCK' || (opts.strict && aggregate.verdict === 'FIX');
|
|
152
|
+
process.exitCode = failing ? 1 : 0;
|
|
153
|
+
}
|
|
154
|
+
function aggregateReports(reports) {
|
|
155
|
+
const layoutReports = reports.filter((r) => r.isLayout);
|
|
156
|
+
const pageReports = reports.filter((r) => !r.isLayout);
|
|
157
|
+
let layoutVerdict;
|
|
158
|
+
let layoutCounts;
|
|
159
|
+
if (layoutReports.length > 0) {
|
|
160
|
+
const worst = (a, b) => {
|
|
161
|
+
if (a === 'BLOCK' || b === 'BLOCK')
|
|
162
|
+
return 'BLOCK';
|
|
163
|
+
if (a === 'FIX' || b === 'FIX')
|
|
164
|
+
return 'FIX';
|
|
165
|
+
return 'PASS';
|
|
166
|
+
};
|
|
167
|
+
layoutVerdict = layoutReports.reduce((acc, r) => worst(acc, r.report.verdict), 'PASS');
|
|
168
|
+
layoutCounts = layoutReports[0].report.counts;
|
|
169
|
+
}
|
|
170
|
+
const totals = { total: 0, ok: 0, renamed: 0, healable: 0, ambiguous: 0, lost: 0, rebound: 0, added: 0 };
|
|
171
|
+
for (const { report } of reports) {
|
|
172
|
+
for (const key of Object.keys(totals)) {
|
|
173
|
+
totals[key] += report.counts[key];
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const worstV = (a, b) => {
|
|
177
|
+
if (a === 'BLOCK' || b === 'BLOCK')
|
|
178
|
+
return 'BLOCK';
|
|
179
|
+
if (a === 'FIX' || b === 'FIX')
|
|
180
|
+
return 'FIX';
|
|
181
|
+
return 'PASS';
|
|
182
|
+
};
|
|
183
|
+
const verdict = reports.reduce((acc, r) => worstV(acc, r.report.verdict), 'PASS');
|
|
184
|
+
return {
|
|
185
|
+
verdict,
|
|
186
|
+
layoutVerdict,
|
|
187
|
+
layoutCounts,
|
|
188
|
+
pageReports: pageReports.map((r) => ({
|
|
189
|
+
name: r.name,
|
|
190
|
+
verdict: r.report.verdict,
|
|
191
|
+
counts: r.report.counts,
|
|
192
|
+
})),
|
|
193
|
+
totals,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function printAggregate(agg, reports, baselineDir, currentDir) {
|
|
197
|
+
const icon = agg.verdict === 'PASS' ? '✅' : agg.verdict === 'FIX' ? '🔧' : '⛔';
|
|
198
|
+
console.log(`\n${icon} ${agg.verdict} (directory diff)`);
|
|
199
|
+
console.log(` ${path.basename(baselineDir)} → ${path.basename(currentDir)}`);
|
|
200
|
+
console.log(` ${reports.length} files diffed`);
|
|
201
|
+
console.log(` ${agg.totals.ok} ok · ${agg.totals.renamed} renamed · ${agg.totals.healable} healable · ` +
|
|
202
|
+
`${agg.totals.ambiguous} ambiguous · ${agg.totals.lost} lost · ${agg.totals.rebound} rebound · ${agg.totals.added} new`);
|
|
203
|
+
// Layout section
|
|
204
|
+
if (agg.layoutVerdict) {
|
|
205
|
+
const li = agg.layoutVerdict === 'PASS' ? '✅' : agg.layoutVerdict === 'FIX' ? '🔧' : '⛔';
|
|
206
|
+
console.log(`\n 📐 Layouts ${li} ${agg.layoutVerdict}`);
|
|
207
|
+
if (agg.layoutCounts) {
|
|
208
|
+
console.log(` ${agg.layoutCounts.ok} ok · ${agg.layoutCounts.healable} healable · ` +
|
|
209
|
+
`${agg.layoutCounts.lost} lost · ${agg.layoutCounts.added} new`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Per-page summary
|
|
213
|
+
console.log('\n 📄 Pages');
|
|
214
|
+
for (const pr of agg.pageReports) {
|
|
215
|
+
const pi = pr.verdict === 'PASS' ? '✅' : pr.verdict === 'FIX' ? '🔧' : '⛔';
|
|
216
|
+
console.log(` ${pi} ${pr.verdict.padEnd(5)} ${pr.name.padEnd(25)} ` +
|
|
217
|
+
`${pr.counts.ok} ok · ${pr.counts.healable} heal · ${pr.counts.lost} lost · ${pr.counts.added} new`);
|
|
218
|
+
}
|
|
219
|
+
console.log('');
|
|
220
|
+
if (agg.totals.lost > 0) {
|
|
221
|
+
console.log(' ⛔ Some selectors are lost — a human must fix or delete the test.');
|
|
222
|
+
}
|
|
223
|
+
if (agg.totals.healable > 0) {
|
|
224
|
+
console.log(' 🔧 Healable selectors can be auto-fixed with `ia-qa-heal fix --dir`.');
|
|
225
|
+
}
|
|
226
|
+
console.log('');
|
|
227
|
+
}
|
|
72
228
|
function readMapping(file) {
|
|
73
229
|
let raw;
|
|
74
230
|
try {
|
package/dist/cli/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/cli/diff.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/cli/diff.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/fix.d.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `ia-qa-heal fix <before.json> <after.json> <test-paths…> [--dry-run]`
|
|
2
|
+
* `ia-qa-heal fix <before.json> <after.json> <test-paths…> [--dry-run] [--locators]`
|
|
3
|
+
* `ia-qa-heal fix --dir <baseline-dir> <current-dir> <test-paths…> [--dry-run] [--locators]`
|
|
3
4
|
*
|
|
4
|
-
* The deterministic half of self-healing. Diffs two mappings
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* The deterministic half of self-healing. Diffs two mappings (or two directories
|
|
6
|
+
* of mappings in `--dir` mode), takes ONLY the `healable` rows, and rewrites
|
|
7
|
+
* those selectors in your test files.
|
|
8
|
+
*
|
|
9
|
+
* In `--dir` mode, layouts in `_layouts/` are diffed first (one diff instead of
|
|
10
|
+
* N), then individual pages. All healable rewrites are collected and applied in
|
|
11
|
+
* one pass — a footer change means 1 diff, not 47.
|
|
9
12
|
*
|
|
10
13
|
* It **prepares the ground, the human decides**: it edits the working tree and
|
|
11
14
|
* never commits. LOST / AMBIGUOUS / RENAMED are printed but never touched.
|
|
12
|
-
* Presentation only — the engine lives in `../fixEngine` and is shared with the
|
|
13
|
-
* MCP server's `fix_tests` tool.
|
|
14
15
|
*
|
|
15
16
|
* Exit codes: 0 on a successful run (even with 0 rewrites); 2 = bad input.
|
|
16
17
|
*/
|
package/dist/cli/fix.js
CHANGED
|
@@ -39,25 +39,31 @@ const path = __importStar(require("path"));
|
|
|
39
39
|
const match_1 = require("../browser/match");
|
|
40
40
|
const fixEngine_1 = require("../fixEngine");
|
|
41
41
|
/**
|
|
42
|
-
* `ia-qa-heal fix <before.json> <after.json> <test-paths…> [--dry-run]`
|
|
42
|
+
* `ia-qa-heal fix <before.json> <after.json> <test-paths…> [--dry-run] [--locators]`
|
|
43
|
+
* `ia-qa-heal fix --dir <baseline-dir> <current-dir> <test-paths…> [--dry-run] [--locators]`
|
|
43
44
|
*
|
|
44
|
-
* The deterministic half of self-healing. Diffs two mappings
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
45
|
+
* The deterministic half of self-healing. Diffs two mappings (or two directories
|
|
46
|
+
* of mappings in `--dir` mode), takes ONLY the `healable` rows, and rewrites
|
|
47
|
+
* those selectors in your test files.
|
|
48
|
+
*
|
|
49
|
+
* In `--dir` mode, layouts in `_layouts/` are diffed first (one diff instead of
|
|
50
|
+
* N), then individual pages. All healable rewrites are collected and applied in
|
|
51
|
+
* one pass — a footer change means 1 diff, not 47.
|
|
49
52
|
*
|
|
50
53
|
* It **prepares the ground, the human decides**: it edits the working tree and
|
|
51
54
|
* never commits. LOST / AMBIGUOUS / RENAMED are printed but never touched.
|
|
52
|
-
* Presentation only — the engine lives in `../fixEngine` and is shared with the
|
|
53
|
-
* MCP server's `fix_tests` tool.
|
|
54
55
|
*
|
|
55
56
|
* Exit codes: 0 on a successful run (even with 0 rewrites); 2 = bad input.
|
|
56
57
|
*/
|
|
57
58
|
async function runFix(args) {
|
|
58
59
|
const dryRun = args.includes('--dry-run');
|
|
59
60
|
const useLocators = args.includes('--locators');
|
|
61
|
+
const dirMode = args.includes('--dir');
|
|
60
62
|
const rest = args.filter((a) => !a.startsWith('--'));
|
|
63
|
+
if (dirMode) {
|
|
64
|
+
await runDirFix(rest, { dryRun, useLocators });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
61
67
|
const [beforeFile, afterFile, ...testPaths] = rest;
|
|
62
68
|
if (!beforeFile || !afterFile || testPaths.length === 0) {
|
|
63
69
|
console.error('Usage: ia-qa-heal fix <before.json> <after.json> <test-file-or-dir…> [--locators] [--dry-run]');
|
|
@@ -108,6 +114,124 @@ async function runFix(args) {
|
|
|
108
114
|
}
|
|
109
115
|
process.exitCode = 0;
|
|
110
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Directory-level fix: diff all matching mapping pairs (layouts first), collect
|
|
119
|
+
* all healable rewrites, and apply them to test files in one pass.
|
|
120
|
+
*/
|
|
121
|
+
async function runDirFix(args, opts) {
|
|
122
|
+
const [baselineDir, currentDir, ...testPaths] = args;
|
|
123
|
+
if (!baselineDir || !currentDir || testPaths.length === 0) {
|
|
124
|
+
console.error('Usage: ia-qa-heal fix --dir <baseline-dir> <current-dir> <test-file-or-dir…> [--locators] [--dry-run]');
|
|
125
|
+
process.exitCode = 2;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (!fs.existsSync(baselineDir) || !fs.statSync(baselineDir).isDirectory()) {
|
|
129
|
+
console.error(`❌ "${baselineDir}" is not a directory.`);
|
|
130
|
+
process.exitCode = 2;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (!fs.existsSync(currentDir) || !fs.statSync(currentDir).isDirectory()) {
|
|
134
|
+
console.error(`❌ "${currentDir}" is not a directory.`);
|
|
135
|
+
process.exitCode = 2;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Collect all rewrites from all mapping pairs
|
|
139
|
+
const allRewrites = new Map();
|
|
140
|
+
const allLocators = opts.useLocators ? new Map() : undefined;
|
|
141
|
+
let totalHealable = 0;
|
|
142
|
+
let totalLost = 0;
|
|
143
|
+
let totalAmbiguous = 0;
|
|
144
|
+
const diffOne = (baselineFile, currentFile, label) => {
|
|
145
|
+
try {
|
|
146
|
+
const before = readMapping(baselineFile);
|
|
147
|
+
const after = readMapping(currentFile);
|
|
148
|
+
const report = (0, match_1.diffMappings)(before, after);
|
|
149
|
+
const rewrites = (0, fixEngine_1.computeRewrites)(report.rows);
|
|
150
|
+
for (const [from, to] of rewrites) {
|
|
151
|
+
if (!allRewrites.has(from))
|
|
152
|
+
allRewrites.set(from, to);
|
|
153
|
+
}
|
|
154
|
+
if (allLocators) {
|
|
155
|
+
const locs = (0, fixEngine_1.computeLocatorRewrites)(report.rows, after.elements);
|
|
156
|
+
for (const [from, target] of locs) {
|
|
157
|
+
if (!allLocators.has(from))
|
|
158
|
+
allLocators.set(from, target);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const rows = report.rows;
|
|
162
|
+
totalHealable += rows.filter((r) => r.status === 'healable').length;
|
|
163
|
+
totalLost += rows.filter((r) => r.status === 'lost').length;
|
|
164
|
+
totalAmbiguous += rows.filter((r) => r.status === 'ambiguous').length;
|
|
165
|
+
}
|
|
166
|
+
catch (e) {
|
|
167
|
+
console.error(`⚠ Skipping ${label}: ${e instanceof Error ? e.message : String(e)}`);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
// Layouts first
|
|
171
|
+
const layoutsDir = path.join(baselineDir, '_layouts');
|
|
172
|
+
if (fs.existsSync(layoutsDir)) {
|
|
173
|
+
const layoutFiles = fs.readdirSync(layoutsDir).filter((f) => f.endsWith('.json'));
|
|
174
|
+
for (const file of layoutFiles) {
|
|
175
|
+
const bl = path.join(baselineDir, '_layouts', file);
|
|
176
|
+
const cl = path.join(currentDir, '_layouts', file);
|
|
177
|
+
if (fs.existsSync(bl) && fs.existsSync(cl)) {
|
|
178
|
+
diffOne(bl, cl, `_layouts/${file}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Page mappings
|
|
183
|
+
const pageFiles = fs.readdirSync(baselineDir).filter((f) => f.endsWith('.json') && !f.startsWith('.'));
|
|
184
|
+
for (const file of pageFiles) {
|
|
185
|
+
const bl = path.join(baselineDir, file);
|
|
186
|
+
const cl = path.join(currentDir, file);
|
|
187
|
+
if (fs.existsSync(cl)) {
|
|
188
|
+
diffOne(bl, cl, file);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (allRewrites.size === 0 && (!allLocators || allLocators.size === 0)) {
|
|
192
|
+
console.log('\n🔧 No healable rewrites across any mapping pair — nothing to apply.');
|
|
193
|
+
if (totalLost > 0)
|
|
194
|
+
console.log(` ${totalLost} lost selectors need human attention.`);
|
|
195
|
+
if (totalAmbiguous > 0)
|
|
196
|
+
console.log(` ${totalAmbiguous} ambiguous selectors need human attention.`);
|
|
197
|
+
process.exitCode = 0;
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const files = (0, fixEngine_1.collectFiles)(testPaths, (p) => console.error(`⚠ Skipping "${p}" — not found.`));
|
|
201
|
+
if (files.length === 0) {
|
|
202
|
+
console.error(`No test files found under: ${testPaths.join(', ')}`);
|
|
203
|
+
process.exitCode = 2;
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
console.log(`\n🔧 ia-qa-heal fix --dir — deterministic selector rewrite${opts.dryRun ? ' (dry run)' : ''}`);
|
|
207
|
+
console.log(` ${allRewrites.size} healable rewrite${allRewrites.size === 1 ? '' : 's'} across all mappings · ${files.length} file${files.length === 1 ? '' : 's'} scanned` +
|
|
208
|
+
(allLocators ? ` · ${allLocators.size} expressible as getByRole locators` : '') +
|
|
209
|
+
'\n');
|
|
210
|
+
const result = (0, fixEngine_1.applyRewrites)(files, allRewrites, opts.dryRun, allLocators);
|
|
211
|
+
if (result.edits.length === 0) {
|
|
212
|
+
console.log(' No test file referenced any of the healable selectors — nothing to rewrite.');
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
for (const edit of result.edits) {
|
|
216
|
+
console.log(` ${opts.dryRun ? 'would edit' : '✎ edited'} ${path.relative(process.cwd(), edit.file)}`);
|
|
217
|
+
for (const r of edit.replacements)
|
|
218
|
+
console.log(` ${r.count}× ${r.from} → ${r.to}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (totalLost > 0)
|
|
222
|
+
console.log(`\n ⛔ ${totalLost} lost selectors need human attention.`);
|
|
223
|
+
if (totalAmbiguous > 0)
|
|
224
|
+
console.log(` ❓ ${totalAmbiguous} ambiguous selectors need human attention.`);
|
|
225
|
+
console.log(`\n ${opts.dryRun ? 'Would apply' : 'Applied'} ${result.totalReplacements} replacement${result.totalReplacements === 1 ? '' : 's'} in ${result.edits.length} file${result.edits.length === 1 ? '' : 's'}.` +
|
|
226
|
+
(opts.dryRun ? ' (dry run — nothing written.)' : ''));
|
|
227
|
+
if (!opts.dryRun && result.totalReplacements > 0) {
|
|
228
|
+
console.log(' Review with `git diff`, then commit and push if it looks right. Nothing was committed.\n');
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
console.log('');
|
|
232
|
+
}
|
|
233
|
+
process.exitCode = 0;
|
|
234
|
+
}
|
|
111
235
|
function printRebound(report) {
|
|
112
236
|
const rebound = report.rows.filter((r) => r.rebound);
|
|
113
237
|
if (rebound.length === 0)
|
package/dist/cli/fix.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/cli/fix.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/cli/fix.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -12,10 +12,14 @@ Usage:
|
|
|
12
12
|
ia-qa-heal map [page] Map configured pages → .ia-qa/mapping/<page>.json + .md
|
|
13
13
|
ia-qa-heal diff <before> <after> Diff two mappings → PASS/FIX/BLOCK verdict (CI gate)
|
|
14
14
|
--strict fail on FIX too --json machine-readable output
|
|
15
|
+
--dir directory mode: diff all mappings in two dirs
|
|
16
|
+
(layouts in _layouts/ diffed first, then pages)
|
|
15
17
|
ia-qa-heal fix <before> <after> <tests…> Apply the deterministic healable rewrites to your test files
|
|
16
18
|
--dry-run show the plan without writing. Never commits.
|
|
17
19
|
--locators emit getByRole(role, { name }) instead of selectors
|
|
18
20
|
(Playwright, .js/.ts) — immune to positional drift
|
|
21
|
+
--dir directory mode: diff all mappings, apply all rewrites
|
|
22
|
+
at once. Layouts in _layouts/ diffed first.
|
|
19
23
|
ia-qa-heal help Show this help
|
|
20
24
|
`;
|
|
21
25
|
async function main() {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AACA,iCAAiC;AACjC,+BAA+B;AAC/B,iCAAiC;AACjC,+BAA+B;AAE/B,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AACA,iCAAiC;AACjC,+BAA+B;AAC/B,iCAAiC;AACjC,+BAA+B;AAE/B,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;CAgBZ,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,AAAD,EAAG,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,MAAM,IAAA,cAAO,GAAE,CAAC;YAChB,MAAM;QACR,KAAK,KAAK;YACR,MAAM,IAAA,YAAM,EAAC,GAAG,CAAC,CAAC;YAClB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,IAAA,cAAO,EAAC,IAAI,CAAC,CAAC;YACpB,MAAM;QACR,KAAK,KAAK;YACR,MAAM,IAAA,YAAM,EAAC,IAAI,CAAC,CAAC;YACnB,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,SAAS,IAAI,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/cli/map.d.ts
CHANGED
|
@@ -5,5 +5,8 @@
|
|
|
5
5
|
* see `resolveSecret`), launches headless Chromium, logs in if configured,
|
|
6
6
|
* then visits each target page and writes a compressed accessibility mapping
|
|
7
7
|
* to `.ia-qa/mapping/<page-name>.json`.
|
|
8
|
+
*
|
|
9
|
+
* After all pages are mapped, if `config.layouts` is defined, extracts shared
|
|
10
|
+
* elements into `_layouts/<name>.json` and strips them from per-page mappings.
|
|
8
11
|
*/
|
|
9
12
|
export declare function runMap(pageNameArg?: string): Promise<void>;
|
package/dist/cli/map.js
CHANGED
|
@@ -39,6 +39,8 @@ const launcher_1 = require("../launcher");
|
|
|
39
39
|
const config_1 = require("../config");
|
|
40
40
|
const aom_1 = require("../aom");
|
|
41
41
|
const markdown_1 = require("../markdown");
|
|
42
|
+
const layout_1 = require("../layout");
|
|
43
|
+
const markdown_2 = require("../markdown");
|
|
42
44
|
/**
|
|
43
45
|
* `ia-qa-heal map [pageName]` — scraping & DOM compression engine.
|
|
44
46
|
*
|
|
@@ -46,6 +48,9 @@ const markdown_1 = require("../markdown");
|
|
|
46
48
|
* see `resolveSecret`), launches headless Chromium, logs in if configured,
|
|
47
49
|
* then visits each target page and writes a compressed accessibility mapping
|
|
48
50
|
* to `.ia-qa/mapping/<page-name>.json`.
|
|
51
|
+
*
|
|
52
|
+
* After all pages are mapped, if `config.layouts` is defined, extracts shared
|
|
53
|
+
* elements into `_layouts/<name>.json` and strips them from per-page mappings.
|
|
49
54
|
*/
|
|
50
55
|
async function runMap(pageNameArg) {
|
|
51
56
|
const config = (0, config_1.loadConfig)();
|
|
@@ -86,6 +91,54 @@ async function runMap(pageNameArg) {
|
|
|
86
91
|
finally {
|
|
87
92
|
await browser.close();
|
|
88
93
|
}
|
|
94
|
+
// Post-mapping: detect & extract layout components (only when mapping all pages)
|
|
95
|
+
if (!pageNameArg && config.layouts) {
|
|
96
|
+
await extractAndSaveLayouts(config);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* After all pages are mapped, detect shared layout elements, extract them into
|
|
101
|
+
* `_layouts/<name>.json`, strip them from per-page mappings, and re-save.
|
|
102
|
+
*/
|
|
103
|
+
async function extractAndSaveLayouts(config) {
|
|
104
|
+
const layouts = config.layouts;
|
|
105
|
+
for (const [layoutName, layoutCfg] of Object.entries(layouts)) {
|
|
106
|
+
const threshold = layoutCfg.threshold ?? 0.9;
|
|
107
|
+
const layoutPageNames = config.pages
|
|
108
|
+
.filter((p) => p.layout === layoutName)
|
|
109
|
+
.map((p) => p.name);
|
|
110
|
+
if (layoutPageNames.length === 0) {
|
|
111
|
+
console.log(`\n📐 Layout "${layoutName}": no pages reference it — skipping.`);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
// Load the freshly-mapped pages
|
|
115
|
+
const pages = [];
|
|
116
|
+
for (const name of layoutPageNames) {
|
|
117
|
+
try {
|
|
118
|
+
pages.push((0, aom_1.loadMapping)(name));
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
console.log(` ⚠ Could not load mapping for "${name}" — skipping.`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (pages.length === 0)
|
|
125
|
+
continue;
|
|
126
|
+
const layoutMapping = (0, layout_1.extractLayout)(layoutName, pages, threshold, layoutCfg.description);
|
|
127
|
+
console.log(`\n📐 Layout "${layoutName}": ${layoutMapping.elements.length} elements shared across ≥${Math.floor(threshold * pages.length)}/${pages.length} pages`);
|
|
128
|
+
if (layoutMapping.elements.length === 0)
|
|
129
|
+
continue;
|
|
130
|
+
// Save the layout
|
|
131
|
+
const layoutFile = (0, layout_1.saveLayout)(layoutMapping);
|
|
132
|
+
const layoutMd = (0, markdown_2.saveLayoutMarkdown)(layoutMapping);
|
|
133
|
+
console.log(` ✔ layout → ${path.relative(process.cwd(), layoutFile)} + ${path.relative(process.cwd(), layoutMd)}`);
|
|
134
|
+
// Strip layout elements from each page and re-save
|
|
135
|
+
const stripped = (0, layout_1.stripLayoutFromPages)(pages, layoutMapping);
|
|
136
|
+
for (const slim of stripped) {
|
|
137
|
+
(0, aom_1.saveMapping)(slim);
|
|
138
|
+
(0, markdown_1.saveMarkdown)(slim);
|
|
139
|
+
}
|
|
140
|
+
console.log(` ✔ stripped ${layoutMapping.elements.length} layout elements from ${stripped.length} page mappings`);
|
|
141
|
+
}
|
|
89
142
|
}
|
|
90
143
|
async function login(page, config) {
|
|
91
144
|
const auth = config.auth;
|
package/dist/cli/map.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/cli/map.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/cli/map.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -14,11 +14,21 @@ export interface SecretRef {
|
|
|
14
14
|
/** AWS region — required when source is `aws-ssm`. */
|
|
15
15
|
region?: string;
|
|
16
16
|
}
|
|
17
|
+
export interface LayoutConfig {
|
|
18
|
+
/** Human-readable description of this layout group. */
|
|
19
|
+
description?: string;
|
|
20
|
+
/** Optional CSS selector to scope layout extraction. Auto-detection is the primary path. */
|
|
21
|
+
selector?: string;
|
|
22
|
+
/** Fraction of pages (0-1) an element must appear on to be promoted to layout. Default 0.9. */
|
|
23
|
+
threshold?: number;
|
|
24
|
+
}
|
|
17
25
|
export interface PageTarget {
|
|
18
26
|
/** Logical page name — becomes the mapping filename (`.ia-qa/mapping/<name>.json`). */
|
|
19
27
|
name: string;
|
|
20
28
|
/** Path or absolute URL, resolved against `baseUrl`. */
|
|
21
29
|
url: string;
|
|
30
|
+
/** Reference to a layout key in `config.layouts`. Layout elements are stripped from this page's mapping. */
|
|
31
|
+
layout?: string;
|
|
22
32
|
}
|
|
23
33
|
export interface AuthConfig {
|
|
24
34
|
loginUrl: string;
|
|
@@ -37,12 +47,17 @@ export interface IaQaConfig {
|
|
|
37
47
|
secrets: Record<string, SecretRef>;
|
|
38
48
|
auth?: AuthConfig;
|
|
39
49
|
pages: PageTarget[];
|
|
50
|
+
/** Layout groups — shared elements auto-detected across pages. */
|
|
51
|
+
layouts?: Record<string, LayoutConfig>;
|
|
40
52
|
}
|
|
41
53
|
export declare const CONFIG_DIR = ".ia-qa";
|
|
42
54
|
export declare const MAPPING_DIRNAME = "mapping";
|
|
43
55
|
export declare function configPath(cwd?: string): string;
|
|
44
56
|
export declare function mappingDir(cwd?: string): string;
|
|
57
|
+
export declare const LAYOUT_DIRNAME = "_layouts";
|
|
45
58
|
export declare function mappingPath(pageName: string, dir?: string): string;
|
|
59
|
+
export declare function layoutDir(cwd?: string): string;
|
|
60
|
+
export declare function layoutPath(layoutName: string, dir?: string): string;
|
|
46
61
|
export declare function loadConfig(cwd?: string): IaQaConfig;
|
|
47
62
|
export declare function saveConfig(config: IaQaConfig, cwd?: string): string;
|
|
48
63
|
/**
|
package/dist/config.js
CHANGED
|
@@ -33,10 +33,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.MAPPING_DIRNAME = exports.CONFIG_DIR = void 0;
|
|
36
|
+
exports.LAYOUT_DIRNAME = exports.MAPPING_DIRNAME = exports.CONFIG_DIR = void 0;
|
|
37
37
|
exports.configPath = configPath;
|
|
38
38
|
exports.mappingDir = mappingDir;
|
|
39
39
|
exports.mappingPath = mappingPath;
|
|
40
|
+
exports.layoutDir = layoutDir;
|
|
41
|
+
exports.layoutPath = layoutPath;
|
|
40
42
|
exports.loadConfig = loadConfig;
|
|
41
43
|
exports.saveConfig = saveConfig;
|
|
42
44
|
exports.resolveSecret = resolveSecret;
|
|
@@ -50,10 +52,18 @@ function configPath(cwd = process.cwd()) {
|
|
|
50
52
|
function mappingDir(cwd = process.cwd()) {
|
|
51
53
|
return path.join(cwd, exports.CONFIG_DIR, exports.MAPPING_DIRNAME);
|
|
52
54
|
}
|
|
55
|
+
exports.LAYOUT_DIRNAME = '_layouts';
|
|
53
56
|
function mappingPath(pageName, dir = mappingDir()) {
|
|
54
57
|
const safe = pageName.replace(/[^a-zA-Z0-9._-]/g, '-');
|
|
55
58
|
return path.join(dir, `${safe}.json`);
|
|
56
59
|
}
|
|
60
|
+
function layoutDir(cwd = process.cwd()) {
|
|
61
|
+
return path.join(cwd, exports.CONFIG_DIR, exports.MAPPING_DIRNAME, exports.LAYOUT_DIRNAME);
|
|
62
|
+
}
|
|
63
|
+
function layoutPath(layoutName, dir = layoutDir()) {
|
|
64
|
+
const safe = layoutName.replace(/[^a-zA-Z0-9._-]/g, '-');
|
|
65
|
+
return path.join(dir, `${safe}.json`);
|
|
66
|
+
}
|
|
57
67
|
function loadConfig(cwd = process.cwd()) {
|
|
58
68
|
const file = configPath(cwd);
|
|
59
69
|
if (!fs.existsSync(file)) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,5 +8,7 @@ export { launchBrowser } from './launcher';
|
|
|
8
8
|
export type { BrowserChoice, LaunchedBrowser } from './launcher';
|
|
9
9
|
export type { MapUrlOptions, MapUrlResult } from './mapUrl';
|
|
10
10
|
export { computeRewrites, applyRewrites, collectFiles, replaceQuoted } from './fixEngine';
|
|
11
|
-
export { loadConfig, resolveSecret } from './config';
|
|
12
|
-
export type { IaQaConfig, SecretRef, PageTarget, AuthConfig } from './config';
|
|
11
|
+
export { loadConfig, resolveSecret, layoutDir, layoutPath, LAYOUT_DIRNAME } from './config';
|
|
12
|
+
export type { IaQaConfig, SecretRef, PageTarget, AuthConfig, LayoutConfig } from './config';
|
|
13
|
+
export { extractLayout, stripLayoutFromPages } from './layout';
|
|
14
|
+
export type { LayoutMapping } from './layout';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
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.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;
|
|
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; } });
|
|
@@ -26,4 +26,10 @@ Object.defineProperty(exports, "replaceQuoted", { enumerable: true, get: functio
|
|
|
26
26
|
var config_1 = require("./config");
|
|
27
27
|
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
|
|
28
28
|
Object.defineProperty(exports, "resolveSecret", { enumerable: true, get: function () { return config_1.resolveSecret; } });
|
|
29
|
+
Object.defineProperty(exports, "layoutDir", { enumerable: true, get: function () { return config_1.layoutDir; } });
|
|
30
|
+
Object.defineProperty(exports, "layoutPath", { enumerable: true, get: function () { return config_1.layoutPath; } });
|
|
31
|
+
Object.defineProperty(exports, "LAYOUT_DIRNAME", { enumerable: true, get: function () { return config_1.LAYOUT_DIRNAME; } });
|
|
32
|
+
var layout_1 = require("./layout");
|
|
33
|
+
Object.defineProperty(exports, "extractLayout", { enumerable: true, get: function () { return layout_1.extractLayout; } });
|
|
34
|
+
Object.defineProperty(exports, "stripLayoutFromPages", { enumerable: true, get: function () { return layout_1.stripLayoutFromPages; } });
|
|
29
35
|
//# sourceMappingURL=index.js.map
|
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,
|
|
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,mCAA+D;AAAtD,uGAAA,aAAa,OAAA;AAAE,8GAAA,oBAAoB,OAAA"}
|
package/dist/layout.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { MappedElement, PageMapping } from './aom';
|
|
2
|
+
/**
|
|
3
|
+
* Layout detection & extraction engine.
|
|
4
|
+
*
|
|
5
|
+
* A "layout" is a set of interactive elements that appear on many pages (navbar,
|
|
6
|
+
* footer, cookie consent, search, etc.). Rather than storing 34 copies of the
|
|
7
|
+
* same footer across 47 page mappings, we detect them once, extract them into
|
|
8
|
+
* `_layouts/<name>.json`, and strip them from individual page mappings.
|
|
9
|
+
*
|
|
10
|
+
* The driving metric is `threshold`: an element is promoted to layout when it
|
|
11
|
+
* appears — same role, name, and selector — on ≥ threshold fraction of pages.
|
|
12
|
+
*/
|
|
13
|
+
export interface LayoutMapping {
|
|
14
|
+
layout: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
capturedAt: string;
|
|
17
|
+
sourcePages: number;
|
|
18
|
+
elements: MappedElement[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract layout elements from a set of page mappings.
|
|
22
|
+
*
|
|
23
|
+
* For each element, count how many pages it appears on. Any element above
|
|
24
|
+
* `threshold * totalPages` (rounded down) is promoted to layout.
|
|
25
|
+
*
|
|
26
|
+
* Returns the layout mapping. Does NOT modify the page mappings — call
|
|
27
|
+
* `stripLayoutFromPages` separately to produce lean page mappings.
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractLayout(layoutName: string, pages: PageMapping[], threshold: number, description?: string): LayoutMapping;
|
|
30
|
+
/**
|
|
31
|
+
* Remove layout elements from each page mapping. Returns new page mappings
|
|
32
|
+
* (the originals are not mutated).
|
|
33
|
+
*/
|
|
34
|
+
export declare function stripLayoutFromPages(pages: PageMapping[], layout: LayoutMapping): PageMapping[];
|
|
35
|
+
/**
|
|
36
|
+
* Save a layout mapping to `_layouts/<name>.json`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function saveLayout(mapping: LayoutMapping, dir?: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Load a layout mapping from disk.
|
|
41
|
+
*/
|
|
42
|
+
export declare function loadLayout(layoutName: string, dir?: string): LayoutMapping;
|
|
43
|
+
/**
|
|
44
|
+
* Build a set of element fingerprints from all loaded layouts for fast lookup.
|
|
45
|
+
*/
|
|
46
|
+
export declare function layoutFingerprintSet(layouts: LayoutMapping[]): Set<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Load all layouts referenced by a config. Returns a Map of layoutName → LayoutMapping.
|
|
49
|
+
*/
|
|
50
|
+
export declare function loadAllLayouts(layoutNames: string[], dir?: string): Map<string, LayoutMapping>;
|
|
51
|
+
/**
|
|
52
|
+
* Walk `.ia-qa/mapping/` and collect all page mappings (skip `_layouts/` and non-JSON).
|
|
53
|
+
*/
|
|
54
|
+
export declare function collectPageMappings(dir?: string): PageMapping[];
|
package/dist/layout.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
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.extractLayout = extractLayout;
|
|
37
|
+
exports.stripLayoutFromPages = stripLayoutFromPages;
|
|
38
|
+
exports.saveLayout = saveLayout;
|
|
39
|
+
exports.loadLayout = loadLayout;
|
|
40
|
+
exports.layoutFingerprintSet = layoutFingerprintSet;
|
|
41
|
+
exports.loadAllLayouts = loadAllLayouts;
|
|
42
|
+
exports.collectPageMappings = collectPageMappings;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const config_1 = require("./config");
|
|
46
|
+
/** Fingerprint an element by its role + name + selector. All three must match for the element to be "the same" across pages. */
|
|
47
|
+
function fingerprint(el) {
|
|
48
|
+
return `${el.role}||${el.name}||${el.selector}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Extract layout elements from a set of page mappings.
|
|
52
|
+
*
|
|
53
|
+
* For each element, count how many pages it appears on. Any element above
|
|
54
|
+
* `threshold * totalPages` (rounded down) is promoted to layout.
|
|
55
|
+
*
|
|
56
|
+
* Returns the layout mapping. Does NOT modify the page mappings — call
|
|
57
|
+
* `stripLayoutFromPages` separately to produce lean page mappings.
|
|
58
|
+
*/
|
|
59
|
+
function extractLayout(layoutName, pages, threshold, description) {
|
|
60
|
+
if (pages.length === 0) {
|
|
61
|
+
return {
|
|
62
|
+
layout: layoutName,
|
|
63
|
+
description,
|
|
64
|
+
capturedAt: new Date().toISOString(),
|
|
65
|
+
sourcePages: 0,
|
|
66
|
+
elements: [],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// Count pages each element fingerprint appears on
|
|
70
|
+
const counts = new Map();
|
|
71
|
+
for (const page of pages) {
|
|
72
|
+
for (const el of page.elements) {
|
|
73
|
+
const fp = fingerprint(el);
|
|
74
|
+
let entry = counts.get(fp);
|
|
75
|
+
if (!entry) {
|
|
76
|
+
entry = { el, pages: new Set() };
|
|
77
|
+
counts.set(fp, entry);
|
|
78
|
+
}
|
|
79
|
+
entry.pages.add(page.page);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Promote elements that appear on ≥ minPages
|
|
83
|
+
const layoutElements = [];
|
|
84
|
+
for (const [, entry] of counts) {
|
|
85
|
+
if (entry.pages.size / pages.length >= threshold) {
|
|
86
|
+
layoutElements.push(entry.el);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Sort by role then name for stable output
|
|
90
|
+
layoutElements.sort((a, b) => {
|
|
91
|
+
const rc = a.role.localeCompare(b.role);
|
|
92
|
+
if (rc !== 0)
|
|
93
|
+
return rc;
|
|
94
|
+
return a.name.localeCompare(b.name);
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
layout: layoutName,
|
|
98
|
+
description,
|
|
99
|
+
capturedAt: new Date().toISOString(),
|
|
100
|
+
sourcePages: pages.length,
|
|
101
|
+
elements: layoutElements,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Remove layout elements from each page mapping. Returns new page mappings
|
|
106
|
+
* (the originals are not mutated).
|
|
107
|
+
*/
|
|
108
|
+
function stripLayoutFromPages(pages, layout) {
|
|
109
|
+
const fpSet = new Set(layout.elements.map(fingerprint));
|
|
110
|
+
return pages.map((page) => ({
|
|
111
|
+
...page,
|
|
112
|
+
elements: page.elements.filter((el) => !fpSet.has(fingerprint(el))),
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Save a layout mapping to `_layouts/<name>.json`.
|
|
117
|
+
*/
|
|
118
|
+
function saveLayout(mapping, dir = (0, config_1.layoutDir)()) {
|
|
119
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
120
|
+
const file = (0, config_1.layoutPath)(mapping.layout, dir);
|
|
121
|
+
fs.writeFileSync(file, JSON.stringify(mapping, null, 2) + '\n', 'utf8');
|
|
122
|
+
return file;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Load a layout mapping from disk.
|
|
126
|
+
*/
|
|
127
|
+
function loadLayout(layoutName, dir = (0, config_1.layoutDir)()) {
|
|
128
|
+
const file = (0, config_1.layoutPath)(layoutName, dir);
|
|
129
|
+
if (!fs.existsSync(file)) {
|
|
130
|
+
throw new Error(`No layout found for "${layoutName}" (${file}).`);
|
|
131
|
+
}
|
|
132
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Build a set of element fingerprints from all loaded layouts for fast lookup.
|
|
136
|
+
*/
|
|
137
|
+
function layoutFingerprintSet(layouts) {
|
|
138
|
+
const fpSet = new Set();
|
|
139
|
+
for (const layout of layouts) {
|
|
140
|
+
for (const el of layout.elements) {
|
|
141
|
+
fpSet.add(fingerprint(el));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return fpSet;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Load all layouts referenced by a config. Returns a Map of layoutName → LayoutMapping.
|
|
148
|
+
*/
|
|
149
|
+
function loadAllLayouts(layoutNames, dir = (0, config_1.layoutDir)()) {
|
|
150
|
+
const map = new Map();
|
|
151
|
+
for (const name of layoutNames) {
|
|
152
|
+
const file = (0, config_1.layoutPath)(name, dir);
|
|
153
|
+
if (fs.existsSync(file)) {
|
|
154
|
+
map.set(name, JSON.parse(fs.readFileSync(file, 'utf8')));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return map;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Walk `.ia-qa/mapping/` and collect all page mappings (skip `_layouts/` and non-JSON).
|
|
161
|
+
*/
|
|
162
|
+
function collectPageMappings(dir = (0, config_1.mappingDir)()) {
|
|
163
|
+
const pages = [];
|
|
164
|
+
if (!fs.existsSync(dir))
|
|
165
|
+
return pages;
|
|
166
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
167
|
+
for (const entry of entries) {
|
|
168
|
+
if (entry.isFile() && entry.name.endsWith('.json') && !entry.name.startsWith('.')) {
|
|
169
|
+
const abs = path.join(dir, entry.name);
|
|
170
|
+
try {
|
|
171
|
+
const raw = JSON.parse(fs.readFileSync(abs, 'utf8'));
|
|
172
|
+
if (raw && Array.isArray(raw.elements) && typeof raw.page === 'string') {
|
|
173
|
+
pages.push(raw);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
/* skip unparseable */
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return pages;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"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"}
|
package/dist/markdown.d.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { PageMapping } from './aom';
|
|
2
|
-
import {
|
|
2
|
+
import { LayoutMapping } from './layout';
|
|
3
|
+
import { renderPageContract, renderLayoutContract } from './browser/contract';
|
|
3
4
|
/**
|
|
4
5
|
* Node-side file I/O for the page contract. The rendering itself lives in
|
|
5
6
|
* `browser/contract.js` (pure JS) so the CLI and ia-qa.com produce identical
|
|
6
7
|
* `.md` output from the same mapping.
|
|
7
8
|
*/
|
|
8
|
-
export { renderPageContract };
|
|
9
|
+
export { renderPageContract, renderLayoutContract };
|
|
9
10
|
export declare function markdownPath(pageName: string, dir?: string): string;
|
|
11
|
+
export declare function layoutMdPath(layoutName: string, dir?: string): string;
|
|
10
12
|
export declare function saveMarkdown(mapping: PageMapping, dir?: string): string;
|
|
13
|
+
export declare function saveLayoutMarkdown(mapping: LayoutMapping, dir?: string): string;
|
package/dist/markdown.js
CHANGED
|
@@ -33,22 +33,35 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.renderPageContract = void 0;
|
|
36
|
+
exports.renderLayoutContract = exports.renderPageContract = void 0;
|
|
37
37
|
exports.markdownPath = markdownPath;
|
|
38
|
+
exports.layoutMdPath = layoutMdPath;
|
|
38
39
|
exports.saveMarkdown = saveMarkdown;
|
|
40
|
+
exports.saveLayoutMarkdown = saveLayoutMarkdown;
|
|
39
41
|
const fs = __importStar(require("fs"));
|
|
40
42
|
const path = __importStar(require("path"));
|
|
41
43
|
const config_1 = require("./config");
|
|
42
44
|
const contract_1 = require("./browser/contract");
|
|
43
45
|
Object.defineProperty(exports, "renderPageContract", { enumerable: true, get: function () { return contract_1.renderPageContract; } });
|
|
46
|
+
Object.defineProperty(exports, "renderLayoutContract", { enumerable: true, get: function () { return contract_1.renderLayoutContract; } });
|
|
44
47
|
function markdownPath(pageName, dir = (0, config_1.mappingDir)()) {
|
|
45
48
|
const safe = pageName.replace(/[^a-zA-Z0-9._-]/g, '-');
|
|
46
49
|
return path.join(dir, `${safe}.md`);
|
|
47
50
|
}
|
|
51
|
+
function layoutMdPath(layoutName, dir = (0, config_1.layoutDir)()) {
|
|
52
|
+
const safe = layoutName.replace(/[^a-zA-Z0-9._-]/g, '-');
|
|
53
|
+
return path.join(dir, `${safe}.md`);
|
|
54
|
+
}
|
|
48
55
|
function saveMarkdown(mapping, dir = (0, config_1.mappingDir)()) {
|
|
49
56
|
fs.mkdirSync(dir, { recursive: true });
|
|
50
57
|
const file = markdownPath(mapping.page, dir);
|
|
51
58
|
fs.writeFileSync(file, (0, contract_1.renderPageContract)(mapping), 'utf8');
|
|
52
59
|
return file;
|
|
53
60
|
}
|
|
61
|
+
function saveLayoutMarkdown(mapping, dir = (0, config_1.layoutDir)()) {
|
|
62
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
63
|
+
const file = layoutMdPath(mapping.layout, dir);
|
|
64
|
+
fs.writeFileSync(file, (0, contract_1.renderLayoutContract)(mapping), 'utf8');
|
|
65
|
+
return file;
|
|
66
|
+
}
|
|
54
67
|
//# sourceMappingURL=markdown.js.map
|
package/dist/markdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,oCAGC;AAED,oCAGC;AAED,oCAKC;AAED,gDAKC;AArCD,uCAAyB;AACzB,2CAA6B;AAG7B,qCAAiD;AACjD,iDAA8E;AAQrE,mGARA,6BAAkB,OAQA;AAAE,qGARA,+BAAoB,OAQA;AAEjD,SAAgB,YAAY,CAAC,QAAgB,EAAE,MAAc,IAAA,mBAAU,GAAE;IACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,YAAY,CAAC,UAAkB,EAAE,MAAc,IAAA,kBAAS,GAAE;IACxE,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,YAAY,CAAC,OAAoB,EAAE,MAAc,IAAA,mBAAU,GAAE;IAC3E,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAA,6BAAkB,EAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAsB,EAAE,MAAc,IAAA,kBAAS,GAAE;IAClF,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAA,+BAAoB,EAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ia-qa/self-healing",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
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",
|