@@ -28,6 +28,7 @@ type Dep = t.Expression & { replace?: (newNode: t.Node) => void }
2828interface SymbolInfo {
2929 decl : t . Declaration
3030 bindings : t . Identifier [ ]
31+ params : t . TSTypeParameter [ ]
3132 deps : Dep [ ]
3233}
3334
@@ -177,15 +178,27 @@ export function createFakeJsPlugin({
177178 // @ts -expect-error
178179 decl . id = binding
179180 }
181+
182+ const params : t . TSTypeParameter [ ] =
183+ 'typeParameters' in decl &&
184+ decl . typeParameters ?. type === 'TSTypeParameterDeclaration'
185+ ? decl . typeParameters . params
186+ : [ ]
187+
180188 const deps = collectDependencies ( decl , namespaceStmts )
181189
182190 const elements : t . Expression [ ] = [
183- t . numericLiteral ( 0 ) ,
184- ... deps . map ( ( dep ) => t . arrowFunctionExpression ( [ ] , dep ) ) ,
185- ... ( sideEffect
186- ? [ t . callExpression ( t . identifier ( 'sideEffect' ) , [ bindings [ 0 ] ] ) ]
187- : [ ] ) ,
191+ t . numericLiteral ( 0 /* placeholder */ ) ,
192+ t . arrowFunctionExpression (
193+ params . map ( ( param ) => t . identifier ( param . name ) ) ,
194+ t . arrayExpression ( deps ) ,
195+ ) ,
188196 ]
197+ if ( sideEffect ) {
198+ elements . push (
199+ t . callExpression ( t . identifier ( 'sideEffect' ) , [ bindings [ 0 ] ] ) ,
200+ )
201+ }
189202 const runtime : t . ArrayExpression = t . arrayExpression ( elements )
190203
191204 if ( decl !== stmt ) {
@@ -196,10 +209,11 @@ export function createFakeJsPlugin({
196209 decl,
197210 deps,
198211 bindings,
212+ params,
199213 } )
200214 elements [ 0 ] = t . numericLiteral ( symbolId )
201215
202- // var ${binding} = [${symbolId}, () => ${ dep} , ..., sideEffect()]
216+ // var ${binding} = [${symbolId}, (param, ... ) => [ dep, ...] , sideEffect()]
203217 const runtimeAssignment : t . VariableDeclaration = {
204218 type : 'VariableDeclaration' ,
205219 kind : 'var' ,
@@ -284,7 +298,8 @@ export function createFakeJsPlugin({
284298 return null
285299 }
286300
287- const [ symbolIdNode , ...depsFns ] = decl . init . elements as t . Expression [ ]
301+ const [ symbolIdNode , depsFn /*, ignore sideEffect */ ] = decl . init
302+ . elements as [ t . Expression , t . ArrowFunctionExpression ]
288303 if ( symbolIdNode ?. type !== 'NumericLiteral' ) {
289304 return null
290305 }
@@ -300,18 +315,21 @@ export function createFakeJsPlugin({
300315 overwriteNode ( original . bindings [ i ] , transformedBinding )
301316 }
302317
303- const transformedDeps = depsFns
304- . filter ( ( node ) => node ?. type === 'ArrowFunctionExpression' )
305- . map ( ( node ) => node . body )
306-
307- if ( original . deps . length ) {
308- for ( let i = 0 ; i < original . deps . length ; i ++ ) {
309- const originalDep = original . deps [ i ]
310- if ( originalDep . replace ) {
311- originalDep . replace ( transformedDeps [ i ] )
312- } else {
313- Object . assign ( originalDep , transformedDeps [ i ] )
314- }
318+ const transformedParams = depsFn . params as t . Identifier [ ]
319+ for ( let i = 0 ; i < original . params . length ; i ++ ) {
320+ const originalParam = original . params [ i ]
321+ const transformedParam = transformedParams [ i ]
322+ originalParam . name = transformedParam . name
323+ }
324+
325+ const transformedDeps = ( depsFn . body as t . ArrayExpression )
326+ . elements as t . Expression [ ]
327+ for ( let i = 0 ; i < original . deps . length ; i ++ ) {
328+ const originalDep = original . deps [ i ]
329+ if ( originalDep . replace ) {
330+ originalDep . replace ( transformedDeps [ i ] )
331+ } else {
332+ Object . assign ( originalDep , transformedDeps [ i ] )
315333 }
316334 }
317335
0 commit comments