Skip to content

Commit 1aa773c

Browse files
committed
adjust messages, disallow empty strings
1 parent 941c79a commit 1aa773c

File tree

8 files changed

+85
-90
lines changed

8 files changed

+85
-90
lines changed

packages/svelte/messages/compile-warnings/a11y.md

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,6 @@
2626

2727
> Avoid `<%name%>` elements
2828
29-
## a11y_empty_aria_attribute
30-
31-
> '%attribute%' cannot be empty
32-
33-
> '%attribute%' cannot be empty — change it to `%attribute%="%value%"`
34-
3529
## a11y_figcaption_index
3630

3731
> `<figcaption>` must be first or last child of `<figure>`
@@ -50,11 +44,11 @@
5044
5145
## a11y_incorrect_aria_attribute_type
5246

53-
> The value of '%attribute%' must be of type %type%
47+
> The value of '%attribute%' must be a %type%
5448
5549
## a11y_incorrect_aria_attribute_type_boolean
5650

57-
> The value of '%attribute%' must be either 'true' or 'false'
51+
> The value of '%attribute%' must be either 'true' or 'false'. It cannot be empty
5852
5953
## a11y_incorrect_aria_attribute_type_id
6054

packages/svelte/src/compiler/phases/2-analyze/a11y.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -603,19 +603,18 @@ function validate_aria_attribute_value(attribute, name, schema, value) {
603603
const type = schema.type;
604604

605605
if (value === null) return;
606-
607-
if (value === true) {
608-
const v = type === 'boolean' || type === 'tristate' ? 'true' : undefined;
609-
w.a11y_empty_aria_attribute(attribute, name, v);
610-
return;
611-
}
606+
if (value === true) value = '';
612607

613608
if (type === 'boolean' && value !== 'true' && value !== 'false') {
614609
w.a11y_incorrect_aria_attribute_type_boolean(attribute, name);
615-
} else if (type === 'integer' && !Number.isInteger(+value)) {
610+
} else if (type === 'integer' && (value === '' || !Number.isInteger(+value))) {
616611
w.a11y_incorrect_aria_attribute_type_integer(attribute, name);
617-
} else if (type === 'number' && isNaN(+value)) {
612+
} else if (type === 'number' && (value === '' || isNaN(+value))) {
618613
w.a11y_incorrect_aria_attribute_type(attribute, name, 'number');
614+
} else if ((type === 'string' || type === 'id') && value === '') {
615+
w.a11y_incorrect_aria_attribute_type(attribute, name, 'non-empty string');
616+
} else if (type === 'idlist' && value === '') {
617+
w.a11y_incorrect_aria_attribute_type_idlist(attribute, name);
619618
} else if (type === 'token') {
620619
const values = (schema.values ?? []).map((value) => value.toString());
621620
if (!values.includes(value.toLowerCase())) {

packages/svelte/src/compiler/warnings.js

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,6 @@ export function a11y_distracting_elements(node, name) {
100100
w(node, "a11y_distracting_elements", `Avoid \`<${name}>\` elements`);
101101
}
102102

103-
/**
104-
* '%attribute%' cannot be empty — change it to `%attribute%="%value%"`
105-
* @param {null | NodeLike} node
106-
* @param {string} attribute
107-
* @param {string | undefined | null} [value]
108-
*/
109-
export function a11y_empty_aria_attribute(node, attribute, value) {
110-
w(node, "a11y_empty_aria_attribute", value ? `'${attribute}' cannot be empty — change it to \`${attribute}="${value}"\`` : `'${attribute}' cannot be empty`);
111-
}
112-
113103
/**
114104
* `<figcaption>` must be first or last child of `<figure>`
115105
* @param {null | NodeLike} node
@@ -144,22 +134,12 @@ export function a11y_img_redundant_alt(node) {
144134
}
145135

146136
/**
147-
* The value of '%attribute%' must be of type %type%
148-
* @param {null | NodeLike} node
149-
* @param {string} attribute
150-
* @param {string} type
151-
*/
152-
export function a11y_incorrect_aria_attribute_type(node, attribute, type) {
153-
w(node, "a11y_incorrect_aria_attribute_type", `The value of '${attribute}' must be of type ${type}`);
154-
}
155-
156-
/**
157-
* The value of '%attribute%' must be either 'true' or 'false'
137+
* The value of '%attribute%' must be either 'true' or 'false'. It cannot be empty
158138
* @param {null | NodeLike} node
159139
* @param {string} attribute
160140
*/
161141
export function a11y_incorrect_aria_attribute_type_boolean(node, attribute) {
162-
w(node, "a11y_incorrect_aria_attribute_type_boolean", `The value of '${attribute}' must be either 'true' or 'false'`);
142+
w(node, "a11y_incorrect_aria_attribute_type_boolean", `The value of '${attribute}' must be either 'true' or 'false'. It cannot be empty`);
163143
}
164144

165145
/**
@@ -189,6 +169,16 @@ export function a11y_incorrect_aria_attribute_type_integer(node, attribute) {
189169
w(node, "a11y_incorrect_aria_attribute_type_integer", `The value of '${attribute}' must be an integer`);
190170
}
191171

172+
/**
173+
* The value of '%attribute%' must be a %type%
174+
* @param {null | NodeLike} node
175+
* @param {string} attribute
176+
* @param {string} type
177+
*/
178+
export function a11y_incorrect_aria_attribute_type(node, attribute, type) {
179+
w(node, "a11y_incorrect_aria_attribute_type", `The value of '${attribute}' must be a ${type}`);
180+
}
181+
192182
/**
193183
* The value of '%attribute%' must be exactly one of %values%
194184
* @param {null | NodeLike} node

packages/svelte/tests/validator/samples/a11y-aria-proptypes-boolean/warnings.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{
33
"code": "a11y_incorrect_aria_attribute_type_boolean",
4-
"message": "The value of 'aria-disabled' must be either 'true' or 'false'",
4+
"message": "The value of 'aria-disabled' must be either 'true' or 'false'. It cannot be empty",
55
"start": {
66
"line": 5,
77
"column": 8
@@ -13,7 +13,7 @@
1313
},
1414
{
1515
"code": "a11y_incorrect_aria_attribute_type_boolean",
16-
"message": "The value of 'aria-disabled' must be either 'true' or 'false'",
16+
"message": "The value of 'aria-disabled' must be either 'true' or 'false'. It cannot be empty",
1717
"start": {
1818
"line": 6,
1919
"column": 8

packages/svelte/tests/validator/samples/a11y-aria-proptypes-integer/warnings.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
}
2525
},
2626
{
27-
"code": "a11y_empty_aria_attribute",
28-
"message": "'aria-level' cannot be empty",
27+
"code": "a11y_incorrect_aria_attribute_type_integer",
28+
"message": "The value of 'aria-level' must be an integer",
2929
"start": {
3030
"line": 4,
3131
"column": 5

packages/svelte/tests/validator/samples/a11y-aria-proptypes-number/warnings.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
{
33
"code": "a11y_incorrect_aria_attribute_type",
4-
"message": "The value of 'aria-valuemax' must be of type number",
4+
"message": "The value of 'aria-valuemax' must be a number",
55
"start": {
66
"line": 1,
77
"column": 5
@@ -13,7 +13,7 @@
1313
},
1414
{
1515
"code": "a11y_incorrect_aria_attribute_type",
16-
"message": "The value of 'aria-valuemax' must be of type number",
16+
"message": "The value of 'aria-valuemax' must be a number",
1717
"start": {
1818
"line": 2,
1919
"column": 5
@@ -25,7 +25,7 @@
2525
},
2626
{
2727
"code": "a11y_incorrect_aria_attribute_type",
28-
"message": "The value of 'aria-valuemax' must be of type number",
28+
"message": "The value of 'aria-valuemax' must be a number",
2929
"start": {
3030
"line": 5,
3131
"column": 5

packages/svelte/tests/validator/samples/a11y-role-supports-aria-props/input.svelte

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
<link aria-rowcount="0" />
2626
<menu aria-valuemin="0"></menu>
2727
<meter aria-colspan="0"></meter>
28-
<nav aria-valuetext=""></nav>
28+
<nav aria-valuetext="x"></nav>
2929
<ol aria-sort="none"></ol>
3030
<option aria-invalid="true"></option>
3131
<optgroup aria-sort="none"></optgroup>
@@ -45,7 +45,7 @@
4545
<div role="application" aria-required="true"></div>
4646
<div role="article" aria-multiline="true"></div>
4747
<div role="banner" aria-autocomplete="inline"></div>
48-
<div role="blockquote" aria-valuetext=""></div>
48+
<div role="blockquote" aria-valuetext="x"></div>
4949
<div role="button" aria-colspan="0"></div>
5050
<div role="caption" aria-setsize="0"></div>
5151
<div role="cell" aria-multiline="true"></div>
@@ -54,7 +54,7 @@
5454
<div role="columnheader" aria-colcount="0"></div>
5555
<div role="combobox" aria-multiselectable="true" aria-controls={[]} aria-expanded="true"></div>
5656
<div role="complementary" aria-readonly="true"></div>
57-
<div role="contentinfo" aria-valuetext=""></div>
57+
<div role="contentinfo" aria-valuetext="x"></div>
5858
<div role="definition" aria-multiline="true"></div>
5959
<div role="deletion" aria-expanded="true"></div>
6060
<div role="dialog" aria-multiline="true"></div>
@@ -85,7 +85,7 @@
8585
<div role="menuitemradio" aria-rowspan="0" aria-checked="false"></div>
8686
<div role="meter" aria-valuenow="0" aria-haspopup="true"></div>
8787
<div role="navigation" aria-expanded="true"></div>
88-
<div role="none" aria-placeholder=""></div>
88+
<div role="none" aria-placeholder="x"></div>
8989
<div role="note" aria-modal="true"></div>
9090
<div role="option" aria-selected="true" aria-valuemax="0"></div>
9191
<div role="paragraph" aria-level="0"></div>
@@ -101,7 +101,7 @@
101101
<div role="search" aria-autocomplete="inline"></div>
102102
<div role="searchbox" aria-colindex="0"></div>
103103
<div role="separator" aria-sort="none"></div>
104-
<div role="slider" aria-valuenow="0" aria-placeholder=""></div>
104+
<div role="slider" aria-valuenow="0" aria-placeholder="x"></div>
105105
<div role="spinbutton" aria-posinset="0"></div>
106106
<div role="status" aria-valuemin="0"></div>
107107
<div role="strong" aria-valuemin="0"></div>
@@ -116,7 +116,7 @@
116116
<div role="textbox" aria-colspan="0"></div>
117117
<div role="time" aria-selected="true"></div>
118118
<div role="timer" aria-sort="none"></div>
119-
<div role="toolbar" aria-valuetext=""></div>
119+
<div role="toolbar" aria-valuetext="x"></div>
120120
<div role="tooltip" aria-multiline="true"></div>
121121
<div role="tree" aria-expanded="true"></div>
122122
<div role="treegrid" aria-level="0"></div>
@@ -144,8 +144,8 @@
144144
<div role="doc-example" aria-multiselectable="true"></div>
145145
<div role="doc-footnote" aria-rowcount="0"></div>
146146
<div role="doc-foreword" aria-valuenow="0"></div>
147-
<div role="doc-glossary" aria-valuetext=""></div>
148-
<div role="doc-glossref" aria-placeholder=""></div>
147+
<div role="doc-glossary" aria-valuetext="x"></div>
148+
<div role="doc-glossref" aria-placeholder="x"></div>
149149
<div role="doc-index" aria-rowcount="0"></div>
150150
<div role="doc-introduction" aria-pressed="true"></div>
151151
<div role="doc-noteref" aria-valuenow="0"></div>
@@ -184,31 +184,31 @@
184184
<menuitem type="radio" aria-placeholder="placeholder"></menuitem> <!-- implicit role: menuitemradio -->
185185

186186
<!-- VALID -->
187-
<a aria-keyshortcuts="" href="/">Link</a>
187+
<a aria-keyshortcuts="x" href="/">Link</a>
188188
<area aria-expanded="true" alt="" />
189189
<article aria-dropeffect="none"></article>
190-
<aside aria-keyshortcuts=""></aside>
190+
<aside aria-keyshortcuts="x"></aside>
191191
<body aria-labelledby="id"></body>
192192
<button aria-hidden="true"></button>
193193
<datalist aria-activedescendant="id" tabindex="0"></datalist>
194194
<dd aria-labelledby="id"></dd>
195195
<dfn aria-details="id"></dfn>
196-
<dialog aria-keyshortcuts=""></dialog>
197-
<details aria-keyshortcuts=""></details>
196+
<dialog aria-keyshortcuts="x"></dialog>
197+
<details aria-keyshortcuts="x"></details>
198198
<dt aria-hidden="true"></dt>
199199
<fieldset aria-owns="id"></fieldset>
200-
<form aria-keyshortcuts=""></form>
201-
<h1 aria-keyshortcuts="">H1</h1>
200+
<form aria-keyshortcuts="x"></form>
201+
<h1 aria-keyshortcuts="x">H1</h1>
202202
<h2 aria-controls={[]}>H2</h2>
203203
<h3 aria-controls={[]}>H3</h3>
204204
<h4 aria-details="id">H4</h4>
205205
<h5 aria-grabbed="true">H5</h5>
206206
<h6 aria-grabbed="true">H6</h6>
207207
<hr aria-relevant="all" />
208208
<img aria-flowto="id" alt="Valid aria role" />
209-
<li aria-label=""></li>
209+
<li aria-label="x"></li>
210210
<link aria-hidden="true" />
211-
<menu aria-roledescription=""></menu>
211+
<menu aria-roledescription="x"></menu>
212212
<meter aria-valuemin="0"></meter>
213213
<nav aria-labelledby="id"></nav>
214214
<ol aria-grabbed="true"></ol>
@@ -235,10 +235,10 @@
235235
<div role="caption" aria-grabbed="true"></div>
236236
<div role="cell" aria-rowindex="0"></div>
237237
<div role="checkbox" aria-checked="true" aria-details="id"></div>
238-
<div role="code" aria-keyshortcuts=""></div>
238+
<div role="code" aria-keyshortcuts="x"></div>
239239
<div role="columnheader" aria-rowspan="0"></div>
240240
<div role="combobox" aria-invalid="true" aria-controls={[]} aria-expanded="true"></div>
241-
<div role="complementary" aria-label=""></div>
241+
<div role="complementary" aria-label="x"></div>
242242
<div role="contentinfo" aria-dropeffect="none"></div>
243243
<div role="definition" aria-grabbed="true"></div>
244244
<div role="deletion" aria-busy="true"></div>
@@ -248,71 +248,71 @@
248248
<div role="emphasis" aria-atomic="true"></div>
249249
<div role="feed" aria-atomic="true"></div>
250250
<div role="figure" aria-busy="true"></div>
251-
<div role="form" aria-roledescription=""></div>
251+
<div role="form" aria-roledescription="x"></div>
252252
<div role="generic" aria-current="true"></div>
253253
<div role="grid" aria-busy="true"></div>
254254
<div role="gridcell" aria-relevant="all"></div>
255255
<div role="group" aria-busy="true"></div>
256256
<div role="heading" aria-level="" aria-flowto="id"></div>
257257
<div role="img" aria-grabbed="true"></div>
258-
<div role="insertion" aria-roledescription=""></div>
258+
<div role="insertion" aria-roledescription="x"></div>
259259
<div role="link" aria-owns="id"></div>
260260
<div role="list" aria-labelledby="id"></div>
261261
<div role="listbox" aria-current="true"></div>
262262
<div role="listitem" aria-controls={[]}></div>
263263
<div role="log" aria-controls={[]}></div>
264-
<div role="main" aria-keyshortcuts=""></div>
264+
<div role="main" aria-keyshortcuts="x"></div>
265265
<div role="marquee" aria-labelledby="id"></div>
266266
<div role="math" aria-labelledby="id"></div>
267267
<div role="menu" aria-atomic="true"></div>
268268
<div role="menubar" aria-grabbed="true"></div>
269269
<div role="menuitem" aria-grabbed="true"></div>
270270
<div role="menuitemcheckbox" aria-checked="true" aria-controls={[]}></div>
271271
<div role="menuitemradio" aria-checked="true" aria-grabbed="true"></div>
272-
<div role="meter" aria-valuenow="0" aria-valuetext=""></div>
272+
<div role="meter" aria-valuenow="0" aria-valuetext="x"></div>
273273
<div role="navigation" aria-controls={[]}></div>
274274
<div role="none" undefined></div>
275275
<div role="note" aria-hidden="true"></div>
276276
<div role="option" aria-selected="true" aria-describedby="id"></div>
277277
<div role="paragraph" aria-grabbed="true"></div>
278278
<div role="presentation" aria-relevant="all"></div>
279279
<div role="progressbar" aria-valuemin="0"></div>
280-
<div role="radio" aria-checked="true" aria-roledescription=""></div>
280+
<div role="radio" aria-checked="true" aria-roledescription="x"></div>
281281
<div role="radiogroup" aria-required="true"></div>
282-
<div role="region" aria-roledescription=""></div>
282+
<div role="region" aria-roledescription="x"></div>
283283
<div role="row" aria-posinset="0"></div>
284284
<div role="rowgroup" aria-busy="true"></div>
285-
<div role="rowheader" aria-label=""></div>
285+
<div role="rowheader" aria-label="x"></div>
286286
<div role="scrollbar" aria-controls={[]} aria-valuenow="0" aria-relevant="all"></div>
287287
<div role="search" aria-grabbed="true"></div>
288288
<div role="searchbox" aria-dropeffect="none"></div>
289-
<div role="separator" aria-roledescription=""></div>
289+
<div role="separator" aria-roledescription="x"></div>
290290
<div role="slider" aria-valuenow="0" aria-relevant="all"></div>
291291
<div role="spinbutton" aria-required="true"></div>
292-
<div role="status" aria-label=""></div>
293-
<div role="strong" aria-keyshortcuts=""></div>
294-
<div role="subscript" aria-keyshortcuts=""></div>
292+
<div role="status" aria-label="x"></div>
293+
<div role="strong" aria-keyshortcuts="x"></div>
294+
<div role="subscript" aria-keyshortcuts="x"></div>
295295
<div role="superscript" aria-live="off"></div>
296-
<div role="switch" aria-checked="true" aria-roledescription=""></div>
296+
<div role="switch" aria-checked="true" aria-roledescription="x"></div>
297297
<div role="tab" aria-flowto="id"></div>
298298
<div role="table" aria-rowcount="0"></div>
299299
<div role="tablist" aria-atomic="true"></div>
300300
<div role="tabpanel" aria-labelledby="id"></div>
301301
<div role="term" aria-details="id"></div>
302302
<div role="textbox" aria-hidden="true"></div>
303-
<div role="time" aria-label=""></div>
303+
<div role="time" aria-label="x"></div>
304304
<div role="timer" aria-hidden="true"></div>
305-
<div role="toolbar" aria-roledescription=""></div>
305+
<div role="toolbar" aria-roledescription="x"></div>
306306
<div role="tooltip" aria-owns="id"></div>
307307
<div role="tree" aria-errormessage="error"></div>
308308
<div role="treegrid" aria-details="id"></div>
309309
<div role="treeitem" aria-selected="true" aria-dropeffect="none"></div>
310-
<div role="doc-abstract" aria-label=""></div>
310+
<div role="doc-abstract" aria-label="x"></div>
311311
<div role="doc-acknowledgments" aria-controls={[]}></div>
312312
<div role="doc-afterword" aria-flowto="id"></div>
313313
<div role="doc-appendix" aria-describedby="id"></div>
314314
<div role="doc-backlink" aria-dropeffect="none"></div>
315-
<div role="doc-biblioentry" aria-roledescription=""></div>
315+
<div role="doc-biblioentry" aria-roledescription="x"></div>
316316
<div role="doc-bibliography" aria-labelledby="id"></div>
317317
<div role="doc-biblioref" aria-haspopup="true"></div>
318318
<div role="doc-chapter" aria-controls={[]}></div>
@@ -321,12 +321,12 @@
321321
<div role="doc-cover" aria-controls={[]}></div>
322322
<div role="doc-credit" aria-haspopup="true"></div>
323323
<div role="doc-credits" aria-describedby="id"></div>
324-
<div role="doc-dedication" aria-roledescription=""></div>
324+
<div role="doc-dedication" aria-roledescription="x"></div>
325325
<div role="doc-endnote" aria-errormessage="error"></div>
326326
<div role="doc-endnotes" aria-owns="id"></div>
327327
<div role="doc-epigraph" aria-controls={[]}></div>
328328
<div role="doc-epilogue" aria-relevant="all"></div>
329-
<div role="doc-errata" aria-keyshortcuts=""></div>
329+
<div role="doc-errata" aria-keyshortcuts="x"></div>
330330
<div role="doc-example" aria-invalid="true"></div>
331331
<div role="doc-footnote" aria-labelledby="id"></div>
332332
<div role="doc-foreword" aria-expanded="true"></div>
@@ -339,7 +339,7 @@
339339
<div role="doc-pagebreak" aria-owns="id"></div>
340340
<div role="doc-pagelist" aria-disabled="true"></div>
341341
<div role="doc-part" aria-relevant="all"></div>
342-
<div role="doc-preface" aria-label=""></div>
342+
<div role="doc-preface" aria-label="x"></div>
343343
<div role="doc-prologue" aria-invalid="true"></div>
344344
<div role="doc-pullquote" undefined></div>
345345
<div role="doc-qna" aria-errormessage="error"></div>

0 commit comments

Comments
 (0)