@issuegraph/editor 0.4.0 → 0.22.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.
- package/README.md +65 -9
- package/dist/a11y/baseline.d.ts +182 -0
- package/dist/a11y/baseline.d.ts.map +1 -0
- package/dist/a11y/baseline.js +434 -0
- package/dist/a11y/baseline.js.map +1 -0
- package/dist/audit/findings.d.ts +107 -1
- package/dist/audit/findings.d.ts.map +1 -1
- package/dist/audit/findings.js +113 -6
- package/dist/audit/findings.js.map +1 -1
- package/dist/audit/panel.d.ts +277 -0
- package/dist/audit/panel.d.ts.map +1 -0
- package/dist/audit/panel.js +462 -0
- package/dist/audit/panel.js.map +1 -0
- package/dist/audit/refused.d.ts +99 -0
- package/dist/audit/refused.d.ts.map +1 -0
- package/dist/audit/refused.js +276 -0
- package/dist/audit/refused.js.map +1 -0
- package/dist/audit/styles.d.ts +1 -1
- package/dist/audit/styles.d.ts.map +1 -1
- package/dist/audit/styles.js +429 -1
- package/dist/audit/styles.js.map +1 -1
- package/dist/audit/surface.d.ts +54 -12
- package/dist/audit/surface.d.ts.map +1 -1
- package/dist/audit/surface.js +53 -13
- package/dist/audit/surface.js.map +1 -1
- package/dist/create/draft.d.ts +36 -0
- package/dist/create/draft.d.ts.map +1 -1
- package/dist/create/draft.js +40 -0
- package/dist/create/draft.js.map +1 -1
- package/dist/create/keys.d.ts +134 -9
- package/dist/create/keys.d.ts.map +1 -1
- package/dist/create/keys.js +119 -20
- package/dist/create/keys.js.map +1 -1
- package/dist/firstpass/candidates.d.ts +17 -1
- package/dist/firstpass/candidates.d.ts.map +1 -1
- package/dist/index.d.ts +42 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -14
- package/dist/index.js.map +1 -1
- package/dist/overlay/render.d.ts +11 -3
- package/dist/overlay/render.d.ts.map +1 -1
- package/dist/overlay/render.js +76 -20
- package/dist/overlay/render.js.map +1 -1
- package/dist/overlay/request.d.ts +71 -0
- package/dist/overlay/request.d.ts.map +1 -0
- package/dist/overlay/request.js +129 -0
- package/dist/overlay/request.js.map +1 -0
- package/dist/overlay/styles.d.ts +1 -1
- package/dist/overlay/styles.d.ts.map +1 -1
- package/dist/overlay/styles.js +78 -7
- package/dist/overlay/styles.js.map +1 -1
- package/dist/picker/render.d.ts +26 -16
- package/dist/picker/render.d.ts.map +1 -1
- package/dist/picker/render.js +25 -36
- package/dist/picker/render.js.map +1 -1
- package/dist/picker/styles.d.ts +7 -7
- package/dist/picker/styles.d.ts.map +1 -1
- package/dist/picker/styles.js +7 -36
- package/dist/picker/styles.js.map +1 -1
- package/dist/picker/view.d.ts +8 -4
- package/dist/picker/view.d.ts.map +1 -1
- package/dist/picker/view.js +4 -3
- package/dist/picker/view.js.map +1 -1
- package/dist/picker/words.d.ts +12 -10
- package/dist/picker/words.d.ts.map +1 -1
- package/dist/picker/words.js +12 -8
- package/dist/picker/words.js.map +1 -1
- package/dist/reevaluate/parts.d.ts +130 -0
- package/dist/reevaluate/parts.d.ts.map +1 -0
- package/dist/reevaluate/parts.js +260 -0
- package/dist/reevaluate/parts.js.map +1 -0
- package/dist/reevaluate/render.d.ts +18 -11
- package/dist/reevaluate/render.d.ts.map +1 -1
- package/dist/reevaluate/render.js +21 -135
- package/dist/reevaluate/render.js.map +1 -1
- package/dist/reevaluate/styles.d.ts +1 -1
- package/dist/reevaluate/styles.d.ts.map +1 -1
- package/dist/reevaluate/styles.js +26 -0
- package/dist/reevaluate/styles.js.map +1 -1
- package/dist/reevaluate/view.d.ts +16 -1
- package/dist/reevaluate/view.d.ts.map +1 -1
- package/dist/reevaluate/view.js +21 -1
- package/dist/reevaluate/view.js.map +1 -1
- package/dist/reevaluate/words.d.ts +7 -0
- package/dist/reevaluate/words.d.ts.map +1 -1
- package/dist/scale/ladder.d.ts +62 -6
- package/dist/scale/ladder.d.ts.map +1 -1
- package/dist/scale/ladder.js +129 -11
- package/dist/scale/ladder.js.map +1 -1
- package/dist/scale/render.d.ts +44 -0
- package/dist/scale/render.d.ts.map +1 -1
- package/dist/scale/render.js +206 -28
- package/dist/scale/render.js.map +1 -1
- package/dist/scale/styles.d.ts +11 -5
- package/dist/scale/styles.d.ts.map +1 -1
- package/dist/scale/styles.js +133 -4
- package/dist/scale/styles.js.map +1 -1
- package/dist/workspace/chrome.d.ts +1 -1
- package/dist/workspace/chrome.d.ts.map +1 -1
- package/dist/workspace/chrome.js +48 -0
- package/dist/workspace/chrome.js.map +1 -1
- package/dist/workspace/firstpass.d.ts +166 -0
- package/dist/workspace/firstpass.d.ts.map +1 -0
- package/dist/workspace/firstpass.js +151 -0
- package/dist/workspace/firstpass.js.map +1 -0
- package/dist/workspace/host.d.ts +283 -11
- package/dist/workspace/host.d.ts.map +1 -1
- package/dist/workspace/host.js +614 -43
- package/dist/workspace/host.js.map +1 -1
- package/dist/workspace/inspector.d.ts +72 -2
- package/dist/workspace/inspector.d.ts.map +1 -1
- package/dist/workspace/inspector.js +26 -0
- package/dist/workspace/inspector.js.map +1 -1
- package/dist/workspace/mount.d.ts +75 -6
- package/dist/workspace/mount.d.ts.map +1 -1
- package/dist/workspace/mount.js +1851 -60
- package/dist/workspace/mount.js.map +1 -1
- package/dist/workspace/rail.d.ts +5 -2
- package/dist/workspace/rail.d.ts.map +1 -1
- package/dist/workspace/rail.js.map +1 -1
- package/dist/workspace/recovery.d.ts +155 -0
- package/dist/workspace/recovery.d.ts.map +1 -0
- package/dist/workspace/recovery.js +156 -0
- package/dist/workspace/recovery.js.map +1 -0
- package/dist/workspace/render.d.ts +779 -2
- package/dist/workspace/render.d.ts.map +1 -1
- package/dist/workspace/render.js +1727 -61
- package/dist/workspace/render.js.map +1 -1
- package/dist/workspace/selection.d.ts +11 -0
- package/dist/workspace/selection.d.ts.map +1 -1
- package/dist/workspace/selection.js +10 -0
- package/dist/workspace/selection.js.map +1 -1
- package/dist/workspace/styles.d.ts +1 -1
- package/dist/workspace/styles.d.ts.map +1 -1
- package/dist/workspace/styles.js +1405 -42
- package/dist/workspace/styles.js.map +1 -1
- package/package.json +4 -4
package/dist/audit/findings.js
CHANGED
|
@@ -143,7 +143,7 @@ function compareMembers(a, b) {
|
|
|
143
143
|
* and no detector can produce one, so silence would hide a defect rather than
|
|
144
144
|
* tolerate an input.
|
|
145
145
|
*/
|
|
146
|
-
function finding(kind, members, detail) {
|
|
146
|
+
function finding(kind, members, detail, walk, edge) {
|
|
147
147
|
const spec = AUDIT_CLASS_SPECS[kind];
|
|
148
148
|
// A SORTED SET. Sorting is what makes two runs over one document produce
|
|
149
149
|
// equal findings; deduplication matters because the row grammar counts one
|
|
@@ -151,12 +151,34 @@ function finding(kind, members, detail) {
|
|
|
151
151
|
const named = Object.freeze([...new Set(members)].sort());
|
|
152
152
|
if (named.length === 0)
|
|
153
153
|
throw new Error(`unreachable: a ${kind} finding names no issues`);
|
|
154
|
+
// COPIED AND FROZEN LIKE `named`, AND FOR THE SAME REASON ONE LINE UP: this
|
|
155
|
+
// one comes straight off a HOST's function, so without the copy the finding
|
|
156
|
+
// holds an array its caller can still reach and reorder. Not sorted and not
|
|
157
|
+
// deduplicated, though — the order IS the value here, and a walk that repeats
|
|
158
|
+
// a ref would be a defect in the reader rather than an input to normalize.
|
|
159
|
+
// AN EMPTY WALK IS AN ABSENT ONE. No conforming reader answers `[]` — a
|
|
160
|
+
// component it declines to order answers `null` — but the two would otherwise
|
|
161
|
+
// be different values that draw identically and key differently in `distinct`
|
|
162
|
+
// below, which is the absence-rendered-as-a-value shape this module refuses
|
|
163
|
+
// elsewhere.
|
|
164
|
+
const walked = walk === null || walk === undefined || walk.length === 0
|
|
165
|
+
? undefined
|
|
166
|
+
: Object.freeze([...walk]);
|
|
154
167
|
return Object.freeze({
|
|
155
168
|
kind,
|
|
156
169
|
severity: spec.severity,
|
|
157
170
|
keepAsHistory: spec.keepAsHistory,
|
|
158
171
|
members: named,
|
|
159
172
|
detail,
|
|
173
|
+
// SPREAD RATHER THAN ASSIGNED `undefined`, because an explicitly-undefined
|
|
174
|
+
// property is not the same value as an absent one to a caller enumerating
|
|
175
|
+
// keys — `distinct` below is one such caller. (`exactOptionalPropertyTypes`
|
|
176
|
+
// would permit the plain assignment: the field is declared `| undefined`.)
|
|
177
|
+
...(walked === undefined ? {} : { walk: walked }),
|
|
178
|
+
// SPREAD FOR THE REASON THE LINE ABOVE IS, and the same reason again: an
|
|
179
|
+
// explicitly-undefined property is not an absent one to `distinct`, which
|
|
180
|
+
// enumerates.
|
|
181
|
+
...(edge === undefined || edge === null ? {} : { edge }),
|
|
160
182
|
});
|
|
161
183
|
}
|
|
162
184
|
function edgesOfKind(document, kind) {
|
|
@@ -219,12 +241,36 @@ resolveFrom) {
|
|
|
219
241
|
* An empty group is skipped rather than drawn: a finding naming nobody would
|
|
220
242
|
* add to the header count while giving a reader nothing to navigate to.
|
|
221
243
|
*/
|
|
244
|
+
/**
|
|
245
|
+
* The first walk any member of `members` names, or `null`.
|
|
246
|
+
*
|
|
247
|
+
* See the call site for why it asks more than one.
|
|
248
|
+
*/
|
|
249
|
+
function walkOfComponent(graph, members) {
|
|
250
|
+
for (const ref of members) {
|
|
251
|
+
const walk = graph.cycleWalk?.(ref);
|
|
252
|
+
if (walk !== null && walk !== undefined)
|
|
253
|
+
return walk;
|
|
254
|
+
}
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
222
257
|
function cycleFindings(graph) {
|
|
223
258
|
return graph.cycles
|
|
224
259
|
.filter((members) => members.length > 0)
|
|
225
260
|
.map((members) => [...members].sort())
|
|
226
261
|
.sort((a, b) => compareMembers(a, b))
|
|
227
|
-
.map((members) => finding('cycle', members, `${members.join(' · ')} form a blocked-by cycle; no member can ever become ready
|
|
262
|
+
.map((members) => finding('cycle', members, `${members.join(' · ')} form a blocked-by cycle; no member can ever become ready`,
|
|
263
|
+
// ASKED PER COMPONENT AND STILL A PASS-THROUGH. The reader decides
|
|
264
|
+
// whether there IS a walk; this module neither computes nor
|
|
265
|
+
// second-guesses that. Asking by KEY rather than by position is what
|
|
266
|
+
// lets the filter and the two sorts above stay exactly as they were —
|
|
267
|
+
// there is no index left to keep in step.
|
|
268
|
+
//
|
|
269
|
+
// EVERY MEMBER, NOT JUST THE FIRST. Within the READER's group they all
|
|
270
|
+
// answer the same walk, so one would do — but `members` is the HOST's
|
|
271
|
+
// array, and a single ref the reader does not hold would drop the walk
|
|
272
|
+
// for the whole component if it happened to sort first.
|
|
273
|
+
walkOfComponent(graph, members)));
|
|
228
274
|
}
|
|
229
275
|
/**
|
|
230
276
|
* A `blocked-by` whose EFFECTIVE target is closed.
|
|
@@ -272,7 +318,11 @@ function staleBlockerFindings(document, graph, refused) {
|
|
|
272
318
|
// spelling shape that forced the dead-duplicate change cannot reach here:
|
|
273
319
|
// a target the document does not carry is never resolved on the `'to'`
|
|
274
320
|
// side, so the finding is withheld as unknown rather than mis-membered.
|
|
275
|
-
findings.push(finding('stale-blocker', [edge.from, edge.to].sort(), `${edge.from} is blocked-by ${effective}${via}, which is closed; readiness is already satisfied
|
|
321
|
+
findings.push(finding('stale-blocker', [edge.from, edge.to].sort(), `${edge.from} is blocked-by ${effective}${via}, which is closed; readiness is already satisfied`, null,
|
|
322
|
+
// THE DECLARER'S EDGE, which is what the paragraph above already says
|
|
323
|
+
// this finding's remedy sits on. Now it is carried rather than only
|
|
324
|
+
// described, so `Remove the edge` can name it.
|
|
325
|
+
{ id: edge.id, from: edge.from, to: edge.to }));
|
|
276
326
|
}
|
|
277
327
|
return findings.sort((a, b) => compareMembers(a.members, b.members));
|
|
278
328
|
}
|
|
@@ -327,7 +377,11 @@ function deadDuplicateFindings(document, graph, refused) {
|
|
|
327
377
|
const canonical = verdict.effective;
|
|
328
378
|
const via = canonical === edge.to ? '' : ` (through ${edge.to})`;
|
|
329
379
|
// `finding` deduplicates, so the same-spelling case stays two members.
|
|
330
|
-
findings.push(finding('dead-duplicate-ref', [edge.from, edge.to, canonical].sort(), `${edge.from} is duplicate-of ${canonical}${via}, which is closed; its work is excluded from the order and tracked nowhere
|
|
380
|
+
findings.push(finding('dead-duplicate-ref', [edge.from, edge.to, canonical].sort(), `${edge.from} is duplicate-of ${canonical}${via}, which is closed; its work is excluded from the order and tracked nowhere`, null,
|
|
381
|
+
// THE DECLARED `duplicate-of`, NOT the chain's end. `Repoint or clear`
|
|
382
|
+
// acts on the edge the reader wrote; `canonical` may be several hops
|
|
383
|
+
// away and is named in the sentence instead.
|
|
384
|
+
{ id: edge.id, from: edge.from, to: edge.to }));
|
|
331
385
|
}
|
|
332
386
|
return findings.sort((a, b) => compareMembers(a.members, b.members));
|
|
333
387
|
}
|
|
@@ -370,11 +424,64 @@ export function auditDocument(input) {
|
|
|
370
424
|
const { document, graph } = input;
|
|
371
425
|
const refusals = input.encodingRefused ?? [];
|
|
372
426
|
const refused = new Set(refusals.map((refusal) => refusal.ref));
|
|
373
|
-
return Object.freeze([
|
|
427
|
+
return Object.freeze(distinct([
|
|
374
428
|
...cycleFindings(graph),
|
|
375
429
|
...staleBlockerFindings(document, graph, refused),
|
|
376
430
|
...deadDuplicateFindings(document, graph, refused),
|
|
377
431
|
...encodingRefusedFindings(refusals),
|
|
378
|
-
]);
|
|
432
|
+
]));
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* One entry per distinct finding, keeping the first of any repeat.
|
|
436
|
+
*
|
|
437
|
+
* A FINDING IS WHAT IT SAYS. `detail` is composed from the very edge or members
|
|
438
|
+
* the finding is about, so two findings with one kind, one member set and one
|
|
439
|
+
* sentence are not two findings — they are one, found twice.
|
|
440
|
+
*
|
|
441
|
+
* THE INPUT THAT PRODUCES THEM IS SUPPORTED REDUNDANCY, NOT MALFORMED DATA.
|
|
442
|
+
* `@issuegraph/viewer`'s `indexEdges` collapses an exact repeated directed edge
|
|
443
|
+
* into one relationship without a diagnostic, so a store document carrying the
|
|
444
|
+
* same `blocked-by` twice is ordinary; the audit reads that document
|
|
445
|
+
* unnormalized and its per-edge detectors duly emit one finding per occurrence.
|
|
446
|
+
*
|
|
447
|
+
* IT IS DONE HERE RATHER THAN IN EACH DETECTOR, and rather than in a renderer.
|
|
448
|
+
* A detector deduplicating its own output would be four copies of one rule, and
|
|
449
|
+
* `encodingRefusedFindings` already carries a fifth for refusals. A renderer
|
|
450
|
+
* doing it would leave the HEADER COUNT wrong — a repeated edge would have said
|
|
451
|
+
* "3 encoding problems" over a list of two.
|
|
452
|
+
*
|
|
453
|
+
* THE COUNT NOW SPANS TWO SURFACES, AND THAT DOES NOT RELAX THIS RULE. §17d's
|
|
454
|
+
* fourth class is drawn by `./refused.ts` rather than listed by `./panel.ts`,
|
|
455
|
+
* so the ambient count in `./surface.ts` is a count of the panel's cards PLUS
|
|
456
|
+
* the refused block's. `./refused.ts` repeats the by-ref rule above for its own
|
|
457
|
+
* list — one line, stated in its header, and pinned by `./panel.test.ts` —
|
|
458
|
+
* because a card count that disagreed with the finding count would break the
|
|
459
|
+
* same arithmetic, one surface over.
|
|
460
|
+
*/
|
|
461
|
+
function distinct(findings) {
|
|
462
|
+
const seen = new Set();
|
|
463
|
+
const out = [];
|
|
464
|
+
for (const found of findings) {
|
|
465
|
+
// THE MEMBERS ARE IN THE KEY AS WELL AS THE SENTENCE. `detail` determines
|
|
466
|
+
// them today for every detector, but the key should not rest on a property
|
|
467
|
+
// of the prose: a class that ever states two member sets in one sentence
|
|
468
|
+
// would silently drop a finding rather than fail a test.
|
|
469
|
+
// AND THE WALK, by the same argument the paragraph above makes about the
|
|
470
|
+
// sentence: two findings that agree on class, members and prose but name
|
|
471
|
+
// different orderings are two findings, and a key that cannot see the
|
|
472
|
+
// difference would drop one silently. No conforming reader produces that
|
|
473
|
+
// pair — a component has one walk — which is precisely why the key should
|
|
474
|
+
// not be the thing that depends on it staying true.
|
|
475
|
+
// AND THE EDGE, by the argument the two paragraphs above make about the
|
|
476
|
+
// sentence and the walk: two findings agreeing on class, members and prose
|
|
477
|
+
// while naming different edges are two findings, and a key that cannot see
|
|
478
|
+
// the difference drops one silently.
|
|
479
|
+
const key = `${found.kind}\u0000${found.members.join('\u0001')}\u0000${found.detail}\u0000${(found.walk ?? []).join('\u0001')}\u0000${found.edge?.id ?? ''}`;
|
|
480
|
+
if (seen.has(key))
|
|
481
|
+
continue;
|
|
482
|
+
seen.add(key);
|
|
483
|
+
out.push(found);
|
|
484
|
+
}
|
|
485
|
+
return out;
|
|
379
486
|
}
|
|
380
487
|
//# sourceMappingURL=findings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findings.js","sourceRoot":"","sources":["../../src/audit/findings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,OAAO;IACP,eAAe;IACf,oBAAoB;IACpB,kBAAkB;CACV,CAAC,CAAC;AA6CZ;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAClF,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAC/F,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC;QAChC,QAAQ,EAAE,kBAAkB;QAC5B,MAAM,EAAE,CAAC;QACT,aAAa,EAAE,KAAK;KACrB,CAAC;IACF,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;CAClF,CAAwD,CAAC;
|
|
1
|
+
{"version":3,"file":"findings.js","sourceRoot":"","sources":["../../src/audit/findings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* §17d's findings panel: the three RELATIONSHIP findings, as a list.
|
|
3
|
+
*
|
|
4
|
+
* `./surface.ts` draws the ambient half — the persistent header count and the
|
|
5
|
+
* left-bar on an affected rail row. Neither says what was found. This module
|
|
6
|
+
* draws the list, so a reader who sees a count has somewhere to read it.
|
|
7
|
+
*
|
|
8
|
+
* ## Three classes, not four — the fourth is `./refused.ts`'
|
|
9
|
+
*
|
|
10
|
+
* `encoding-refused` is drawn OUTSIDE this panel, and SPEC is why: a refusal is
|
|
11
|
+
* *"surfaced on the issue itself, because until it parses the issue has no
|
|
12
|
+
* edges at all and would otherwise look simply unencoded"*. The other three
|
|
13
|
+
* say something about a relationship that exists; that one says the
|
|
14
|
+
* relationships cannot be read.
|
|
15
|
+
*
|
|
16
|
+
* SO THERE ARE TWO COUNTS NOW, AND THEY ARE DIFFERENT NUMBERS ON PURPOSE.
|
|
17
|
+
* `./surface.ts`'s ambient count stays every finding — it is the persistent
|
|
18
|
+
* control, it sits in the workspace chrome beside both surfaces, and a reader
|
|
19
|
+
* works through all four classes. The count in THIS panel's head is this
|
|
20
|
+
* panel's own cards, because it is enclosed by the list it counts. See
|
|
21
|
+
* {@link renderAuditPanel}.
|
|
22
|
+
*
|
|
23
|
+
* ## It is the module `./surface.ts` predicted
|
|
24
|
+
*
|
|
25
|
+
* That file's rule is *"findings travel as data; whatever lists them owns their
|
|
26
|
+
* escaping"*, and it is still true of it: `renderAuditHeader` concatenates by
|
|
27
|
+
* hand and is safe because the only value reaching it is a COUNT. A `detail` is
|
|
28
|
+
* not a number — it is prose about issues a host supplied — so this module is
|
|
29
|
+
* the lister that owns the escaping, and it owns it the way every other leaf in
|
|
30
|
+
* this package does: it builds an {@link ElementSpec} tree and the caller renders
|
|
31
|
+
* it through the viewer's `renderMarkup`. Nothing here writes a tag.
|
|
32
|
+
*
|
|
33
|
+
* ## The card is THREE lines, or FOUR when the finding carries a walk
|
|
34
|
+
*
|
|
35
|
+
* The frame draws a chip, a title, a mono line of the refs, and a prose
|
|
36
|
+
* paragraph. This module long drew three, on this argument: `AuditFinding.detail`
|
|
37
|
+
* ALREADY OPENS WITH THE MEMBERS — `${members.join(' · ')} form a blocked-by
|
|
38
|
+
* cycle; …` — so *"drawing a members line beside it prints every reference
|
|
39
|
+
* twice"*.
|
|
40
|
+
*
|
|
41
|
+
* THAT ARGUMENT WAS RIGHT ABOUT A LINE THE FRAME DOES NOT DRAW. The frame's
|
|
42
|
+
* third line is `#544 → #551 → #560 → #544` — a WALK, not the `·`-joined set
|
|
43
|
+
* the sentence opens with. Calling it "a mono line of the refs" was the slip:
|
|
44
|
+
* the line that was declined and the line drawn below are not the same line, and
|
|
45
|
+
* the refs are the only thing they have in common.
|
|
46
|
+
*
|
|
47
|
+
* SO THE COST IS CONCEDED RATHER THAN ARGUED AWAY. On a card that carries a
|
|
48
|
+
* walk the refs really do appear twice, and the head three times. What buys it
|
|
49
|
+
* is the one thing the sentence cannot say: `#544 · #551 · #560` does not say
|
|
50
|
+
* who waits on whom, and a stuck group's ordering is the first thing a groomer
|
|
51
|
+
* needs in order to pick an edge to cut. Direction appears nowhere else on the
|
|
52
|
+
* card.
|
|
53
|
+
*
|
|
54
|
+
* `detail` IS LEFT BYTE-IDENTICAL, and composing the walk INTO it was the
|
|
55
|
+
* alternative. It is rejected on §17d rather than on the accessible name — a
|
|
56
|
+
* walk-composed sentence would be collision-free by the same construction the
|
|
57
|
+
* current one is, so that cost is not real. The reason is that the frame draws a
|
|
58
|
+
* SEPARATE line and this section is delivered as a frame/implementation pair, so
|
|
59
|
+
* folding it into the sentence deviates from the artifact the work is measured
|
|
60
|
+
* against; and it would give `detail` two shapes, since a component §6.6
|
|
61
|
+
* declines to order has no walk to compose.
|
|
62
|
+
*
|
|
63
|
+
* THE ARROW GLYPH IS `aria-hidden`, AND THAT IS A GAP RATHER THAN A WIN. The
|
|
64
|
+
* only thing the line adds is direction, and the glyph does not carry it: `→`
|
|
65
|
+
* announces as "right arrow", not "waits on". Announcing the line anyway would
|
|
66
|
+
* repeat three refs `detail` has just named, in a form that has lost the reason
|
|
67
|
+
* it was drawn — the same trade `renderAuditPanel`'s `◆` makes below. The
|
|
68
|
+
* remaining options were a visually-hidden utility this package does not have,
|
|
69
|
+
* or an `aria-label` on a `p` with no role, which is not reliably announced. So
|
|
70
|
+
* a screen reader hears exactly what it heard before this line existed, and the
|
|
71
|
+
* ordering is genuinely lost to it. Filed, not resolved here.
|
|
72
|
+
*
|
|
73
|
+
* THE TITLE IS PER CLASS, AND THE FRAME'S ARE PER FINDING. `AuditFinding` has no
|
|
74
|
+
* title field, and this package appends numbers rather than interpolating them
|
|
75
|
+
* (`WorkspaceWords.whyRank` records why), so a per-finding title would need a
|
|
76
|
+
* template language this package has twice refused to ship. Four fixed titles
|
|
77
|
+
* keep the frame's type hierarchy at no cost to the data model; the difference
|
|
78
|
+
* is a stated deviation rather than a silent one.
|
|
79
|
+
*
|
|
80
|
+
* ## The chip carries `data-ig-audit-kind`, NEVER `data-ig-audit`
|
|
81
|
+
*
|
|
82
|
+
* `./styles.ts` ends with an UNQUALIFIED `[data-ig-audit]` rule — deliberately,
|
|
83
|
+
* because it lands on a row the viewer rendered and this layer may not rewrite
|
|
84
|
+
* that row's `class`. So an element out here carrying the same attribute picks
|
|
85
|
+
* up the rail's 2px gold left-bar whatever hue it was given, and the four-hue
|
|
86
|
+
* chip mapping would draw one gold bar on all four. The severity attribute stays
|
|
87
|
+
* reserved for the rail rows it was scoped for.
|
|
88
|
+
*
|
|
89
|
+
* ## There is no filter control here, and that is SPEC's call rather than a cut
|
|
90
|
+
*
|
|
91
|
+
* The frame's panel header carries `filter the rail to these`. SPEC §17a gives
|
|
92
|
+
* the workspace *"an audit **filter** … for focus; an audit **mode** does not"*,
|
|
93
|
+
* and §17d gives the header count one job — *"always the same click"*. That is
|
|
94
|
+
* one control, which `./surface.ts` already draws and which is on screen beside
|
|
95
|
+
* this panel. A second element on `data-ig-audit-filter` would be a second
|
|
96
|
+
* TOGGLE for one boolean (`workspace/host.ts` flips rather than sets), one
|
|
97
|
+
* announcing `aria-pressed` and one not.
|
|
98
|
+
*
|
|
99
|
+
* The frame needs its own because it draws the panel STANDALONE, with no
|
|
100
|
+
* workspace header in the artboard. Composed, it has one.
|
|
101
|
+
*
|
|
102
|
+
* ## `Show the loop` is in, because §17d's rule is navigation
|
|
103
|
+
*
|
|
104
|
+
* `./surface.ts` states the section's own doctrine: *"every finding is a
|
|
105
|
+
* judgment call, so the surface offers navigation and never a remedy."* The
|
|
106
|
+
* frame's other three buttons are remedies and are deferred. Without this one
|
|
107
|
+
* the panel is a paragraph you cannot act on or navigate from, sitting at the
|
|
108
|
+
* top of a column whose whole job is the selection.
|
|
109
|
+
*
|
|
110
|
+
* IT PUBLISHES `reveal-issue`, NOT the `select-issue` the inspector's hold rows
|
|
111
|
+
* use, and the difference is the whole of the control's safety. `select-issue`
|
|
112
|
+
* is a POINTER: with a relationship draft awaiting its target, `workspace/host
|
|
113
|
+
* .ts` reads a pointer as CHOOSING that target and emits the create proposal.
|
|
114
|
+
* So "go and look" would have declared a relationship — a write, from the one
|
|
115
|
+
* surface whose stated rule is that it never offers one. `reveal-issue` moves
|
|
116
|
+
* the selection and abandons the draft, and can produce no edit at all.
|
|
117
|
+
*
|
|
118
|
+
* AND IT IS DRAWN ONLY FOR A LOADED MEMBER — see {@link navigableMember}.
|
|
119
|
+
*
|
|
120
|
+
* @see https://github.com/autnmy/issuegraph/blob/main/SPEC.md
|
|
121
|
+
*/
|
|
122
|
+
import { type ElementSpec } from '@issuegraph/viewer';
|
|
123
|
+
import type { AuditClass } from './findings.ts';
|
|
124
|
+
import type { AuditOverlay } from './surface.ts';
|
|
125
|
+
/**
|
|
126
|
+
* The attribute a severity chip carries.
|
|
127
|
+
*
|
|
128
|
+
* ITS OWN NAME RATHER THAN `AUDIT_SEVERITY_ATTRIBUTE`, for the reason in this
|
|
129
|
+
* module's header: that one is matched by an unqualified rule meant for rail
|
|
130
|
+
* rows, and a chip wearing it would draw the ambient bar.
|
|
131
|
+
*/
|
|
132
|
+
export declare const AUDIT_KIND_ATTRIBUTE = "data-ig-audit-kind";
|
|
133
|
+
/**
|
|
134
|
+
* The words this package will not invent.
|
|
135
|
+
*
|
|
136
|
+
* TOTAL RECORDS OVER {@link AuditClass}, the shape `AUDIT_CLASS_SPECS` already
|
|
137
|
+
* uses, so adding a fifth class is a type error here rather than a chip that
|
|
138
|
+
* silently draws its own key.
|
|
139
|
+
*/
|
|
140
|
+
export interface AuditWords {
|
|
141
|
+
/** Reads the panel's header after the count — the frame's `encoding problems`. */
|
|
142
|
+
readonly heading: string;
|
|
143
|
+
/** The chip on each card. The frame's `cycle`, `stale`, `dead ref`, `refused`. */
|
|
144
|
+
readonly classes: Readonly<Record<AuditClass, string>>;
|
|
145
|
+
/**
|
|
146
|
+
* The card's title line.
|
|
147
|
+
*
|
|
148
|
+
* ONE PER CLASS. See this module's header for why the frame's per-finding
|
|
149
|
+
* titles are not reconstructible.
|
|
150
|
+
*/
|
|
151
|
+
readonly titles: Readonly<Record<AuditClass, string>>;
|
|
152
|
+
/** The navigation control on each card — the frame's `Show the loop`. */
|
|
153
|
+
readonly show: string;
|
|
154
|
+
/**
|
|
155
|
+
* The panel head's filter control — the frame's `filter the rail to these`.
|
|
156
|
+
*
|
|
157
|
+
* IT LIVES HERE NOW RATHER THAN IN THE HEADER. §17d draws it in the panel
|
|
158
|
+
* head, and `RULINGS.md` §3 gives the header count one job instead: anchoring
|
|
159
|
+
* this overlay. One control, one meaning, each.
|
|
160
|
+
*/
|
|
161
|
+
readonly filter: string;
|
|
162
|
+
/**
|
|
163
|
+
* §17d's REMEDIES, one label per control the frame draws.
|
|
164
|
+
*
|
|
165
|
+
* `RULINGS.md` §3 makes these required and forbids auto-fix in the same
|
|
166
|
+
* breath: *"Every button it draws costs one deliberate human keystroke."*
|
|
167
|
+
* None of them writes. Each selects the finding's subject and hands the work
|
|
168
|
+
* to the inspector, which already owns every edit affordance — so the label
|
|
169
|
+
* names the reader's INTENT and the inspector performs it.
|
|
170
|
+
*
|
|
171
|
+
* ONE RECORD, NOT ONE PER CLASS, because the frame gives each class its own
|
|
172
|
+
* wording rather than a shared verb: a `blocked-by` is removed, a
|
|
173
|
+
* `duplicate-of` is repointed, and a cycle is neither.
|
|
174
|
+
*/
|
|
175
|
+
readonly remedies: AuditRemedyWords;
|
|
176
|
+
/**
|
|
177
|
+
* The refused block's own heading — the frame's `Encoding refused`.
|
|
178
|
+
*
|
|
179
|
+
* THE LAST THREE BELONG TO `./refused.ts`, AND THEY LIVE HERE ANYWAY. §17d is
|
|
180
|
+
* one section and its words are one record: a host wiring the audit supplies
|
|
181
|
+
* `AuditWords` once, and splitting a second record off for the fourth class
|
|
182
|
+
* would let a host supply half a section. `classes` and `titles` are already
|
|
183
|
+
* total over `AuditClass`, which includes `encoding-refused` — so the words
|
|
184
|
+
* for that class were never going to sit anywhere else.
|
|
185
|
+
*/
|
|
186
|
+
readonly refusedHeading: string;
|
|
187
|
+
/** The outward link's label. The package draws the `↗`. */
|
|
188
|
+
readonly refusedOpen: string;
|
|
189
|
+
/** The reveal control's label — the frame's `Rewrite from editor`. */
|
|
190
|
+
readonly refusedRewrite: string;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* The four remedy labels §17d draws, and no others.
|
|
194
|
+
*
|
|
195
|
+
* NOT TOTAL OVER `AuditClass`, unlike `classes` and `titles`. The frame gives
|
|
196
|
+
* `cycle` one remedy, `stale-blocker` two, `dead-duplicate-ref` one and
|
|
197
|
+
* `encoding-refused` none — the refusal's own controls are `refusedOpen` and
|
|
198
|
+
* `refusedRewrite`, which already exist. A record keyed by class would make a
|
|
199
|
+
* host supply a label for a button nothing draws.
|
|
200
|
+
*/
|
|
201
|
+
export interface AuditRemedyWords {
|
|
202
|
+
/** The frame's `pick one edge to drop`, on a cycle. */
|
|
203
|
+
readonly pickEdge: string;
|
|
204
|
+
/** The frame's `Remove the edge`, on a stale blocker. */
|
|
205
|
+
readonly removeEdge: string;
|
|
206
|
+
/**
|
|
207
|
+
* The frame's `Keep as history`, on a stale blocker and nowhere else.
|
|
208
|
+
*
|
|
209
|
+
* Drawn from {@link AuditFinding.keepAsHistory}, which the class table
|
|
210
|
+
* already sets — `true` for `stale-blocker` alone. The field predates this
|
|
211
|
+
* control and was waiting for it.
|
|
212
|
+
*/
|
|
213
|
+
readonly keepAsHistory: string;
|
|
214
|
+
/** The frame's `Repoint or clear`, on a dead duplicate ref. */
|
|
215
|
+
readonly repoint: string;
|
|
216
|
+
}
|
|
217
|
+
export interface AuditPanelOptions {
|
|
218
|
+
readonly words: AuditWords;
|
|
219
|
+
/**
|
|
220
|
+
* The edge ids the drawn surface actually holds.
|
|
221
|
+
*
|
|
222
|
+
* THE SAME ARGUMENT `known` MAKES ONE FIELD UP, and it needs its own field
|
|
223
|
+
* for the reason a review round proved: the endpoints do not answer it. Two
|
|
224
|
+
* issues can both be on the drawn page while the edge between them is NOT —
|
|
225
|
+
* `mount.ts` deliberately preserves such omissions — and a remedy gated on
|
|
226
|
+
* the ends alone then publishes `select-edge` for an edge the host cannot
|
|
227
|
+
* resolve, leaving the reader with a button that clears their selection and
|
|
228
|
+
* opens an inspector with no subject.
|
|
229
|
+
*
|
|
230
|
+
* That was the first fix's mistake: "both ends drawn" is a PROXY for "the
|
|
231
|
+
* edge is drawn", and this is the thing itself.
|
|
232
|
+
*/
|
|
233
|
+
readonly edges: ReadonlySet<string>;
|
|
234
|
+
/**
|
|
235
|
+
* Whether the rail is currently narrowed to these findings.
|
|
236
|
+
*
|
|
237
|
+
* The panel DRAWS the state and never holds it: §2's ruling makes the filter
|
|
238
|
+
* a thing the reader can see is on and clear in one click, and the host owns
|
|
239
|
+
* which rows the rail is showing.
|
|
240
|
+
*/
|
|
241
|
+
readonly filtered?: boolean | undefined;
|
|
242
|
+
/**
|
|
243
|
+
* The keys the surface being drawn actually carries, so navigation can only
|
|
244
|
+
* name somewhere the reader can arrive.
|
|
245
|
+
*
|
|
246
|
+
* REQUIRED, AND IT IS THE CALLER'S ANSWER RATHER THAN ONE DERIVED HERE. The
|
|
247
|
+
* audit reads a document that is not always the document on screen: a host
|
|
248
|
+
* audits the whole repository it holds and renders a page of it — the demo's
|
|
249
|
+
* own projection audits `held` while drawing `landed`, which can be empty —
|
|
250
|
+
* so a ref present in `AuditInput.document` may still have no row to reach.
|
|
251
|
+
* The overlay cannot see that difference, and neither can this module.
|
|
252
|
+
*
|
|
253
|
+
* THE SAME SET AND THE SAME RULE `holdRow` ALREADY USES. A hold's subject
|
|
254
|
+
* control is withheld for "a subject the inspector could not resolve", which
|
|
255
|
+
* is this question asked one panel over; `renderWorkspace` computes the set
|
|
256
|
+
* once, off the NORMALIZED document it draws, and hands it to both.
|
|
257
|
+
*/
|
|
258
|
+
readonly known: ReadonlySet<string>;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* The panel, or `null` when there is nothing to list.
|
|
262
|
+
*
|
|
263
|
+
* `null` RATHER THAN AN EMPTY PANEL, and it is not the same decision as the
|
|
264
|
+
* header count's. The count is drawn at zero on purpose — `./surface.ts`:
|
|
265
|
+
* *"a control that appears when there is bad news is a control the eye has to
|
|
266
|
+
* re-find"* — because it IS the control. A list of nothing is not a control; it
|
|
267
|
+
* is a heading over an empty region in a column whose space belongs to the
|
|
268
|
+
* selection. So the ambient half stays put at zero and the list goes away.
|
|
269
|
+
*
|
|
270
|
+
* IT IS THE LISTED FINDINGS THAT DECIDE, NOT `overlay.findings`. A document
|
|
271
|
+
* whose only findings are encoding refusals has a non-zero count, a bar on
|
|
272
|
+
* every affected row, and NOTHING for this panel to list — so it draws the
|
|
273
|
+
* refused block and no panel at all. Testing the overlay instead would have
|
|
274
|
+
* drawn a panel whose head said `2` above an empty list.
|
|
275
|
+
*/
|
|
276
|
+
export declare function renderAuditPanel(overlay: AuditOverlay, options: AuditPanelOptions): ElementSpec | null;
|
|
277
|
+
//# sourceMappingURL=panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/audit/panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwHG;AAGH,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,oBAAoB,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,eAAe,CAAC;AAEzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,uBAAuB,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC;;;;;;;;;OASG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACrC;AAuQD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CAgGpB"}
|