@ia-qa/self-healing 1.5.7 → 1.6.1

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.
@@ -0,0 +1,328 @@
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.containsAsWords = containsAsWords;
37
+ exports.findDeadLocators = findDeadLocators;
38
+ exports.runAudit = runAudit;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const match_1 = require("../browser/match");
42
+ const config_1 = require("../config");
43
+ const ingest_1 = require("../ingest");
44
+ const nameLocators_1 = require("../nameLocators");
45
+ const summary_1 = require("./summary");
46
+ const FUZZY_SUGGEST = 0.6;
47
+ /**
48
+ * Does `haystack` contain `needle` on word boundaries? "save" is inside "save
49
+ * changes" but not inside "saved searches" — substring alone would claim both.
50
+ */
51
+ function containsAsWords(haystack, needle) {
52
+ if (needle === '' || haystack === needle)
53
+ return false;
54
+ const words = haystack.split(' ');
55
+ const target = needle.split(' ');
56
+ for (let i = 0; i + target.length <= words.length; i++) {
57
+ if (target.every((w, k) => words[i + k] === w))
58
+ return true;
59
+ }
60
+ return false;
61
+ }
62
+ /**
63
+ * Reduce candidates to one, or to nothing.
64
+ *
65
+ * Two labels that fit equally well is not a weak suggestion, it is an absence of
66
+ * one — the same refusal `matchElement` makes when it returns `ambiguous`.
67
+ */
68
+ function pickUnique(candidates, kind) {
69
+ const byName = new Map();
70
+ for (const { e, score } of candidates) {
71
+ const rec = byName.get(e.name) ?? { role: e.role, score, pages: new Set() };
72
+ rec.pages.add(e.page);
73
+ byName.set(e.name, rec);
74
+ }
75
+ const top = Array.from(byName.entries()).sort((a, b) => b[1].score - a[1].score);
76
+ if (top.length === 0)
77
+ return undefined;
78
+ if (top.length > 1 && top[0][1].score - top[1][1].score < 0.05)
79
+ return undefined;
80
+ return { name: top[0][0], role: top[0][1].role, score: top[0][1].score, pages: Array.from(top[0][1].pages), kind };
81
+ }
82
+ function readMappings(dir) {
83
+ const pages = [];
84
+ const elements = [];
85
+ const files = fs
86
+ .readdirSync(dir)
87
+ .filter((f) => f.endsWith('.json') && !f.startsWith('.') && !f.startsWith('_'));
88
+ for (const file of files) {
89
+ let parsed;
90
+ try {
91
+ parsed = JSON.parse(fs.readFileSync(path.join(dir, file), 'utf8'));
92
+ }
93
+ catch {
94
+ continue;
95
+ }
96
+ if (!parsed || !Array.isArray(parsed.elements))
97
+ continue;
98
+ const page = file.replace(/\.json$/, '');
99
+ pages.push(page);
100
+ for (const el of parsed.elements) {
101
+ elements.push({ role: el.role, name: el.name, selector: el.selector, page });
102
+ }
103
+ }
104
+ // Layouts hold the shared shell (navbar, footer). A locator answered only by a
105
+ // layout is still answered — leaving them out would invent dead locators.
106
+ const layouts = path.join(dir, '_layouts');
107
+ if (fs.existsSync(layouts)) {
108
+ for (const file of fs.readdirSync(layouts).filter((f) => f.endsWith('.json'))) {
109
+ try {
110
+ const parsed = JSON.parse(fs.readFileSync(path.join(layouts, file), 'utf8'));
111
+ for (const el of parsed.elements ?? []) {
112
+ elements.push({ role: el.role, name: el.name, selector: el.selector, page: `_layouts/${file.replace(/\.json$/, '')}` });
113
+ }
114
+ }
115
+ catch {
116
+ /* a malformed layout is not a dead locator — skip it */
117
+ }
118
+ }
119
+ }
120
+ return { pages, elements };
121
+ }
122
+ /**
123
+ * Which inventoried names resolve to nothing the contract holds?
124
+ *
125
+ * A name is alive as soon as ONE mapped page answers it: the audit has no way of
126
+ * knowing which page a given test visits, so "found somewhere" is the only
127
+ * reading that cannot manufacture a false positive.
128
+ */
129
+ function findDeadLocators(usage, elements) {
130
+ const dead = [];
131
+ for (const [key, sites] of Object.entries(usage.names ?? {})) {
132
+ const judged = sites.filter(nameLocators_1.judgeable);
133
+ if (judged.length === 0)
134
+ continue;
135
+ // Union of what the call shapes allow: `getByRole('button')` says button,
136
+ // `getByLabel` says any form control. Alive under any of them is alive.
137
+ const roleSets = judged.map((s) => (0, nameLocators_1.candidateRoles)(s));
138
+ const roles = roleSets.some((r) => r === null)
139
+ ? null
140
+ : Array.from(new Set(roleSets.flat()));
141
+ const matches = elements.filter((e) => (0, nameLocators_1.normalizeName)(e.name) === key && (roles === null || roles.indexOf(e.role) !== -1));
142
+ if (matches.length > 0)
143
+ continue;
144
+ // Nothing carries that name. Is there one obviously-close label? Offered as a
145
+ // suggestion and never applied: with a single capture there is no evidence
146
+ // this is the *same* element, only that it reads alike.
147
+ const inRole = elements.filter((e) => roles === null || roles.indexOf(e.role) !== -1);
148
+ // Label *extension* — "Save" becoming "Save changes" — is the commonest real
149
+ // rename and the one character bigrams score worst: a short name diluted by a
150
+ // longer one falls under the fuzzy threshold precisely when it is most likely
151
+ // to be the same button. Whole-word containment catches it without loosening
152
+ // the threshold everywhere else, and only when exactly one label qualifies.
153
+ const extended = inRole.filter((e) => containsAsWords((0, nameLocators_1.normalizeName)(e.name), key));
154
+ const scored = inRole
155
+ .map((e) => ({ e, score: (0, match_1.diceSimilarity)((0, nameLocators_1.normalizeName)(e.name), key) }))
156
+ .filter((x) => x.score >= FUZZY_SUGGEST)
157
+ .sort((a, b) => b.score - a.score);
158
+ const suggestion = pickUnique(extended.map((e) => ({ e, score: 1 })), 'extended') ??
159
+ pickUnique(scored, 'fuzzy');
160
+ dead.push({ name: judged[0].text, roles, sites: judged, suggestion });
161
+ }
162
+ return dead.sort((a, b) => b.sites.length - a.sites.length);
163
+ }
164
+ async function runAudit(args) {
165
+ const strict = args.includes('--strict');
166
+ const json = args.includes('--json');
167
+ const paths = args.filter((a) => !a.startsWith('--'));
168
+ const dir = (0, config_1.mappingDir)();
169
+ if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {
170
+ console.error(`❌ No mapping to audit against — ${path.resolve(dir)} does not exist.\n\n` +
171
+ ` \`audit\` reads one capture of the app and asks whether your suite still names\n` +
172
+ ` things that exist in it. Capture it first:\n` +
173
+ ` ia-qa-heal map\n\n` +
174
+ ` No baseline needed — unlike \`diff\`, this works on the very first run.`);
175
+ process.exitCode = 2;
176
+ return;
177
+ }
178
+ // Test paths on the command line re-scan in memory; otherwise the inventory on
179
+ // disk is used, and only if it exists — auditing against a stale file the user
180
+ // did not ask for would be worse than telling them to run `ingest`.
181
+ let usage;
182
+ if (paths.length > 0) {
183
+ usage = (0, ingest_1.ingestPaths)(paths).usage;
184
+ }
185
+ else {
186
+ usage = (0, ingest_1.loadUsage)();
187
+ if (!usage) {
188
+ let configured;
189
+ try {
190
+ configured = (0, config_1.loadConfig)().testPaths;
191
+ }
192
+ catch {
193
+ /* covered by the message below */
194
+ }
195
+ if (configured && configured.length > 0)
196
+ usage = (0, ingest_1.ingestPaths)(configured).usage;
197
+ }
198
+ }
199
+ if (!usage) {
200
+ console.error(`❌ No locator inventory to audit.\n\n` +
201
+ ` Run \`ia-qa-heal ingest <test-dir>\` first, add "testPaths" to .ia-qa/config.json,\n` +
202
+ ` or pass the test paths directly: \`ia-qa-heal audit tests/\`.`);
203
+ process.exitCode = 2;
204
+ return;
205
+ }
206
+ const { pages, elements } = readMappings(dir);
207
+ const dead = findDeadLocators(usage, elements);
208
+ const allSites = Object.values(usage.names ?? {}).flat();
209
+ const judgedSites = allSites.filter(nameLocators_1.judgeable);
210
+ const unjudgedSites = allSites.length - judgedSites.length;
211
+ const deadSites = dead.reduce((s, d) => s + d.sites.length, 0);
212
+ const selectorCount = Object.keys(usage.selectors).length;
213
+ // Nothing judgeable is not a pass. "0 locators checked · all resolve" is the
214
+ // same false green as counting an uncompared contract as `ok` — it reports the
215
+ // absence of a check as the success of one. Refuse, and say which absence.
216
+ if (judgedSites.length === 0) {
217
+ const reason = usage.scanned === 0
218
+ ? 'no-files'
219
+ : allSites.length === 0 && selectorCount === 0
220
+ ? 'no-locators'
221
+ : 'nothing-judgeable';
222
+ const human = reason === 'no-files'
223
+ ? `❌ Nothing to audit: no test files found${paths.length > 0 ? ` under ${paths.join(', ')}` : ''}.\n\n` +
224
+ ` A brand-new project has nothing to check yet — that is not a pass, it is an\n` +
225
+ ` empty question. The ${pages.length} mapped page${pages.length === 1 ? '' : 's'} in .ia-qa/mapping/*.md already list every\n` +
226
+ ` role + accessible name on the app: write the first tests against those, then\n` +
227
+ ` \`ia-qa-heal baseline\` locks today's UI as the reference.`
228
+ : reason === 'no-locators'
229
+ ? `❌ Nothing to audit: ${usage.scanned} file${usage.scanned === 1 ? '' : 's'} scanned, no locator literal found.\n\n` +
230
+ ` Locators built dynamically (variables, concatenation, \${…}) are invisible to a\n` +
231
+ ` static scan — and to \`fix\` too. Nothing here can be checked either way.`
232
+ : `❌ Nothing to audit: your suite has ${selectorCount} CSS selector${selectorCount === 1 ? '' : 's'} and ` +
233
+ `${allSites.length} text-anchored locator${allSites.length === 1 ? '' : 's'}, none of which this can judge.\n\n` +
234
+ ` \`audit\` answers one question — does a locator still NAME something that exists? —\n` +
235
+ ` and only role-anchored calls (getByRole, getByLabel, By.linkText) can be held to it.\n` +
236
+ ` A CSS selector says where, not what: use \`map\` + \`baseline\` + \`diff\` to gate those.`;
237
+ console.error(human);
238
+ if (json) {
239
+ console.log(JSON.stringify({ verdict: null, reason, pagesMapped: pages.length, scanned: usage.scanned }, null, 2));
240
+ }
241
+ process.exitCode = 2;
242
+ return;
243
+ }
244
+ const selectorNames = Object.keys(usage.selectors);
245
+ const mappedSelectors = new Set(elements.map((e) => e.selector));
246
+ const unresolvedSelectors = selectorNames.filter((s) => !mappedSelectors.has(s));
247
+ const verdict = dead.length === 0 ? 'PASS' : dead.every((d) => d.suggestion) ? 'FIX' : 'BLOCK';
248
+ if (json) {
249
+ console.log(JSON.stringify({
250
+ verdict,
251
+ pagesMapped: pages.length,
252
+ locatorsJudged: judgedSites.length,
253
+ locatorsNotJudged: unjudgedSites,
254
+ deadLocators: dead,
255
+ unresolvedSelectors,
256
+ advisory: !strict,
257
+ }, null, 2));
258
+ process.exitCode = strict && verdict !== 'PASS' ? 1 : 0;
259
+ return;
260
+ }
261
+ const icon = verdict === 'PASS' ? '✅' : verdict === 'FIX' ? '🔧' : '⛔';
262
+ console.log(`\n${icon} ${verdict} ia-qa-heal audit — does your suite still name things that exist?`);
263
+ console.log(` ${pages.length} mapped page${pages.length === 1 ? '' : 's'} · ${elements.length} elements · no baseline needed`);
264
+ console.log(` ${judgedSites.length} role-anchored locator${judgedSites.length === 1 ? '' : 's'} checked` +
265
+ (deadSites > 0 ? ` · ${deadSites} name nothing` : ' · all resolve'));
266
+ if (dead.length > 0) {
267
+ console.log(`\n ⛔ ${dead.length} locator name${dead.length === 1 ? '' : 's'} match no mapped element:`);
268
+ for (const d of dead) {
269
+ const where = d.sites.slice(0, 3).map((s) => `${s.file}:${s.line}`).join(', ');
270
+ const more = d.sites.length > 3 ? ` +${d.sites.length - 3} more` : '';
271
+ const roleLabel = d.roles ? d.roles.join('|') : 'any role';
272
+ console.log(` ${roleLabel} "${d.name}" · ${where}${more}`);
273
+ if (d.suggestion) {
274
+ const how = d.suggestion.kind === 'extended'
275
+ ? 'contains the old label'
276
+ : `${Math.round(d.suggestion.score * 100)}% similar`;
277
+ console.log(` ↳ closest live label: ${d.suggestion.role} "${d.suggestion.name}"` +
278
+ ` (${how} · ${d.suggestion.pages.slice(0, 2).join(', ')})`);
279
+ }
280
+ }
281
+ console.log(`\n Suggestions are read from ONE capture, so they prove a resemblance, not an identity.` +
282
+ `\n Nothing is rewritten here — \`audit\` never edits. Confirm, then fix by hand.`);
283
+ }
284
+ if (unjudgedSites > 0) {
285
+ // Two very different reasons to abstain, and a user who cannot tell them
286
+ // apart will read the total as a coverage failure rather than as honesty.
287
+ const offRole = allSites.filter((s) => !(0, nameLocators_1.judgeable)(s) && s.role !== undefined && !nameLocators_1.CONTRACT_ROLES.has(s.role));
288
+ const offRoleNames = Array.from(new Set(offRole.map((s) => s.role))).slice(0, 4);
289
+ console.log(`\n ℹ️ ${unjudgedSites} locator${unjudgedSites === 1 ? '' : 's'} not judged, on purpose:`);
290
+ if (unjudgedSites - offRole.length > 0) {
291
+ console.log(` ${unjudgedSites - offRole.length} text-anchored (getByText, cy.contains…) — could point at any text node.`);
292
+ }
293
+ if (offRole.length > 0) {
294
+ console.log(` ${offRole.length} on a role the contract never holds (${offRoleNames.join(', ')}) —` +
295
+ ` \`map\` captures interactive elements, so their absence proves nothing.`);
296
+ }
297
+ }
298
+ if (unresolvedSelectors.length > 0) {
299
+ console.log(` ℹ️ ${unresolvedSelectors.length} of ${selectorNames.length} CSS selectors appear in no contract —` +
300
+ ` expected for containers and text nodes, worth a look for the rest.`);
301
+ }
302
+ // The two ways a finding can be wrong, named up front. Both are about what the
303
+ // capture *saw*, not about the suite — and a user who meets one without warning
304
+ // concludes the tool is noisy rather than that their mapping is partial.
305
+ if (dead.length > 0) {
306
+ console.log(`\n Before believing a finding, check the capture behind it:` +
307
+ `\n · unmapped page — the locator may live on a page not in config.pages` +
308
+ `\n (\`ia-qa-heal discover\` lists them; ${pages.length} page${pages.length === 1 ? ' is' : 's are'} mapped today)` +
309
+ `\n · unmapped state — \`map\` captures a page in ONE state. A label that only` +
310
+ `\n appears after a click (a tab, a mode toggle, an open dialog) is not in the` +
311
+ `\n contract, and a test that clicks first is right while this says otherwise.`);
312
+ }
313
+ else {
314
+ console.log(`\n Coverage decides what this verdict is worth: ${pages.length} page${pages.length === 1 ? '' : 's'} mapped.` +
315
+ `\n \`ia-qa-heal discover\` lists what you are not mapping yet.`);
316
+ }
317
+ if (!strict && verdict !== 'PASS') {
318
+ console.log(` Advisory run — exits 0. Add --strict once your mapping covers the pages your suite visits.\n`);
319
+ }
320
+ else {
321
+ console.log('');
322
+ }
323
+ (0, summary_1.summaryLine)('audit', verdict === 'PASS' ? 'ok' : verdict === 'FIX' ? 'fix' : 'block', verdict === 'PASS'
324
+ ? `PASS · ${judgedSites.length} locators all resolve`
325
+ : `${verdict} · ${dead.length} locator name${dead.length === 1 ? '' : 's'} match nothing`, [`${pages.length} pages`, unjudgedSites > 0 ? `${unjudgedSites} not judged` : undefined]);
326
+ process.exitCode = strict && verdict !== 'PASS' ? 1 : 0;
327
+ }
328
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/cli/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runCheck(args: string[]): Promise<void>;