mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-21 10:36:27 +03:00
Add detector.ignoreSelectors: one component-level opt-out instead of an attribute per instance
An author who wants a rule off for one component has had two choices: put `data-impeccable-ignore` on every instance, or silence the rule (or the file) for the whole project. On impeccable-site #34 that meant eleven attributes on eleven copies of the same 10px label for `undersized-ui-text`, 25 opt-out attributes in all. The count is the problem: the markup carries noise, and the reviewer never sees how much was waived. `detector.ignoreSelectors` is the declared twin of that attribute. One entry, `{ rule, selector }`, waives the rule for every element the selector matches and for that element's subtree, the same waiver the attribute grants the element carrying it: impeccable ignores add-selector undersized-ui-text ".ks-tag" \ --reason "10px mono index labels, confirmed" The waiver is never silent. The engines stamp a waived finding with `ignoredBy: "<selector>"` instead of dropping it; the config layer drops and counts, and every scan prints one line per entry on stderr, in `--json` runs too, so stdout stays the findings array: 3 undersized-ui-text hits ignored by detector.ignoreSelectors on .ks-tag. Where it applies: the browser engine (`BrowserConfig.ignoreSelectors`, also readable from `window.__IMPECCABLE_CONFIG__`), the static HTML engine (`DetectHtmlOptions.ignore_selectors`, and the `ignoreSelectors` option of the wasm `detect_html_source_json` export), the detect CLI, and the design hook. The text engine has no DOM and ignores the key. Entries can be scoped with `files` globs like `ignoreValues`; `--no-config` disables them; `doctor` validates their rule ids alongside `ignoreRules`. Nothing changes for a project without the key: the engines stamp nothing, the CLI prints nothing, the config writer does not add an empty `ignoreSelectors`, and the per-instance attribute keeps working exactly as before. Coverage: `crates/html/tests/selector_ignores.rs` (component, subtree, wrong-rule, `*`, attribute parity), driver tests over the fake DOM, `crates/detect` config tests (normalize, merge, per-target narrowing, the tally), and oracle cases `detect-selector-ignore-*` / `ignores-selector-*` over a new workspace. The eight re-recorded context/doctor goldens differ only in the recognized-detector-keys sentence, which now lists the new key. Assisted-by: Claude Code Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LQBUunp8QttxZqihybNmtL
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
cb56ed6c19
commit
1d214f1e48
+10
-2
@@ -204,11 +204,19 @@ over the file-scanning engines, JSON in and JSON out:
|
||||
- `detect_text_json(content, file_path, options_json)`
|
||||
- `detect_html_source_json(html, file_path, options_json)`
|
||||
|
||||
Both take `{ inlineIgnores?: boolean, designSystem?: { frontmatter?, sidecar? } }`
|
||||
Both take
|
||||
`{ inlineIgnores?: boolean, designSystem?: { frontmatter?, sidecar? }, ignoreSelectors?: [{ rule, selector }] }`
|
||||
and return the findings array `impeccable detect --json` prints, same keys and
|
||||
same order. `designSystem` carries the DESIGN.md inputs rather than a
|
||||
normalized object, because the JS API's normalized form used `Set`s and
|
||||
`Map`s that JSON cannot hold. Unparseable options fall back to the defaults.
|
||||
`Map`s that JSON cannot hold. `ignoreSelectors` is the project's
|
||||
component-level opt-out (`detector.ignoreSelectors`), already narrowed by the
|
||||
host to the entries whose `files` globs cover this file: a finding on an
|
||||
element the selector matches, or on a descendant of one, comes back carrying
|
||||
`ignoredBy: "<selector>"` rather than being dropped, so the host can count
|
||||
what an author's opt-out silenced and say so. Only the HTML engine matches
|
||||
selectors; the text engine has no DOM and ignores the key. Unparseable
|
||||
options fall back to the defaults.
|
||||
`antipatterns_json()` lists the built-ins followed by any pack's rows, and
|
||||
`immediate_tier_rules_json()` returns the design hook's immediate tier (the
|
||||
rule ids worth fixing at the edit site). That list lives in
|
||||
|
||||
Reference in New Issue
Block a user