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
2 changes: 1 addition & 1 deletion .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"recommendations": [
"prettier.prettier-vscode",
"esbenp.prettier-vscode",
"editorconfig.editorconfig",
"dbaeumer.vscode-eslint",
"streetsidesoftware.code-spell-checker"
Expand Down
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"editor.codeActionsOnSave": ["source.fixAll.eslint"]
},
"[javascript][typescript][markdown][json][jsonc][json5][yaml]": {
"editor.defaultFormatter": "prettier.prettier-vscode",
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"editor.codeActionsOnSave": {
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
"release": "release-it"
},
"devDependencies": {
"@angular/compiler": "21.1.0",
"@angular/compiler": "21.2.0-next.0",
"@babel/code-frame": "8.0.0-beta.4",
"@babel/parser": "8.0.0-beta.4",
"@babel/types": "8.0.0-beta.4",
Expand All @@ -54,7 +54,7 @@
"vitest": "4.0.17"
},
"peerDependencies": {
"@angular/compiler": ">=21.0.7 || >= 21.1.0-0"
"@angular/compiler": ">=21.0.7 || >= 21.2.0-0"
},
"engines": {
"node": ">= 20"
Expand Down
12 changes: 2 additions & 10 deletions src/ast-transform/node-transformer.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
import {
type AST,
EmptyExpr,
ParenthesizedExpression,
} from '@angular/compiler';
import { type AST, ParenthesizedExpression } from '@angular/compiler';

import {
type IncompleteNode,
type RawLocationInformation,
Source,
} from '../source.ts';
import type { NGEmptyExpression, NGNode } from './node-types.ts';
import type { NGNode } from './node-types.ts';
import { transformVisitors } from './visitors.ts';

export class NodeTransformer extends Source {
Expand Down Expand Up @@ -62,10 +58,6 @@ export class NodeTransformer extends Source {

transform<T extends NGNode>() {
const { node } = this;
if (node instanceof EmptyExpr) {
return this.create<NGEmptyExpression>({ type: 'NGEmptyExpression' }) as T;
}

const properties = node.visit(transformVisitors, this);
return this.create(properties, this.node) as T;
}
Expand Down
2 changes: 2 additions & 0 deletions src/ast-transform/transforms/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
export * from './transform-array-expression.ts';
export * from './transform-arrow-function-expression.ts';
export * from './transform-ast-with-source.ts';
export * from './transform-binary-expression.ts';
export * from './transform-call-expression.ts';
export * from './transform-chained-expression.ts';
export * from './transform-conditional-expression.ts';
export * from './transform-empty-expression.ts';
export * from './transform-interpolation.ts';
export * from './transform-literal.ts';
export * from './transform-member-expression.ts';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { type ArrowFunction, type AstVisitor } from '@angular/compiler';
import type * as babel from '@babel/types';

import { type NodeTransformer } from '../node-transformer.ts';

const commonProperties = {
id: null,
generator: false,
async: false,
expression: true,
} as const;

export const visitArrowFunction: AstVisitor['visitArrowFunction'] = (
node: ArrowFunction,
transformer: NodeTransformer,
): babel.ArrowFunctionExpression & { id: null } => ({
type: 'ArrowFunctionExpression',
params: node.parameters.map((parameter) =>
transformer.createNode<babel.Identifier>(
{ type: 'Identifier', name: parameter.name },
parameter.sourceSpan,
),
),
body: transformer.transformChild<babel.Expression>(node.body),
...commonProperties,
});
6 changes: 6 additions & 0 deletions src/ast-transform/transforms/transform-empty-expression.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import type { NGEmptyExpression } from '../../types.ts';

export const visitEmptyExpr = (): Omit<
NGEmptyExpression,
'start' | 'end' | 'range'
> => ({ type: 'NGEmptyExpression' });
7 changes: 7 additions & 0 deletions tests/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,13 @@ export function massageAst(ast: any, parser: 'babel' | 'angular'): any {
delete ast.extra.trailingComma;
}

if (
ast.type === 'ArrowFunctionExpression' &&
!Object.hasOwn(ast, 'expression')
) {
ast.expression = ast.body.type !== 'BlockStatement';
}

delete ast.loc;
}

Expand Down
15 changes: 15 additions & 0 deletions tests/transform.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ const testCases: TestCase[] = [
expectedEstreeType: 'BinaryExpression',
text: ' ( ( ( ( a ) ) in ( ( b ) ) ) ) ',
},
{
expectedAngularType: 'Binary',
expectedEstreeType: 'BinaryExpression',
text: ' ( ( ( ( a ) ) instanceof ( ( b ) ) ) ) ',
},
{
expectedAngularType: 'Binary',
expectedEstreeType: 'LogicalExpression',
Expand Down Expand Up @@ -495,6 +500,16 @@ const testCases: TestCase[] = [
expectedEstreeType: 'ObjectExpression',
text: ' ( ( {foo: tag ` a ${ b } ` } ) ) ',
},
{
expectedAngularType: 'ArrowFunction',
expectedEstreeType: 'ArrowFunctionExpression',
text: ' ( ( () => ( ( 1 ) ) ) ) ',
},
{
expectedAngularType: 'ArrowFunction',
expectedEstreeType: 'ArrowFunctionExpression',
text: ' ( ( (a, b ) => ( ( 1 ) ) ) ) ',
},
];

const IS_CI = Boolean(process.env.CI);
Expand Down
12 changes: 6 additions & 6 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ __metadata:
version: 8
cacheKey: 10

"@angular/compiler@npm:21.1.0":
version: 21.1.0
resolution: "@angular/compiler@npm:21.1.0"
"@angular/compiler@npm:21.2.0-next.0":
version: 21.2.0-next.0
resolution: "@angular/compiler@npm:21.2.0-next.0"
dependencies:
tslib: "npm:^2.3.0"
checksum: 10/1f409c20eb36079719e004f9e683a41d9d9fd975d814132faa28f941a0d491ba392c7cca92061f8dbe540bd922cac905f76ccab48a87c82c764b3b7cdb6b28dd
checksum: 10/61e5c75eff50de8ffcb3098fbbab7dbe3da885db5939d99965ab54cab1649771dc35dd57de0c7af0031a410f273afaac436ee66c63c639eb455175d38311b74a
languageName: node
linkType: hard

Expand Down Expand Up @@ -1671,7 +1671,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "angular-estree-parser@workspace:."
dependencies:
"@angular/compiler": "npm:21.1.0"
"@angular/compiler": "npm:21.2.0-next.0"
"@babel/code-frame": "npm:8.0.0-beta.4"
"@babel/parser": "npm:8.0.0-beta.4"
"@babel/types": "npm:8.0.0-beta.4"
Expand All @@ -1692,7 +1692,7 @@ __metadata:
typescript-eslint: "npm:8.53.0"
vitest: "npm:4.0.17"
peerDependencies:
"@angular/compiler": ">=21.0.7 || >= 21.1.0-0"
"@angular/compiler": ">=21.0.7 || >= 21.2.0-0"
languageName: unknown
linkType: soft

Expand Down