Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion lib/rules/template-no-invalid-interactive.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
'use strict';

const { isNativeElement } = require('../utils/is-native-element');
const { isHtmlInteractiveContent } = require('../utils/html-interactive-content');
const { INTERACTIVE_ROLES } = require('../utils/interactive-roles');

function hasAttr(node, name) {
Expand Down Expand Up @@ -78,6 +77,20 @@
const ignoreTabindex = options.ignoreTabindex || false;
const ignoreUsemap = options.ignoreUsemap || false;

const NATIVE_INTERACTIVE_ELEMENTS = new Set([
'button',
'canvas',
'details',
'embed',
'iframe',
'input',
'label',
'select',
'summary',
'textarea',
]);

// eslint-disable-next-line complexity
function isInteractive(node) {
const tag = node.tag?.toLowerCase();
if (!tag) {
Expand All @@ -91,7 +104,7 @@
// HTML §3.2.5.2.7 interactive content (authoritative for content-model;
// handles label/button/etc. + conditional a[href], input[!hidden],
// img[usemap], audio/video[controls]).
if (isHtmlInteractiveContent(node, getTextAttr, { ignoreUsemap })) {

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 24.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><li><button {{action "foo"}}></button></li></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'li', original: 'li', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 3 } } }, tail: [], original: 'li', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 3 } }, parts: [ 'li' ], this: false, data: false }, attributes: [], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'button', original: 'button', loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 11 } } }, tail: [], original: 'button', loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 11 } }, parts: [ 'button' ], this: false, data: false }, attributes: [], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'action', original: 'action', loc: { start: { line: 1, column: 24 }, end: { line: 1, column: 30 } }, range: [ 24, 30 ], start: 24, end: 30 }, tail: [], original: 'action', loc: { start: { line: 1, column: 24 }, end: { line: 1, column: 30 } }, parts: [ 'action' ], this: false, data: false, parent: [Circular], range: [ 24, 30 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'foo', loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 36 } }, original: 'foo', parent: [Circular], range: [ 31, 36 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 36 }, end: { line: 1, column: 36 } }, parent: [Circular], range: [ 36, 36 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 22 }, end: { line: 1, column: 38 } }, parent: [Circular], range: [ 22, 38 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: 4 }, end: { line: 1, column: 29 } }, closeTag: { start: { line: 1, column: 29 }, end: { line: 1, column: 38 } }, loc: { start: { line: 1, column: 14 }, end: { line: 1, column: 48 } }, tag: 'button', blockParams: [], selfClosing: false, parent: [Circular], range: [ 14, 48 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end', name: 'button', parts: [ { type: 'GlimmerElementNodePart', original: 'button', name: 'button', range: [ 15, 21 ], start: '<unserializable>

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 24.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div randomProperty={{myValue}}></div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'randomProperty', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'myValue', original: 'myValue', loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 39 } }, range: [ 32, 39 ], start: 32, end: 39, parent: [Circular] }, tail: [], original: 'myValue', loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 39 } }, parts: [ 'myValue' ], this: false, data: false, parent: [Circular], range: [ 32, 39 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 30 }, end: { line: 1, column: 41 } }, escaped: true, parent: [Circular], range: [ 30, 41 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 41 } }, parent: [Circular], range: [ 15, 41 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 32 } }, closeTag: { start: { line: 1, column: 32 }, end: { line: 1, column: 38 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 48 } }, tag: 'div', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 59 } }, parent: { type: 'Program', range: [ +0, 59 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 10, index: 10 }, end: { line: 1, column: 11, index: 11 } } }, { type: 'word', value: 'div', range: [ 11, 14 ], start: '<unserializable>: Use token.range[0] in

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 24.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div role="button" {{action "foo"}}></div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'role', value: { type: 'GlimmerTextNode', chars: 'button', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 28 } }, parent: [Circular], value: 'button', range: [ 20, 28 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 28 } }, parent: [Circular], range: [ 15, 28 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'action', original: 'action', loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 37 } }, range: [ 31, 37 ], start: 31, end: 37 }, tail: [], original: 'action', loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 37 } }, parts: [ 'action' ], this: false, data: false, parent: [Circular], range: [ 31, 37 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'foo', loc: { start: { line: 1, column: 38 }, end: { line: 1, column: 43 } }, original: 'foo', parent: [Circular], range: [ 38, 43 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 43 }, end: { line: 1, column: 43 } }, parent: [Circular], range: [ 43, 43 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 45 } }, parent: [Circular], range: [ 29, 45 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 36 } }, closeTag: { start: { line: 1, column: 36 }, end: { line: 1, column: 42 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 52 } }, tag: 'div', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: {

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 24.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><canvas {{on "mousedown"}}></canvas></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'canvas', original: 'canvas', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } } }, tail: [], original: 'canvas', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } }, parts: [ 'canvas' ], this: false, data: false }, attributes: [], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'on', original: 'on', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 22 } }, range: [ 20, 22 ], start: 20, end: 22, parent: [Circular] }, tail: [], original: 'on', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 22 } }, parts: [ 'on' ], this: false, data: false, parent: [Circular], range: [ 20, 22 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'mousedown', loc: { start: { line: 1, column: 23 }, end: { line: 1, column: 34 } }, original: 'mousedown', parent: [Circular], range: [ 23, 34 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 34 }, end: { line: 1, column: 34 } }, parent: [Circular], range: [ 34, 34 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 36 } }, parent: [Circular], range: [ 18, 36 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 27 } }, closeTag: { start: { line: 1, column: 27 }, end: { line: 1, column: 36 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 46 } }, tag: 'canvas', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 57 } }, parent: { type: 'Program', range: [ +0, 57 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.ra

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 24.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><button {{action "foo"}}></button></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'button', original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } } }, tail: [], original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } }, parts: [ 'button' ], this: false, data: false }, attributes: [], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'action', original: 'action', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 26 } }, range: [ 20, 26 ], start: 20, end: 26 }, tail: [], original: 'action', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 26 } }, parts: [ 'action' ], this: false, data: false, parent: [Circular], range: [ 20, 26 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'foo', loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 32 } }, original: 'foo', parent: [Circular], range: [ 27, 32 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 32 } }, parent: [Circular], range: [ 32, 32 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 34 } }, parent: [Circular], range: [ 18, 34 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 25 } }, closeTag: { start: { line: 1, column: 25 }, end: { line: 1, column: 34 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 44 } }, tag: 'button', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 55 } }, parent: { type: 'Program', range: [ +0, 55 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead o

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 24.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><input onkeydown={{this.handleKey}} /></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'input', original: 'input', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 6 } } }, tail: [], original: 'input', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 6 } }, parts: [ 'input' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'onkeydown', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 33 } }, name: undefined, range: [ 29, 33 ], start: 29, end: 33 }, tail: [ 'handleKey' ], original: 'this.handleKey', loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 43 } }, parts: [ 'handleKey' ], this: true, data: false, parent: [Circular], range: [ 29, 43 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 45 } }, escaped: true, parent: [Circular], range: [ 27, 45 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 17 }, end: { line: 1, column: 45 } }, parent: [Circular], range: [ 17, 45 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 38 } }, closeTag: null, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 48 } }, tag: 'input', blockParams: [], selfClosing: true, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 59 } }, parent: { type: 'Program', range: [ +0, 59 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 10, index: 10 }, end: { line: 1, column: 11, index: 11 } } }, { type: 'word', value: 'input', range: [ 11, 16 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use tok

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 24.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div>No handlers</div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'No handlers', loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 26 } }, parent: [Circular], value: 'No handlers', range: [ 15, 26 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 5 } }, closeTag: { start: { line: 1, column: 16 }, end: { line: 1, column: 22 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 32 } }, tag: 'div', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 43 } }, parent: { type: 'Program', range: [ +0, 43 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 10, index: 10 }, end: { line: 1, column: 11, index: 11 } } }, { type: 'word', value: 'div', range: [ 11, 14 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 11, index: 11 }, end: { line: 1, column: 14, index: 14 } } }, { type: 'Punctuator', value: '>', range: [ 14, 15 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 14, index: 14 }, end: { line: 1, column: 15, index: 15 } } }, { type: 'GlimmerTextNode', chars: 'No handlers', loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 26 } }, parent: [Circular], value: 'No handlers', range: [ 15, 26 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, { type: 'Punctuator', value: '<', range: [ 26, 27 ], start: '<unserializable>: Use token.range[0] instead of token.start', end:

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 24.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div role="button" onclick={{this.handleClick}}>Interactive</div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'role', value: { type: 'GlimmerTextNode', chars: 'button', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 28 } }, parent: [Circular], value: 'button', range: [ 20, 28 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 28 } }, parent: [Circular], range: [ 15, 28 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, { type: 'GlimmerAttrNode', name: 'onclick', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 39 }, end: { line: 1, column: 43 } }, name: undefined, range: [ 39, 43 ], start: 39, end: 43 }, tail: [ 'handleClick' ], original: 'this.handleClick', loc: { start: { line: 1, column: 39 }, end: { line: 1, column: 55 } }, parts: [ 'handleClick' ], this: true, data: false, parent: [Circular], range: [ 39, 55 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 57 } }, escaped: true, parent: [Circular], range: [ 37, 57 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 57 } }, parent: [Circular], range: [ 29, 57 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'Interactive', loc: { start: { line: 1, column: 58 }, end: { line: 1, column: 69 } }, parent: [Circular], value: 'Interactive', range: [ 58, 69 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 48 } }, closeTag: { start: { line: 1, column: 59 }, end: { line: 1, column: 65 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 75 } }, tag: 'div', blockParams: [], selfClosing

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 24.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><a href="/about" onclick={{this.handleClick}}>Link</a></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'a', original: 'a', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, tail: [], original: 'a', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } }, parts: [ 'a' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'href', value: { type: 'GlimmerTextNode', chars: '/about', loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 26 } }, parent: [Circular], value: '/about', range: [ 18, 26 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, loc: { start: { line: 1, column: 13 }, end: { line: 1, column: 26 } }, parent: [Circular], range: [ 13, 26 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, { type: 'GlimmerAttrNode', name: 'onclick', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 41 } }, name: undefined, range: [ 37, 41 ], start: 37, end: 41 }, tail: [ 'handleClick' ], original: 'this.handleClick', loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 53 } }, parts: [ 'handleClick' ], this: true, data: false, parent: [Circular], range: [ 37, 53 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 35 }, end: { line: 1, column: 55 } }, escaped: true, parent: [Circular], range: [ 35, 55 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 55 } }, parent: [Circular], range: [ 27, 55 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'Link', loc: { start: { line: 1, column: 56 }, end: { line: 1, column: 60 } }, parent: [Circular], value: 'Link', range: [ 56, 60 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 46 } }, closeTag: { start: { line: 1, column: 50 }, end: { line: 1, column: 54 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 64 } }, tag: 'a', blockParams: [], selfClosing: false, parent: { type:

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 24.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><button onclick={{this.handleClick}}>Click</button></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'button', original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } } }, tail: [], original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } }, parts: [ 'button' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'onclick', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 28 }, end: { line: 1, column: 32 } }, name: undefined, range: [ 28, 32 ], start: 28, end: 32 }, tail: [ 'handleClick' ], original: 'this.handleClick', loc: { start: { line: 1, column: 28 }, end: { line: 1, column: 44 } }, parts: [ 'handleClick' ], this: true, data: false, parent: [Circular], range: [ 28, 44 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 26 }, end: { line: 1, column: 46 } }, escaped: true, parent: [Circular], range: [ 26, 46 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 46 } }, parent: [Circular], range: [ 18, 46 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'Click', loc: { start: { line: 1, column: 47 }, end: { line: 1, column: 52 } }, parent: [Circular], value: 'Click', range: [ 47, 52 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 37 } }, closeTag: { start: { line: 1, column: 42 }, end: { line: 1, column: 51 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 61 } }, tag: 'button', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 72 } }, parent: { type: 'Program', range: [ +0, 72 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start:

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 22.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><li><button {{action "foo"}}></button></li></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'li', original: 'li', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 3 } } }, tail: [], original: 'li', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 3 } }, parts: [ 'li' ], this: false, data: false }, attributes: [], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'button', original: 'button', loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 11 } } }, tail: [], original: 'button', loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 11 } }, parts: [ 'button' ], this: false, data: false }, attributes: [], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'action', original: 'action', loc: { start: { line: 1, column: 24 }, end: { line: 1, column: 30 } }, range: [ 24, 30 ], start: 24, end: 30 }, tail: [], original: 'action', loc: { start: { line: 1, column: 24 }, end: { line: 1, column: 30 } }, parts: [ 'action' ], this: false, data: false, parent: [Circular], range: [ 24, 30 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'foo', loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 36 } }, original: 'foo', parent: [Circular], range: [ 31, 36 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 36 }, end: { line: 1, column: 36 } }, parent: [Circular], range: [ 36, 36 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 22 }, end: { line: 1, column: 38 } }, parent: [Circular], range: [ 22, 38 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: 4 }, end: { line: 1, column: 29 } }, closeTag: { start: { line: 1, column: 29 }, end: { line: 1, column: 38 } }, loc: { start: { line: 1, column: 14 }, end: { line: 1, column: 48 } }, tag: 'button', blockParams: [], selfClosing: false, parent: [Circular], range: [ 14, 48 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end', name: 'button', parts: [ { type: 'GlimmerElementNodePart', original: 'button', name: 'button', range: [ 15, 21 ], start: '<unserializable>

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 22.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div randomProperty={{myValue}}></div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'randomProperty', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'myValue', original: 'myValue', loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 39 } }, range: [ 32, 39 ], start: 32, end: 39, parent: [Circular] }, tail: [], original: 'myValue', loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 39 } }, parts: [ 'myValue' ], this: false, data: false, parent: [Circular], range: [ 32, 39 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 30 }, end: { line: 1, column: 41 } }, escaped: true, parent: [Circular], range: [ 30, 41 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 41 } }, parent: [Circular], range: [ 15, 41 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 32 } }, closeTag: { start: { line: 1, column: 32 }, end: { line: 1, column: 38 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 48 } }, tag: 'div', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 59 } }, parent: { type: 'Program', range: [ +0, 59 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 10, index: 10 }, end: { line: 1, column: 11, index: 11 } } }, { type: 'word', value: 'div', range: [ 11, 14 ], start: '<unserializable>: Use token.range[0] in

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 22.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div role="button" {{action "foo"}}></div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'role', value: { type: 'GlimmerTextNode', chars: 'button', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 28 } }, parent: [Circular], value: 'button', range: [ 20, 28 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 28 } }, parent: [Circular], range: [ 15, 28 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'action', original: 'action', loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 37 } }, range: [ 31, 37 ], start: 31, end: 37 }, tail: [], original: 'action', loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 37 } }, parts: [ 'action' ], this: false, data: false, parent: [Circular], range: [ 31, 37 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'foo', loc: { start: { line: 1, column: 38 }, end: { line: 1, column: 43 } }, original: 'foo', parent: [Circular], range: [ 38, 43 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 43 }, end: { line: 1, column: 43 } }, parent: [Circular], range: [ 43, 43 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 45 } }, parent: [Circular], range: [ 29, 45 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 36 } }, closeTag: { start: { line: 1, column: 36 }, end: { line: 1, column: 42 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 52 } }, tag: 'div', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: {

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 22.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><canvas {{on "mousedown"}}></canvas></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'canvas', original: 'canvas', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } } }, tail: [], original: 'canvas', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } }, parts: [ 'canvas' ], this: false, data: false }, attributes: [], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'on', original: 'on', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 22 } }, range: [ 20, 22 ], start: 20, end: 22, parent: [Circular] }, tail: [], original: 'on', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 22 } }, parts: [ 'on' ], this: false, data: false, parent: [Circular], range: [ 20, 22 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'mousedown', loc: { start: { line: 1, column: 23 }, end: { line: 1, column: 34 } }, original: 'mousedown', parent: [Circular], range: [ 23, 34 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 34 }, end: { line: 1, column: 34 } }, parent: [Circular], range: [ 34, 34 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 36 } }, parent: [Circular], range: [ 18, 36 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 27 } }, closeTag: { start: { line: 1, column: 27 }, end: { line: 1, column: 36 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 46 } }, tag: 'canvas', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 57 } }, parent: { type: 'Program', range: [ +0, 57 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.ra

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 22.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><button {{action "foo"}}></button></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'button', original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } } }, tail: [], original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } }, parts: [ 'button' ], this: false, data: false }, attributes: [], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'action', original: 'action', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 26 } }, range: [ 20, 26 ], start: 20, end: 26 }, tail: [], original: 'action', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 26 } }, parts: [ 'action' ], this: false, data: false, parent: [Circular], range: [ 20, 26 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'foo', loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 32 } }, original: 'foo', parent: [Circular], range: [ 27, 32 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 32 } }, parent: [Circular], range: [ 32, 32 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 34 } }, parent: [Circular], range: [ 18, 34 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 25 } }, closeTag: { start: { line: 1, column: 25 }, end: { line: 1, column: 34 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 44 } }, tag: 'button', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 55 } }, parent: { type: 'Program', range: [ +0, 55 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead o

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 22.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><input onkeydown={{this.handleKey}} /></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'input', original: 'input', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 6 } } }, tail: [], original: 'input', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 6 } }, parts: [ 'input' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'onkeydown', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 33 } }, name: undefined, range: [ 29, 33 ], start: 29, end: 33 }, tail: [ 'handleKey' ], original: 'this.handleKey', loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 43 } }, parts: [ 'handleKey' ], this: true, data: false, parent: [Circular], range: [ 29, 43 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 45 } }, escaped: true, parent: [Circular], range: [ 27, 45 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 17 }, end: { line: 1, column: 45 } }, parent: [Circular], range: [ 17, 45 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 38 } }, closeTag: null, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 48 } }, tag: 'input', blockParams: [], selfClosing: true, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 59 } }, parent: { type: 'Program', range: [ +0, 59 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 10, index: 10 }, end: { line: 1, column: 11, index: 11 } } }, { type: 'word', value: 'input', range: [ 11, 16 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use tok

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 22.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div>No handlers</div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'No handlers', loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 26 } }, parent: [Circular], value: 'No handlers', range: [ 15, 26 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 5 } }, closeTag: { start: { line: 1, column: 16 }, end: { line: 1, column: 22 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 32 } }, tag: 'div', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 43 } }, parent: { type: 'Program', range: [ +0, 43 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 10, index: 10 }, end: { line: 1, column: 11, index: 11 } } }, { type: 'word', value: 'div', range: [ 11, 14 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 11, index: 11 }, end: { line: 1, column: 14, index: 14 } } }, { type: 'Punctuator', value: '>', range: [ 14, 15 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 14, index: 14 }, end: { line: 1, column: 15, index: 15 } } }, { type: 'GlimmerTextNode', chars: 'No handlers', loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 26 } }, parent: [Circular], value: 'No handlers', range: [ 15, 26 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, { type: 'Punctuator', value: '<', range: [ 26, 27 ], start: '<unserializable>: Use token.range[0] instead of token.start', end:

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 22.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div role="button" onclick={{this.handleClick}}>Interactive</div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'role', value: { type: 'GlimmerTextNode', chars: 'button', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 28 } }, parent: [Circular], value: 'button', range: [ 20, 28 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 28 } }, parent: [Circular], range: [ 15, 28 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, { type: 'GlimmerAttrNode', name: 'onclick', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 39 }, end: { line: 1, column: 43 } }, name: undefined, range: [ 39, 43 ], start: 39, end: 43 }, tail: [ 'handleClick' ], original: 'this.handleClick', loc: { start: { line: 1, column: 39 }, end: { line: 1, column: 55 } }, parts: [ 'handleClick' ], this: true, data: false, parent: [Circular], range: [ 39, 55 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 57 } }, escaped: true, parent: [Circular], range: [ 37, 57 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 57 } }, parent: [Circular], range: [ 29, 57 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'Interactive', loc: { start: { line: 1, column: 58 }, end: { line: 1, column: 69 } }, parent: [Circular], value: 'Interactive', range: [ 58, 69 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 48 } }, closeTag: { start: { line: 1, column: 59 }, end: { line: 1, column: 65 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 75 } }, tag: 'div', blockParams: [], selfClosing

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 22.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><a href="/about" onclick={{this.handleClick}}>Link</a></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'a', original: 'a', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, tail: [], original: 'a', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } }, parts: [ 'a' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'href', value: { type: 'GlimmerTextNode', chars: '/about', loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 26 } }, parent: [Circular], value: '/about', range: [ 18, 26 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, loc: { start: { line: 1, column: 13 }, end: { line: 1, column: 26 } }, parent: [Circular], range: [ 13, 26 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, { type: 'GlimmerAttrNode', name: 'onclick', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 41 } }, name: undefined, range: [ 37, 41 ], start: 37, end: 41 }, tail: [ 'handleClick' ], original: 'this.handleClick', loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 53 } }, parts: [ 'handleClick' ], this: true, data: false, parent: [Circular], range: [ 37, 53 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 35 }, end: { line: 1, column: 55 } }, escaped: true, parent: [Circular], range: [ 35, 55 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 55 } }, parent: [Circular], range: [ 27, 55 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'Link', loc: { start: { line: 1, column: 56 }, end: { line: 1, column: 60 } }, parent: [Circular], value: 'Link', range: [ 56, 60 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 46 } }, closeTag: { start: { line: 1, column: 50 }, end: { line: 1, column: 54 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 64 } }, tag: 'a', blockParams: [], selfClosing: false, parent: { type:

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 22.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><button onclick={{this.handleClick}}>Click</button></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'button', original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } } }, tail: [], original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } }, parts: [ 'button' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'onclick', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 28 }, end: { line: 1, column: 32 } }, name: undefined, range: [ 28, 32 ], start: 28, end: 32 }, tail: [ 'handleClick' ], original: 'this.handleClick', loc: { start: { line: 1, column: 28 }, end: { line: 1, column: 44 } }, parts: [ 'handleClick' ], this: true, data: false, parent: [Circular], range: [ 28, 44 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 26 }, end: { line: 1, column: 46 } }, escaped: true, parent: [Circular], range: [ 26, 46 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 46 } }, parent: [Circular], range: [ 18, 46 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'Click', loc: { start: { line: 1, column: 47 }, end: { line: 1, column: 52 } }, parent: [Circular], value: 'Click', range: [ 47, 52 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 37 } }, closeTag: { start: { line: 1, column: 42 }, end: { line: 1, column: 51 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 61 } }, tag: 'button', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 72 } }, parent: { type: 'Program', range: [ +0, 72 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start:

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 20.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><li><button {{action "foo"}}></button></li></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'li', original: 'li', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 3 } } }, tail: [], original: 'li', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 3 } }, parts: [ 'li' ], this: false, data: false }, attributes: [], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'button', original: 'button', loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 11 } } }, tail: [], original: 'button', loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 11 } }, parts: [ 'button' ], this: false, data: false }, attributes: [], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'action', original: 'action', loc: { start: { line: 1, column: 24 }, end: { line: 1, column: 30 } }, range: [ 24, 30 ], start: 24, end: 30 }, tail: [], original: 'action', loc: { start: { line: 1, column: 24 }, end: { line: 1, column: 30 } }, parts: [ 'action' ], this: false, data: false, parent: [Circular], range: [ 24, 30 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'foo', loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 36 } }, original: 'foo', parent: [Circular], range: [ 31, 36 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 36 }, end: { line: 1, column: 36 } }, parent: [Circular], range: [ 36, 36 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 22 }, end: { line: 1, column: 38 } }, parent: [Circular], range: [ 22, 38 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: 4 }, end: { line: 1, column: 29 } }, closeTag: { start: { line: 1, column: 29 }, end: { line: 1, column: 38 } }, loc: { start: { line: 1, column: 14 }, end: { line: 1, column: 48 } }, tag: 'button', blockParams: [], selfClosing: false, parent: [Circular], range: [ 14, 48 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end', name: 'button', parts: [ { type: 'GlimmerElementNodePart', original: 'button', name: 'button', range: [ 15, 21 ], start: '<unserializable>

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 20.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div randomProperty={{myValue}}></div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'randomProperty', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'myValue', original: 'myValue', loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 39 } }, range: [ 32, 39 ], start: 32, end: 39, parent: [Circular] }, tail: [], original: 'myValue', loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 39 } }, parts: [ 'myValue' ], this: false, data: false, parent: [Circular], range: [ 32, 39 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 30 }, end: { line: 1, column: 41 } }, escaped: true, parent: [Circular], range: [ 30, 41 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 41 } }, parent: [Circular], range: [ 15, 41 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 32 } }, closeTag: { start: { line: 1, column: 32 }, end: { line: 1, column: 38 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 48 } }, tag: 'div', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 59 } }, parent: { type: 'Program', range: [ +0, 59 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 10, index: 10 }, end: { line: 1, column: 11, index: 11 } } }, { type: 'word', value: 'div', range: [ 11, 14 ], start: '<unserializable>: Use token.range[0] in

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 20.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div role="button" {{action "foo"}}></div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'role', value: { type: 'GlimmerTextNode', chars: 'button', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 28 } }, parent: [Circular], value: 'button', range: [ 20, 28 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 28 } }, parent: [Circular], range: [ 15, 28 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'action', original: 'action', loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 37 } }, range: [ 31, 37 ], start: 31, end: 37 }, tail: [], original: 'action', loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 37 } }, parts: [ 'action' ], this: false, data: false, parent: [Circular], range: [ 31, 37 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'foo', loc: { start: { line: 1, column: 38 }, end: { line: 1, column: 43 } }, original: 'foo', parent: [Circular], range: [ 38, 43 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 43 }, end: { line: 1, column: 43 } }, parent: [Circular], range: [ 43, 43 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 45 } }, parent: [Circular], range: [ 29, 45 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 36 } }, closeTag: { start: { line: 1, column: 36 }, end: { line: 1, column: 42 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 52 } }, tag: 'div', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: {

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 20.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><canvas {{on "mousedown"}}></canvas></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'canvas', original: 'canvas', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } } }, tail: [], original: 'canvas', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } }, parts: [ 'canvas' ], this: false, data: false }, attributes: [], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'on', original: 'on', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 22 } }, range: [ 20, 22 ], start: 20, end: 22, parent: [Circular] }, tail: [], original: 'on', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 22 } }, parts: [ 'on' ], this: false, data: false, parent: [Circular], range: [ 20, 22 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'mousedown', loc: { start: { line: 1, column: 23 }, end: { line: 1, column: 34 } }, original: 'mousedown', parent: [Circular], range: [ 23, 34 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 34 }, end: { line: 1, column: 34 } }, parent: [Circular], range: [ 34, 34 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 36 } }, parent: [Circular], range: [ 18, 36 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 27 } }, closeTag: { start: { line: 1, column: 27 }, end: { line: 1, column: 36 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 46 } }, tag: 'canvas', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 57 } }, parent: { type: 'Program', range: [ +0, 57 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.ra

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 20.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><button {{action "foo"}}></button></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting <input>:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'button', original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } } }, tail: [], original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } }, parts: [ 'button' ], this: false, data: false }, attributes: [], modifiers: [ { type: 'GlimmerElementModifierStatement', path: { type: 'GlimmerPathExpression', head: { type: 'VarHead', name: 'action', original: 'action', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 26 } }, range: [ 20, 26 ], start: 20, end: 26 }, tail: [], original: 'action', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 26 } }, parts: [ 'action' ], this: false, data: false, parent: [Circular], range: [ 20, 26 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [ { type: 'GlimmerStringLiteral', value: 'foo', loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 32 } }, original: 'foo', parent: [Circular], range: [ 27, 32 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], hash: { type: 'GlimmerHash', pairs: [], loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 32 } }, parent: [Circular], range: [ 32, 32 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 34 } }, parent: [Circular], range: [ 18, 34 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 25 } }, closeTag: { start: { line: 1, column: 25 }, end: { line: 1, column: 34 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 44 } }, tag: 'button', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 55 } }, parent: { type: 'Program', range: [ +0, 55 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead o

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 20.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><input onkeydown={{this.handleKey}} /></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'input', original: 'input', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 6 } } }, tail: [], original: 'input', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 6 } }, parts: [ 'input' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'onkeydown', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 33 } }, name: undefined, range: [ 29, 33 ], start: 29, end: 33 }, tail: [ 'handleKey' ], original: 'this.handleKey', loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 43 } }, parts: [ 'handleKey' ], this: true, data: false, parent: [Circular], range: [ 29, 43 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 45 } }, escaped: true, parent: [Circular], range: [ 27, 45 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 17 }, end: { line: 1, column: 45 } }, parent: [Circular], range: [ 17, 45 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 38 } }, closeTag: null, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 48 } }, tag: 'input', blockParams: [], selfClosing: true, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 59 } }, parent: { type: 'Program', range: [ +0, 59 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 10, index: 10 }, end: { line: 1, column: 11, index: 11 } } }, { type: 'word', value: 'input', range: [ 11, 16 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use tok

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 20.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div>No handlers</div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'No handlers', loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 26 } }, parent: [Circular], value: 'No handlers', range: [ 15, 26 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 5 } }, closeTag: { start: { line: 1, column: 16 }, end: { line: 1, column: 22 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 32 } }, tag: 'div', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 43 } }, parent: { type: 'Program', range: [ +0, 43 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 10, index: 10 }, end: { line: 1, column: 11, index: 11 } } }, { type: 'word', value: 'div', range: [ 11, 14 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 11, index: 11 }, end: { line: 1, column: 14, index: 14 } } }, { type: 'Punctuator', value: '>', range: [ 14, 15 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: 14, index: 14 }, end: { line: 1, column: 15, index: 15 } } }, { type: 'GlimmerTextNode', chars: 'No handlers', loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 26 } }, parent: [Circular], value: 'No handlers', range: [ 15, 26 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, { type: 'Punctuator', value: '<', range: [ 26, 27 ], start: '<unserializable>: Use token.range[0] instead of token.start', end:

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 20.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><div role="button" onclick={{this.handleClick}}>Interactive</div></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'div', original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, tail: [], original: 'div', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } }, parts: [ 'div' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'role', value: { type: 'GlimmerTextNode', chars: 'button', loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 28 } }, parent: [Circular], value: 'button', range: [ 20, 28 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 28 } }, parent: [Circular], range: [ 15, 28 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, { type: 'GlimmerAttrNode', name: 'onclick', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 39 }, end: { line: 1, column: 43 } }, name: undefined, range: [ 39, 43 ], start: 39, end: 43 }, tail: [ 'handleClick' ], original: 'this.handleClick', loc: { start: { line: 1, column: 39 }, end: { line: 1, column: 55 } }, parts: [ 'handleClick' ], this: true, data: false, parent: [Circular], range: [ 39, 55 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 57 } }, escaped: true, parent: [Circular], range: [ 37, 57 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 57 } }, parent: [Circular], range: [ 29, 57 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'Interactive', loc: { start: { line: 1, column: 58 }, end: { line: 1, column: 69 } }, parent: [Circular], value: 'Interactive', range: [ 58, 69 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 48 } }, closeTag: { start: { line: 1, column: 59 }, end: { line: 1, column: 65 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 75 } }, tag: 'div', blockParams: [], selfClosing

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 20.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><a href="/about" onclick={{this.handleClick}}>Link</a></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'a', original: 'a', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, tail: [], original: 'a', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } }, parts: [ 'a' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'href', value: { type: 'GlimmerTextNode', chars: '/about', loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 26 } }, parent: [Circular], value: '/about', range: [ 18, 26 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' }, loc: { start: { line: 1, column: 13 }, end: { line: 1, column: 26 } }, parent: [Circular], range: [ 13, 26 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, { type: 'GlimmerAttrNode', name: 'onclick', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 41 } }, name: undefined, range: [ 37, 41 ], start: 37, end: 41 }, tail: [ 'handleClick' ], original: 'this.handleClick', loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 53 } }, parts: [ 'handleClick' ], this: true, data: false, parent: [Circular], range: [ 37, 53 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 35 }, end: { line: 1, column: 55 } }, escaped: true, parent: [Circular], range: [ 35, 55 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 55 } }, parent: [Circular], range: [ 27, 55 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'Link', loc: { start: { line: 1, column: 56 }, end: { line: 1, column: 60 } }, parent: [Circular], value: 'Link', range: [ 56, 60 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 46 } }, closeTag: { start: { line: 1, column: 50 }, end: { line: 1, column: 54 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 64 } }, tag: 'a', blockParams: [], selfClosing: false, parent: { type:

Check failure on line 107 in lib/rules/template-no-invalid-interactive.js

View workflow job for this annotation

GitHub Actions / build (ubuntu, 20.x)

tests/lib/rules/template-no-invalid-interactive.js > template-no-invalid-interactive > valid > <template><button onclick={{this.handleClick}}>Click</button></template>

ReferenceError: isHtmlInteractiveContent is not defined Occurred while linting test.gjs:1 Rule: "template-no-invalid-interactive" ❯ isInteractive lib/rules/template-no-invalid-interactive.js:107:7 ❯ GlimmerElementNode lib/rules/template-no-invalid-interactive.js:160:13 ❯ ruleErrorHandler node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/linter.js:1076:28 ❯ node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:58 ❯ Object.emit node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/safe-emitter.js:45:38 ❯ NodeEventGenerator.applySelector node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:297:26 ❯ NodeEventGenerator.applySelectors node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:326:22 ❯ NodeEventGenerator.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/node-event-generator.js:340:14 ❯ CodePathAnalyzer.enterNode node_modules/.pnpm/[email protected]/node_modules/eslint/lib/linter/code-path-analysis/code-path-analyzer.js:803:23 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { ruleId: 'template-no-invalid-interactive', currentNode: { type: 'GlimmerElementNode', path: { type: 'PathExpression', head: { type: 'VarHead', name: 'button', original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } } }, tail: [], original: 'button', loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 7 } }, parts: [ 'button' ], this: false, data: false }, attributes: [ { type: 'GlimmerAttrNode', name: 'onclick', value: { type: 'GlimmerMustacheStatement', path: { type: 'GlimmerPathExpression', head: { type: 'ThisHead', original: 'this', loc: { start: { line: 1, column: 28 }, end: { line: 1, column: 32 } }, name: undefined, range: [ 28, 32 ], start: 28, end: 32 }, tail: [ 'handleClick' ], original: 'this.handleClick', loc: { start: { line: 1, column: 28 }, end: { line: 1, column: 44 } }, parts: [ 'handleClick' ], this: true, data: false, parent: [Circular], range: [ 28, 44 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, params: [], hash: null, trusting: false, strip: { open: false, close: false }, loc: { start: { line: 1, column: 26 }, end: { line: 1, column: 46 } }, escaped: true, parent: [Circular], range: [ 26, 46 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' }, loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 46 } }, parent: [Circular], range: [ 18, 46 ], start: '<unserializable>: Use node.range[0] instead of node.start', end: '<unserializable>: Use node.range[1] instead of node.end' } ], modifiers: [], params: [], comments: [], children: [ { type: 'GlimmerTextNode', chars: 'Click', loc: { start: { line: 1, column: 47 }, end: { line: 1, column: 52 } }, parent: [Circular], value: 'Click', range: [ 47, 52 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end' } ], openTag: { start: { line: 1, column: +0 }, end: { line: 1, column: 37 } }, closeTag: { start: { line: 1, column: 42 }, end: { line: 1, column: 51 } }, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 61 } }, tag: 'button', blockParams: [], selfClosing: false, parent: { type: 'GlimmerTemplate', body: [ [Circular] ], blockParams: [], loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 72 } }, parent: { type: 'Program', range: [ +0, 72 ], body: [ [Circular] ], comments: [], sourceType: 'module', tokens: [ { type: 'Punctuator', value: '<template>', range: [ +0, 10 ], start: '<unserializable>: Use token.range[0] instead of token.start', end: '<unserializable>: Use token.range[1] instead of token.end', loc: { start: { line: 1, column: +0 }, end: { line: 1, column: 10 } } }, { type: 'Punctuator', value: '<', range: [ 10, 11 ], start:
return true;
}

Expand Down
61 changes: 27 additions & 34 deletions lib/rules/template-no-nested-interactive.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
'use strict';

const { isHtmlInteractiveContent } = require('../utils/html-interactive-content');
const { INTERACTIVE_ROLES, COMPOSITE_WIDGET_CHILDREN } = require('../utils/interactive-roles');

function hasAttr(node, name) {
Expand All @@ -15,15 +12,17 @@ function getTextAttr(node, name) {
return undefined;
}

// Menu submenu pattern — per WAI-ARIA APG, a `menuitem` may own a nested
// `menu` (APG convention: such menuitems are also marked with
// `aria-haspopup`, but this rule does not require the attribute before
// allowing the nesting). aria-query's `requiredOwnedElements` does not
// express this "menu-inside-menuitem" direction, so it is handled explicitly.
const MENUITEM_ROLES = new Set(['menuitem', 'menuitemcheckbox', 'menuitemradio']);

function getRole(node) {
return getTextAttr(node, 'role');
}
Comment thread
johanrd marked this conversation as resolved.

// Menu submenu pattern — per WAI-ARIA APG, a `menuitem` with `aria-haspopup`
// may own a nested `menu`. aria-query's `requiredOwnedElements` does not
// express this "menu-inside-menuitem" direction, so it is handled explicitly.
const MENUITEM_ROLES = new Set(['menuitem', 'menuitemcheckbox', 'menuitemradio']);

function isCompositeWidgetPattern(parentRole, childRole) {
if (!parentRole || !childRole) {
return false;
Expand All @@ -39,33 +38,31 @@ function isCompositeWidgetPattern(parentRole, childRole) {
return false;
}

function isMenuItemNode(node) {
// Match all three menu-item role variants per ARIA taxonomy. `menuitem`,
// `menuitemcheckbox`, and `menuitemradio` are all "menu items" — they can
// carry submenus (via MENUITEM_ROLES in isCompositeWidgetPattern) and nest
// each other (via the nested-menuitem compat exception). Keeping both
// predicates symmetric avoids false positives on APG Menu Button /
// Menubar patterns that mix the variants.
return MENUITEM_ROLES.has(getTextAttr(node, 'role'));
function isSummaryFirstChildOfDetails(summaryNode, parentEntry) {
if (summaryNode.tag !== 'summary' || parentEntry.tag !== 'details') {
return false;
}
const parentNode = parentEntry.node;
const children = parentNode.children || [];
const firstNonWhitespace = children.find((child) => {
if (child.type === 'GlimmerTextNode') {
return child.chars.trim().length > 0;
}
return true;
});
return firstNonWhitespace === summaryNode;
}

function isAllowedDetailsChild(childNode, parentEntry) {
if (parentEntry.tag !== 'details') {
return false;
}
// Non-<summary> children are flow content in the disclosed panel — allowed.
// <summary> is only allowed as the first non-whitespace child of <details>.
if (childNode.tag !== 'summary') {
return true;
}
const children = parentEntry.node.children || [];
const firstNonWhitespace = children.find((child) => {
if (child.type === 'GlimmerTextNode') {
return child.chars.trim().length > 0;
}
return true;
});
return firstNonWhitespace === childNode;
// <summary> is only allowed as the first non-whitespace child of <details>.
return isSummaryFirstChildOfDetails(childNode, parentEntry);
}

/** @type {import('eslint').Rule.RuleModule} */
Expand Down Expand Up @@ -227,19 +224,15 @@ module.exports = {
}
parentEntry.interactiveChildCount++;
} else if (isAllowedDetailsChild(node, parentEntry)) {
// flow content in the disclosed panel, or <summary> as first child
// Non-<summary> children are body content; <summary> allowed only as first child
} else if (isCompositeWidgetPattern(getRole(parentEntry.node), getRole(node))) {
// Canonical ARIA composite-widget hierarchies — e.g. option inside
// listbox, tab inside tablist, treeitem inside tree, row inside
// grid/treegrid, gridcell/columnheader/rowheader inside row,
// radio inside radiogroup, menu inside menuitem (submenu).
// Derived from aria-query's requiredOwnedElements with superClass
// inheritance — see lib/utils/interactive-roles.js.
} else if (isMenuItemNode(parentEntry.node) && isMenuItemNode(node)) {
// Nested menu-item nodes (any combination of menuitem /
// menuitemcheckbox / menuitemradio) are valid — menu/sub-menu
// pattern per WAI-ARIA APG. Kept for historical compat since
// aria-query doesn't encode this via requiredOwnedElements.
// menuitem inside menu/menubar, radio inside radiogroup, and
// menu inside menuitem (submenu). Derived from aria-query's
// `requiredOwnedElements` (+ superClass inheritance for
// treegrid, etc.). See lib/utils/interactive-roles.js.
} else {
context.report({
node,
Expand Down
2 changes: 0 additions & 2 deletions lib/utils/interactive-roles.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
'use strict';

const { roles } = require('aria-query');

// Interactive ARIA roles — concrete roles whose taxonomy descends from `widget`
Expand Down
11 changes: 5 additions & 6 deletions tests/lib/rules/template-no-invalid-interactive.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,8 @@ ruleTester.run('template-no-invalid-interactive', rule, {
// <summary> is natively interactive
'<template><summary onclick={{this.toggle}}>Details</summary></template>',

// ARIA widget roles: scrollbar, treeitem (+ many others from the shared
// interactive-roles util). tooltip is intentionally NOT in the widget
// set (per WAI-ARIA 1.2 §5.3.3 it's a document-structure role) and so
// handlers on `role="tooltip"` should be flagged — see invalid cases.
// ARIA widget roles: scrollbar, treeitem
// (tooltip is not a widget per WAI-ARIA 1.2 §5.3.3 — document-structure role)
'<template><div role="scrollbar" onclick={{this.scroll}}>Scroll</div></template>',
'<template><div role="treeitem" onclick={{this.select}}>Node</div></template>',

Expand Down Expand Up @@ -219,8 +217,9 @@ ruleTester.run('template-no-invalid-interactive', rule, {
],
},
{
// role="tooltip" is document-structure per WAI-ARIA 1.2 §5.3.3 — NOT
// a widget, so a handler on it is as invalid as a handler on a bare div.
// `tooltip` is a Document Structure role per WAI-ARIA 1.2 §5.3.3, not a
// widget. Click handlers on a tooltip are therefore an invalid
// interactive handler on a non-interactive element.
filename: 'test.gjs',
code: '<template><div role="tooltip" onclick={{this.show}}>Tip</div></template>',
output: null,
Expand Down
25 changes: 22 additions & 3 deletions tests/lib/rules/template-no-nested-interactive.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,18 @@ ruleTester.run('template-no-nested-interactive', rule, {
{{/if}}
</label>
</template>`,

// Canonical ARIA composite-widget hierarchies — derived from aria-query's
// `requiredOwnedElements`. These are standard WAI-ARIA APG patterns and
// must not be flagged.
'<template><div role="listbox"><div role="option">A</div><div role="option">B</div></div></template>',
'<template><div role="tablist"><div role="tab">Tab 1</div><div role="tab">Tab 2</div></div></template>',
'<template><div role="tree"><div role="treeitem">Node</div></div></template>',
'<template><div role="treegrid"><div role="row"><div role="gridcell">Cell</div></div></div></template>',
'<template><div role="grid"><div role="row"><div role="gridcell">Cell</div></div></div></template>',
'<template><div role="grid"><div role="row"><div role="rowheader">Header</div></div></div></template>',
'<template><div role="grid"><div role="row"><div role="columnheader">Header</div></div></div></template>',
'<template><div role="radiogroup"><div role="radio">Opt 1</div></div></template>',
],

invalid: [
Expand Down Expand Up @@ -354,9 +366,16 @@ hbsRuleTester.run('template-no-nested-interactive', rule, {
code: '<button><img usemap=""></button>',
options: [{ ignoreUsemapAttribute: true }],
},
// <audio>/<video> without `controls` are NOT interactive.
'<button><audio></audio></button>',
'<button><video></video></button>',

// Canonical ARIA composite-widget hierarchies.
'<div role="listbox"><div role="option">A</div><div role="option">B</div></div>',
'<div role="tablist"><div role="tab">Tab 1</div><div role="tab">Tab 2</div></div>',
'<div role="tree"><div role="treeitem">Node</div></div>',
'<div role="treegrid"><div role="row"><div role="gridcell">Cell</div></div></div>',
'<div role="grid"><div role="row"><div role="gridcell">Cell</div></div></div>',
'<div role="grid"><div role="row"><div role="rowheader">Header</div></div></div>',
'<div role="grid"><div role="row"><div role="columnheader">Header</div></div></div>',
'<div role="radiogroup"><div role="radio">Opt 1</div></div>',
],
invalid: [
{
Expand Down
Loading