Skip to content

Commit 78aae0d

Browse files
authored
Support spread elements in array/object literals (#362)
1 parent 93f6ead commit 78aae0d

6 files changed

Lines changed: 47 additions & 9 deletions

File tree

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"release": "release-it"
3232
},
3333
"devDependencies": {
34-
"@angular/compiler": "21.0.7",
34+
"@angular/compiler": "21.1.0-rc.0",
3535
"@babel/code-frame": "8.0.0-beta.3",
3636
"@babel/parser": "8.0.0-beta.3",
3737
"@babel/types": "8.0.0-beta.3",
@@ -53,7 +53,7 @@
5353
"vitest": "4.0.16"
5454
},
5555
"peerDependencies": {
56-
"@angular/compiler": ">=21.0.7"
56+
"@angular/compiler": ">=21.0.7 || >= 21.1.0-0"
5757
},
5858
"engines": {
5959
"node": ">= 20"

src/ast-transform/transform-object-expression.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,21 @@ export const visitLiteralMap = (
1919
type: 'ObjectExpression',
2020
properties: keys.map((keyNode, index) => {
2121
const valueNode = values[index];
22+
const range: [number, number] = [
23+
keyNode.sourceSpan.start,
24+
valueNode.sourceSpan.end,
25+
];
26+
27+
if (keyNode.kind === 'spread') {
28+
return createChild<babel.SpreadElement>(
29+
{
30+
type: 'SpreadElement',
31+
argument: transformer.transformChild<babel.Expression>(valueNode),
32+
},
33+
range,
34+
);
35+
}
36+
2237
const shorthand = Boolean(keyNode.isShorthandInitialized);
2338
const key = createChild<babel.Identifier | babel.StringLiteral>(
2439
keyNode.quoted
@@ -37,7 +52,7 @@ export const visitLiteralMap = (
3752
// @ts-expect-error -- Missed in types
3853
method: false,
3954
},
40-
[keyNode.sourceSpan.start, valueNode.sourceSpan.end],
55+
range,
4156
);
4257
}),
4358
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { type SpreadElement } from '@angular/compiler';
2+
import type * as babel from '@babel/types';
3+
4+
import { type Transformer } from './transform.ts';
5+
6+
export const visitSpreadElement = (
7+
node: SpreadElement,
8+
transformer: Transformer,
9+
): babel.SpreadElement => ({
10+
type: 'SpreadElement',
11+
argument: transformer.transformChild(node.expression),
12+
});

src/ast-transform/transforms.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export * from './transform-non-null-expression.ts';
1111
export * from './transform-object-expression.ts';
1212
export * from './transform-parenthesized-expression.ts';
1313
export * from './transform-pipe-expression.ts';
14+
export * from './transform-spread-element.ts';
1415
export * from './transform-template-literal.ts';
1516
export * from './transform-this-expression.ts';
1617
export * from './transform-unary-expression.ts';

tests/transform.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,11 +210,21 @@ const testCases: TestCase[] = [
210210
expectedEstreeType: 'ArrayExpression',
211211
text: ' ( ( [ ( ( 1 ) ), ] ) ) ',
212212
},
213+
{
214+
expectedAngularType: 'LiteralArray',
215+
expectedEstreeType: 'ArrayExpression',
216+
text: ' ( ( [ ( ( 1 ) ), ... ( ( a ) ) ] ) ) ',
217+
},
213218
{
214219
expectedAngularType: 'LiteralMap',
215220
expectedEstreeType: 'ObjectExpression',
216221
text: ' ( ( { "a" : ( ( 1 ) ), } ) )',
217222
},
223+
{
224+
expectedAngularType: 'LiteralMap',
225+
expectedEstreeType: 'ObjectExpression',
226+
text: ' ( ( { "a" : ( ( 1 ) ), ...( ( a ) ) } ) )',
227+
},
218228
{
219229
expectedAngularType: 'LiteralMap',
220230
expectedEstreeType: 'ObjectExpression',

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.0.7":
9-
version: 21.0.7
10-
resolution: "@angular/compiler@npm:21.0.7"
8+
"@angular/compiler@npm:21.1.0-rc.0":
9+
version: 21.1.0-rc.0
10+
resolution: "@angular/compiler@npm:21.1.0-rc.0"
1111
dependencies:
1212
tslib: "npm:^2.3.0"
13-
checksum: 10/ce950aeda8f6d0a3930e296fef1645d945003094039bc5b763631ed043905396611ef655ac3b0b3b32d1c4b01d86577c354aca7d69ca6ce5ff51bbb6886a3610
13+
checksum: 10/a4721142e932fe62b27a5e383b540ccb83cd2ca456e8ff3bdd62be1022f46b46d224213108b1186978de5f0d6e6916e7c074fb4270b16818f66b155f53531ac5
1414
languageName: node
1515
linkType: hard
1616

@@ -1565,7 +1565,7 @@ __metadata:
15651565
version: 0.0.0-use.local
15661566
resolution: "angular-estree-parser@workspace:."
15671567
dependencies:
1568-
"@angular/compiler": "npm:21.0.7"
1568+
"@angular/compiler": "npm:21.1.0-rc.0"
15691569
"@babel/code-frame": "npm:8.0.0-beta.3"
15701570
"@babel/parser": "npm:8.0.0-beta.3"
15711571
"@babel/types": "npm:8.0.0-beta.3"
@@ -1586,7 +1586,7 @@ __metadata:
15861586
typescript-eslint: "npm:8.52.0"
15871587
vitest: "npm:4.0.16"
15881588
peerDependencies:
1589-
"@angular/compiler": ">=21.0.7"
1589+
"@angular/compiler": ">=21.0.7 || >= 21.1.0-0"
15901590
languageName: unknown
15911591
linkType: soft
15921592

0 commit comments

Comments
 (0)