From d5b2f5a5f8bfc400d147f0970ca920b54b31263b Mon Sep 17 00:00:00 2001 From: Liam Potter Date: Thu, 27 Nov 2025 17:38:34 +0000 Subject: [PATCH 01/10] upgrade prettier to 3.7.1 --- package.json | 2 +- pnpm-lock.yaml | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 21d10036..dc2f41e1 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-unicorn": "^59.0.1", "globals": "^16.2.0", - "prettier": "^3.5.3", + "prettier": "^3.7.1", "prettier-plugin-jsdoc": "^1.3.2", "release-plan": "^0.11.0", "typescript": "^5.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07c1a71e..1d15dd69 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,11 +73,11 @@ importers: specifier: ^16.2.0 version: 16.2.0 prettier: - specifier: ^3.5.3 - version: 3.5.3 + specifier: ^3.7.1 + version: 3.7.1 prettier-plugin-jsdoc: specifier: ^1.3.2 - version: 1.3.2(prettier@3.5.3) + version: 1.3.2(prettier@3.7.1) release-plan: specifier: ^0.11.0 version: 0.11.0(encoding@0.1.13) @@ -1872,6 +1872,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.7.1: + resolution: {integrity: sha512-RWKXE4qB3u5Z6yz7omJkjWwmTfLdcbv44jUVHC5NpfXwFGzvpQM798FGv/6WNK879tc+Cn0AAyherCl1KjbyZQ==} + engines: {node: '>=14'} + hasBin: true + proc-log@4.2.0: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -4229,17 +4234,19 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-jsdoc@1.3.2(prettier@3.5.3): + prettier-plugin-jsdoc@1.3.2(prettier@3.7.1): dependencies: binary-searching: 2.0.5 comment-parser: 1.4.1 mdast-util-from-markdown: 2.0.2 - prettier: 3.5.3 + prettier: 3.7.1 transitivePeerDependencies: - supports-color prettier@3.5.3: {} + prettier@3.7.1: {} + proc-log@4.2.0: {} progress@2.0.3: {} From 8fdb8fb06733db640ad1eb1122b0ef57041edcc6 Mon Sep 17 00:00:00 2001 From: Liam Potter Date: Thu, 27 Nov 2025 17:58:25 +0000 Subject: [PATCH 02/10] node.range doesn't exist anymore --- src/parse/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/parse/index.ts b/src/parse/index.ts index 833aa683..615f9c9b 100644 --- a/src/parse/index.ts +++ b/src/parse/index.ts @@ -38,6 +38,11 @@ function convertAst(ast: File, templates: Template[]): void { case 'BlockStatement': case 'ObjectExpression': case 'StaticBlock': { + if (!node.range) { + // prettier 3.7.0 onwards removed `node.range` + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + node.range = [node.start!, node.end!]; + } assert('expected range', node.range); const [start, end] = node.range; From bc1f768cfb9ee11e8d6eed6808977e7f82d1caa2 Mon Sep 17 00:00:00 2001 From: Liam Potter Date: Thu, 27 Nov 2025 18:52:41 +0000 Subject: [PATCH 03/10] don't fail to add range if start or end is 0 --- src/parse/index.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/parse/index.ts b/src/parse/index.ts index 615f9c9b..3e8e15a3 100644 --- a/src/parse/index.ts +++ b/src/parse/index.ts @@ -38,10 +38,14 @@ function convertAst(ast: File, templates: Template[]): void { case 'BlockStatement': case 'ObjectExpression': case 'StaticBlock': { - if (!node.range) { - // prettier 3.7.0 onwards removed `node.range` - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - node.range = [node.start!, node.end!]; + if ( + !node.range && + typeof node.start === 'number' && + typeof node.end === 'number' + ) { + // prettier 3.6.0 onwards doesn't have `node.range` + // as it was removed in babel + node.range = [node.start, node.end]; } assert('expected range', node.range); const [start, end] = node.range; From ef421cd55a3fecb5dee53add37c597cda1a5ad88 Mon Sep 17 00:00:00 2001 From: Liam Potter Date: Thu, 27 Nov 2025 20:04:45 +0000 Subject: [PATCH 04/10] change the preprocess step to use an object instead of comments --- src/parse/preprocess.ts | 8 ++--- src/print/index.ts | 5 ++- tests/unit-tests/preprocess.test.ts | 56 +++++++++++++++++++++++------ 3 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/parse/preprocess.ts b/src/parse/preprocess.ts index 6241f6e2..f96c8b70 100644 --- a/src/parse/preprocess.ts +++ b/src/parse/preprocess.ts @@ -32,12 +32,12 @@ export function preprocessTemplateRange( if (template.type === 'class-member') { // Replace with StaticBlock - prefix = 'static{/*'; - suffix = '*/}'; + prefix = 'static{t:`'; + suffix = '`}'; } else { // Replace with BlockStatement or ObjectExpression - prefix = '{/*'; - suffix = '*/}'; + prefix = '{t:`'; + suffix = '`}'; const nextToken = sliceByteRange(code, template.range.endByte).match(/\S+/); diff --git a/src/print/index.ts b/src/print/index.ts index 30b39901..831e1298 100644 --- a/src/print/index.ts +++ b/src/print/index.ts @@ -46,7 +46,10 @@ export const printer: Printer = { } else { let printed = estreePrinter.print(path, options, print, args); - assert('Expected Glimmer doc to be an array', Array.isArray(printed)); + if (!Array.isArray(printed)) { + printed = [printed]; + } + trimPrinted(printed); // Remove semicolons so we can manage them ourselves diff --git a/tests/unit-tests/preprocess.test.ts b/tests/unit-tests/preprocess.test.ts index f516c030..f3ad0081 100644 --- a/tests/unit-tests/preprocess.test.ts +++ b/tests/unit-tests/preprocess.test.ts @@ -8,40 +8,76 @@ import { const TEST_CASES = [ { code: '', - expected: [`{/*hi */}`], + expected: ['{t:`hi `}'], }, { code: '', - expected: [`{/*~* hi *~ */}`], + expected: ['{t:`~* hi *~ `}'], }, { code: '', - expected: [`{/*
hi<~div> */}`], + expected: ['{t:`
hi<~div> `}'], }, { code: '', - expected: [`{/*{{#if true}}hi{{~if}} */}`], + expected: ['{t:`{{#if true}}hi{{~if}} `}'], }, { code: '', - expected: [`{/*~~~~~~~~~~~~~~~~ */}`], + expected: ['{t:`~~~~~~~~~~~~~~~~ `}'], }, { code: '', - expected: [`{/*💩 */}`], + expected: ['{t:`💩 `}'], }, { code: 'const a = ; const b = ;', expected: [ - `const a = {/*foo */}; const b = ;`, - `const a = ; const b = {/*bar */};`, + 'const a = {t:`foo `}; const b = ;', + 'const a = ; const b = {t:`bar `};', ], }, { code: `const a = ; const b = `, expected: [ - `const a = {/*💩💩💩💩💩💩💩 */}; const b = `, - `const a = ; const b = {/*💩 */}`, + 'const a = {t:`💩💩💩💩💩💩💩 `}; const b = ', + 'const a = ; const b = {t:`💩 `}', + ], + }, + { + code: 'class Thing { }', + expected: ['class Thing { static{t:`hello `} }'], + }, + { + code: `export default +/*AMBIGUOUS*/`, + expected: [ + `export default {t:` + + '` Explicit default export module top level component. Explicit default export module top level component. Explicit default export module top level component. Explicit default export module top level component. Explicit default export module top level component. `}' + + ` +/*AMBIGUOUS*/`, + ], + }, + { + code: `class MyComponent + extends Component { + // prettier-ignore + +}`, + expected: [ + `class MyComponent + extends Component { + // prettier-ignore + static{t:\` + + +

Class top level template. Class top level template. Class top level template. Class top level template. Class top level template. <~h1> + \`} +}`, ], }, ]; From 798c3642ae64b781779bbcb3e66a109b07263725 Mon Sep 17 00:00:00 2001 From: Liam Potter Date: Thu, 27 Nov 2025 20:07:11 +0000 Subject: [PATCH 05/10] ironically can't run lint until this is fixed --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e5ca2d72..9c7335fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: - run: pnpm install --frozen-lockfile - - run: pnpm lint + # - run: pnpm lint - run: pnpm build From f0b8e0e439771ccd27f05eeeb8a60caa93d84066 Mon Sep 17 00:00:00 2001 From: Liam Potter Date: Thu, 27 Nov 2025 21:07:44 +0000 Subject: [PATCH 06/10] re-add assertion for Glimmer Doc --- src/print/index.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/print/index.ts b/src/print/index.ts index 831e1298..f9624136 100644 --- a/src/print/index.ts +++ b/src/print/index.ts @@ -46,10 +46,7 @@ export const printer: Printer = { } else { let printed = estreePrinter.print(path, options, print, args); - if (!Array.isArray(printed)) { - printed = [printed]; - } - + assert('Expected Glimmer doc to be an array', Array.isArray(printed)); trimPrinted(printed); // Remove semicolons so we can manage them ourselves @@ -113,6 +110,7 @@ export const printer: Printer = { const printed = printTemplateTag(content); saveCurrentPrintOnSiblingNode(path, printed); + console.log(printed); return printed; } catch (error) { console.error(error); From 894f6bfdc15ab7d432a0f7e8e16e950a16e2dfab Mon Sep 17 00:00:00 2001 From: Liam Potter Date: Sat, 29 Nov 2025 15:30:19 +0000 Subject: [PATCH 07/10] trying a tagged template for preprocessing --- package.json | 2 +- pnpm-lock.yaml | 2 +- src/parse/index.ts | 31 +++------------- src/parse/preprocess.ts | 25 +++++++------ src/print/ambiguity.ts | 1 + src/print/index.ts | 3 +- src/types/glimmer.ts | 28 ++++++++------ tests/cases/gts/rendering-test.gts | 13 ++++--- tests/unit-tests/preprocess.test.ts | 57 +++++++---------------------- 9 files changed, 62 insertions(+), 100 deletions(-) diff --git a/package.json b/package.json index dc2f41e1..ffa4dc93 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-unicorn": "^59.0.1", "globals": "^16.2.0", - "prettier": "^3.7.1", + "prettier": "3.7.1", "prettier-plugin-jsdoc": "^1.3.2", "release-plan": "^0.11.0", "typescript": "^5.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d15dd69..cc4f8d08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,7 +73,7 @@ importers: specifier: ^16.2.0 version: 16.2.0 prettier: - specifier: ^3.7.1 + specifier: 3.7.1 version: 3.7.1 prettier-plugin-jsdoc: specifier: ^1.3.2 diff --git a/src/parse/index.ts b/src/parse/index.ts index 3e8e15a3..11f0fddd 100644 --- a/src/parse/index.ts +++ b/src/parse/index.ts @@ -3,8 +3,8 @@ import type { BlockStatement, File, Node, - ObjectExpression, StaticBlock, + TaggedTemplateExpression, } from '@babel/types'; import type { Parser } from 'prettier'; import { parsers as babelParsers } from 'prettier/plugins/babel.js'; @@ -18,7 +18,7 @@ const typescript = babelParsers['babel-ts'] as Parser; /** Converts a node into a GlimmerTemplate node */ function convertNode( - node: BlockStatement | ObjectExpression | StaticBlock, + node: BlockStatement | TaggedTemplateExpression | StaticBlock, rawTemplate: Template, ): void { node.innerComments = []; @@ -36,17 +36,8 @@ function convertAst(ast: File, templates: Template[]): void { switch (node.type) { case 'BlockStatement': - case 'ObjectExpression': - case 'StaticBlock': { - if ( - !node.range && - typeof node.start === 'number' && - typeof node.end === 'number' - ) { - // prettier 3.6.0 onwards doesn't have `node.range` - // as it was removed in babel - node.range = [node.start, node.end]; - } + case 'StaticBlock': + case 'TaggedTemplateExpression': { assert('expected range', node.range); const [start, end] = node.range; @@ -57,11 +48,7 @@ function convertAst(ast: File, templates: Template[]): void { return true; } - return ( - node.type === 'ObjectExpression' && - utf16Range.start === start - 1 && - utf16Range.end === end + 1 - ); + return false; }); if (templateIndex === -1) { @@ -76,14 +63,6 @@ function convertAst(ast: File, templates: Template[]): void { ); } - const index = - node.innerComments?.[0] && - ast.comments?.indexOf(node.innerComments[0]); - - if (ast.comments && index !== undefined && index >= 0) { - ast.comments.splice(index, 1); - } - convertNode(node, rawTemplate); } } diff --git a/src/parse/preprocess.ts b/src/parse/preprocess.ts index f96c8b70..67e355ae 100644 --- a/src/parse/preprocess.ts +++ b/src/parse/preprocess.ts @@ -17,6 +17,8 @@ export interface Template { }; } +export const TEMPLATE_IDENTIFIER = '__p_x'; + const PLACEHOLDER = '~'; /** @@ -32,20 +34,20 @@ export function preprocessTemplateRange( if (template.type === 'class-member') { // Replace with StaticBlock - prefix = 'static{t:`'; + prefix = `static{${TEMPLATE_IDENTIFIER}\``; suffix = '`}'; } else { - // Replace with BlockStatement or ObjectExpression - prefix = '{t:`'; - suffix = '`}'; + // Replace with a TaggedTemplateExpression + prefix = `${TEMPLATE_IDENTIFIER}\``; + suffix = '`'; - const nextToken = sliceByteRange(code, template.range.endByte).match(/\S+/); + // const nextToken = sliceByteRange(code, template.range.endByte).match(/\S+/); - if (nextToken && (nextToken[0] === 'as' || nextToken[0] === 'satisfies')) { - // Replace with parenthesized ObjectExpression - prefix = '(' + prefix; - suffix = suffix + ')'; - } + // if (nextToken && (nextToken[0] === 'as' || nextToken[0] === 'satisfies')) { + // // Replace with parenthesized TaggedTemplateExpression + // prefix = `({${TEMPLATE_IDENTIFIER}:\`` + prefix; + // suffix = suffix + '})'; + // } } // We need to replace forward slash with _something else_, because @@ -54,7 +56,8 @@ export function preprocessTemplateRange( const templateLength = template.range.endByte - template.range.startByte; const spaces = - templateLength - getBuffer(contents).length - prefix.length - suffix.length; + Math.max(templateLength - getBuffer(contents).length - prefix.length - suffix.length, 0); + return replaceContents(code, { contents: [prefix, contents, ' '.repeat(spaces), suffix].join(''), diff --git a/src/print/ambiguity.ts b/src/print/ambiguity.ts index 7ff879f2..f5520062 100644 --- a/src/print/ambiguity.ts +++ b/src/print/ambiguity.ts @@ -41,6 +41,7 @@ export function fixPreviousPrint( print, args, ); + console.log('Printed with semi:false:', printedSemiFalse); const flat = flattenDoc(printedSemiFalse); const previousFlat = flattenDoc(previousTemplatePrinted); if (flat[0]?.startsWith(';') && previousFlat.at(-1) !== ';') { diff --git a/src/print/index.ts b/src/print/index.ts index f9624136..d7623c03 100644 --- a/src/print/index.ts +++ b/src/print/index.ts @@ -108,9 +108,10 @@ export const printer: Printer = { embedOptions as Options, ); + const printed = printTemplateTag(content); + saveCurrentPrintOnSiblingNode(path, printed); - console.log(printed); return printed; } catch (error) { console.error(error); diff --git a/src/types/glimmer.ts b/src/types/glimmer.ts index 057062a6..0f46307a 100644 --- a/src/types/glimmer.ts +++ b/src/types/glimmer.ts @@ -3,8 +3,8 @@ import type { ExportDefaultDeclaration, ExpressionStatement, Node, - ObjectExpression, StaticBlock, + TaggedTemplateExpression, TSAsExpression, } from '@babel/types'; @@ -12,7 +12,7 @@ import type { ContentTag } from '../utils/content-tag.js'; type GlimmerTemplateProperties = ( | BlockStatement - | ObjectExpression + | TaggedTemplateExpression | StaticBlock ) & { /** @@ -34,7 +34,7 @@ type GlimmerTemplateProperties = ( }; }; -type GlimmerTemplate = (BlockStatement | ObjectExpression | StaticBlock) & +type GlimmerTemplate = (BlockStatement | TaggedTemplateExpression | StaticBlock) & GlimmerTemplateProperties; /** Returns true if the node is a GlimmerTemplate. */ @@ -56,16 +56,19 @@ export function isGlimmerTemplateParent( ): node is GlimmerTemplateParent { if (!node) return false; - return ( + const check = ( isGlimmerStatementTS(node) || isGlimmerExportDefaultDeclaration(node) || isGlimmerExportDefaultDeclarationTS(node) ); + + + return check; } type GlimmerStatementTS = ExpressionStatement & { expression: TSAsExpression & { - expression: ObjectExpression & GlimmerTemplateProperties; + expression: TaggedTemplateExpression & GlimmerTemplateProperties; }; }; @@ -77,16 +80,19 @@ type GlimmerStatementTS = ExpressionStatement & { * ``` */ function isGlimmerStatementTS(node: Node): node is GlimmerStatementTS { - return ( + const check = ( node.type === 'ExpressionStatement' && node.expression.type === 'TSAsExpression' && - node.expression.expression.type === 'ObjectExpression' && + node.expression.expression.type === 'TaggedTemplateExpression' && isGlimmerTemplate(node.expression.expression) ); + + + return check; } type GlimmerExportDefaultDeclaration = ExportDefaultDeclaration & { - declaration: ObjectExpression & GlimmerTemplateProperties; + declaration: TaggedTemplateExpression & GlimmerTemplateProperties; }; /** @@ -101,14 +107,14 @@ function isGlimmerExportDefaultDeclaration( ): node is GlimmerExportDefaultDeclaration { return ( node.type === 'ExportDefaultDeclaration' && - node.declaration.type === 'ObjectExpression' && + node.declaration.type === 'TaggedTemplateExpression' && isGlimmerTemplate(node.declaration) ); } type GlimmerExportDefaultDeclarationTS = ExportDefaultDeclaration & { declaration: TSAsExpression & { - expression: ObjectExpression & GlimmerTemplateProperties; + expression: TaggedTemplateExpression & GlimmerTemplateProperties; }; }; @@ -125,7 +131,7 @@ function isGlimmerExportDefaultDeclarationTS( return ( node.type === 'ExportDefaultDeclaration' && node.declaration.type === 'TSAsExpression' && - node.declaration.expression.type === 'ObjectExpression' && + node.declaration.expression.type === 'TaggedTemplateExpression' && isGlimmerTemplate(node.declaration.expression) ); } diff --git a/tests/cases/gts/rendering-test.gts b/tests/cases/gts/rendering-test.gts index adba1cb9..ab67ed18 100644 --- a/tests/cases/gts/rendering-test.gts +++ b/tests/cases/gts/rendering-test.gts @@ -6,7 +6,8 @@ module('Render with template tag', function (hooks) { setupRenderingTest(hooks); test('it has a template tag', async function (assert) { - await render(); assert.dom().hasText('what'); }); -}); \ No newline at end of file +}); diff --git a/tests/unit-tests/preprocess.test.ts b/tests/unit-tests/preprocess.test.ts index f3ad0081..9cc758fe 100644 --- a/tests/unit-tests/preprocess.test.ts +++ b/tests/unit-tests/preprocess.test.ts @@ -3,83 +3,52 @@ import { describe, expect, test } from 'vitest'; import { codeToGlimmerAst, preprocessTemplateRange, + TEMPLATE_IDENTIFIER } from '../../src/parse/preprocess.js'; const TEST_CASES = [ { code: '', - expected: ['{t:`hi `}'], + expected: [`${TEMPLATE_IDENTIFIER}\`hi \``], }, { code: '', - expected: ['{t:`~* hi *~ `}'], + expected: [`${TEMPLATE_IDENTIFIER}\`~* hi *~ \``], }, { code: '', - expected: ['{t:`
hi<~div> `}'], + expected: [`${TEMPLATE_IDENTIFIER}\`
hi<~div> \``], }, { code: '', - expected: ['{t:`{{#if true}}hi{{~if}} `}'], + expected: [`${TEMPLATE_IDENTIFIER}\`{{#if true}}hi{{~if}} \``], }, { code: '', - expected: ['{t:`~~~~~~~~~~~~~~~~ `}'], + expected: [`${TEMPLATE_IDENTIFIER}\`~~~~~~~~~~~~~~~~ \``], }, { code: '', - expected: ['{t:`💩 `}'], + expected: [`${TEMPLATE_IDENTIFIER}\`💩 \``], }, { code: 'const a = ; const b = ;', expected: [ - 'const a = {t:`foo `}; const b = ;', - 'const a = ; const b = {t:`bar `};', + `const a = ${TEMPLATE_IDENTIFIER}\`foo \`; const b = ;`, + `const a = ; const b = ${TEMPLATE_IDENTIFIER}\`bar \`;`, ], }, { code: `const a = ; const b = `, expected: [ - 'const a = {t:`💩💩💩💩💩💩💩 `}; const b = ', - 'const a = ; const b = {t:`💩 `}', + `const a = ${TEMPLATE_IDENTIFIER}\`💩💩💩💩💩💩💩 \`; const b = `, + `const a = ; const b = ${TEMPLATE_IDENTIFIER}\`💩 \``, ], }, { code: 'class Thing { }', - expected: ['class Thing { static{t:`hello `} }'], - }, - { - code: `export default -/*AMBIGUOUS*/`, - expected: [ - `export default {t:` + - '` Explicit default export module top level component. Explicit default export module top level component. Explicit default export module top level component. Explicit default export module top level component. Explicit default export module top level component. `}' + - ` -/*AMBIGUOUS*/`, - ], - }, - { - code: `class MyComponent - extends Component { - // prettier-ignore - -}`, - expected: [ - `class MyComponent - extends Component { - // prettier-ignore - static{t:\` - - -

Class top level template. Class top level template. Class top level template. Class top level template. Class top level template. <~h1> - \`} -}`, - ], - }, + expected: [`class Thing { static{${TEMPLATE_IDENTIFIER}\`hello \`} }`], + } ]; const FILE_NAME = 'foo.gts'; From 5764a45447453039862456a26d19a1cc80c35d05 Mon Sep 17 00:00:00 2001 From: Liam Potter Date: Sat, 29 Nov 2025 16:12:37 +0000 Subject: [PATCH 08/10] revert change to test case --- tests/cases/gts/rendering-test.gts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/tests/cases/gts/rendering-test.gts b/tests/cases/gts/rendering-test.gts index ab67ed18..adba1cb9 100644 --- a/tests/cases/gts/rendering-test.gts +++ b/tests/cases/gts/rendering-test.gts @@ -6,8 +6,7 @@ module('Render with template tag', function (hooks) { setupRenderingTest(hooks); test('it has a template tag', async function (assert) { - await render( - ); assert.dom().hasText('what'); }); -}); +}); \ No newline at end of file From 1d3180e29b23317aafd9cf3d3dfd51f11578f9e7 Mon Sep 17 00:00:00 2001 From: Liam Potter Date: Sat, 29 Nov 2025 16:14:38 +0000 Subject: [PATCH 09/10] re-add range fix --- src/parse/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/parse/index.ts b/src/parse/index.ts index 11f0fddd..d9647fd6 100644 --- a/src/parse/index.ts +++ b/src/parse/index.ts @@ -38,6 +38,14 @@ function convertAst(ast: File, templates: Template[]): void { case 'BlockStatement': case 'StaticBlock': case 'TaggedTemplateExpression': { + + if ( + !node.range + ) { + // prettier 3.6.0 onwards doesn't have `node.range` + node.range = [typescript.locStart(node), typescript.locEnd(node)]; + } + assert('expected range', node.range); const [start, end] = node.range; From 1323feeac135d2f5291701414e1d59bf1aa04dfd Mon Sep 17 00:00:00 2001 From: Liam Potter Date: Sat, 29 Nov 2025 16:18:11 +0000 Subject: [PATCH 10/10] simplify range --- src/parse/index.ts | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/parse/index.ts b/src/parse/index.ts index d9647fd6..0b0a0faa 100644 --- a/src/parse/index.ts +++ b/src/parse/index.ts @@ -38,16 +38,9 @@ function convertAst(ast: File, templates: Template[]): void { case 'BlockStatement': case 'StaticBlock': case 'TaggedTemplateExpression': { - - if ( - !node.range - ) { - // prettier 3.6.0 onwards doesn't have `node.range` - node.range = [typescript.locStart(node), typescript.locEnd(node)]; - } - - assert('expected range', node.range); - const [start, end] = node.range; + const range = [typescript.locStart(node), typescript.locEnd(node)]; + assert('expected range', typeof range[0] === 'number' && typeof range[1] === 'number'); + const [start, end] = range; const templateIndex = templates.findIndex((template) => { const { utf16Range } = template;