@@ -55,21 +55,39 @@ const isMetaUrl = (parser, arg) => {
5555 return true ;
5656} ;
5757
58+ /**
59+ * @type {WeakMap<NewExpressionNode, BasicEvaluatedExpression | undefined> }
60+ */
61+ const getEvaluatedExprCache = new WeakMap ( ) ;
62+
5863/**
5964 * @param {NewExpressionNode } expr expression
6065 * @param {Parser } parser parser parser
61- * @returns {BasicEvaluatedExpression | undefined } basicEvaluatedExpression
66+ * @returns {BasicEvaluatedExpression | undefined } basic evaluated expression
6267 */
6368const getEvaluatedExpr = ( expr , parser ) => {
64- if ( expr . arguments . length !== 2 ) return ;
69+ let result = getEvaluatedExprCache . get ( expr ) ;
70+ if ( result !== undefined ) return result ;
71+
72+ /**
73+ * @returns {BasicEvaluatedExpression | undefined } basic evaluated expression
74+ */
75+ const evaluate = ( ) => {
76+ if ( expr . arguments . length !== 2 ) return ;
77+
78+ const [ arg1 , arg2 ] = expr . arguments ;
6579
66- const [ arg1 , arg2 ] = expr . arguments ;
80+ if ( arg2 . type !== "MemberExpression" || arg1 . type === "SpreadElement" )
81+ return ;
82+ if ( ! isMetaUrl ( parser , arg2 ) ) return ;
6783
68- if ( arg2 . type !== "MemberExpression" || arg1 . type === "SpreadElement" ) return ;
84+ return parser . evaluateExpression ( arg1 ) ;
85+ } ;
6986
70- if ( ! isMetaUrl ( parser , arg2 ) ) return ;
87+ result = evaluate ( ) ;
88+ getEvaluatedExprCache . set ( expr , result ) ;
7189
72- return parser . evaluateExpression ( arg1 ) ;
90+ return result ;
7391} ;
7492
7593class URLParserPlugin {
0 commit comments