44 * SPDX-License-Identifier: BSD-3-Clause
55 */
66
7- import ts from 'typescript' ;
8-
97import { QueryAssignedElementsVisitor } from './query-assigned-elements.js' ;
108
11- import type { LitClassContext } from '../lit-class-context.js' ;
12-
139/**
1410 * Transform:
1511 *
@@ -23,202 +19,8 @@ import type {LitClassContext} from '../lit-class-context.js';
2319 * ?.querySelector('slot[name=list]')
2420 * ?.assignedNodes() ?? [];
2521 * }
26- *
27- * Falls back on transforming the legacy queryAssignedNodes API.
2822 */
2923export class QueryAssignedNodesVisitor extends QueryAssignedElementsVisitor {
3024 override readonly decoratorName = 'queryAssignedNodes' ;
3125 override slottedQuery = 'assignedNodes' ;
32-
33- private readonly legacyVisitor : QueryAssignedLegacyNodesVisitor ;
34-
35- constructor ( context : ts . TransformationContext ) {
36- super ( context ) ;
37- this . legacyVisitor = new QueryAssignedLegacyNodesVisitor ( context ) ;
38- }
39-
40- override visit (
41- litClassContext : LitClassContext ,
42- property : ts . ClassElement ,
43- decorator : ts . Decorator
44- ) {
45- if ( this . legacyVisitor . visit ( litClassContext , property , decorator ) ) {
46- return ;
47- }
48- super . visit ( litClassContext , property , decorator ) ;
49- }
50- }
51-
52- class QueryAssignedLegacyNodesVisitor {
53- private readonly _factory : ts . NodeFactory ;
54-
55- constructor ( { factory} : ts . TransformationContext ) {
56- this . _factory = factory ;
57- }
58-
59- /**
60- * Modified `visit` to keep support for the deprecated legacy
61- * `queryAssignedNodes` decorator. Returns a boolean to notify if it was
62- * successfully applied.
63- */
64- visit (
65- litClassContext : LitClassContext ,
66- property : ts . ClassElement ,
67- decorator : ts . Decorator
68- ) : boolean {
69- if ( ! ts . isPropertyDeclaration ( property ) ) {
70- return false ;
71- }
72- if ( ! ts . isCallExpression ( decorator . expression ) ) {
73- return false ;
74- }
75- if ( ! ts . isIdentifier ( property . name ) ) {
76- return false ;
77- }
78- const name = property . name . text ;
79- const [ arg0 , arg1 , arg2 ] = decorator . expression . arguments ;
80- if ( arg0 && ! ts . isStringLiteral ( arg0 ) ) {
81- // Detection for new queryAssignedNodes API.
82- return false ;
83- }
84- const slotName =
85- arg0 !== undefined && ts . isStringLiteral ( arg0 ) ? arg0 . text : '' ;
86- const flatten = arg1 ?. kind === ts . SyntaxKind . TrueKeyword ;
87- const selector =
88- arg2 !== undefined && ts . isStringLiteral ( arg2 ) ? arg2 . text : '' ;
89- litClassContext . litFileContext . replaceAndMoveComments (
90- property ,
91- this . _createQueryAssignedNodesGetter ( name , slotName , flatten , selector )
92- ) ;
93- return true ;
94- }
95-
96- private _createQueryAssignedNodesGetter (
97- name : string ,
98- slotName : string ,
99- flatten : boolean ,
100- selector : string
101- ) {
102- const factory = this . _factory ;
103-
104- const slotSelector = `slot${
105- slotName ? `[name=${ slotName } ]` : ':not([name])'
106- } `;
107-
108- // {flatten: true}
109- const assignedNodesOptions = flatten
110- ? [
111- factory . createObjectLiteralExpression (
112- [
113- factory . createPropertyAssignment (
114- factory . createIdentifier ( 'flatten' ) ,
115- factory . createTrue ( )
116- ) ,
117- ] ,
118- false
119- ) ,
120- ]
121- : [ ] ;
122-
123- // this.renderRoot?.querySelector(<selector>)?.assignedNodes(<options>)
124- const assignedNodes = factory . createCallChain (
125- factory . createPropertyAccessChain (
126- factory . createCallChain (
127- factory . createPropertyAccessChain (
128- factory . createPropertyAccessExpression (
129- factory . createThis ( ) ,
130- factory . createIdentifier ( 'renderRoot' )
131- ) ,
132- factory . createToken ( ts . SyntaxKind . QuestionDotToken ) ,
133- factory . createIdentifier ( 'querySelector' )
134- ) ,
135- undefined ,
136- undefined ,
137- [ factory . createStringLiteral ( slotSelector ) ]
138- ) ,
139- factory . createToken ( ts . SyntaxKind . QuestionDotToken ) ,
140- factory . createIdentifier ( 'assignedNodes' )
141- ) ,
142- undefined ,
143- undefined ,
144- assignedNodesOptions
145- ) ;
146-
147- const returnExpression = ! selector
148- ? assignedNodes
149- : // <assignedNodes>?.filter((node) =>
150- // node.nodeType === Node.ELEMENT_NODE &&
151- // node.matches(<selector>)
152- factory . createCallChain (
153- factory . createPropertyAccessChain (
154- assignedNodes ,
155- factory . createToken ( ts . SyntaxKind . QuestionDotToken ) ,
156- factory . createIdentifier ( 'filter' )
157- ) ,
158- undefined ,
159- undefined ,
160- [
161- factory . createArrowFunction (
162- undefined ,
163- undefined ,
164- [
165- factory . createParameterDeclaration (
166- undefined ,
167- undefined ,
168- factory . createIdentifier ( 'node' ) ,
169- undefined ,
170- undefined ,
171- undefined
172- ) ,
173- ] ,
174- undefined ,
175- factory . createToken ( ts . SyntaxKind . EqualsGreaterThanToken ) ,
176- factory . createBinaryExpression (
177- factory . createBinaryExpression (
178- factory . createPropertyAccessExpression (
179- factory . createIdentifier ( 'node' ) ,
180- factory . createIdentifier ( 'nodeType' )
181- ) ,
182- factory . createToken ( ts . SyntaxKind . EqualsEqualsEqualsToken ) ,
183- factory . createPropertyAccessExpression (
184- factory . createIdentifier ( 'Node' ) ,
185- factory . createIdentifier ( 'ELEMENT_NODE' )
186- )
187- ) ,
188- factory . createToken ( ts . SyntaxKind . AmpersandAmpersandToken ) ,
189- factory . createCallExpression (
190- factory . createPropertyAccessExpression (
191- factory . createIdentifier ( 'node' ) ,
192- factory . createIdentifier ( 'matches' )
193- ) ,
194- undefined ,
195- [ factory . createStringLiteral ( selector ) ]
196- )
197- )
198- ) ,
199- ]
200- ) ;
201-
202- // { return <returnExpression> }
203- const getterBody = factory . createBlock (
204- [
205- factory . createReturnStatement (
206- factory . createBinaryExpression (
207- returnExpression ,
208- factory . createToken ( ts . SyntaxKind . QuestionQuestionToken ) ,
209- factory . createArrayLiteralExpression ( [ ] , false )
210- )
211- ) ,
212- ] ,
213- true
214- ) ;
215-
216- return factory . createGetAccessorDeclaration (
217- undefined ,
218- factory . createIdentifier ( name ) ,
219- [ ] ,
220- undefined ,
221- getterBody
222- ) ;
223- }
22426}
0 commit comments