@issuegraph/editor 0.10.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 +38 -7
- package/dist/a11y/baseline.d.ts.map +1 -1
- package/dist/a11y/baseline.js +4 -0
- package/dist/a11y/baseline.js.map +1 -1
- 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 +428 -0
- 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 +19 -0
- package/dist/create/draft.d.ts.map +1 -1
- package/dist/create/draft.js +21 -0
- package/dist/create/draft.js.map +1 -1
- package/dist/create/keys.d.ts +68 -8
- package/dist/create/keys.d.ts.map +1 -1
- package/dist/create/keys.js +43 -5
- package/dist/create/keys.js.map +1 -1
- package/dist/index.d.ts +38 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -13
- 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 +22 -6
- 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 +38 -7
- package/dist/overlay/styles.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 +119 -8
- 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 +197 -27
- 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/host.d.ts +83 -1
- package/dist/workspace/host.d.ts.map +1 -1
- package/dist/workspace/host.js +197 -4
- package/dist/workspace/host.js.map +1 -1
- package/dist/workspace/inspector.d.ts +33 -7
- package/dist/workspace/inspector.d.ts.map +1 -1
- package/dist/workspace/inspector.js +15 -0
- package/dist/workspace/inspector.js.map +1 -1
- package/dist/workspace/mount.d.ts +23 -1
- package/dist/workspace/mount.d.ts.map +1 -1
- package/dist/workspace/mount.js +500 -17
- 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/render.d.ts +379 -3
- package/dist/workspace/render.d.ts.map +1 -1
- package/dist/workspace/render.js +893 -133
- 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 +868 -18
- package/dist/workspace/styles.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -109,9 +109,28 @@ auditRowAttributes(overlay, ref); // {} for a clean row; the severity mark fo
|
|
|
109
109
|
|
|
110
110
|
**"Long-closed" is not available here.** A document carries no timestamp, so every closed blocker is reported — the safe direction for a finding whose whole severity is `misleading`, and one a host can narrow with a date it does have.
|
|
111
111
|
|
|
112
|
-
**
|
|
112
|
+
**Three classes are a list; the fourth is its own block.** `renderAuditPanel` draws the cycle, the stale blocker and the dead duplicate ref as cards, because each says something about a relationship that exists. `renderEncodingRefusedBlock` draws the refusal separately — SPEC surfaces it *"on the issue itself, because until it parses the issue has no edges at all and would otherwise look simply unencoded"* — with the ref, the reader's diagnostic, the offending source line, and two controls.
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
```ts
|
|
115
|
+
import { renderAuditPanel, renderEncodingRefusedBlock } from '@issuegraph/editor';
|
|
116
|
+
|
|
117
|
+
renderAuditPanel(overlay, { words, known, edges }); // the three relationship findings
|
|
118
|
+
renderEncodingRefusedBlock(encodingRefused, { words, known, issueUrl });
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`known` is the issue refs your surface draws and `edges` the edge ids it draws — both answered by you, not derived here, because the audit reads a document that is not always the one on screen. They gate the controls: a remedy that selects an edge your surface does not hold would clear the reader's selection and open nothing, so it is withheld. The finding is still drawn; it is the control that is withheld, never the information.
|
|
122
|
+
|
|
123
|
+
Both return `null` when they have nothing to draw. `renderWorkspace` composes them for you into §17d's overlay over the **canvas** — anchored to the header count, dismissed on Escape, and never over the rail, because judging a finding is largely a question of what it would do to the order.
|
|
124
|
+
|
|
125
|
+
**Two counts, and they are different numbers.** `renderAuditHeader`'s count is every finding — it is the persistent control, it sits in the workspace chrome beside both surfaces, and a reader works through all four classes. The count in the *panel's own head* is that panel's own cards, because it is enclosed by the list it counts.
|
|
126
|
+
|
|
127
|
+
**`issueUrl` is yours to answer, and its answer is checked.** The package holds an opaque reference and no repository identity, so the outward link is drawn only for a URL you resolve — and only if it passes `@issuegraph/viewer`'s `isLinkable`. An `href` runs in your origin, so `javascript:` and `data:` are script sinks that escaping does not close; absent, `null` and a refused scheme all draw no link. `Rewrite from editor` publishes `reveal-issue`, never `select-issue`: the latter is a pointer that completes a relationship draft, so it could WRITE from a surface whose rule is that it never writes.
|
|
128
|
+
|
|
129
|
+
**Ambient, and the list of things it is not.** A persistent header count that never moves and never animates, a `--ig-stroke` gold left-bar on affected rail rows, and a filter — not a mode, because *"a mode you must enter is a mode you forget"*. No modals, toasts, red banners, badge animation, or **auto-fix**. That prohibition is asserted over the emitted markup and the stylesheet bytes rather than stated here alone.
|
|
130
|
+
|
|
131
|
+
**Remedies are required, and auto-fix is still forbidden.** An earlier revision of this file said the surface *"offers navigation and never a remedy"*, and Design ruled the other way: `17d` draws `Remove the edge`, `Keep as history`, `Repoint or clear` and `pick one edge to drop`, and only AUTO-fix is banned. The two are reconciled by the mechanism — **not one remedy writes.** Each publishes a selection and hands the work to the inspector, which already owns every edit affordance, so every button costs one deliberate human keystroke and the judgment stays with the owner.
|
|
132
|
+
|
|
133
|
+
**The bar is CSS on this package's own attribute, not an element drawn into a viewer row.** The reason is **ownership of the row**, not escaping: the rows belong to `@issuegraph/viewer`, and rewriting a row's `class` from out here reaches past the surface layer 2 composes through. (Layer 1's `renderMarkup` *is* public and five leaves here import it — an earlier revision of this paragraph said otherwise, and `audit/surface.ts` records the same correction.) `auditRowAttributes` answers what a row carries, `auditStylesheet` draws the bar from it, and the exchange is data.
|
|
115
134
|
|
|
116
135
|
## The three equivalent create paths
|
|
117
136
|
|
|
@@ -154,7 +173,8 @@ element.addEventListener('keydown', (event) => {
|
|
|
154
173
|
selectedEdge,
|
|
155
174
|
// Which of the create flow's own interactions is the keyboard in?
|
|
156
175
|
// Only the shell can see this.
|
|
157
|
-
|
|
176
|
+
// 'canvas' | 'kind-chooser' | 'target-search' | 'add-control' | 'elsewhere'
|
|
177
|
+
interaction: activeInteraction(),
|
|
158
178
|
});
|
|
159
179
|
if (intent.kind === 'none') return; // someone else's key — let it through
|
|
160
180
|
event.preventDefault();
|
|
@@ -164,22 +184,31 @@ element.addEventListener('keydown', (event) => {
|
|
|
164
184
|
|
|
165
185
|
**It asks about *our* interaction, not about who else might own the key** — and that is the design decision worth reading, because it replaced the obvious one. Four review rounds each found a different owner the map had failed to anticipate: the platform's `Cmd+R`, the target search's digits, an input method's `⏎`, then an unrelated editable control's `Escape`. Every fix was correct and every one invited the next, because they answered an unanswerable question. *Who else might own this press?* is an inventory of the **host's** widgets — unbounded from in here, and one entry longer every time a host grows a control.
|
|
166
186
|
|
|
167
|
-
So `CreateInteraction` enumerates **this design's own flow
|
|
187
|
+
So `CreateInteraction` enumerates **this design's own flow** — one state per step of it — and the host says which one it is in:
|
|
168
188
|
|
|
169
189
|
| state | what reaches the map |
|
|
170
190
|
|---|---|
|
|
171
191
|
| `canvas` | every binding |
|
|
172
192
|
| `kind-chooser` | `R`, the digits `1`–`5`, and `Escape` — **not** `⏎` |
|
|
173
193
|
| `target-search` | only `⏎` and `Escape` |
|
|
194
|
+
| `add-control` | only `R` |
|
|
174
195
|
| `elsewhere` | nothing |
|
|
175
196
|
|
|
176
|
-
`elsewhere` is what closes the set: it is *everything that is not one of our own steps* — an inline title, a filter, a modal, a control this package has never heard of.
|
|
197
|
+
`elsewhere` is what closes the set: it is *everything that is not one of our own steps* — an inline title, a filter, a modal, a control this package has never heard of. Another widget adds no code here, and `Escape` is surrendered along with the rest, because that control needs `Escape` to cancel its own edit.
|
|
198
|
+
|
|
199
|
+
**The set is closed by the flow, not by a count.** It has grown twice, both times because a step of *this* flow was missing from it rather than because the closure argument failed — see `kind-chooser` and `add-control` below. What has never moved is the invariant that matters: no state here names a host's widget.
|
|
177
200
|
|
|
178
201
|
**`kind-chooser` is a fact about the DRAFT, not about focus** — a source gathered and no kind yet, with a focused text box excluded so a search box keeps its own digits. It was folded into `canvas` until [#152](https://github.com/autnmy/issuegraph/issues/152), on the assumption that focus stays on the row a draft was begun from; activating the add control *replaces* that control with the kind list, so focus lands wherever the host's restore puts it, and where a filter has emptied the list there is no row to land on at all. `canvas` answers only for a focused row, so the chooser's own digits were handed back at the one step whose entire purpose is to be answered with a digit.
|
|
179
202
|
|
|
180
203
|
`⏎` is withheld there deliberately, and it is the reason this is a state rather than an alias for `canvas`: `commit-target` fires on `match`, a target query survives a restarted draft, and a `⏎` at the kind step would commit a target before any kind was chosen — while also being taken from the kind button under focus.
|
|
181
204
|
|
|
182
|
-
|
|
205
|
+
**`add-control` is the SAME shape, one control over.** §17b gives the create flow three equivalent entries — canvas, keyboard, and the inspector's `+ add` — and the third one's control was `elsewhere`, so `R` was inert at exactly the position that *draws* `R` as its hint ([#173](https://github.com/autnmy/issuegraph/issues/173)). **A host must report this state for that to work**: report `elsewhere` while your add control has focus and `R` stays inert there, whatever version you are on.
|
|
206
|
+
|
|
207
|
+
The test that decides whether a control gets its own state — and stops the list growing on taste — is **does this control draw a key the map reads**. The kind chooser passes it because its digits are `KIND_KEYS`; the add control passes it because it draws `RELATE_KEY` itself. A control that tells the reader to press a key cannot be a control that key is refused by. A filter, a remove button, and every control that draws no key stay `elsewhere`.
|
|
208
|
+
|
|
209
|
+
It admits **`R` and nothing else**, which follows from the same sentence rather than from caution: `⌫` there would delete a selected edge the reader is not looking at, and a digit would fill a kind slot on a draft that has not begun. And unlike `kind-chooser` it *is* a fact about focus — legitimately, because at the begin step there is no draft yet, so the missing fact is the **subject** to begin from, which the control publishes on `data-ig-target`. `mountWorkspace` answers both states itself and asks the draft first, so once a draft begins `kind-chooser` takes over.
|
|
210
|
+
|
|
211
|
+
Which bindings survive `kind-chooser`, `target-search` and `add-control` is **data on the binding table**, so no call site decides it and a sixth binding is a compile error until the table answers. `⏎` and `Escape` reach it because the search box is focused at exactly the moment `⏎` must commit the target — the middle of `R → digit → search → ⏎`. Its printable keys do not: most issue references carry a digit, so a map that claimed `1`–`5` there would eat nearly every query, and `⌫` deletes a *character* rather than the reader's selected edge.
|
|
183
212
|
|
|
184
213
|
`interaction` is **required, not optional**. Every default is wrong for some host, and the plausible one — assume the canvas — is the one that steals keystrokes.
|
|
185
214
|
|
|
@@ -206,6 +235,8 @@ The assembly leaf: the rail on the left, the canvas in the centre, the inspector
|
|
|
206
235
|
|
|
207
236
|
**Positions are fixed, and that is §17f rather than a layout preference.** The rail answers *"what gets worked next"* for the whole backlog and must never refuse; the canvas answers *"what surrounds this issue"* and refuses above its budget. Assembling them must not average the two — so the grid gives each zone its own track, and a large document grows the canvas's refusal instead of squeezing the rail out.
|
|
208
237
|
|
|
238
|
+
**The canvas zone leads with a caption, and only where it is true.** Refusing loudly is the easy half of §17f; the quiet decline is the `direct` tier, where the ladder narrows to one component, draws it successfully, and would otherwise say nothing about the rest — leaving a canvas of 6 issues out of 312 indistinguishable from a backlog that has 6. So the row states the focused key and the ratio there, and nowhere else: above the budget there is no canvas to describe and the refusal already carries its own count. Its words are the host's (`WorkspaceWords.canvas`), and the `edit mode` pill beside them is separately optional, because markup served without `mountWorkspace` is not editable and must not claim to be.
|
|
239
|
+
|
|
209
240
|
**The rail is virtualised, which is what lets it stay complete.** Those read as opposites and are not: the MODEL holds every slot and `addressOf` answers for every rank in the order, while the WINDOW bounds only how many rows are drawn. A reader looking at rows 1–50 of 312 can still ask what is at rank 287 and get an answer. Windowing is therefore a rail *requirement* — the alternative, a rail that paginates, has stopped answering its question.
|
|
210
241
|
|
|
211
242
|
The window is an **offset**, not a rank, because a held slot has `rank: null` and ranks are not a coordinate you can slice on. Every out-of-range value is clamped rather than refused: this reads a scroll position, and taking the rail down over a rounding error is the one thing it may not do.
|
|
@@ -228,7 +259,7 @@ The selection reaches the **canvas** too, through two additive options on `Scale
|
|
|
228
259
|
|
|
229
260
|
**Originating one is layer 1's half.** Every edge mark the graph draws — the stroke, its terminal, and a `together-with` connector — carries `edgeIdentity(...)` on `data-ig-group`, so `onSelect` reports an edge identity that `findEdge` resolves and a host turns into `select-edge`. Before that, four of the five relationships could not be pointed at on the canvas at all.
|
|
230
261
|
|
|
231
|
-
**The audit is ambient.** A persistent count in the header and a 2px left-bar on affected rail rows — no modal, no auto-fix, no animation, and a filter rather than a mode. The bar is applied by walking the rail's `ElementSpec` tree and adding `data-ig-audit` to the keyed rows, never by splicing the rendered string: `scene.root` is data and `KEY_ATTRIBUTE` is published, so this is a pure transform over a public value and no attribute in this package is escaped by anything but `renderMarkup`.
|
|
262
|
+
**The audit is ambient.** A persistent count in the header and a 2px left-bar on affected rail rows — no modal, no auto-fix, no animation, and a filter rather than a mode. The findings themselves live in a transient overlay that count opens, over the canvas and never over the rail. The bar is applied by walking the rail's `ElementSpec` tree and adding `data-ig-audit` to the keyed rows, never by splicing the rendered string: `scene.root` is data and `KEY_ATTRIBUTE` is published, so this is a pure transform over a public value and no attribute in this package is escaped by anything but `renderMarkup`.
|
|
232
263
|
|
|
233
264
|
`auditFiltered` is the toggle's state, and the workspace holds it: the header draws a `button` with `aria-pressed`, so without somewhere to keep that the control could never complete the action it advertised. The filter narrows the rail **before** the window, or it would narrow only the rows the window had already reached and read as doing nothing on a long backlog. It narrows the rail and nothing else — §17a gives the audit a filter for focus, and the canvas answers a different question.
|
|
234
265
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/a11y/baseline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AAEH,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,gDAAgD;AAChD,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IAClD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhG;;;;;;;;;GASG;AACH,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,cAAc,GAAG,MAAM,CAAC;AAEtD,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjD;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/a11y/baseline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AAEH,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,gDAAgD;AAChD,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IAClD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhG;;;;;;;;;GASG;AACH,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,cAAc,GAAG,MAAM,CAAC;AAEtD,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjD;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAQ9C,CAAC;AA6QH;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,YAAY,EAAE,CAqD5E"}
|
package/dist/a11y/baseline.js
CHANGED
|
@@ -87,6 +87,10 @@ export const CONTROL_ATTRIBUTES = Object.freeze([
|
|
|
87
87
|
'data-ig-command',
|
|
88
88
|
'data-ig-answer',
|
|
89
89
|
'data-ig-audit-filter',
|
|
90
|
+
// §17d's header count, which opens the overlay. A SEPARATE CHANNEL from the
|
|
91
|
+
// filter beside it because it is a separate control now — `RULINGS.md` §3
|
|
92
|
+
// split one button that carried two meanings into two that carry one each.
|
|
93
|
+
'data-ig-audit-panel',
|
|
90
94
|
]);
|
|
91
95
|
/**
|
|
92
96
|
* Implicit roles, for the tags this package actually renders.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/a11y/baseline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AAyFH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAsB,MAAM,CAAC,MAAM,CAAC;IACjE,iBAAiB;IACjB,gBAAgB;IAChB,sBAAsB;
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/a11y/baseline.ts"],"names":[],"mappings":"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"}
|
package/dist/audit/findings.d.ts
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
*
|
|
27
27
|
* @see https://github.com/autnmy/issuegraph/blob/main/SPEC.md
|
|
28
28
|
*/
|
|
29
|
-
import type { GraphDocument, IssueRef } from '@issuegraph/store';
|
|
29
|
+
import type { EdgeId, GraphDocument, IssueRef } from '@issuegraph/store';
|
|
30
30
|
/**
|
|
31
31
|
* The four classes, in the order §17d states them — which is also the order
|
|
32
32
|
* findings are reported in, so a list is stable between runs.
|
|
@@ -117,6 +117,23 @@ export declare const AUDIT_CLASS_SPECS: Readonly<{
|
|
|
117
117
|
* four-row builder table, and it still could not reach a value deserialized
|
|
118
118
|
* from a wire. Removing the boundary was cheaper than either.
|
|
119
119
|
*/
|
|
120
|
+
/**
|
|
121
|
+
* The edge a finding's remedy acts on, with the ends it joins.
|
|
122
|
+
*
|
|
123
|
+
* THE ENDS ARE CARRIED, NOT JUST THE ID, and that is what lets `./panel.ts`
|
|
124
|
+
* withhold a remedy the reader could not complete. A remedy publishes
|
|
125
|
+
* `select-edge`, which the host resolves against the DRAWN document — and the
|
|
126
|
+
* audit reads a document that is not always the one on screen, so an edge
|
|
127
|
+
* whose ends are off the page selects nothing and the reader presses a button
|
|
128
|
+
* that silently does nothing. `known` answers for issues; these are the issues
|
|
129
|
+
* to ask about. The id alone would have to be parsed to recover them, and its
|
|
130
|
+
* spelling is `@issuegraph/core`'s business rather than this module's.
|
|
131
|
+
*/
|
|
132
|
+
export interface AuditEdge {
|
|
133
|
+
readonly id: EdgeId;
|
|
134
|
+
readonly from: IssueRef;
|
|
135
|
+
readonly to: IssueRef;
|
|
136
|
+
}
|
|
120
137
|
export interface AuditFinding {
|
|
121
138
|
readonly kind: AuditClass;
|
|
122
139
|
readonly severity: AuditSeverity;
|
|
@@ -136,16 +153,79 @@ export interface AuditFinding {
|
|
|
136
153
|
readonly members: readonly IssueRef[];
|
|
137
154
|
/** What the reader can be told, in one sentence. Never parsed, never a code. */
|
|
138
155
|
readonly detail: string;
|
|
156
|
+
/**
|
|
157
|
+
* A cycle's ordered `blocked-by` walk — `a -> b` reads "a waits on b" — with
|
|
158
|
+
* each member named ONCE and the return edge to the head implied.
|
|
159
|
+
*
|
|
160
|
+
* Only ever on a `cycle` finding — this module builds it nowhere else, and
|
|
161
|
+
* `./panel.ts` gates the line it draws on the class as well as on the field,
|
|
162
|
+
* so a host that hand-builds a finding cannot put a walk on a stale-blocker
|
|
163
|
+
* card. Absent whenever §6.6 declines to name a walk for the component, or the
|
|
164
|
+
* host wired no reader answer for it. See {@link AuditGraph.cycleWalk}.
|
|
165
|
+
*
|
|
166
|
+
* NOT FOLDED INTO {@link AuditFinding.members}, which is documented one field
|
|
167
|
+
* up as a sorted SET: sorting is exactly what destroys the ORDER, and the
|
|
168
|
+
* order is the only thing a walk carries that `members` does not. (A
|
|
169
|
+
* conforming walk names no ref twice either, so the set's other rule is not
|
|
170
|
+
* what keeps them apart.)
|
|
171
|
+
*
|
|
172
|
+
* NOT FOLDED INTO `detail` either, which is left byte-identical by this
|
|
173
|
+
* field's arrival. `./panel.ts` records why the card draws the walk as its own
|
|
174
|
+
* line rather than composing it into the sentence.
|
|
175
|
+
*/
|
|
176
|
+
readonly walk?: readonly IssueRef[] | undefined;
|
|
177
|
+
/**
|
|
178
|
+
* The ONE edge this finding is about, when it is about an edge at all.
|
|
179
|
+
*
|
|
180
|
+
* §3 of `RULINGS.md` says a remedy *"selects the finding's issue or edge and
|
|
181
|
+
* hands the work to the inspector"*. `members` cannot answer that: it is
|
|
182
|
+
* documented one field up as a SORTED SET, and sorting is exactly what
|
|
183
|
+
* destroys the direction — `['#201', '#533']` cannot say which end declared
|
|
184
|
+
* the `blocked-by`. The edge is in hand where the finding is built, so it is
|
|
185
|
+
* carried rather than reconstructed.
|
|
186
|
+
*
|
|
187
|
+
* PRESENT ON THE TWO EDGE CLASSES ONLY. A cycle is about a COMPONENT and
|
|
188
|
+
* names no single edge — picking one here would be this module choosing which
|
|
189
|
+
* edge a reader should drop, which is the judgment §17d keeps with the owner.
|
|
190
|
+
* An encoding refusal is about an issue whose edges were never read, so there
|
|
191
|
+
* is no edge to name.
|
|
192
|
+
*/
|
|
193
|
+
readonly edge?: AuditEdge | undefined;
|
|
139
194
|
}
|
|
140
195
|
/**
|
|
141
196
|
* An issue whose declaration the reader refused.
|
|
142
197
|
*
|
|
143
198
|
* The `diagnostic` is the reader's own words when the host has them — this
|
|
144
199
|
* package never produces one, because it never sees a body.
|
|
200
|
+
*
|
|
201
|
+
* BOTH OPTIONAL FIELDS ARE FACTS ABOUT THE RAW BODY, which is the whole reason
|
|
202
|
+
* they live HERE rather than on {@link AuditFinding}. §17d draws the refusal as
|
|
203
|
+
* its own block — the ref, the reader's diagnostic, and the source line the
|
|
204
|
+
* reader stopped on — and none of those is reconstructible from a finding:
|
|
205
|
+
* `detail` is documented as "what the reader can be told, in one sentence.
|
|
206
|
+
* Never parsed, never a code", so recovering a source line out of it would make
|
|
207
|
+
* a sentence a wire format.
|
|
208
|
+
*
|
|
209
|
+
* AND A FINDING IS ONE SHAPE OVER FOUR CLASSES. Three of them can never carry
|
|
210
|
+
* either field, so declaring them there would render an absence as a value in
|
|
211
|
+
* the one module whose fourth class exists to refuse exactly that — while
|
|
212
|
+
* re-opening the caller-supplied surface {@link AuditFinding} records six review
|
|
213
|
+
* rounds closing. `./refused.ts` reads these refusals directly, and the audit
|
|
214
|
+
* still turns each one into a finding for the count and the rail's bar.
|
|
145
215
|
*/
|
|
146
216
|
export interface EncodingRefusal {
|
|
147
217
|
readonly ref: IssueRef;
|
|
148
218
|
readonly diagnostic?: string | undefined;
|
|
219
|
+
/**
|
|
220
|
+
* The line of the issue's own body the reader stopped on — the frame's
|
|
221
|
+
* `blocked-by: [231, 234`, drawn muted and in mono under the diagnostic.
|
|
222
|
+
*
|
|
223
|
+
* RAW BODY TEXT, so it can carry anything a body can, markup included.
|
|
224
|
+
* Nothing in this package writes a tag around it: `./refused.ts` builds an
|
|
225
|
+
* {@link ElementSpec} and the viewer's `renderMarkup` owns the escaping,
|
|
226
|
+
* which is the same rule `./panel.ts` follows for `detail`.
|
|
227
|
+
*/
|
|
228
|
+
readonly sourceLine?: string | undefined;
|
|
149
229
|
}
|
|
150
230
|
/**
|
|
151
231
|
* The two answers the audit needs from a reader, and does not compute.
|
|
@@ -197,6 +277,32 @@ export interface AuditGraph {
|
|
|
197
277
|
* as naming its canonical.
|
|
198
278
|
*/
|
|
199
279
|
readonly duplicateCanonical: (ref: IssueRef) => IssueRef | null;
|
|
280
|
+
/**
|
|
281
|
+
* `Model.cycleWalk` — the ordered `blocked-by` walk of the stuck group a ref
|
|
282
|
+
* belongs to, or `null` where §6.6 declines to name one.
|
|
283
|
+
*
|
|
284
|
+
* A FUNCTION, the same shape as `duplicateCanonical` one field up, and for the
|
|
285
|
+
* same reason: the host owns the translation between a store reference and a
|
|
286
|
+
* model key, so the question is asked in the STORE's own spelling. An array
|
|
287
|
+
* running alongside `cycles` would have been the alternative and it does not
|
|
288
|
+
* survive this file — `cycleFindings` below opens by FILTERING components out,
|
|
289
|
+
* which shifts every index after the first drop — let alone a host that cannot
|
|
290
|
+
* translate one component and drops it.
|
|
291
|
+
*
|
|
292
|
+
* OPTIONAL, UNLIKE THE TWO FIELDS ABOVE, and the ground for the difference is
|
|
293
|
+
* SPEC's rather than a judgement about severity. §6.6 says a reader that omits
|
|
294
|
+
* the walk is still conforming, so this port has to be able to express one.
|
|
295
|
+
* The paragraph above refuses a thinner AUDIT read as a complete one; an
|
|
296
|
+
* absent walk removes no finding, changes no count and weakens no class — the
|
|
297
|
+
* card simply draws no arrow, which is what shipped before this field existed.
|
|
298
|
+
*
|
|
299
|
+
* WHAT ABSENCE CANNOT SAY, stated because it is a real shortfall rather than a
|
|
300
|
+
* detail. Not wired by the host, refused by §6.6, and answered `null` for a
|
|
301
|
+
* ref the reader does not hold are three different facts, and they arrive here
|
|
302
|
+
* as one. Nothing downstream can tell them apart, so nothing downstream can
|
|
303
|
+
* explain to a reader why one cycle card has an arrow and the next does not.
|
|
304
|
+
*/
|
|
305
|
+
readonly cycleWalk?: ((ref: IssueRef) => readonly IssueRef[] | null) | undefined;
|
|
200
306
|
}
|
|
201
307
|
export interface AuditInput {
|
|
202
308
|
readonly document: GraphDocument;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../src/audit/findings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../src/audit/findings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAc,MAAM,mBAAmB,CAAC;AAErF;;;GAGG;AACH,eAAO,MAAM,aAAa,+EAKf,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa;AACvB,8EAA8E;AAC5E,aAAa;AACf,0EAA0E;GACxE,WAAW;AACb,kEAAkE;GAChE,YAAY;AACd,qDAAqD;GACnD,kBAAkB,CAAC;AAEvB,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;EASoC,CAAC;AAGnE,+EAA+E;AAC/E;;;;;;;;;;;;;;;;GAgBG;AACH;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;IACtC,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,CAAC;IAChD;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,CAAC;IAClD;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,QAAQ,GAAG,IAAI,CAAC;IAChE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,SAAS,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CAClF;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,eAAe,EAAE,GAAG,SAAS,CAAC;CACnE;AAwfD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,YAAY,EAAE,CAYxE"}
|
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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"}
|