invalid-attr ルールの変更
このページでは invalid-attr ルールオプションの破壊的変更に加えて、デフォルト設定のままで新たに検出対象となった値について説明します。v4 では黙って受理されていたマークアップが、設定変更なしで v5 ではエラーとして現れる可能性があります。
変更一覧
| 変更内容 | 影響範囲 |
|---|---|
{ type: X } ラッパーの廃止 | { "value": { "type": "Int" } } を使用している設定 |
attrs オプションの削除 | 非推奨の attrs オプションを使用している設定 |
| オブジェクト形式の非推奨化 | allowAttrs / disallowAttrs でオブジェクト形式を使用している設定 |
| v5 で新たに検出される値 | 全プロジェクト — 既存マークアップに対して新しい検証が発火 |
{ type: X } ラッパーの廃止
属性値の { type: X } ラッパーオブジェクトが廃止されました。型文字列を直接指定してください。
変更前(v4):
{
"invalid-attr": {
"options": {
"allowAttrs": [
{
"name": "x-count",
"value": { "type": "Int" }
}
]
}
}
}
変更後(v5):
{
"invalid-attr": {
"options": {
"allowAttrs": [
{
"name": "x-count",
"value": "Int"
}
]
}
}
}
{ enum: [...] } と { pattern: "..." } の形式は従来通り動作します。廃止されたのは { type: X } ラッパーのみです。
attrs オプションの削除
attrs オプションは削除されました。v3.7.0 から非推奨でした。代わりに allowAttrs と disallowAttrs を使用してください。
変更前(v4):
{
"invalid-attr": {
"options": {
"attrs": {
"x-data": { "type": "Any" },
"x-count": { "type": "Int" },
"x-color": { "enum": ["red", "blue"] },
"x-id": { "pattern": "/^[a-z]+$/" },
"x-banned": { "disallowed": true }
}
}
}
}
変更後(v5):
{
"invalid-attr": {
"options": {
"allowAttrs": [
"x-data",
{ "name": "x-count", "value": "Int" },
{ "name": "x-color", "value": { "enum": ["red", "blue"] } },
{ "name": "x-id", "value": { "pattern": "/^[a-z]+$/" } }
],
"disallowAttrs": ["x-banned"]
}
}
}
主な違い:
- 許可する属性は
allowAttrsに配列で指定 "disallowed": trueだった属性はdisallowAttrsに移動- 値の制約がない属性は文字列で指定可能(例:
"x-data")
オブジェクト形式の非推奨化
allowAttrs と disallowAttrs のオブジェクト形式は v5 でもまだ動作しますが、将来のバージョンで削除されます。今のうちに配列形式に切り替えてください。
変更前(オブジェクト形式):
{
"invalid-attr": {
"options": {
"allowAttrs": {
"x-attr": "Int"
}
}
}
}
変更後(配列形式):
{
"invalid-attr": {
"options": {
"allowAttrs": [
{
"name": "x-attr",
"value": "Int"
}
]
}
}
}
v5 で新たに検出される値
v5 では、これまで Any として素通りしていた領域について invalid-attr のデフォルト検証範囲が拡張されました。設定を変更せずに v5 へアップグレードすると、以下のようなマークアップで v4 では発火しなかった違反が出る可能性があります。
各行は検証追加を導入した Issue と、その根拠となる HTML / URL / Encoding Living Standard のセクションを示します。新しい違反に納得できない場合は、まずリンク先の Issue を確認してください — いくつかは、nu-validator が仕様より厳しく解釈していたケースについて仕様引用つきで excluded-ids.json に記録しながら導入されています。
| 対象領域 | v5 で失敗する例 | Issue | 仕様 |
|---|---|---|---|
type に応じた input[value] | <input type="color" value="red"> | #3598 | HTML LS — input 要素 |
rel に応じた link[as] | <link rel="preload" as="audio"> | #3189 | HTML LS — link 要素 |
img[role] + alt="" | <img role="presentation" alt=""> | #3641 | ARIA in HTML — img |
| URL 内の禁止コードポイント | <a href="http://example.com/"> | #3629 | URL LS — URL code points |
http-equiv に応じた meta[content] | <meta http-equiv="refresh" content="garbage"> | #3734 | HTML LS — meta http-equiv |
media= の MQL5 厳格文法 | <link media="screen and (color: 1em)"> | #3850 | Media Queries Level 5 §4 |
| URL 系属性の URL LS 厳格検証 | <a href="http://user:pass@example.com"> | #3848 | URL LS — URL parsing |
メディア系 src の非空必須 | <img src=""> | #3868 | HTML LS — valid non-empty URL |
<base href> の URL LS 厳格化 | <base href="http://user@example.com/"> | #3868 | HTML LS — set the frozen base URL |
<input type=url value> の絶対URL | <input type="url" value="/relative"> | #3868 | HTML LS — URL state |
| フォーム送信系 URL の非空必須 | <form action=""> | — | HTML LS — valid non-empty URL |
<video poster> の非空必須 | <video poster="" src="movie.mp4"> | — | HTML LS — video poster |
<base> の href / target 必須 | <base> | — | HTML LS — the base element |
<input type=image> の alt 必須 | <input type="image" src="b.png"> | — | HTML LS — input image button |
単独の autocomplete=webauthn 禁止 | <input autocomplete="webauthn"> | — | HTML LS — webauthn token |
input[name="isindex"] 禁止 | <input type="text" name="isindex"> | — | HTML LS — the name attribute |
srcset の descriptor 重複禁止 | <img srcset="a 1x, b 1x"> | — | HTML LS — srcset attributes |
link[disabled] は stylesheet 限定 | <link rel="icon" href="x" disabled> | — | HTML LS — link[disabled] |
rel="alternate stylesheet" 要 title | <link rel="alternate stylesheet" href="x"> | — | HTML LS — alternate stylesheet |
URL 系属性 (href / src / action / cite / itemid / itemtype 等) で新たに違反となるパターン
URL 型チェッカーが、new URL() が暗黙的に自動補正してしまう URL Living Standard の validation error を捕捉するようになりました。v4 で受理されていた以下のパターンが、v5 では invalid-attr 違反となります。
- invalid-credentials (URL LS §1.1):
<a href="http://user:pass@example.com">,<a href="//user@example.com">, さらに<a href="http://@example.com">(空の userinfo も authority に@を含む点で違反)。URL から userinfo を除いてください。 - special-scheme-missing-following-solidus (URL LS):
<a href="http:foo">,<a href="https:/foo">,<a href="ftp:bar">。スペシャルスキーム URL はscheme://を要求します。 - file-scheme-missing-following-solidus (URL LS):
<a href="file:foo">,<a href="file:/foo">,<a href="file:">。三本スラッシュ形式file:///pathを使用してください。 - invalid-reverse-solidus (URL LS):
<a href="http://example.com\foo">,<a href="/foo\bar">。URL LS はスペシャルスキーム URL の\を/に自動変換しますが validation error として報告します。非スペシャルスキーム (data:,mailto:) は opaque path の一部として扱うため引き続き受理されます。 - file-invalid-Windows-drive-letter (URL LS):
<a href="file:///C|/foo">。URL LS がC|をC:に自動補正します。コロン形式を使用してください。 - 複数の
#(URL LS — invalid-URL-unit fragment state):<a href="http://example.com/#a#b">。2 つ目の#は自動 percent-encode されますが URL writing 文法では不正です。内側の#を%23に percent-encode するか除去してください。 - IPv6 host 以外の
[/](URL LS — invalid-URL-unit):<a href="[61:24:74]:98">(IPv6 風の相対 URL)、<a href="http://example.com/path[a]">。[/]は special scheme URL の host 位置でのみ許容される URL code point です。 data:URL に,が無い (RFC 2397):<a href="data:">、<a href="data:/example.com/">。データ本体の直前に必須の,を入れてください。
メディア src・<base href>・<input type=url value> で新たに違反となるパターン
上記の URL LS パイプラインに加え、3 つの専用型でさらに厳格化されています。
<audio src>/<embed src>/<iframe src>/<img src>/<input type=image src>/<script src>/<source src>/<track src>/<video src>はNonEmptyURL型を使うようになり、ASCII 空白を剥がした結果が空 (空白のみ含む場合も) の値を拒否します。HTML LS §4.8 はこれらを「valid non-empty URL potentially surrounded by spaces」と定義しています。<form action>/<button formaction>/<input formaction>/<object data>/<link href>/<video poster>も同じNonEmptyURL型を使うようになりました。いずれも仕様上「valid non-empty URL potentially surrounded by spaces」と定義されていますが、以前は空文字も許容するURL型でした。空文字 (および空白のみの値) はinvalid-attr違反となります。<base>はhref、target、またはその両方を必要とします (HTML LS §4.2.3)。属性のない<base>は v4 では黙認されていましたが、v5 ではrequired-attrルールが違反として報告します。いずれかを指定すれば要件を満たします。<input type="image">はalt属性を必須化 (HTML LS §4.10.5.1.18)。type="image"でaltが無い場合にrequired-attrルールが発火します。- 単独の
autocomplete="webauthn"は非適合 (HTML LS §4.10.18.7)。webauthnトークンは「他のトークンと組み合わせて使われなければならない」とされており、<input autocomplete="webauthn">のような単独使用は v5 で違反となります。autocomplete="name webauthn"のような組み合わせは引き続き有効です。 <input name="isindex">は予約値 (HTML LS §4.10.18.2)。廃止された<isindex>要素の名残として、リテラル値isindexは予約されています。v5 ではname属性がisindex(大文字小文字区別) のときに違反となります。srcsetの descriptor 重複は非適合 (HTML LS §4.8.4.4.1)。仕様は「重複した descriptor を持つ image candidate string は invalid」と定義しています。Srcset型チェッカーは密度スロット (1x, 1x、1x, 1.0x、または省略 = 暗黙 1x と1xの組み合わせ) と幅スロット (480w, 480w) いずれの重複も拒否します。判定は数値比較なので、同じ値の異なる表記 (1vs1.0等) も衝突します。<link disabled>はrel="stylesheet"限定 (HTML LS §4.6.7.18)。disabled属性は「rel に stylesheet キーワードを含む link 要素にのみ指定可能」と仕様で限定されています。<link rel="icon" disabled>等はinvalid-attr違反となります。<link rel="alternate stylesheet">は非空のtitle必須 (HTML LS §4.6.7.4)。rel にalternateとstylesheetの両方を含む場合、仕様により「非空の」title属性が必要です。title が無いケースはrequired-attrルール、明示的な空 (title="") はinvalid-attrルール (NoEmptyAny条件付き型 override) が発火します。<base href>は既存のdata:/javascript:スキーム禁止に加え、URL LS の完全な検証も実行するようになりました。以前はdata:/javascript:以外なら無検査で受理していました。<input type="url" value>は絶対 URL 限定の variant を使うようになりました。空の値は受理 (HTML LS §4.10.5.1.7 「指定されかつ非空なら」) ですが、相対 URL は拒否します。完全なhttps://…形式を使うか、属性を空にしてください。
<base href> を完全な URL Living Standard パイプラインに通したことで、Node の URL.canParse の厳格さも <base href> に適用されるようになりました。副作用として、IPv4 形式で最終オクテットが 255 を超えるホスト値 (例: <base href="http://192.168.0.257/">) が markuplint で違反扱いになります。URL LS の host parser は IPv4 parse 失敗時に通常のホスト名としてフォールバックする規定があり nu-validator はこれを許容しますが、URL.canParse はこのフォールバックを実装していません。実利用に影響が出る場合は Issue を起票 してください — 厳格な仕様要件ではなく「仕様より厳しいコーナーケース」として追跡しています。
media= で新たに違反となるパターン
link / style / source / svg|style の media 属性は専用の MediaQueryList チェッカーで検証されるようになりました。v4 では汎用の <media-query-list> 経由で素通りしていた以下が、v5 では invalid-attr 違反となります。
- 非推奨メディアタイプ (MQL5 §2.3):
<link media="aural">,<link media="tv">,<link media="projection">,<link media="handheld">,<link media="braille">,<link media="embossed">,<link media="speech">,<link media="tty">等。screen/print/allへの置き換え、もしくは feature query を利用してください。 - 非推奨メディア特性 (MQL4):
(device-width: ...),(device-height: ...),(device-aspect-ratio: ...)およびmin-/max-バリアント。(width: ...)/(height: ...)/(aspect-ratio: ...)を利用してください。 - 特性ごとの値型違反 (MQL5 §4):
(min-width: 400)(長さに単位なし)、(min-width: 400dpi)(長さに解像度単位)、(color: 1em)(整数に長さ単位)、(resolution: 96)(解像度に単位なし) 等。 <integer>特性に負値 (MQL5 §4.4):(color: -1),(monochrome: -2),(min-color-index: -1)等。仕様は非負を要求しています。<ratio>特性に非正値 (MQL5 §4.5):(aspect-ratio: 0),(aspect-ratio: 0/1),(aspect-ratio: -1/1)等。仕様は厳密に正を要求しています。
これらの厳格化を個別に無効化する設定はありません。特定のケースで問題がある場合は、失敗するマークアップと仕様の該当段落を添えて Issue を起票 してください — 仕様の誤読が判明したものは修正または範囲を狭めます。