From 913323634abcbc05afd6a44571839e4adc2611b4 Mon Sep 17 00:00:00 2001 From: Wout Mertens Date: Wed, 28 Aug 2024 12:51:27 +0200 Subject: [PATCH] fix: qrl-class --- packages/qwik/src/core/qrl/qrl-class.ts | 53 ++++++++++++------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/packages/qwik/src/core/qrl/qrl-class.ts b/packages/qwik/src/core/qrl/qrl-class.ts index a99688c12bc..04e0879e37f 100644 --- a/packages/qwik/src/core/qrl/qrl-class.ts +++ b/packages/qwik/src/core/qrl/qrl-class.ts @@ -62,7 +62,7 @@ export type QRLInternalMethods = { unknown; $setContainer$(containerEl: Element | undefined): Element | undefined; - $resolveLazy$(containerEl: Element): ValueOrPromise; + $resolveLazy$(containerEl?: Element): ValueOrPromise; }; export type QRLInternal = QRL & QRLInternalMethods; @@ -105,24 +105,14 @@ export const createQRL = ( return fn; } return function (this: unknown, ...args: QrlArgs) { - const currentCtx = tryGetInvokeContext(); - const prevQrl = currentCtx?.$qrl$; - const prevEvent = currentCtx?.$event$; - - const baseContext = createOrReuseInvocationContext(currentCtx); - const context: InvokeContext = { - ...baseContext, - $qrl$: qrl as QRLInternal, - }; - if (context.$event$ === undefined) { - context.$event$ = this as Event; - } - try { + let context = tryGetInvokeContext(); + if (context) { return fn.apply(this, args); - } finally { - context.$qrl$ = prevQrl; - context.$event$ = prevEvent; } + context = newInvokeContext(); + context.$qrl$ = qrl; + context.$event$ = this as Event; + return invoke.call(this, context, fn as any, ...args); } as TYPE; }; @@ -153,7 +143,7 @@ export const createQRL = ( symbolRef = maybeThen(imported, (ref) => (qrl.resolved = symbolRef = wrapFn(ref))); } (symbolRef as Promise).finally(() => emitUsedSymbol(symbol, ctx?.$element$, start)); - return symbolRef; + return symbolRef!; }; const resolveLazy = (containerEl?: Element): ValueOrPromise => { @@ -174,16 +164,19 @@ export const createQRL = ( if (beforeFn && beforeFn() === false) { return; } - - const baseContext = createOrReuseInvocationContext(currentCtx); - const context: InvokeContext = { - ...baseContext, - $qrl$: qrl as QRLInternal, - }; - if (context.$event$ === undefined) { - context.$event$ = this as Event; + const context = createOrReuseInvocationContext(currentCtx); + const prevQrl = context.$qrl$; + const prevEvent = context.$event$; + // Note that we set the qrl here instead of in wrapFn because + // it is possible we're called on a copied qrl + context.$qrl$ = qrl; + context.$event$ ||= this as Event; + try { + return invoke.call(this, context, f, ...(args as Parameters)); + } finally { + context.$qrl$ = prevQrl; + context.$event$ = prevEvent; } - return invoke.call(this, context, f, ...(args as Parameters)); }); } @@ -223,7 +216,11 @@ export const createQRL = ( symbolRef = maybeThen(symbolRef, (resolved) => (qrl.resolved = symbolRef = wrapFn(resolved))); } if (isDev) { - (qrl as any)._devOnlySymbolRef = symbolRef; + Object.defineProperty(qrl, '_devOnlySymbolRef', { + get() { + return symbolRef; + }, + }); } if (qDev) { seal(qrl);