Skip to content
Merged
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
7 changes: 6 additions & 1 deletion src/parser/transforms.js
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,11 @@ export const replaceRange = function replaceRange(s, start, end, substitute) {
return s.slice(0, start) + substitute + s.slice(end);
};

function maskTemplateContentForLint(content) {
// Preserve line endings and UTF-16 length, but remove template syntax from the JS placeholder.
return content.replace(/[^\r\n]/g, ' ');
}

const processor = new Preprocessor();

class EmberParserError extends Error {
Expand Down Expand Up @@ -332,7 +337,7 @@ export function transformForLint(code, fileName) {
// Build placeholder JS inline (same format as ember-estree's toPlaceholderJS)
let jsCode = code;
for (const tplInfo of [...result].reverse()) {
const content = tplInfo.contents.replace(/`/g, '\\`').replace(/\$/g, '\\$');
const content = maskTemplateContentForLint(tplInfo.contents);
const start = tplInfo.range.startUtf16Codepoint;
const end = tplInfo.range.endUtf16Codepoint;
const tplLength = end - start;
Expand Down
19 changes: 18 additions & 1 deletion tests/parser.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { beforeAll, describe, expect, it } from 'vitest';
import { parseForESLint } from '../src/parser/gjs-gts-parser.js';
import { replaceExtensions } from '../src/parser/ts-patch.js';
import { traverse } from '../src/parser/transforms.js';
import { transformForLint, traverse } from '../src/parser/transforms.js';
import { SourceCode } from 'eslint';
import { visitorKeys as tsVisitors } from '@typescript-eslint/visitor-keys';
import { visitorKeys as glimmerVisitorKeys } from '@glimmer/syntax';
Expand Down Expand Up @@ -2384,6 +2384,23 @@ export const NotFound = <template>
}
});

it('transforms class templates with backtick-only comments for linting', () => {
const code = [
"import Component from '@glimmer/component';",
'',
'export default class MyComponent extends Component {',
' <template>',
' {{! `asd` `qwe` `zxc` `undefined` `asd` }}',
' {{! `@foo` }}',
' </template>',
'}',
].join('\n');

const { output } = transformForLint(code, 'example.gts');

expect(output).toHaveLength(code.length);
});

it('svg elements are not added to global scope', () => {
result = parseForESLint(
`<template>
Expand Down
Loading