Skip to content

Commit 3a083b2

Browse files
authored
Support @angular/compiler 21.2 (#368)
1 parent ef29775 commit 3a083b2

File tree

10 files changed

+68
-20
lines changed

10 files changed

+68
-20
lines changed

.vscode/extensions.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"recommendations": [
3-
"prettier.prettier-vscode",
3+
"esbenp.prettier-vscode",
44
"editorconfig.editorconfig",
55
"dbaeumer.vscode-eslint",
66
"streetsidesoftware.code-spell-checker"

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"editor.codeActionsOnSave": ["source.fixAll.eslint"]
44
},
55
"[javascript][typescript][markdown][json][jsonc][json5][yaml]": {
6-
"editor.defaultFormatter": "prettier.prettier-vscode",
6+
"editor.defaultFormatter": "esbenp.prettier-vscode",
77
"editor.formatOnSave": true
88
},
99
"editor.codeActionsOnSave": {

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"release": "release-it"
3333
},
3434
"devDependencies": {
35-
"@angular/compiler": "21.1.0",
35+
"@angular/compiler": "21.2.0-next.0",
3636
"@babel/code-frame": "8.0.0-beta.4",
3737
"@babel/parser": "8.0.0-beta.4",
3838
"@babel/types": "8.0.0-beta.4",
@@ -54,7 +54,7 @@
5454
"vitest": "4.0.17"
5555
},
5656
"peerDependencies": {
57-
"@angular/compiler": ">=21.0.7 || >= 21.1.0-0"
57+
"@angular/compiler": ">=21.0.7 || >= 21.2.0-0"
5858
},
5959
"engines": {
6060
"node": ">= 20"

src/ast-transform/node-transformer.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1-
import {
2-
type AST,
3-
EmptyExpr,
4-
ParenthesizedExpression,
5-
} from '@angular/compiler';
1+
import { type AST, ParenthesizedExpression } from '@angular/compiler';
62

73
import {
84
type IncompleteNode,
95
type RawLocationInformation,
106
Source,
117
} from '../source.ts';
12-
import type { NGEmptyExpression, NGNode } from './node-types.ts';
8+
import type { NGNode } from './node-types.ts';
139
import { transformVisitors } from './visitors.ts';
1410

1511
export class NodeTransformer extends Source {
@@ -62,10 +58,6 @@ export class NodeTransformer extends Source {
6258

6359
transform<T extends NGNode>() {
6460
const { node } = this;
65-
if (node instanceof EmptyExpr) {
66-
return this.create<NGEmptyExpression>({ type: 'NGEmptyExpression' }) as T;
67-
}
68-
6961
const properties = node.visit(transformVisitors, this);
7062
return this.create(properties, this.node) as T;
7163
}

src/ast-transform/transforms/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
export * from './transform-array-expression.ts';
2+
export * from './transform-arrow-function-expression.ts';
23
export * from './transform-ast-with-source.ts';
34
export * from './transform-binary-expression.ts';
45
export * from './transform-call-expression.ts';
56
export * from './transform-chained-expression.ts';
67
export * from './transform-conditional-expression.ts';
8+
export * from './transform-empty-expression.ts';
79
export * from './transform-interpolation.ts';
810
export * from './transform-literal.ts';
911
export * from './transform-member-expression.ts';
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { type ArrowFunction, type AstVisitor } from '@angular/compiler';
2+
import type * as babel from '@babel/types';
3+
4+
import { type NodeTransformer } from '../node-transformer.ts';
5+
6+
const commonProperties = {
7+
id: null,
8+
generator: false,
9+
async: false,
10+
expression: true,
11+
} as const;
12+
13+
export const visitArrowFunction: AstVisitor['visitArrowFunction'] = (
14+
node: ArrowFunction,
15+
transformer: NodeTransformer,
16+
): babel.ArrowFunctionExpression & { id: null } => ({
17+
type: 'ArrowFunctionExpression',
18+
params: node.parameters.map((parameter) =>
19+
transformer.createNode<babel.Identifier>(
20+
{ type: 'Identifier', name: parameter.name },
21+
parameter.sourceSpan,
22+
),
23+
),
24+
body: transformer.transformChild<babel.Expression>(node.body),
25+
...commonProperties,
26+
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import type { NGEmptyExpression } from '../../types.ts';
2+
3+
export const visitEmptyExpr = (): Omit<
4+
NGEmptyExpression,
5+
'start' | 'end' | 'range'
6+
> => ({ type: 'NGEmptyExpression' });

tests/helpers.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ export function massageAst(ast: any, parser: 'babel' | 'angular'): any {
4646
delete ast.extra.trailingComma;
4747
}
4848

49+
if (
50+
ast.type === 'ArrowFunctionExpression' &&
51+
!Object.hasOwn(ast, 'expression')
52+
) {
53+
ast.expression = ast.body.type !== 'BlockStatement';
54+
}
55+
4956
delete ast.loc;
5057
}
5158

tests/transform.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ const testCases: TestCase[] = [
4242
expectedEstreeType: 'BinaryExpression',
4343
text: ' ( ( ( ( a ) ) in ( ( b ) ) ) ) ',
4444
},
45+
{
46+
expectedAngularType: 'Binary',
47+
expectedEstreeType: 'BinaryExpression',
48+
text: ' ( ( ( ( a ) ) instanceof ( ( b ) ) ) ) ',
49+
},
4550
{
4651
expectedAngularType: 'Binary',
4752
expectedEstreeType: 'LogicalExpression',
@@ -495,6 +500,16 @@ const testCases: TestCase[] = [
495500
expectedEstreeType: 'ObjectExpression',
496501
text: ' ( ( {foo: tag ` a ${ b } ` } ) ) ',
497502
},
503+
{
504+
expectedAngularType: 'ArrowFunction',
505+
expectedEstreeType: 'ArrowFunctionExpression',
506+
text: ' ( ( () => ( ( 1 ) ) ) ) ',
507+
},
508+
{
509+
expectedAngularType: 'ArrowFunction',
510+
expectedEstreeType: 'ArrowFunctionExpression',
511+
text: ' ( ( (a, b ) => ( ( 1 ) ) ) ) ',
512+
},
498513
];
499514

500515
const IS_CI = Boolean(process.env.CI);

yarn.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ __metadata:
55
version: 8
66
cacheKey: 10
77

8-
"@angular/compiler@npm:21.1.0":
9-
version: 21.1.0
10-
resolution: "@angular/compiler@npm:21.1.0"
8+
"@angular/compiler@npm:21.2.0-next.0":
9+
version: 21.2.0-next.0
10+
resolution: "@angular/compiler@npm:21.2.0-next.0"
1111
dependencies:
1212
tslib: "npm:^2.3.0"
13-
checksum: 10/1f409c20eb36079719e004f9e683a41d9d9fd975d814132faa28f941a0d491ba392c7cca92061f8dbe540bd922cac905f76ccab48a87c82c764b3b7cdb6b28dd
13+
checksum: 10/61e5c75eff50de8ffcb3098fbbab7dbe3da885db5939d99965ab54cab1649771dc35dd57de0c7af0031a410f273afaac436ee66c63c639eb455175d38311b74a
1414
languageName: node
1515
linkType: hard
1616

@@ -1671,7 +1671,7 @@ __metadata:
16711671
version: 0.0.0-use.local
16721672
resolution: "angular-estree-parser@workspace:."
16731673
dependencies:
1674-
"@angular/compiler": "npm:21.1.0"
1674+
"@angular/compiler": "npm:21.2.0-next.0"
16751675
"@babel/code-frame": "npm:8.0.0-beta.4"
16761676
"@babel/parser": "npm:8.0.0-beta.4"
16771677
"@babel/types": "npm:8.0.0-beta.4"
@@ -1692,7 +1692,7 @@ __metadata:
16921692
typescript-eslint: "npm:8.53.0"
16931693
vitest: "npm:4.0.17"
16941694
peerDependencies:
1695-
"@angular/compiler": ">=21.0.7 || >= 21.1.0-0"
1695+
"@angular/compiler": ">=21.0.7 || >= 21.2.0-0"
16961696
languageName: unknown
16971697
linkType: soft
16981698

0 commit comments

Comments
 (0)