From c290031c941b413c60dc6b62786c69b5d37a8331 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 13 Mar 2025 02:02:35 +0800 Subject: [PATCH 1/3] fix: fix location for template literals --- package.json | 8 ++++---- src/transform-node.ts | 23 ++++++---------------- tests/transform.test.ts | 3 +++ yarn.lock | 43 ++++++++++++++++++++++++++++++----------- 4 files changed, 45 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index 08acecd8..53314b3f 100644 --- a/package.json +++ b/package.json @@ -27,10 +27,10 @@ "release": "yarn build && standard-version" }, "devDependencies": { - "@angular/compiler": "19.2.1", + "@angular/compiler": "19.2.2", "@babel/code-frame": "7.26.2", - "@babel/parser": "7.26.9", - "@babel/types": "7.26.9", + "@babel/parser": "7.26.10", + "@babel/types": "7.26.10", "@types/babel__code-frame": "7.0.6", "@types/node": "22.13.10", "@vitest/coverage-v8": "3.0.8", @@ -50,7 +50,7 @@ "vitest": "3.0.8" }, "peerDependencies": { - "@angular/compiler": "^19.0.0" + "@angular/compiler": ">=19.2.2" }, "engines": { "node": ">= 20" diff --git a/src/transform-node.ts b/src/transform-node.ts index 7847db0c..97a8b4bd 100644 --- a/src/transform-node.ts +++ b/src/transform-node.ts @@ -555,24 +555,13 @@ class Transformer extends Source { } if (node instanceof angular.TemplateLiteralElement) { - const templateLiteral = options!.parent! as angular.TemplateLiteral; - const elementIndex = templateLiteral.elements.indexOf(node); + const { elements } = options!.parent! as angular.TemplateLiteral; + const elementIndex = elements.indexOf(node); const isFirst = elementIndex === 0; - const isLast = elementIndex === templateLiteral.elements.length - 1; - - // The `TemplateLiteralElement` don't have correct location information - const start = isFirst - ? templateLiteral.sourceSpan.start + 1 - : node.sourceSpan.start; - let end; - if (isLast) { - end = templateLiteral.sourceSpan.end - 1; - } else { - const nextExpression = templateLiteral.expressions[elementIndex]; - // TODO: Support search multiple characters in `getCharacterLastIndex()` - // FIXME: Search `${` instead - end = this.getCharacterLastIndex('$', nextExpression.sourceSpan.start); - } + const isLast = elementIndex === elements.length - 1; + + const end = node.sourceSpan.end - (isLast ? 1 : 0); + const start = node.sourceSpan.start + (isFirst ? 1 : 0); const raw = this.text.slice(start, end); return this.#create( diff --git a/tests/transform.test.ts b/tests/transform.test.ts index 70401353..226f835d 100644 --- a/tests/transform.test.ts +++ b/tests/transform.test.ts @@ -96,6 +96,9 @@ describe.each` ${'PrefixNot'} | ${'UnaryExpression'} | ${' ! ( typeof {} === "number" ) '} | ${true} | ${true} | ${true} | ${true} ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' ` a ${ b } \u0063 ` '} | ${true} | ${true} | ${true} | ${true} ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' ( ` a ${ b } \u0063 ` ) '} | ${true} | ${true} | ${true} | ${true} + ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' ` \u0063 ` '} | ${true} | ${true} | ${true} | ${true} + ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' ` ` '} | ${true} | ${true} | ${true} | ${true} + ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' `` '} | ${true} | ${true} | ${true} | ${true} `('($expectedAngularType -> $expectedEstreeType)', (fields) => { for (const method of PARSE_METHODS) { testSection(method, fields); diff --git a/yarn.lock b/yarn.lock index b457a970..fd5490f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,17 +15,17 @@ __metadata: languageName: node linkType: hard -"@angular/compiler@npm:19.2.1": - version: 19.2.1 - resolution: "@angular/compiler@npm:19.2.1" +"@angular/compiler@npm:19.2.2": + version: 19.2.2 + resolution: "@angular/compiler@npm:19.2.2" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 19.2.1 + "@angular/core": 19.2.2 peerDependenciesMeta: "@angular/core": optional: true - checksum: 10/24d094e6f6653e20bd554a1b38488b6e6f752ec65491dd77135fc8b7ac03020f64ed967e21fd9ea38a5e644e7e90e84cf8da24d31ef905944cbafa34c05a31bb + checksum: 10/2c427e4e4696f8ce357e432a517d12a0730f9cbdb1306b5be49f9d4f7bd54b76442cfaba8f82579152bc814402e5f666bb5092c994f43c3022bb9a93e8d64db6 languageName: node linkType: hard @@ -54,7 +54,18 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:7.26.9, @babel/parser@npm:^7.25.4": +"@babel/parser@npm:7.26.10": + version: 7.26.10 + resolution: "@babel/parser@npm:7.26.10" + dependencies: + "@babel/types": "npm:^7.26.10" + bin: + parser: ./bin/babel-parser.js + checksum: 10/3f87781f46795ba72448168061d9e99c394fdf9cd4aa3ddf053a06334247da4d25d0923ccc89195937d3360d384cee181e99711763c1e8fe81d4f17ee22541fc + languageName: node + linkType: hard + +"@babel/parser@npm:^7.25.4": version: 7.26.9 resolution: "@babel/parser@npm:7.26.9" dependencies: @@ -65,7 +76,17 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:7.26.9, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.9": +"@babel/types@npm:7.26.10, @babel/types@npm:^7.26.10": + version: 7.26.10 + resolution: "@babel/types@npm:7.26.10" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10/6b4f24ee77af853c2126eaabb65328cd44a7d6f439685131cf929c30567e01b6ea2e5d5653b2c304a09c63a5a6199968f0e27228a007acf35032036d79a9dee6 + languageName: node + linkType: hard + +"@babel/types@npm:^7.25.4, @babel/types@npm:^7.26.9": version: 7.26.9 resolution: "@babel/types@npm:7.26.9" dependencies: @@ -989,10 +1010,10 @@ __metadata: version: 0.0.0-use.local resolution: "angular-estree-parser@workspace:." dependencies: - "@angular/compiler": "npm:19.2.1" + "@angular/compiler": "npm:19.2.2" "@babel/code-frame": "npm:7.26.2" - "@babel/parser": "npm:7.26.9" - "@babel/types": "npm:7.26.9" + "@babel/parser": "npm:7.26.10" + "@babel/types": "npm:7.26.10" "@types/babel__code-frame": "npm:7.0.6" "@types/node": "npm:22.13.10" "@vitest/coverage-v8": "npm:3.0.8" @@ -1011,7 +1032,7 @@ __metadata: typescript-eslint: "npm:8.26.1" vitest: "npm:3.0.8" peerDependencies: - "@angular/compiler": ^19.0.0 + "@angular/compiler": ^19.2.2 languageName: unknown linkType: soft From ddd5abb5270a5deb3a570b3475b78e0325ee2605 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 13 Mar 2025 02:09:10 +0800 Subject: [PATCH 2/3] chore: dedupe --- yarn.lock | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/yarn.lock b/yarn.lock index fd5490f3..1d705ffd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,7 +54,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:7.26.10": +"@babel/parser@npm:7.26.10, @babel/parser@npm:^7.25.4": version: 7.26.10 resolution: "@babel/parser@npm:7.26.10" dependencies: @@ -65,18 +65,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.25.4": - version: 7.26.9 - resolution: "@babel/parser@npm:7.26.9" - dependencies: - "@babel/types": "npm:^7.26.9" - bin: - parser: ./bin/babel-parser.js - checksum: 10/cb84fe3ba556d6a4360f3373cf7eb0901c46608c8d77330cc1ca021d60f5d6ebb4056a8e7f9dd0ef231923ef1fe69c87b11ce9e160d2252e089a20232a2b942b - languageName: node - linkType: hard - -"@babel/types@npm:7.26.10, @babel/types@npm:^7.26.10": +"@babel/types@npm:7.26.10, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.10": version: 7.26.10 resolution: "@babel/types@npm:7.26.10" dependencies: @@ -86,16 +75,6 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.25.4, @babel/types@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/types@npm:7.26.9" - dependencies: - "@babel/helper-string-parser": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10/11b62ea7ed64ef7e39cc9b33852c1084064c3b970ae0eaa5db659241cfb776577d1e68cbff4de438bada885d3a827b52cc0f3746112d8e1bc672bb99a8eb5b56 - languageName: node - linkType: hard - "@bcoe/v8-coverage@npm:^1.0.2": version: 1.0.2 resolution: "@bcoe/v8-coverage@npm:1.0.2" @@ -1032,7 +1011,7 @@ __metadata: typescript-eslint: "npm:8.26.1" vitest: "npm:3.0.8" peerDependencies: - "@angular/compiler": ^19.2.2 + "@angular/compiler": ">=19.2.2" languageName: unknown linkType: soft From 90ac6d8fb37696d6a59a28a205232686999ed111 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 13 Mar 2025 02:10:52 +0800 Subject: [PATCH 3/3] Fix --- tests/transform.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/transform.test.ts b/tests/transform.test.ts index 226f835d..d44eef2b 100644 --- a/tests/transform.test.ts +++ b/tests/transform.test.ts @@ -97,7 +97,7 @@ describe.each` ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' ` a ${ b } \u0063 ` '} | ${true} | ${true} | ${true} | ${true} ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' ( ` a ${ b } \u0063 ` ) '} | ${true} | ${true} | ${true} | ${true} ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' ` \u0063 ` '} | ${true} | ${true} | ${true} | ${true} - ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' ` ` '} | ${true} | ${true} | ${true} | ${true} + ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' ( ( ` ` ) ) '} | ${true} | ${true} | ${true} | ${true} ${'TemplateLiteral'} | ${'TemplateLiteral'} | ${' `` '} | ${true} | ${true} | ${true} | ${true} `('($expectedAngularType -> $expectedEstreeType)', (fields) => { for (const method of PARSE_METHODS) {