Skip to content

Commit f8255e4

Browse files
Merge pull request #2671 from johanrd/night_fix/template-no-outlet-outside-routes
Post-merge-review: Fix `template-no-outlet-outside-routes` false positive on imported `outlet`
2 parents 7396916 + af2d310 commit f8255e4

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

lib/rules/template-no-outlet-outside-routes.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,33 @@ module.exports = {
5151
},
5252

5353
create(context) {
54+
const sourceCode = context.sourceCode;
5455
const filename = context.filename;
5556

5657
const routeTemplate = isRouteTemplate(filename);
5758

59+
function isJsScopeVariable(node) {
60+
if (!sourceCode || !node.path?.original) {
61+
return false;
62+
}
63+
const name = node.path.original;
64+
try {
65+
let scope = sourceCode.getScope(node);
66+
while (scope) {
67+
if (scope.variables.some((v) => v.name === name)) {
68+
return true;
69+
}
70+
scope = scope.upper;
71+
}
72+
} catch {
73+
// sourceCode.getScope may not be available in .hbs-only mode; ignore.
74+
}
75+
return false;
76+
}
77+
5878
function checkForOutlet(node) {
5979
if (node.path.type === 'GlimmerPathExpression' && node.path.original === 'outlet') {
60-
if (!routeTemplate) {
80+
if (!routeTemplate && !isJsScopeVariable(node)) {
6181
context.report({
6282
node,
6383
messageId: 'noOutletOutsideRoutes',

tests/lib/rules/template-no-outlet-outside-routes.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@ ruleTester.run('template-no-outlet-outside-routes', rule, {
3030
filename: 'app/routes/foo.gjs',
3131
code: '<template>{{#outlet}}content{{/outlet}}</template>',
3232
},
33+
// GJS/GTS: imported JS bindings are not flagged
34+
{
35+
filename: 'app/components/my-component.gjs',
36+
code: `import outlet from './my-outlet';
37+
export default <template>{{outlet}}</template>;`,
38+
},
39+
{
40+
filename: 'app/components/my-component.gts',
41+
code: `import outlet from '@company/ui';
42+
export default <template>{{outlet}}</template>;`,
43+
},
3344
],
3445
invalid: [
3546
// Co-located component (explicit filename)

0 commit comments

Comments
 (0)