diff --git a/src/css/Stylesheet.ts b/src/css/Stylesheet.ts index 00233b80c9..464dbd2500 100644 --- a/src/css/Stylesheet.ts +++ b/src/css/Stylesheet.ts @@ -435,6 +435,7 @@ export default class Stylesheet { const message = `Unused CSS selector`; onwarn({ + code: `css-unused-selector`, message, frame, loc: { line: line + 1, column }, diff --git a/src/generators/wrapModule.ts b/src/generators/wrapModule.ts index cdc9db2513..38e837692f 100644 --- a/src/generators/wrapModule.ts +++ b/src/generators/wrapModule.ts @@ -276,6 +276,7 @@ function getGlobals(dependencies: Dependency[], options: CompileOptions) { onerror(error); } else { const warning = { + code: `options-missing-globals`, message: `No name was supplied for imported module '${d.source}'. Guessing '${d.name}', but you should use options.globals`, }; diff --git a/src/interfaces.ts b/src/interfaces.ts index dc3fb614c1..dfce819d5e 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -31,6 +31,7 @@ export interface Warning { loc?: { line: number; column: number; pos?: number }; end?: { line: number; column: number; }; pos?: number; + code: string; message: string; filename?: string; frame?: string; diff --git a/src/validate/html/a11y.ts b/src/validate/html/a11y.ts index c52180cf63..bb264326d0 100644 --- a/src/validate/html/a11y.ts +++ b/src/validate/html/a11y.ts @@ -35,7 +35,10 @@ export default function a11y( if (name.startsWith('aria-')) { if (invisibleElements.has(node.name)) { // aria-unsupported-elements - validator.warn(`A11y: <${node.name}> should not have aria-* attributes`, attribute); + validator.warn(attribute, { + code: `a11y-aria-attributes`, + message: `A11y: <${node.name}> should not have aria-* attributes` + }); } const type = name.slice(5); @@ -44,7 +47,10 @@ export default function a11y( let message = `A11y: Unknown aria attribute 'aria-${type}'`; if (match) message += ` (did you mean '${match}'?)`; - validator.warn(message, attribute); + validator.warn(attribute, { + code: `a11y-unknown-aria-attribute`, + message + }); } } @@ -52,7 +58,10 @@ export default function a11y( if (name === 'role') { if (invisibleElements.has(node.name)) { // aria-unsupported-elements - validator.warn(`A11y: <${node.name}> should not have role attribute`, attribute); + validator.warn(attribute, { + code: `a11y-misplaced-role`, + message: `A11y: <${node.name}> should not have role attribute` + }); } const value = getStaticAttributeValue(node, 'role'); @@ -61,30 +70,45 @@ export default function a11y( let message = `A11y: Unknown role '${value}'`; if (match) message += ` (did you mean '${match}'?)`; - validator.warn(message, attribute); + validator.warn(attribute, { + code: `a11y-unknown-role`, + message + }); } } // no-access-key if (name === 'accesskey') { - validator.warn(`A11y: Avoid using accesskey`, attribute); + validator.warn(attribute, { + code: `a11y-accesskey`, + message: `A11y: Avoid using accesskey` + }); } // no-autofocus if (name === 'autofocus') { - validator.warn(`A11y: Avoid using autofocus`, attribute); + validator.warn(attribute, { + code: `a11y-autofocus`, + message: `A11y: Avoid using autofocus` + }); } // scope if (name === 'scope' && node.name !== 'th') { - validator.warn(`A11y: The scope attribute should only be used with