@ia-qa/self-healing 1.8.2 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/TUTORIAL.md +17 -5
- package/dist/ui/page.js +413 -5
- package/dist/ui/page.js.map +1 -1
- package/dist/ui/server.js +109 -16
- package/dist/ui/server.js.map +1 -1
- package/dist/ui/setup.d.ts +55 -0
- package/dist/ui/setup.js +216 -0
- package/dist/ui/setup.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -98,6 +98,9 @@ npx ia-qa-heal audit # does my suite still name things that exist?
|
|
|
98
98
|
`audit` is read-only and advisory (exit 0 unless `--strict`) — it answers on day one, before
|
|
99
99
|
you have any history to compare against.
|
|
100
100
|
|
|
101
|
+
Rather fill in a form than answer questions in a terminal? `npx ia-qa-heal ui` in a folder with
|
|
102
|
+
no config opens the [console](#the-console--ia-qa-heal-ui) on a setup form that writes the same file.
|
|
103
|
+
|
|
101
104
|
**Then one command, for good:**
|
|
102
105
|
|
|
103
106
|
```bash
|
|
@@ -540,6 +543,12 @@ A local web console for the rows where the tool gave up: highlighted crops of ea
|
|
|
540
543
|
the `file:line` of every test that breaks, the verbs as plain-language buttons, and the history
|
|
541
544
|
as charts. `--shortcut` writes a desktop launcher.
|
|
542
545
|
|
|
546
|
+
Opened in a folder that has no `.ia-qa/config.json`, it shows a **setup form** instead: the
|
|
547
|
+
app's address, the pages (read from the sitemap, or typed), and how the app logs in — and it
|
|
548
|
+
writes the same file `init` would. It never overwrites a config, and no field asks for a
|
|
549
|
+
secret: the login answers are the *names* of environment variables or SSM parameters, and a
|
|
550
|
+
browser login is handed over as the `ia-qa-heal login` command to run.
|
|
551
|
+
|
|
543
552
|
It is **loopback only** (`127.0.0.1`), every request carries a per-process token, the Host
|
|
544
553
|
header is pinned, and its buttons spawn this package's own CLI with a fixed argv — never a
|
|
545
554
|
string from the request. It **refuses to start under CI** (an interactive surface there is a
|
package/TUTORIAL.md
CHANGED
|
@@ -244,7 +244,11 @@ npm install -D @ia-qa/self-healing
|
|
|
244
244
|
npx ia-qa-heal init
|
|
245
245
|
```
|
|
246
246
|
|
|
247
|
-
It asks a few questions (your app's URL, whether there's a login, which pages to map) and writes `.ia-qa/config.json`. **You never hand-write that file — the wizard does it.**
|
|
247
|
+
It asks a few questions (your app's URL, whether there's a login, which pages to map) and writes `.ia-qa/config.json`. **You never hand-write that file — the wizard does it.**
|
|
248
|
+
|
|
249
|
+
**Prefer a form to questions in a terminal?** Run `npx ia-qa-heal ui` in the project folder instead: with no config yet, the console opens on a setup form — the same questions in your browser, writing the same file ([Step 6.8](#step-68--no-terminal-open-the-console)).
|
|
250
|
+
|
|
251
|
+
Either way, it helps to know what's inside, because it's the one file you'll tweak:
|
|
248
252
|
|
|
249
253
|
- **🔑 Credentials** — you store the *name* of an environment variable, never the password itself. The real value stays in your `.env` / shell / AWS. **Loading it is your job:** the CLI reads `process.env` and never opens a `.env` file, so a key sitting only in `.env` will not be seen — run `map` under `npx dotenv-cli --` (or Node's `--env-file-if-exists`, 20.12+). Only `map` logs in; `diff`, `baseline`, `audit` and `check` read the mapping and need no credentials. If a variable is missing, the tool stops and names the exact variable to set — it never guesses and never writes a secret to disk.
|
|
250
254
|
- **🌐 URLs to visit** — the list of pages to map. A page that lives behind a click instead of its own URL (a tab or modal an app swaps in) is reached by naming the control to click, not by a URL.
|
|
@@ -601,6 +605,13 @@ A local page opens in your browser with three things a terminal cannot give you:
|
|
|
601
605
|
click away.
|
|
602
606
|
- **The run history as charts** — see [§8.3](#83-the-trend-ia-qa-heal-history).
|
|
603
607
|
|
|
608
|
+
**Nothing set up yet? Open it anyway.** In a folder with no `.ia-qa/config.json`, the console shows
|
|
609
|
+
a setup form instead: the app's address, the pages (read from the sitemap in one click, or typed),
|
|
610
|
+
and how the app logs in. The panel beside it shows the exact file that will be written, and it is
|
|
611
|
+
the same file `init` writes. It never overwrites a config, and no field asks for a password: you
|
|
612
|
+
give the *names* of the variables that hold the credentials, and a browser login is handed over
|
|
613
|
+
as the `ia-qa-heal login` command to run once in a terminal.
|
|
614
|
+
|
|
604
615
|
Once, per project, so nobody ever types a command again:
|
|
605
616
|
|
|
606
617
|
```bash
|
|
@@ -618,10 +629,10 @@ leaves a process running behind your back. It can do **nothing the CLI would ref
|
|
|
618
629
|
it would simply hang.
|
|
619
630
|
|
|
620
631
|
Working on several projects? The header carries a **Project** dropdown. Pick
|
|
621
|
-
**+ Add another project…** and paste the folder's path
|
|
622
|
-
|
|
623
|
-
click from then on, and `ia-qa-heal ui --forget [dir]` takes it back out
|
|
624
|
-
the project).
|
|
632
|
+
**+ Add another project…** and paste the folder's path. A folder that has never been set up opens
|
|
633
|
+
on the setup form above, and joins the list once its config is written. Everything you add is
|
|
634
|
+
remembered, so it is one click from then on, and `ia-qa-heal ui --forget [dir]` takes it back out
|
|
635
|
+
(deleting nothing inside the project).
|
|
625
636
|
|
|
626
637
|
---
|
|
627
638
|
|
|
@@ -924,6 +935,7 @@ npx ia-qa-heal graph --format markdown # the navigation graph, one card per p
|
|
|
924
935
|
npx ia-qa-heal run # the whole loop: capture (your suite, IAQA_CAPTURE=1) → diff → confirm → fix → re-run to verify
|
|
925
936
|
|
|
926
937
|
npx ia-qa-heal ui # the local console: decide with pictures, verbs as buttons, history as charts
|
|
938
|
+
# (in a folder with no config: a setup form that writes it)
|
|
927
939
|
npx ia-qa-heal ui --shortcut # once per project: a desktop icon that opens it in one click
|
|
928
940
|
npx ia-qa-heal ui --forget [dir] # drop a project from the console's switcher
|
|
929
941
|
npx ia-qa-heal history [--json] # the trend: verdicts over time, coverage, which pages churn
|
package/dist/ui/page.js
CHANGED
|
@@ -207,6 +207,61 @@ th{color:var(--muted);font-weight:600;font-size:10.5px;text-transform:uppercase;
|
|
|
207
207
|
td.n{text-align:right;font-variant-numeric:tabular-nums}
|
|
208
208
|
.axis{fill:#71717a;font-size:10px}
|
|
209
209
|
.note{color:var(--muted);font-size:12px;margin-top:8px}
|
|
210
|
+
/* The setup form, for a folder with no config. Same vocabulary as the rest of the
|
|
211
|
+
page: the card, the pill CTA, the dashed line that states what leaves the machine. */
|
|
212
|
+
[hidden]{display:none!important}
|
|
213
|
+
.lede-s{font-size:13px;margin-bottom:16px}
|
|
214
|
+
code.k{background:var(--surface2);border:1px solid var(--border);border-radius:5px;padding:1px 6px;font:11.5px ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--orange2)}
|
|
215
|
+
.step{border-top:1px solid var(--border);padding:18px 0}
|
|
216
|
+
.st{display:flex;align-items:center;gap:10px;margin-bottom:10px}
|
|
217
|
+
.st-row{display:flex;align-items:center;gap:10px}
|
|
218
|
+
.st-row .v{font-size:12.5px;color:var(--muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
219
|
+
.st-row .aside{margin-left:auto;font-size:12px;color:var(--muted)}
|
|
220
|
+
.st-row a{margin-left:auto;font-size:12px;text-decoration:none}
|
|
221
|
+
.st-lock{opacity:.45}
|
|
222
|
+
.field{font:inherit;font-size:13px;width:100%;background:var(--surface2);color:var(--text);border:1px solid var(--border);border-radius:9px;padding:9px 12px;outline:none}
|
|
223
|
+
.field:focus{border-color:var(--orange)}
|
|
224
|
+
.field.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}
|
|
225
|
+
.rowf{display:flex;gap:8px;align-items:center}
|
|
226
|
+
.rowb{display:flex;gap:8px;margin-bottom:10px}
|
|
227
|
+
.cta:disabled{opacity:.5;cursor:default}
|
|
228
|
+
.su-found{display:flex;align-items:baseline;gap:10px;margin:16px 0 4px}
|
|
229
|
+
.su-all{margin-left:auto;display:flex;gap:10px;font-size:12px}
|
|
230
|
+
.su-all a,.su-rm{text-decoration:none}
|
|
231
|
+
.su-row{cursor:pointer;align-items:center}
|
|
232
|
+
.su-n{font-size:12.5px;font-weight:600;width:170px;flex:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
233
|
+
.su-p{font:11.5px ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--muted);word-break:break-all;flex:1}
|
|
234
|
+
.su-rm{font-size:11.5px}
|
|
235
|
+
.chk{width:15px;height:15px;border-radius:4px;border:1.5px solid #3f3f46;flex:none;display:inline-flex;align-items:center;justify-content:center}
|
|
236
|
+
.chk.on{background:var(--orange);border-color:var(--orange)}
|
|
237
|
+
.su-more{margin-top:10px}
|
|
238
|
+
.su-add{margin-top:18px}
|
|
239
|
+
.su-add .note{margin:0 0 6px}
|
|
240
|
+
.btn-s{font-size:12.5px;padding:8px 12px;flex:none}
|
|
241
|
+
.opts{display:flex;flex-direction:column;gap:10px}
|
|
242
|
+
.opt{display:flex;gap:11px;border:1px solid var(--border);border-radius:12px;padding:14px 15px;background:var(--surface2);cursor:pointer}
|
|
243
|
+
.opt-on{border-color:var(--orange);background:#f9731610;cursor:default}
|
|
244
|
+
.opt-b{flex:1;min-width:0}
|
|
245
|
+
.opt-b b{font-size:13px}
|
|
246
|
+
.r{width:15px;height:15px;border-radius:50%;border:1.5px solid #3f3f46;flex:none;margin-top:3px}
|
|
247
|
+
.r-on{border-color:var(--orange);background:radial-gradient(circle,var(--orange) 0 3.5px,transparent 4px)}
|
|
248
|
+
.lbl{font-size:12px;color:var(--muted);margin-bottom:6px}
|
|
249
|
+
.su-sub{margin-top:14px}
|
|
250
|
+
.seg{display:inline-flex;border:1px solid var(--border);border-radius:99px;padding:3px;background:var(--bg);gap:3px}
|
|
251
|
+
.seg span{font-size:12.5px;padding:4px 12px;border-radius:99px;color:var(--muted);border:1px solid transparent;cursor:pointer}
|
|
252
|
+
.seg span.on{font-weight:600;background:#f9731618;color:var(--orange2);border-color:var(--orange)}
|
|
253
|
+
.g2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}
|
|
254
|
+
.g3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-top:10px}
|
|
255
|
+
@media(max-width:700px){.g2,.g3{grid-template-columns:1fr}}
|
|
256
|
+
.su-dash{margin-top:12px;font-size:12px;color:var(--muted);border:1px dashed var(--border);border-radius:8px;padding:9px 11px}
|
|
257
|
+
.su-foot{border-top:1px solid var(--border);padding-top:16px;display:flex;align-items:center;gap:12px;flex-wrap:wrap}
|
|
258
|
+
.su-err{margin-top:10px;font-size:12.5px;color:#fda4af;white-space:pre-wrap}
|
|
259
|
+
.su-file{font-size:12.5px;margin-bottom:10px;word-break:break-all}
|
|
260
|
+
.su-json{white-space:pre;max-height:none;overflow:auto;margin-top:0}
|
|
261
|
+
.su-miss{margin-top:10px;font-size:12px;color:#fcd34d}
|
|
262
|
+
.su-miss li{margin-top:3px}
|
|
263
|
+
.su-promise{display:flex;flex-direction:column;gap:8px;margin-top:14px;font-size:12px;color:var(--muted)}
|
|
264
|
+
.su-promise b{color:var(--text)}
|
|
210
265
|
</style>
|
|
211
266
|
</head><body>
|
|
212
267
|
<header><div class="wrap head">
|
|
@@ -224,7 +279,24 @@ td.n{text-align:right;font-variant-numeric:tabular-nums}
|
|
|
224
279
|
</div></header>
|
|
225
280
|
<main><div class="wrap">
|
|
226
281
|
<div id="update"></div>
|
|
227
|
-
|
|
282
|
+
<!-- Shown instead of everything below when the folder has no config: nothing
|
|
283
|
+
else on this page can say anything true about an app it has no address for. -->
|
|
284
|
+
<section class="grid cols" id="setupSec" hidden>
|
|
285
|
+
<div class="card" id="setupForm"></div>
|
|
286
|
+
<div class="card">
|
|
287
|
+
<h2>What this writes</h2>
|
|
288
|
+
<div class="su-file">One file: <code class="k" id="setupPath"></code></div>
|
|
289
|
+
<div class="log su-json" id="setupJson"></div>
|
|
290
|
+
<div class="note" id="setupMore"></div>
|
|
291
|
+
<div id="setupProblems"></div>
|
|
292
|
+
<div class="su-promise">
|
|
293
|
+
<div>🔑 <b>References only.</b> A password, a token or a cookie is never written to this file, and no field on this page asks for one.</div>
|
|
294
|
+
<div>📦 This file is meant to be committed.</div>
|
|
295
|
+
<div>🔒 Setting up sends nothing anywhere — except the sitemap request in step 2, and only if you click it.</div>
|
|
296
|
+
</div>
|
|
297
|
+
</div>
|
|
298
|
+
</section>
|
|
299
|
+
<section class="grid cols" id="mainGrid">
|
|
228
300
|
<div class="card" id="verdictCard"><div class="empty">loading…</div></div>
|
|
229
301
|
<div class="card">
|
|
230
302
|
<h2>Actions</h2>
|
|
@@ -281,7 +353,13 @@ let LAST_STATE = {};
|
|
|
281
353
|
|
|
282
354
|
function render(s) {
|
|
283
355
|
LAST_STATE = s || {};
|
|
284
|
-
renderPicker(s); renderUpdate(s); renderHead(s);
|
|
356
|
+
renderPicker(s); renderUpdate(s); renderHead(s);
|
|
357
|
+
const setup = Boolean(s.project && s.project.needsSetup);
|
|
358
|
+
q('#setupSec').hidden = !setup;
|
|
359
|
+
q('#mainGrid').hidden = setup;
|
|
360
|
+
['#decisions', '#project', '#history'].forEach((id) => { q(id).closest('section').hidden = setup; });
|
|
361
|
+
if (setup) { q('#findingsCard').hidden = true; renderSetup(s); return; }
|
|
362
|
+
renderVerdict(s); renderActions(s);
|
|
285
363
|
renderDecisions(s); renderHistory(s); renderGoto(s); bindCopy();
|
|
286
364
|
}
|
|
287
365
|
|
|
@@ -329,8 +407,12 @@ function renderPicker(s) {
|
|
|
329
407
|
// terminal, the feature could never start existing.
|
|
330
408
|
wrap.style.display = '';
|
|
331
409
|
const sel = q('#picker');
|
|
410
|
+
// A folder being set up is not in the list yet — it joins once its config is
|
|
411
|
+
// written — but it is the one on screen, so the menu has to say so.
|
|
412
|
+
const listed = list.some((p) => p.dir === s.activeDir);
|
|
332
413
|
sel.innerHTML =
|
|
333
|
-
|
|
414
|
+
(listed ? '' : '<option value="' + esc(s.activeDir) + '" selected>' + esc(shortDir(s.activeDir)) + ' — not set up yet</option>')
|
|
415
|
+
+ list.map((p) =>
|
|
334
416
|
'<option value="' + esc(p.dir) + '"' + (p.dir === s.activeDir ? ' selected' : '') + '>'
|
|
335
417
|
+ esc(shortDir(p.dir)) + (p.baseUrl ? ' — ' + esc(p.baseUrl) : '') + '</option>'
|
|
336
418
|
).join('')
|
|
@@ -364,8 +446,7 @@ function askForFolder() {
|
|
|
364
446
|
const v = prompt(
|
|
365
447
|
'Add a project to this console.\\n\\n'
|
|
366
448
|
+ 'Paste the full path of the project folder — the one you would open in your '
|
|
367
|
-
+ 'editor.
|
|
368
|
-
+ 'if it does not).',
|
|
449
|
+
+ 'editor. If it has never been set up, the console walks you through it.',
|
|
369
450
|
''
|
|
370
451
|
);
|
|
371
452
|
return v && v.trim() ? v.trim() : null;
|
|
@@ -782,6 +863,333 @@ function bindCopy() {
|
|
|
782
863
|
});
|
|
783
864
|
}
|
|
784
865
|
|
|
866
|
+
/* ---- setup: a folder with no .ia-qa/config.json ------------------------ */
|
|
867
|
+
|
|
868
|
+
/* The file ia-qa-heal init writes, asked for in three steps. The panel on the
|
|
869
|
+
right is the server's own plan for the answers so far — the function the write
|
|
870
|
+
goes through — so it cannot show one file and write another. No field here
|
|
871
|
+
takes a secret: the login answers are the NAMES of variables. */
|
|
872
|
+
const ENV_DEFAULTS = { usernameKey: 'E2E_USERNAME', passwordKey: 'E2E_PASSWORD' };
|
|
873
|
+
const SSM_DEFAULTS = { usernameKey: '/staging/app/username', passwordKey: '/staging/app/password' };
|
|
874
|
+
const CHECK_SVG = '<svg width="11" height="11" viewBox="0 0 16 16" fill="none" stroke="#09090b" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8.5l3 3 6-7"/></svg>';
|
|
875
|
+
const setupBlank = () => ({
|
|
876
|
+
step: 1, baseUrl: '', found: null, foundFor: '', reason: [], capped: false, selected: {}, showAll: false, manual: [],
|
|
877
|
+
mode: '', store: 'env', usernameKey: ENV_DEFAULTS.usernameKey, passwordKey: ENV_DEFAULTS.passwordKey, region: 'eu-west-3',
|
|
878
|
+
loginUrl: '/login', usernameSelector: 'input[name="email"]', passwordSelector: 'input[type="password"]',
|
|
879
|
+
submitSelector: 'button[type="submit"]', busy: false, error: '',
|
|
880
|
+
});
|
|
881
|
+
let SETUP = setupBlank();
|
|
882
|
+
let setupDir = null;
|
|
883
|
+
let previewTimer = null;
|
|
884
|
+
|
|
885
|
+
async function postJson(pathname, body) {
|
|
886
|
+
const r = await fetch(pathname + '?t=' + T, {
|
|
887
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body),
|
|
888
|
+
});
|
|
889
|
+
return r.json();
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
function setupPages() {
|
|
893
|
+
return (SETUP.found || []).filter((p) => SETUP.selected[p.url]).concat(SETUP.manual);
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
function setupBody() {
|
|
897
|
+
const S = SETUP;
|
|
898
|
+
const login = S.mode === 'form'
|
|
899
|
+
? { mode: 'form', store: S.store, usernameKey: S.usernameKey, passwordKey: S.passwordKey, region: S.region,
|
|
900
|
+
loginUrl: S.loginUrl, usernameSelector: S.usernameSelector, passwordSelector: S.passwordSelector,
|
|
901
|
+
submitSelector: S.submitSelector }
|
|
902
|
+
: { mode: S.mode };
|
|
903
|
+
return { baseUrl: S.baseUrl, pages: setupPages().map((p) => ({ name: p.name, url: p.url })), login: login };
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
function renderSetup(s) {
|
|
907
|
+
// Answers typed for one folder must never be written into the next one picked.
|
|
908
|
+
if (setupDir !== s.activeDir) { SETUP = setupBlank(); setupDir = s.activeDir; }
|
|
909
|
+
drawSetup();
|
|
910
|
+
refreshPreview();
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
function sitemapUrl(base) {
|
|
914
|
+
try { return new URL('/sitemap.xml', base).toString(); } catch (e) { return base + '/sitemap.xml'; }
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
function stepRow(n, label, value) {
|
|
918
|
+
return '<div class="step st-row"><span class="num">' + n + ' of 3</span><b>' + esc(label) + '</b>'
|
|
919
|
+
+ '<span class="v">' + esc(value) + '</span><a href="#" data-goto="' + n + '">change</a></div>';
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
function drawSetup() {
|
|
923
|
+
const S = SETUP;
|
|
924
|
+
let h = '<h2>Set up this folder</h2>'
|
|
925
|
+
+ '<div class="lede-s">This folder has no <code class="k">.ia-qa/config.json</code> yet, so there is nothing to look at. '
|
|
926
|
+
+ 'Answer three questions and the console writes it for you — the same file <code class="k">ia-qa-heal init</code> would.</div>';
|
|
927
|
+
|
|
928
|
+
if (S.step === 1) {
|
|
929
|
+
h += '<div class="step"><div class="st"><span class="num">1 of 3</span><b>Where does the app live?</b></div>'
|
|
930
|
+
+ '<div class="rowf"><input class="field" id="su-url" placeholder="https://staging.example.com" autocomplete="off" spellcheck="false" value="' + esc(S.baseUrl) + '">'
|
|
931
|
+
+ '<button class="cta" id="su-next1">Next</button></div>'
|
|
932
|
+
+ '<div class="note">The address your tests run against. A staging server beats production if you have one.</div></div>'
|
|
933
|
+
+ '<div class="step st-row st-lock"><span class="num">2 of 3</span><b>Which pages should it watch?</b><span class="aside">needs the address first</span></div>';
|
|
934
|
+
} else {
|
|
935
|
+
h += stepRow(1, 'App', S.baseUrl);
|
|
936
|
+
if (S.step === 2) h += pagesStep();
|
|
937
|
+
else { const n = setupPages().length; h += stepRow(2, 'Pages', n + ' page' + (n === 1 ? '' : 's')); }
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
if (S.step === 3) h += loginStep();
|
|
941
|
+
else h += '<div class="step st-row' + (S.step === 1 ? ' st-lock' : '') + '"><span class="num">3 of 3</span><b>Does the app ask you to log in?</b>'
|
|
942
|
+
+ (S.step === 2 ? '<span class="aside">not answered yet</span>' : '') + '</div>';
|
|
943
|
+
|
|
944
|
+
const ready = S.step === 3 && S.mode && !S.busy;
|
|
945
|
+
h += '<div class="su-foot"><button class="cta" id="su-write"' + (ready ? '' : ' disabled') + '>'
|
|
946
|
+
+ (S.busy && S.step === 3 ? 'Writing…' : 'Write the config ✎') + '</button>'
|
|
947
|
+
+ '<span class="note" style="margin:0">Changes one file on your computer. Nothing is committed.</span></div>'
|
|
948
|
+
+ (S.error ? '<div class="su-err">' + esc(S.error) + '</div>' : '');
|
|
949
|
+
q('#setupForm').innerHTML = h;
|
|
950
|
+
bindSetup();
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
function pagesStep() {
|
|
954
|
+
const S = SETUP;
|
|
955
|
+
let h = '<div class="step"><div class="st"><span class="num">2 of 3</span><b>Which pages should it watch?</b></div>'
|
|
956
|
+
+ '<div class="rowb"><button class="cta" id="su-sitemap"' + (S.busy ? ' disabled' : '') + '>'
|
|
957
|
+
+ (S.busy ? 'Reading the sitemap…' : S.found ? 'Read the sitemap again' : 'Find them in the sitemap') + '</button></div>'
|
|
958
|
+
+ '<div class="net-line" style="margin-top:0">🔗 One request to <b>' + esc(sitemapUrl(S.baseUrl)) + '</b> (and robots.txt if the sitemap lives elsewhere) — plain GET, no browser, no login, nothing else sent.</div>';
|
|
959
|
+
if (S.found && S.found.length === 0) {
|
|
960
|
+
h += '<div class="note">' + S.reason.map(esc).join('<br>') + '<br>Add the pages by hand below.</div>';
|
|
961
|
+
} else if (S.found) {
|
|
962
|
+
const n = S.found.length;
|
|
963
|
+
const sel = S.found.filter((p) => S.selected[p.url]).length;
|
|
964
|
+
h += '<div class="su-found"><b>Found ' + n + ' page' + (n === 1 ? '' : 's') + (S.capped ? ' — the first ' + n + ', the sitemap lists more' : '') + '.</b>'
|
|
965
|
+
+ '<span class="note" style="margin:0">' + sel + ' selected</span>'
|
|
966
|
+
+ '<span class="su-all"><a href="#" id="su-all">select all</a><a href="#" id="su-none">none</a></span></div>'
|
|
967
|
+
+ (S.showAll ? S.found : S.found.slice(0, 8)).map((p) => pageRow(p, Boolean(S.selected[p.url]), 'u', p.url)).join('');
|
|
968
|
+
if (!S.showAll && n > 8) h += '<button class="cta su-more" id="su-more">Show the ' + (n - 8) + ' others</button>';
|
|
969
|
+
}
|
|
970
|
+
h += S.manual.map((p, i) => pageRow(p, true, 'm', String(i))).join('');
|
|
971
|
+
h += '<div class="su-add"><div class="note">A page the sitemap does not list — a route behind the login, say — can be added by hand.</div>'
|
|
972
|
+
+ '<div class="rowf"><input class="field" id="su-mname" placeholder="name" style="width:170px;flex:none" autocomplete="off">'
|
|
973
|
+
+ '<input class="field mono" id="su-mpath" placeholder="/path" autocomplete="off" spellcheck="false">'
|
|
974
|
+
+ '<button class="btn-s" id="su-madd">Add</button></div></div>'
|
|
975
|
+
+ '<div class="rowb" style="margin:14px 0 0"><button class="cta" id="su-next2"' + (setupPages().length ? '' : ' disabled') + '>Next</button></div></div>';
|
|
976
|
+
return h;
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
function pageRow(p, on, kind, key) {
|
|
980
|
+
return '<div class="frow su-row" data-kind="' + kind + '" data-key="' + esc(key) + '">'
|
|
981
|
+
+ '<span class="chk' + (on ? ' on' : '') + '">' + (on ? CHECK_SVG : '') + '</span>'
|
|
982
|
+
+ '<span class="su-n" title="' + esc(p.name) + '">' + esc(p.name) + '</span><span class="su-p">' + esc(p.url) + '</span>'
|
|
983
|
+
+ (kind === 'm' ? '<a href="#" class="su-rm">remove</a>' : '') + '</div>';
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
function loginStep() {
|
|
987
|
+
const S = SETUP;
|
|
988
|
+
const opt = (mode, title, body) => '<div class="opt' + (S.mode === mode ? ' opt-on' : '') + '" data-mode="' + mode + '">'
|
|
989
|
+
+ '<span class="r' + (S.mode === mode ? ' r-on' : '') + '"></span><div class="opt-b"><b>' + title + '</b>' + body + '</div></div>';
|
|
990
|
+
return '<div class="step"><div class="st"><span class="num">3 of 3</span><b>Does the app ask you to log in?</b></div><div class="opts">'
|
|
991
|
+
+ opt('none', 'No — the pages are public', '')
|
|
992
|
+
+ opt('session', 'Yes — I will log in myself, in a browser',
|
|
993
|
+
'<div class="note">Works with any login: single sign-on, two-factor, a code by email. A browser window opens, you sign in the way you always do, and the session is kept for the next captures.</div>'
|
|
994
|
+
+ '<div class="upd-cmd"><code>ia-qa-heal login</code><button class="copy" data-copy="ia-qa-heal login" data-copy-label="copy command">copy command</button></div>'
|
|
995
|
+
+ '<div class="note">Run it once in a terminal, after setup. The console cannot open that window for you: it waits for a person at the keyboard. The session file holds live cookies, so it is kept out of git.</div>')
|
|
996
|
+
+ opt('form', 'Yes — fill a plain login form from stored credentials',
|
|
997
|
+
'<div class="note">For pipelines: no human needed. A username, a password and a submit button, nothing fancier. Single sign-on and two-factor will not get through this way.</div>'
|
|
998
|
+
+ (S.mode === 'form' ? formFields() : ''))
|
|
999
|
+
+ '</div></div>';
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
function formFields() {
|
|
1003
|
+
const S = SETUP;
|
|
1004
|
+
const env = S.store === 'env';
|
|
1005
|
+
const field = (key, label) => '<div><div class="lbl">' + label + '</div><input class="field mono" data-f="' + key + '" value="' + esc(S[key]) + '" autocomplete="off" spellcheck="false"></div>';
|
|
1006
|
+
return '<div class="su-sub"><div class="lbl">Where are the credentials kept?</div><div class="seg">'
|
|
1007
|
+
+ '<span data-store="env"' + (env ? ' class="on"' : '') + '>Environment variables</span>'
|
|
1008
|
+
+ '<span data-store="aws-ssm"' + (env ? '' : ' class="on"') + '>AWS SSM Parameter Store</span></div></div>'
|
|
1009
|
+
+ '<div class="g2">' + field('usernameKey', env ? 'Variable holding the username' : 'SSM parameter holding the username')
|
|
1010
|
+
+ field('passwordKey', env ? 'Variable holding the password' : 'SSM parameter holding the password') + '</div>'
|
|
1011
|
+
+ (env ? '' : '<div class="su-sub" style="max-width:260px">' + field('region', 'AWS region') + '</div>')
|
|
1012
|
+
+ '<div class="su-dash">These are the <b style="color:var(--text)">names</b> of ' + (env ? 'variables' : 'parameters') + ', not their values. '
|
|
1013
|
+
+ 'There is no password field on this page, on purpose: the value stays ' + (env ? 'in your environment' : 'in SSM') + ' and is only read when a capture logs in.</div>'
|
|
1014
|
+
+ '<div class="su-sub" style="max-width:260px">' + field('loginUrl', 'Login page') + '</div>'
|
|
1015
|
+
+ '<details class="tech"><summary>Form fields — the defaults fit most plain forms</summary><div class="g3">'
|
|
1016
|
+
+ field('usernameSelector', 'Username field') + field('passwordSelector', 'Password field') + field('submitSelector', 'Submit button')
|
|
1017
|
+
+ '</div></details>';
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
function bindSetup() {
|
|
1021
|
+
const S = SETUP;
|
|
1022
|
+
const box = q('#setupForm');
|
|
1023
|
+
const on = (sel, fn) => { const el = q(sel); if (el) el.onclick = (e) => { e.preventDefault(); fn(); }; };
|
|
1024
|
+
const url = q('#su-url');
|
|
1025
|
+
if (url) {
|
|
1026
|
+
url.oninput = () => { S.baseUrl = url.value.trim(); schedulePreview(); };
|
|
1027
|
+
url.onkeydown = (e) => { if (e.key === 'Enter') nextFromUrl(); };
|
|
1028
|
+
url.focus();
|
|
1029
|
+
}
|
|
1030
|
+
on('#su-next1', nextFromUrl);
|
|
1031
|
+
on('#su-sitemap', readSitemapNow);
|
|
1032
|
+
on('#su-all', () => { S.found.forEach((p) => { S.selected[p.url] = true; }); drawSetup(); schedulePreview(); });
|
|
1033
|
+
on('#su-none', () => { S.selected = {}; drawSetup(); schedulePreview(); });
|
|
1034
|
+
on('#su-more', () => { S.showAll = true; drawSetup(); });
|
|
1035
|
+
on('#su-madd', addManualPage);
|
|
1036
|
+
on('#su-next2', () => { S.step = 3; S.error = ''; drawSetup(); schedulePreview(); });
|
|
1037
|
+
on('#su-write', writeSetupNow);
|
|
1038
|
+
const mpath = q('#su-mpath');
|
|
1039
|
+
if (mpath) mpath.onkeydown = (e) => { if (e.key === 'Enter') addManualPage(); };
|
|
1040
|
+
box.querySelectorAll('[data-goto]').forEach((a) => {
|
|
1041
|
+
a.onclick = (e) => { e.preventDefault(); S.step = Number(a.dataset.goto); S.error = ''; drawSetup(); schedulePreview(); };
|
|
1042
|
+
});
|
|
1043
|
+
box.querySelectorAll('.su-row').forEach((row) => {
|
|
1044
|
+
row.onclick = (e) => {
|
|
1045
|
+
if (row.dataset.kind === 'm') {
|
|
1046
|
+
if (e.target.classList.contains('su-rm')) {
|
|
1047
|
+
e.preventDefault();
|
|
1048
|
+
S.manual.splice(Number(row.dataset.key), 1);
|
|
1049
|
+
drawSetup(); schedulePreview();
|
|
1050
|
+
}
|
|
1051
|
+
return;
|
|
1052
|
+
}
|
|
1053
|
+
const k = row.dataset.key;
|
|
1054
|
+
if (S.selected[k]) delete S.selected[k]; else S.selected[k] = true;
|
|
1055
|
+
drawSetup(); schedulePreview();
|
|
1056
|
+
};
|
|
1057
|
+
});
|
|
1058
|
+
box.querySelectorAll('[data-mode]').forEach((el) => {
|
|
1059
|
+
el.onclick = () => {
|
|
1060
|
+
if (S.mode === el.dataset.mode) return;
|
|
1061
|
+
S.mode = el.dataset.mode; S.error = '';
|
|
1062
|
+
drawSetup(); schedulePreview();
|
|
1063
|
+
};
|
|
1064
|
+
});
|
|
1065
|
+
box.querySelectorAll('[data-store]').forEach((el) => {
|
|
1066
|
+
el.onclick = (e) => { e.stopPropagation(); switchStore(el.dataset.store); };
|
|
1067
|
+
});
|
|
1068
|
+
box.querySelectorAll('input[data-f]').forEach((el) => {
|
|
1069
|
+
el.oninput = () => { S[el.dataset.f] = el.value.trim(); schedulePreview(); };
|
|
1070
|
+
});
|
|
1071
|
+
bindCopy();
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
function nextFromUrl() {
|
|
1075
|
+
const S = SETUP;
|
|
1076
|
+
let ok = false;
|
|
1077
|
+
try { const u = new URL(S.baseUrl); ok = u.protocol === 'http:' || u.protocol === 'https:'; } catch (e) { ok = false; }
|
|
1078
|
+
if (!ok) {
|
|
1079
|
+
S.error = 'Type the full address, starting with http:// or https:// — for example https://staging.example.com';
|
|
1080
|
+
drawSetup();
|
|
1081
|
+
return;
|
|
1082
|
+
}
|
|
1083
|
+
// Pages read from another address belong to another app.
|
|
1084
|
+
if (S.foundFor && S.foundFor !== S.baseUrl) { S.found = null; S.selected = {}; S.foundFor = ''; }
|
|
1085
|
+
S.error = ''; S.step = 2;
|
|
1086
|
+
drawSetup(); schedulePreview();
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
async function readSitemapNow() {
|
|
1090
|
+
const S = SETUP;
|
|
1091
|
+
S.busy = true; S.error = ''; drawSetup();
|
|
1092
|
+
try {
|
|
1093
|
+
const r = await postJson('/api/setup/sitemap', { baseUrl: S.baseUrl });
|
|
1094
|
+
if (r.error) S.error = r.error;
|
|
1095
|
+
else {
|
|
1096
|
+
S.found = r.pages; S.reason = r.reason || []; S.capped = Boolean(r.capped);
|
|
1097
|
+
S.foundFor = S.baseUrl; S.showAll = false; S.selected = {};
|
|
1098
|
+
r.pages.forEach((p) => { S.selected[p.url] = true; });
|
|
1099
|
+
}
|
|
1100
|
+
} catch (e) {
|
|
1101
|
+
S.error = 'The console lost contact with its server: ' + e;
|
|
1102
|
+
}
|
|
1103
|
+
S.busy = false;
|
|
1104
|
+
drawSetup(); schedulePreview();
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
function addManualPage() {
|
|
1108
|
+
const S = SETUP;
|
|
1109
|
+
const name = q('#su-mname').value.trim();
|
|
1110
|
+
let where = q('#su-mpath').value.trim();
|
|
1111
|
+
if (!name || !where) { S.error = 'A page needs a name and a path.'; drawSetup(); return; }
|
|
1112
|
+
const low = where.toLowerCase();
|
|
1113
|
+
if (where.charAt(0) !== '/' && low.indexOf('http://') !== 0 && low.indexOf('https://') !== 0) where = '/' + where;
|
|
1114
|
+
S.manual.push({ name: name, url: where });
|
|
1115
|
+
S.error = '';
|
|
1116
|
+
drawSetup(); schedulePreview();
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
function switchStore(store) {
|
|
1120
|
+
const S = SETUP;
|
|
1121
|
+
if (S.store === store) return;
|
|
1122
|
+
const from = store === 'env' ? SSM_DEFAULTS : ENV_DEFAULTS;
|
|
1123
|
+
const to = store === 'env' ? ENV_DEFAULTS : SSM_DEFAULTS;
|
|
1124
|
+
if (S.usernameKey === from.usernameKey) S.usernameKey = to.usernameKey;
|
|
1125
|
+
if (S.passwordKey === from.passwordKey) S.passwordKey = to.passwordKey;
|
|
1126
|
+
S.store = store;
|
|
1127
|
+
drawSetup(); schedulePreview();
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
function schedulePreview() {
|
|
1131
|
+
clearTimeout(previewTimer);
|
|
1132
|
+
previewTimer = setTimeout(refreshPreview, 250);
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
async function refreshPreview() {
|
|
1136
|
+
let r;
|
|
1137
|
+
try { r = await postJson('/api/setup/preview', setupBody()); } catch (e) { return; }
|
|
1138
|
+
const cfg = r.config || {};
|
|
1139
|
+
const pages = cfg.pages || [];
|
|
1140
|
+
const shown = Object.assign({}, cfg, { pages: pages.slice(0, 7) });
|
|
1141
|
+
q('#setupPath').textContent = r.file || '';
|
|
1142
|
+
q('#setupJson').textContent = JSON.stringify(shown, null, 2);
|
|
1143
|
+
const more = pages.length - 7;
|
|
1144
|
+
q('#setupMore').textContent = more > 0 ? '… and ' + more + ' more page' + (more === 1 ? '' : 's') + ' in the file.' : '';
|
|
1145
|
+
const missing = SETUP.step === 3 ? (r.problems || []) : [];
|
|
1146
|
+
q('#setupProblems').innerHTML = missing.length
|
|
1147
|
+
? '<ul class="su-miss">' + missing.map((p) => '<li>' + esc(p) + '</li>').join('') + '</ul>'
|
|
1148
|
+
: '';
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
async function writeSetupNow() {
|
|
1152
|
+
const S = SETUP;
|
|
1153
|
+
S.busy = true; S.error = ''; drawSetup();
|
|
1154
|
+
let r;
|
|
1155
|
+
try { r = await postJson('/api/setup/write', setupBody()); }
|
|
1156
|
+
catch (e) { r = { error: 'The console lost contact with its server: ' + e }; }
|
|
1157
|
+
S.busy = false;
|
|
1158
|
+
if (!r.written) { S.error = r.error || 'The config could not be written.'; drawSetup(); return; }
|
|
1159
|
+
SETUP = setupBlank(); setupDir = null;
|
|
1160
|
+
render(r.state);
|
|
1161
|
+
showSetupDone(r);
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
/* The result lands where every other result does — in the Actions card — and
|
|
1165
|
+
says what the chosen login still needs from a person, because that is the one
|
|
1166
|
+
step this form could not take for them. */
|
|
1167
|
+
function showSetupDone(r) {
|
|
1168
|
+
const missing = r.missingEnv || [];
|
|
1169
|
+
let what;
|
|
1170
|
+
if (r.login === 'session') {
|
|
1171
|
+
what = 'Next, log in once from a terminal in this folder. A browser opens, you sign in the way you always do, and the session is kept for every capture after that.';
|
|
1172
|
+
} else if (r.login === 'form' && r.store === 'aws-ssm') {
|
|
1173
|
+
what = 'Only the SSM parameter names were saved. Your local AWS credentials fetch the values when a capture logs in.';
|
|
1174
|
+
} else if (r.login === 'form') {
|
|
1175
|
+
what = 'Only the variable names were saved.' + (missing.length
|
|
1176
|
+
? ' ' + missing.join(' and ') + (missing.length === 1 ? ' is' : ' are') + ' not set in the environment this console was started from — set '
|
|
1177
|
+
+ (missing.length === 1 ? 'it' : 'them') + ' there and reopen the console before the first capture, or it will stop at the login page and say so.'
|
|
1178
|
+
: ' Both are set in the environment this console runs in.');
|
|
1179
|
+
} else {
|
|
1180
|
+
what = 'No login — the pages will be read the way a visitor sees them.';
|
|
1181
|
+
}
|
|
1182
|
+
q('#result').innerHTML = '<div class="res res-ok"><div class="res-head">✅ <span>Done</span></div>'
|
|
1183
|
+
+ '<div class="res-what"><b style="color:var(--text)">' + esc(r.headline) + '</b></div>'
|
|
1184
|
+
+ '<div class="res-what">' + esc(what) + '</div>'
|
|
1185
|
+
+ (r.login === 'session'
|
|
1186
|
+
? '<div class="upd-cmd"><code>ia-qa-heal login</code><button class="copy" data-copy="ia-qa-heal login" data-copy-label="copy command">copy command</button></div>'
|
|
1187
|
+
: '')
|
|
1188
|
+
+ '<div id="next"></div></div>';
|
|
1189
|
+
renderNext(r.next);
|
|
1190
|
+
bindCopy();
|
|
1191
|
+
}
|
|
1192
|
+
|
|
785
1193
|
/* ---- history ---------------------------------------------------------- */
|
|
786
1194
|
|
|
787
1195
|
function renderHistory(s) {
|
package/dist/ui/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/ui/page.ts"],"names":[],"mappings":";;AAqBA,
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/ui/page.ts"],"names":[],"mappings":";;AAqBA,8CAyvCC;AA9wCD;;;;;;;;;;;;;;;;GAgBG;AACH,qCAAiD;AACjD,sCAAyD;AACzD,iCAAuC;AAEvC,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,yEAAyE;IACzE,EAAE;IACF,+EAA+E;IAC/E,8EAA8E;IAC9E,4EAA4E;IAC5E,4DAA4D;IAC5D,EAAE;IACF,+EAA+E;IAC/E,2EAA2E;IAC3E,8EAA8E;IAC9E,oEAAoE;IACpE,EAAE;IACF,iFAAiF;IACjF,kFAAkF;IAClF,4EAA4E;IAC5E,MAAM,OAAO,GAAG,IAAA,uBAAc,GAAE,CAAC;IACjC,uFAAuF;IACvF,wFAAwF;IACxF,uFAAuF;IACvF,sFAAsF;IACtF,MAAM,IAAI,GAAG,IAAA,oBAAa,GAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI;QAClB,CAAC,CAAC,gEAAgE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI;QACnG,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;;;;EAIP,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gHAwNuG,qBAAY,IAAI,OAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAsExI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA26Bf,8BAAqB;;;;;;;;;;;;;;;;;;eAkBxB,CAAC;AAChB,CAAC"}
|
package/dist/ui/server.js
CHANGED
|
@@ -51,6 +51,7 @@ const crypto = __importStar(require("crypto"));
|
|
|
51
51
|
const child_process_1 = require("child_process");
|
|
52
52
|
const config_1 = require("../config");
|
|
53
53
|
const registry_1 = require("./registry");
|
|
54
|
+
const setup_1 = require("./setup");
|
|
54
55
|
const diff_1 = require("../cli/diff");
|
|
55
56
|
const ingest_1 = require("../ingest");
|
|
56
57
|
const evidence_1 = require("../evidence");
|
|
@@ -413,6 +414,20 @@ function setActiveProject(dir) {
|
|
|
413
414
|
function getActiveProject() {
|
|
414
415
|
return activeDir ?? (0, config_1.baseDir)();
|
|
415
416
|
}
|
|
417
|
+
/**
|
|
418
|
+
* A capture is at least one page contract, not a directory. `saveConfig` creates `mapping/`
|
|
419
|
+
* empty, and reading that as a capture told a freshly set-up folder "You have a capture of
|
|
420
|
+
* the app" and offered to promote it — a baseline of nothing. `_`-prefixed entries are
|
|
421
|
+
* layouts, shots and resolutions, never pages.
|
|
422
|
+
*/
|
|
423
|
+
function hasContracts(dir) {
|
|
424
|
+
try {
|
|
425
|
+
return fs.readdirSync(dir).some((f) => f.endsWith('.json') && !f.startsWith('_'));
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
416
431
|
function buildState() {
|
|
417
432
|
if (activeDir)
|
|
418
433
|
(0, config_1.setBaseDir)(activeDir);
|
|
@@ -436,9 +451,17 @@ function buildState() {
|
|
|
436
451
|
configFile: path.join((0, config_1.baseDir)(), config_1.CONFIG_DIR, 'config.json'),
|
|
437
452
|
};
|
|
438
453
|
}
|
|
439
|
-
catch {
|
|
454
|
+
catch (e) {
|
|
440
455
|
project.dir = (0, config_1.baseDir)();
|
|
441
|
-
|
|
456
|
+
// Absent and broken are two different answers. An absent config gets the setup form; a
|
|
457
|
+
// broken one is the user's file and gets its error — never a form that would replace it.
|
|
458
|
+
if (fs.existsSync((0, config_1.configPath)())) {
|
|
459
|
+
project.error = `.ia-qa/config.json is here but cannot be read — ${e instanceof Error ? e.message : String(e)}`;
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
project.needsSetup = true;
|
|
463
|
+
project.error = 'No .ia-qa/config.json in this folder yet — set it up below.';
|
|
464
|
+
}
|
|
442
465
|
}
|
|
443
466
|
// Which frameworks the suite is actually written in, read off the inventory
|
|
444
467
|
// rather than guessed from a folder name — `ingest` already recorded the call
|
|
@@ -459,7 +482,7 @@ function buildState() {
|
|
|
459
482
|
hasBaseline: fs.existsSync(base),
|
|
460
483
|
// Told apart because the empty state's advice differs: with a capture and no
|
|
461
484
|
// reference the next step is to promote one, not to "capture the app" again.
|
|
462
|
-
hasMapping:
|
|
485
|
+
hasMapping: hasContracts(current),
|
|
463
486
|
history: { entries: history, summary: (0, history_1.summarize)(history) },
|
|
464
487
|
actions: actionCatalogue(),
|
|
465
488
|
};
|
|
@@ -711,8 +734,11 @@ async function handle(req, res, token, onBye) {
|
|
|
711
734
|
* the console exists for people who do not have one.
|
|
712
735
|
*
|
|
713
736
|
* So consent can also be given here — but it is still consent, not discovery:
|
|
714
|
-
* a
|
|
715
|
-
*
|
|
737
|
+
* a project is *registered* only once it holds `.ia-qa/config.json`, which means
|
|
738
|
+
* `ui --forget` can take it back. Nothing scans. A folder that has never been set
|
|
739
|
+
* up opens on the setup form instead of a refusal — that refusal used to say "run
|
|
740
|
+
* `ia-qa-heal init` there", a terminal instruction for the people without one —
|
|
741
|
+
* and joins the list the moment the form has written its config.
|
|
716
742
|
*/
|
|
717
743
|
if (req.method === 'POST' && url.pathname === '/api/project/add') {
|
|
718
744
|
let body;
|
|
@@ -725,31 +751,98 @@ async function handle(req, res, token, onBye) {
|
|
|
725
751
|
}
|
|
726
752
|
const raw = typeof body.dir === 'string' ? body.dir.trim().replace(/^["']|["']$/g, '') : '';
|
|
727
753
|
if (raw === '') {
|
|
728
|
-
send(res, 400, 'application/json', JSON.stringify({ error: 'Give the
|
|
754
|
+
send(res, 400, 'application/json', JSON.stringify({ error: 'Give the path of the project folder.' }));
|
|
729
755
|
return;
|
|
730
756
|
}
|
|
731
757
|
const dir = path.resolve(raw);
|
|
732
|
-
if (
|
|
758
|
+
if (path.basename(dir) === config_1.CONFIG_DIR) {
|
|
733
759
|
send(res, 400, 'application/json', JSON.stringify({
|
|
734
|
-
error: `
|
|
735
|
-
`Pick the project's top folder — the one you would open in your editor, ` +
|
|
736
|
-
`not the .ia-qa folder itself. If that project has never been set up, run ` +
|
|
737
|
-
`\`ia-qa-heal init\` in it first.`,
|
|
760
|
+
error: `That is the ${config_1.CONFIG_DIR} folder itself. Pick the project's top folder — the one you would open in your editor.`,
|
|
738
761
|
}));
|
|
739
762
|
return;
|
|
740
763
|
}
|
|
741
|
-
|
|
742
|
-
let addedUrl;
|
|
764
|
+
let isFolder = false;
|
|
743
765
|
try {
|
|
744
|
-
|
|
766
|
+
isFolder = fs.statSync(dir).isDirectory();
|
|
745
767
|
}
|
|
746
768
|
catch {
|
|
747
|
-
|
|
769
|
+
isFolder = false;
|
|
770
|
+
}
|
|
771
|
+
if (!isFolder) {
|
|
772
|
+
send(res, 400, 'application/json', JSON.stringify({ error: `${dir} is not a folder on this machine.` }));
|
|
773
|
+
return;
|
|
774
|
+
}
|
|
775
|
+
setActiveProject(dir);
|
|
776
|
+
if ((0, registry_1.isProjectDir)(dir)) {
|
|
777
|
+
let addedUrl;
|
|
778
|
+
try {
|
|
779
|
+
addedUrl = (0, config_1.loadConfig)().baseUrl;
|
|
780
|
+
}
|
|
781
|
+
catch {
|
|
782
|
+
/* a project whose config will not parse can still be selected, and shown as broken */
|
|
783
|
+
}
|
|
784
|
+
(0, registry_1.rememberProject)(dir, addedUrl);
|
|
748
785
|
}
|
|
749
|
-
(0, registry_1.rememberProject)(dir, addedUrl);
|
|
750
786
|
send(res, 200, 'application/json; charset=utf-8', JSON.stringify(buildState()));
|
|
751
787
|
return;
|
|
752
788
|
}
|
|
789
|
+
/**
|
|
790
|
+
* The setup form's three calls — see ui/setup.ts. `preview` and `write` run the same
|
|
791
|
+
* `planSetup`, so the panel on the page is the file that would be written. None of them
|
|
792
|
+
* spawns anything. The one new authority is writing `.ia-qa/config.json` into the folder
|
|
793
|
+
* this console is showing, and only where none exists; the sitemap read is the same
|
|
794
|
+
* plain fetch `init --discover` makes, to an address the user typed.
|
|
795
|
+
*/
|
|
796
|
+
if (req.method === 'POST' && url.pathname.startsWith('/api/setup/')) {
|
|
797
|
+
let body;
|
|
798
|
+
try {
|
|
799
|
+
body = JSON.parse(await readBody(req));
|
|
800
|
+
}
|
|
801
|
+
catch {
|
|
802
|
+
send(res, 400, 'application/json', JSON.stringify({ error: 'bad request body' }));
|
|
803
|
+
return;
|
|
804
|
+
}
|
|
805
|
+
const dir = getActiveProject();
|
|
806
|
+
if (url.pathname === '/api/setup/sitemap') {
|
|
807
|
+
try {
|
|
808
|
+
const found = await (0, setup_1.readSitemap)(typeof body.baseUrl === 'string' ? body.baseUrl.trim() : '');
|
|
809
|
+
send(res, 200, 'application/json; charset=utf-8', JSON.stringify(found));
|
|
810
|
+
}
|
|
811
|
+
catch (e) {
|
|
812
|
+
send(res, 400, 'application/json', JSON.stringify({ error: e instanceof Error ? e.message : String(e) }));
|
|
813
|
+
}
|
|
814
|
+
return;
|
|
815
|
+
}
|
|
816
|
+
if (url.pathname === '/api/setup/preview') {
|
|
817
|
+
send(res, 200, 'application/json; charset=utf-8', JSON.stringify({ ...(0, setup_1.planSetup)(body, dir), file: (0, config_1.configPath)(dir) }));
|
|
818
|
+
return;
|
|
819
|
+
}
|
|
820
|
+
if (url.pathname === '/api/setup/write') {
|
|
821
|
+
const result = (0, setup_1.writeSetup)(body, dir);
|
|
822
|
+
if (!result.written) {
|
|
823
|
+
send(res, 400, 'application/json', JSON.stringify({ error: result.error, problems: result.plan?.problems ?? [] }));
|
|
824
|
+
return;
|
|
825
|
+
}
|
|
826
|
+
const { config, mode, missingEnv } = result.plan;
|
|
827
|
+
(0, registry_1.rememberProject)(dir, config.baseUrl);
|
|
828
|
+
const n = config.pages.length;
|
|
829
|
+
// `map` stops at a login wall it cannot pass — before `login` has run, or with the
|
|
830
|
+
// form's variables absent from this process — so it is offered only where it can work.
|
|
831
|
+
const canLook = mode === 'none' || (mode === 'form' && missingEnv.length === 0);
|
|
832
|
+
send(res, 200, 'application/json; charset=utf-8', JSON.stringify({
|
|
833
|
+
written: result.file,
|
|
834
|
+
headline: `.ia-qa/config.json written — ${n} page${n === 1 ? '' : 's'}`,
|
|
835
|
+
login: mode,
|
|
836
|
+
store: config.secrets.username?.source ?? null,
|
|
837
|
+
missingEnv,
|
|
838
|
+
next: canLook
|
|
839
|
+
? [{ id: 'map', label: 'Look at the app', means: ACTIONS.map.means, writes: ACTIONS.map.writes }]
|
|
840
|
+
: [],
|
|
841
|
+
state: buildState(),
|
|
842
|
+
}));
|
|
843
|
+
return;
|
|
844
|
+
}
|
|
845
|
+
}
|
|
753
846
|
if (req.method === 'POST' && url.pathname === '/api/run') {
|
|
754
847
|
let body;
|
|
755
848
|
try {
|
package/dist/ui/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type IaQaConfig, type PageTarget } from '../config';
|
|
2
|
+
import { type FetchLike } from '../discovery/sitemap';
|
|
3
|
+
/**
|
|
4
|
+
* The console's setup form — the file `ia-qa-heal init` writes, from a browser.
|
|
5
|
+
*
|
|
6
|
+
* `ui` opened in a folder with no config used to answer "run `ia-qa-heal init` here": a
|
|
7
|
+
* terminal instruction, printed to the one population the console exists for because it
|
|
8
|
+
* does not have one. This is the same wizard without the terminal.
|
|
9
|
+
*
|
|
10
|
+
* Three rules hold it, and the tests pin each:
|
|
11
|
+
* - **One door for preview and write.** `planSetup` builds the config and lists what is
|
|
12
|
+
* still missing; the page's "What this writes" panel is its output, and `writeSetup`
|
|
13
|
+
* refuses while that list is not empty. What the page shows is what lands on disk.
|
|
14
|
+
* - **It never overwrites.** It exists for a folder that has no config. A config that is
|
|
15
|
+
* there but broken is the user's file to fix — rewriting it from a form would discard
|
|
16
|
+
* whatever they had, silently.
|
|
17
|
+
* - **It holds no secret.** The login answers are the NAMES of environment variables or
|
|
18
|
+
* SSM parameters, exactly as in `init`. A field that took a password would put one on
|
|
19
|
+
* the wire and in a page; the browser login stays `ia-qa-heal login`, which needs a
|
|
20
|
+
* terminal by design and is handed over as a command to copy.
|
|
21
|
+
*/
|
|
22
|
+
export type LoginMode = 'none' | 'session' | 'form';
|
|
23
|
+
export interface SetupRequest {
|
|
24
|
+
baseUrl?: unknown;
|
|
25
|
+
pages?: unknown;
|
|
26
|
+
login?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
export interface SetupPlan {
|
|
29
|
+
config: IaQaConfig;
|
|
30
|
+
problems: string[];
|
|
31
|
+
/** Env var names the form points at that this process's environment lacks. Presence only — a value is never read out. */
|
|
32
|
+
missingEnv: string[];
|
|
33
|
+
mode: LoginMode | null;
|
|
34
|
+
}
|
|
35
|
+
export type SetupWrite = {
|
|
36
|
+
written: true;
|
|
37
|
+
file: string;
|
|
38
|
+
plan: SetupPlan;
|
|
39
|
+
} | {
|
|
40
|
+
written: false;
|
|
41
|
+
error: string;
|
|
42
|
+
plan?: SetupPlan;
|
|
43
|
+
};
|
|
44
|
+
export interface SitemapAnswer {
|
|
45
|
+
pages: PageTarget[];
|
|
46
|
+
/** Why nothing came back — the same sentences `init --discover` prints. Empty when pages were found. */
|
|
47
|
+
reason: string[];
|
|
48
|
+
/** True when the list stopped at the cap: the sitemap holds more than was returned. */
|
|
49
|
+
capped: boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare function isWebAddress(value: string): boolean;
|
|
52
|
+
export declare function planSetup(body: SetupRequest, cwd: string): SetupPlan;
|
|
53
|
+
export declare function writeSetup(body: SetupRequest, cwd: string): SetupWrite;
|
|
54
|
+
/** Step 2's "Find them in the sitemap" — the same plain-fetch reading `init --discover` does. */
|
|
55
|
+
export declare function readSitemap(baseUrl: string, fetchImpl?: FetchLike): Promise<SitemapAnswer>;
|
package/dist/ui/setup.js
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
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.isWebAddress = isWebAddress;
|
|
37
|
+
exports.planSetup = planSetup;
|
|
38
|
+
exports.writeSetup = writeSetup;
|
|
39
|
+
exports.readSitemap = readSitemap;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const config_1 = require("../config");
|
|
43
|
+
const init_1 = require("../cli/init");
|
|
44
|
+
const sitemap_1 = require("../discovery/sitemap");
|
|
45
|
+
const ENV_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
46
|
+
const SSM_NAME = /^\/?[A-Za-z0-9_.-]+(\/[A-Za-z0-9_.-]+)*$/;
|
|
47
|
+
const AWS_REGION = /^[a-z]{2}(-[a-z]+)+-\d+$/;
|
|
48
|
+
const MAX_PAGES = 500;
|
|
49
|
+
const MAX_FIELD = 300;
|
|
50
|
+
const SITEMAP_CAP = 200;
|
|
51
|
+
const text = (v) => (typeof v === 'string' ? v.trim() : '');
|
|
52
|
+
function isWebAddress(value) {
|
|
53
|
+
try {
|
|
54
|
+
const u = new URL(value);
|
|
55
|
+
return u.protocol === 'http:' || u.protocol === 'https:';
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const isPageUrl = (value) => value.startsWith('/') || isWebAddress(value);
|
|
62
|
+
// `mappingPath` turns a name into a filename this way, so two names that collapse to the
|
|
63
|
+
// same string would share one contract file and overwrite each other on every `map`.
|
|
64
|
+
const fileKey = (name) => name.replace(/[^a-zA-Z0-9._-]/g, '-');
|
|
65
|
+
function readPages(raw, problems) {
|
|
66
|
+
if (!Array.isArray(raw))
|
|
67
|
+
return [];
|
|
68
|
+
if (raw.length > MAX_PAGES) {
|
|
69
|
+
problems.push(`${raw.length} pages is more than one setup takes (${MAX_PAGES}). Keep the pages your tests visit — ` +
|
|
70
|
+
`"Which pages am I not testing yet?" adds the rest later.`);
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const pages = [];
|
|
74
|
+
const seen = new Map();
|
|
75
|
+
for (const item of raw) {
|
|
76
|
+
const name = text(item?.name);
|
|
77
|
+
const url = text(item?.url);
|
|
78
|
+
if (!name || !url) {
|
|
79
|
+
problems.push('Every page needs a name and a path.');
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (name.length > 120) {
|
|
83
|
+
problems.push(`The page name "${name.slice(0, 40)}…" is too long — it becomes a filename.`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (!isPageUrl(url)) {
|
|
87
|
+
problems.push(`"${url}" (page "${name}") is not a path like /cart, nor a full http(s) address.`);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const clash = seen.get(fileKey(name));
|
|
91
|
+
if (clash !== undefined) {
|
|
92
|
+
problems.push(`"${clash}" and "${name}" would share one contract file — give them different names.`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
seen.set(fileKey(name), name);
|
|
96
|
+
pages.push({ name, url });
|
|
97
|
+
}
|
|
98
|
+
return pages;
|
|
99
|
+
}
|
|
100
|
+
function readLogin(raw, problems, missingEnv) {
|
|
101
|
+
const mode = text(raw?.mode);
|
|
102
|
+
if (mode !== 'none' && mode !== 'session' && mode !== 'form') {
|
|
103
|
+
problems.push('Does the app ask you to log in? Pick one of the three answers.');
|
|
104
|
+
return { mode: null, secrets: {} };
|
|
105
|
+
}
|
|
106
|
+
// A browser session needs nothing in the config: `login` writes `.ia-qa/session.json`,
|
|
107
|
+
// which `map` already picks up by default.
|
|
108
|
+
if (mode !== 'form')
|
|
109
|
+
return { mode, secrets: {} };
|
|
110
|
+
const source = text(raw?.store) === 'aws-ssm' ? 'aws-ssm' : 'env';
|
|
111
|
+
const what = source === 'env' ? 'environment variable' : 'SSM parameter';
|
|
112
|
+
const shape = source === 'env' ? ENV_NAME : SSM_NAME;
|
|
113
|
+
const region = text(raw?.region);
|
|
114
|
+
const keys = { username: text(raw?.usernameKey), password: text(raw?.passwordKey) };
|
|
115
|
+
const isName = (key) => shape.test(key) && key.length <= MAX_FIELD;
|
|
116
|
+
for (const [label, key] of Object.entries(keys)) {
|
|
117
|
+
const example = source === 'env' ? `E2E_${label.toUpperCase()}` : `/staging/app/${label}`;
|
|
118
|
+
// Never echoed, and never carried into the config below: whatever was typed into a name
|
|
119
|
+
// field that is not a name may be the secret itself, and the preview sends the config
|
|
120
|
+
// straight back onto the page.
|
|
121
|
+
if (!key)
|
|
122
|
+
problems.push(`Which ${what} holds the ${label}? The name is missing.`);
|
|
123
|
+
else if (!isName(key)) {
|
|
124
|
+
problems.push(`The ${label} field does not look like an ${what} name. It takes the NAME (like ${example}), never the ${label} itself.`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (keys.username && keys.username === keys.password) {
|
|
128
|
+
problems.push(`The username and the password point at the same ${what}.`);
|
|
129
|
+
}
|
|
130
|
+
if (source === 'aws-ssm' && !AWS_REGION.test(region)) {
|
|
131
|
+
problems.push('The AWS region is missing or not in the usual shape (eu-west-3, us-east-1…).');
|
|
132
|
+
}
|
|
133
|
+
const fields = {
|
|
134
|
+
loginUrl: text(raw?.loginUrl),
|
|
135
|
+
usernameSelector: text(raw?.usernameSelector),
|
|
136
|
+
passwordSelector: text(raw?.passwordSelector),
|
|
137
|
+
submitSelector: text(raw?.submitSelector),
|
|
138
|
+
};
|
|
139
|
+
if (!isPageUrl(fields.loginUrl))
|
|
140
|
+
problems.push('The login page should be a path like /login, or a full http(s) address.');
|
|
141
|
+
const selectorLabels = [
|
|
142
|
+
['usernameSelector', 'username field'],
|
|
143
|
+
['passwordSelector', 'password field'],
|
|
144
|
+
['submitSelector', 'submit button'],
|
|
145
|
+
];
|
|
146
|
+
for (const [field, label] of selectorLabels) {
|
|
147
|
+
if (!fields[field] || fields[field].length > MAX_FIELD)
|
|
148
|
+
problems.push(`The selector for the ${label} is missing.`);
|
|
149
|
+
}
|
|
150
|
+
if (source === 'env') {
|
|
151
|
+
for (const key of [keys.username, keys.password]) {
|
|
152
|
+
if (ENV_NAME.test(key) && !process.env[key])
|
|
153
|
+
missingEnv.push(key);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const ref = (key) => ({ source, key: isName(key) ? key : '', ...(source === 'aws-ssm' ? { region } : {}) });
|
|
157
|
+
return {
|
|
158
|
+
mode,
|
|
159
|
+
secrets: { username: ref(keys.username), password: ref(keys.password) },
|
|
160
|
+
auth: { ...fields, usernameSecret: 'username', passwordSecret: 'password' },
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
function planSetup(body, cwd) {
|
|
164
|
+
const problems = [];
|
|
165
|
+
const missingEnv = [];
|
|
166
|
+
const baseUrl = text(body?.baseUrl);
|
|
167
|
+
if (!baseUrl)
|
|
168
|
+
problems.push('Where does the app live? The address is missing.');
|
|
169
|
+
else if (!isWebAddress(baseUrl))
|
|
170
|
+
problems.push(`"${baseUrl}" is not a web address — it starts with http:// or https://.`);
|
|
171
|
+
const pages = readPages(body?.pages, problems);
|
|
172
|
+
if (pages.length === 0)
|
|
173
|
+
problems.push('No page selected yet — pick at least one, from the sitemap or by hand.');
|
|
174
|
+
const login = readLogin(body?.login, problems, missingEnv);
|
|
175
|
+
// Detected, never asked — the same call `init --yes` makes, so both doors write the same file.
|
|
176
|
+
const testCommand = (0, init_1.detectTestCommand)(cwd);
|
|
177
|
+
const config = {
|
|
178
|
+
framework: 'playwright',
|
|
179
|
+
baseUrl,
|
|
180
|
+
secrets: login.secrets,
|
|
181
|
+
...(login.auth ? { auth: login.auth } : {}),
|
|
182
|
+
pages,
|
|
183
|
+
...(testCommand ? { testCommand } : {}),
|
|
184
|
+
};
|
|
185
|
+
return { config, problems: [...new Set(problems)], missingEnv, mode: login.mode };
|
|
186
|
+
}
|
|
187
|
+
function writeSetup(body, cwd) {
|
|
188
|
+
if (path.basename(cwd) === config_1.CONFIG_DIR) {
|
|
189
|
+
return { written: false, error: `This is the ${config_1.CONFIG_DIR} folder itself — set up the project's top folder instead.` };
|
|
190
|
+
}
|
|
191
|
+
if (fs.existsSync((0, config_1.configPath)(cwd))) {
|
|
192
|
+
return {
|
|
193
|
+
written: false,
|
|
194
|
+
error: `${config_1.CONFIG_DIR}/config.json already exists here. This form only sets up a folder that has none — it never overwrites one.`,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
const plan = planSetup(body, cwd);
|
|
198
|
+
if (plan.problems.length > 0)
|
|
199
|
+
return { written: false, error: plan.problems[0], plan };
|
|
200
|
+
return { written: true, file: (0, config_1.saveConfig)(plan.config, cwd), plan };
|
|
201
|
+
}
|
|
202
|
+
/** Step 2's "Find them in the sitemap" — the same plain-fetch reading `init --discover` does. */
|
|
203
|
+
async function readSitemap(baseUrl, fetchImpl) {
|
|
204
|
+
if (!isWebAddress(baseUrl))
|
|
205
|
+
throw new Error('The address must start with http:// or https://.');
|
|
206
|
+
const { candidates, stats } = await (0, sitemap_1.discoverFromSitemap)(baseUrl, {
|
|
207
|
+
maxUrls: SITEMAP_CAP,
|
|
208
|
+
...(fetchImpl ? { fetchImpl } : {}),
|
|
209
|
+
});
|
|
210
|
+
return {
|
|
211
|
+
pages: candidates.map((c) => ({ name: c.name, url: c.url })),
|
|
212
|
+
reason: candidates.length === 0 ? (0, sitemap_1.emptySitemapReason)(stats).map((line) => line.trim()) : [],
|
|
213
|
+
capped: candidates.length >= SITEMAP_CAP,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/ui/setup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ia-qa/self-healing",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "Your Playwright, Cypress or Selenium tests break when a selector moves — this finds the element again and rewrites the test. Deterministic: no LLM decides whether your build passes. Runs entirely on your machine, with a local MCP server for agents.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"self-healing",
|