diff --git a/package.json b/package.json index f277e1e4..7680718f 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "release": "release-it" }, "devDependencies": { - "@angular/compiler": "21.0.7", + "@angular/compiler": "21.1.0-rc.0", "@babel/code-frame": "8.0.0-beta.3", "@babel/parser": "8.0.0-beta.3", "@babel/types": "8.0.0-beta.3", @@ -53,7 +53,7 @@ "vitest": "4.0.16" }, "peerDependencies": { - "@angular/compiler": ">=21.0.7" + "@angular/compiler": ">=21.0.7 || >= 21.1.0-0" }, "engines": { "node": ">= 20" diff --git a/src/ast-transform/transform-object-expression.ts b/src/ast-transform/transform-object-expression.ts index db084a35..7ede1ee7 100644 --- a/src/ast-transform/transform-object-expression.ts +++ b/src/ast-transform/transform-object-expression.ts @@ -19,6 +19,21 @@ export const visitLiteralMap = ( type: 'ObjectExpression', properties: keys.map((keyNode, index) => { const valueNode = values[index]; + const range: [number, number] = [ + keyNode.sourceSpan.start, + valueNode.sourceSpan.end, + ]; + + if (keyNode.kind === 'spread') { + return createChild( + { + type: 'SpreadElement', + argument: transformer.transformChild(valueNode), + }, + range, + ); + } + const shorthand = Boolean(keyNode.isShorthandInitialized); const key = createChild( keyNode.quoted @@ -37,7 +52,7 @@ export const visitLiteralMap = ( // @ts-expect-error -- Missed in types method: false, }, - [keyNode.sourceSpan.start, valueNode.sourceSpan.end], + range, ); }), }; diff --git a/src/ast-transform/transform-spread-element.ts b/src/ast-transform/transform-spread-element.ts new file mode 100644 index 00000000..9f18fed0 --- /dev/null +++ b/src/ast-transform/transform-spread-element.ts @@ -0,0 +1,12 @@ +import { type SpreadElement } from '@angular/compiler'; +import type * as babel from '@babel/types'; + +import { type Transformer } from './transform.ts'; + +export const visitSpreadElement = ( + node: SpreadElement, + transformer: Transformer, +): babel.SpreadElement => ({ + type: 'SpreadElement', + argument: transformer.transformChild(node.expression), +}); diff --git a/src/ast-transform/transforms.ts b/src/ast-transform/transforms.ts index ebe32c46..bc7d4b9f 100644 --- a/src/ast-transform/transforms.ts +++ b/src/ast-transform/transforms.ts @@ -11,6 +11,7 @@ export * from './transform-non-null-expression.ts'; export * from './transform-object-expression.ts'; export * from './transform-parenthesized-expression.ts'; export * from './transform-pipe-expression.ts'; +export * from './transform-spread-element.ts'; export * from './transform-template-literal.ts'; export * from './transform-this-expression.ts'; export * from './transform-unary-expression.ts'; diff --git a/tests/transform.test.ts b/tests/transform.test.ts index 79d6faae..510eeffc 100644 --- a/tests/transform.test.ts +++ b/tests/transform.test.ts @@ -210,11 +210,21 @@ const testCases: TestCase[] = [ expectedEstreeType: 'ArrayExpression', text: ' ( ( [ ( ( 1 ) ), ] ) ) ', }, + { + expectedAngularType: 'LiteralArray', + expectedEstreeType: 'ArrayExpression', + text: ' ( ( [ ( ( 1 ) ), ... ( ( a ) ) ] ) ) ', + }, { expectedAngularType: 'LiteralMap', expectedEstreeType: 'ObjectExpression', text: ' ( ( { "a" : ( ( 1 ) ), } ) )', }, + { + expectedAngularType: 'LiteralMap', + expectedEstreeType: 'ObjectExpression', + text: ' ( ( { "a" : ( ( 1 ) ), ...( ( a ) ) } ) )', + }, { expectedAngularType: 'LiteralMap', expectedEstreeType: 'ObjectExpression', diff --git a/yarn.lock b/yarn.lock index b3f8a758..da4508d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,12 +5,12 @@ __metadata: version: 8 cacheKey: 10 -"@angular/compiler@npm:21.0.7": - version: 21.0.7 - resolution: "@angular/compiler@npm:21.0.7" +"@angular/compiler@npm:21.1.0-rc.0": + version: 21.1.0-rc.0 + resolution: "@angular/compiler@npm:21.1.0-rc.0" dependencies: tslib: "npm:^2.3.0" - checksum: 10/ce950aeda8f6d0a3930e296fef1645d945003094039bc5b763631ed043905396611ef655ac3b0b3b32d1c4b01d86577c354aca7d69ca6ce5ff51bbb6886a3610 + checksum: 10/a4721142e932fe62b27a5e383b540ccb83cd2ca456e8ff3bdd62be1022f46b46d224213108b1186978de5f0d6e6916e7c074fb4270b16818f66b155f53531ac5 languageName: node linkType: hard @@ -1565,7 +1565,7 @@ __metadata: version: 0.0.0-use.local resolution: "angular-estree-parser@workspace:." dependencies: - "@angular/compiler": "npm:21.0.7" + "@angular/compiler": "npm:21.1.0-rc.0" "@babel/code-frame": "npm:8.0.0-beta.3" "@babel/parser": "npm:8.0.0-beta.3" "@babel/types": "npm:8.0.0-beta.3" @@ -1586,7 +1586,7 @@ __metadata: typescript-eslint: "npm:8.52.0" vitest: "npm:4.0.16" peerDependencies: - "@angular/compiler": ">=21.0.7" + "@angular/compiler": ">=21.0.7 || >= 21.1.0-0" languageName: unknown linkType: soft