Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
94a7970
WIP: scheduler rewrite
Varixo Jun 30, 2025
13caaf4
fix: schedule store effects
Varixo Jul 2, 2025
c407c6e
fix test to be correct
Varixo Jul 2, 2025
eed0f87
fix: ref test
Varixo Jul 19, 2025
9cb2422
WIP: render done promise
Varixo Jul 20, 2025
0f084ad
fix: use correct qinit event name
Varixo Jul 21, 2025
b712fc9
feat: implement blocking rules logic
Varixo Jul 22, 2025
5e6bd9b
feat: block already scheduled chores if needed before execution
Varixo Jul 23, 2025
9501339
fix: don't schedule effect for array store targets for removing
Varixo Jul 26, 2025
f4e0a8f
fix: inserting errored-host
Varixo Jul 27, 2025
1751b1c
fix: immediately run RUN_QRL chores
Varixo Jul 27, 2025
c3a322c
fix: prevent running journal flush multiple times at the same time
Varixo Jul 28, 2025
8d5eb53
fix: don't schedule chore if it is already running
Varixo Jul 29, 2025
cfbfbce
fix: unit tests await for queue
Varixo Jul 29, 2025
dedfbe2
fix: processing deleted vnode
Varixo Aug 2, 2025
751375a
feat: use setImmediate or MessageChannel as next tick
Varixo Aug 2, 2025
adf0484
fix: expected in visible task test
Varixo Aug 2, 2025
fda07e8
fix: block visible tasks by its parent and child
Varixo Aug 2, 2025
d4d0455
refactor: rename scheduler-document-position test file
Varixo Aug 3, 2025
3d126a7
fix: scheduler rules with QRLs
Varixo Aug 3, 2025
e0e38fe
chore: reenable view transition
Varixo Aug 3, 2025
72f3b7a
error handling and block parent's chores
Varixo Aug 5, 2025
f601798
fix: e2e flaky tests
Varixo Aug 6, 2025
2d4209b
feat: better scheduler messages
Varixo Aug 6, 2025
bafe25d
fix: signals invalidation
Varixo Aug 7, 2025
9168048
fix: block descendant chores
Varixo Aug 8, 2025
bf7d360
feat: introduce $flushEpoch$ to manage DOM updates and improve task s…
Varixo Aug 9, 2025
1d71f11
chore: small changes
Varixo Aug 10, 2025
5d40356
change toggle test expects
Varixo Aug 11, 2025
486ece5
test: fix expect assertPage util
Varixo Aug 13, 2025
80d4dff
fix: useResource tests
Varixo Aug 14, 2025
ffc22d2
fix(qwik-router): dont execute task from removed layout
Varixo Aug 16, 2025
a2d388a
chore: change scheduler return value
Varixo Aug 16, 2025
611f3f5
fix: trigger async computed effects through scheduler
Varixo Aug 16, 2025
46641ae
fix: detect changing already streamed nodes
Varixo Aug 18, 2025
88c5ecf
fix: find slot parent for blocking chores
Varixo Aug 22, 2025
6088b00
fix: trigger qwikrouter rerender after url is set
Varixo Aug 22, 2025
b70ea85
fix: correctly finish chore queue and apply journal
Varixo Aug 23, 2025
cd04424
chore: add changesets
Varixo Aug 26, 2025
b2ea49f
fix: dedupe pnpm lock
Varixo Aug 26, 2025
52de0e0
chore: remove nextTick and deprecate flush functions
Varixo Aug 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/dark-eagles-tap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

fix: ignore diffing for deleted parent
5 changes: 5 additions & 0 deletions .changeset/fluffy-times-hug.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

fix: calling sync qrls should not go through scheduler
5 changes: 5 additions & 0 deletions .changeset/lazy-tigers-dig.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': minor
---

feat: new async scheduler
5 changes: 5 additions & 0 deletions .changeset/silly-pans-wear.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

fix: calling document:onQInit qrls
5 changes: 5 additions & 0 deletions .changeset/social-lizards-clean.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

fix: finding slot parent during scheduling chores
5 changes: 5 additions & 0 deletions .changeset/twenty-lines-prove.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/router': patch
---

fix: trigger params change after navigation
5 changes: 5 additions & 0 deletions .changeset/warm-spoons-punch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@qwik.dev/core': patch
---

fix: computed signal recomputing and triggering effects
16 changes: 15 additions & 1 deletion packages/docs/src/routes/api/qwik-testing/api.json
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@
}
],
"kind": "Function",
"content": "Trigger an event in unit tests on an element.\n\nFuture deprecation candidate.\n\n\n```typescript\nexport declare function trigger(root: Element, queryOrElement: string | Element | keyof HTMLElementTagNameMap | null, eventName: string, eventPayload?: any): Promise<void>;\n```\n\n\n<table><thead><tr><th>\n\nParameter\n\n\n</th><th>\n\nType\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\nroot\n\n\n</td><td>\n\nElement\n\n\n</td><td>\n\n\n</td></tr>\n<tr><td>\n\nqueryOrElement\n\n\n</td><td>\n\nstring \\| Element \\| keyof HTMLElementTagNameMap \\| null\n\n\n</td><td>\n\n\n</td></tr>\n<tr><td>\n\neventName\n\n\n</td><td>\n\nstring\n\n\n</td><td>\n\n\n</td></tr>\n<tr><td>\n\neventPayload\n\n\n</td><td>\n\nany\n\n\n</td><td>\n\n_(Optional)_\n\n\n</td></tr>\n</tbody></table>\n\n**Returns:**\n\nPromise&lt;void&gt;",
"content": "Trigger an event in unit tests on an element.\n\nFuture deprecation candidate.\n\n\n```typescript\nexport declare function trigger(root: Element, queryOrElement: string | Element | keyof HTMLElementTagNameMap | null, eventName: string, eventPayload?: any, options?: {\n waitForIdle?: boolean;\n}): Promise<void>;\n```\n\n\n<table><thead><tr><th>\n\nParameter\n\n\n</th><th>\n\nType\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\nroot\n\n\n</td><td>\n\nElement\n\n\n</td><td>\n\n\n</td></tr>\n<tr><td>\n\nqueryOrElement\n\n\n</td><td>\n\nstring \\| Element \\| keyof HTMLElementTagNameMap \\| null\n\n\n</td><td>\n\n\n</td></tr>\n<tr><td>\n\neventName\n\n\n</td><td>\n\nstring\n\n\n</td><td>\n\n\n</td></tr>\n<tr><td>\n\neventPayload\n\n\n</td><td>\n\nany\n\n\n</td><td>\n\n_(Optional)_\n\n\n</td></tr>\n<tr><td>\n\noptions\n\n\n</td><td>\n\n{ waitForIdle?: boolean; }\n\n\n</td><td>\n\n_(Optional)_\n\n\n</td></tr>\n</tbody></table>\n\n**Returns:**\n\nPromise&lt;void&gt;",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/testing/element-fixture.ts",
"mdFile": "core.trigger.md"
},
Expand All @@ -227,6 +227,20 @@
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/testing/vdom-diff.unit-util.ts",
"mdFile": "core.vnode_fromjsx.md"
},
{
"name": "waitForDrain",
"id": "waitfordrain",
"hierarchy": [
{
"name": "waitForDrain",
"id": "waitfordrain"
}
],
"kind": "Function",
"content": "Wait for the scheduler to drain.\n\nThis is useful when testing async code.\n\n\n```typescript\nexport declare function waitForDrain(container: Container): Promise<void>;\n```\n\n\n<table><thead><tr><th>\n\nParameter\n\n\n</th><th>\n\nType\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\ncontainer\n\n\n</td><td>\n\nContainer\n\n\n</td><td>\n\nThe application container.\n\n\n</td></tr>\n</tbody></table>\n\n**Returns:**\n\nPromise&lt;void&gt;",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/testing/util.ts",
"mdFile": "core.waitfordrain.md"
},
{
"name": "walkJSX",
"id": "walkjsx",
Expand Down
60 changes: 60 additions & 0 deletions packages/docs/src/routes/api/qwik-testing/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,9 @@ export declare function trigger(
queryOrElement: string | Element | keyof HTMLElementTagNameMap | null,
eventName: string,
eventPayload?: any,
options?: {
waitForIdle?: boolean;
},
): Promise<void>;
```

Expand Down Expand Up @@ -568,6 +571,19 @@ any

_(Optional)_

</td></tr>
<tr><td>

options

</td><td>

\{ waitForIdle?: boolean; }

</td><td>

_(Optional)_

</td></tr>
</tbody></table>

Expand Down Expand Up @@ -620,6 +636,50 @@ JSXOutput

[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/testing/vdom-diff.unit-util.ts)

## waitForDrain

Wait for the scheduler to drain.

This is useful when testing async code.

```typescript
export declare function waitForDrain(container: Container): Promise<void>;
```

<table><thead><tr><th>

Parameter

</th><th>

Type

</th><th>

Description

</th></tr></thead>
<tbody><tr><td>

container

</td><td>

Container

</td><td>

The application container.

</td></tr>
</tbody></table>

**Returns:**

Promise&lt;void&gt;

[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/testing/util.ts)

## walkJSX

```typescript
Expand Down
16 changes: 15 additions & 1 deletion packages/docs/src/routes/api/qwik/api.json
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@
}
],
"kind": "Interface",
"content": "Low-level API for platform abstraction.\n\nDifferent platforms (browser, node, service workers) may have different ways of handling things such as `requestAnimationFrame` and imports. To make Qwik platform-independent Qwik uses the `CorePlatform` API to access the platform API.\n\n`CorePlatform` also is responsible for importing symbols. The import map is different on the client (browser) then on the server. For this reason, the server has a manifest that is used to map symbols to javascript chunks. The manifest is encapsulated in `CorePlatform`<!-- -->, for this reason, the `CorePlatform` can't be global as there may be multiple applications running at server concurrently.\n\nThis is a low-level API and there should not be a need for you to access this.\n\n\n```typescript\nexport interface CorePlatform \n```\n\n\n<table><thead><tr><th>\n\nProperty\n\n\n</th><th>\n\nModifiers\n\n\n</th><th>\n\nType\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[chunkForSymbol](#)\n\n\n</td><td>\n\n\n</td><td>\n\n(symbolName: string, chunk: string \\| null, parent?: string) =&gt; readonly \\[symbol: string, chunk: string\\] \\| undefined\n\n\n</td><td>\n\nRetrieve chunk name for the symbol.\n\nWhen the application is running on the server the symbols may be imported from different files (as server build is typically a single javascript chunk.) For this reason, it is necessary to convert the chunks from server format to client (browser) format. This is done by looking up symbols (which are globally unique) in the manifest. (Manifest is the mapping of symbols to the client chunk names.)\n\n\n</td></tr>\n<tr><td>\n\n[importSymbol](#)\n\n\n</td><td>\n\n\n</td><td>\n\n(containerEl: Element \\| undefined, url: string \\| URL \\| undefined \\| null, symbol: string) =&gt; [ValueOrPromise](#valueorpromise)<!-- -->&lt;any&gt;\n\n\n</td><td>\n\nRetrieve a symbol value from QRL.\n\nQwik needs to lazy load data and closures. For this Qwik uses QRLs that are serializable references of resources that are needed. The QRLs contain all the information necessary to retrieve the reference using `importSymbol`<!-- -->.\n\nWhy not use `import()`<!-- -->? Because `import()` is relative to the current file, and the current file is always the Qwik framework. So QRLs have additional information that allows them to serialize imports relative to application base rather than the Qwik framework file.\n\n\n</td></tr>\n<tr><td>\n\n[isServer](#)\n\n\n</td><td>\n\n\n</td><td>\n\nboolean\n\n\n</td><td>\n\nTrue of running on the server platform.\n\n\n</td></tr>\n<tr><td>\n\n[nextTick](#)\n\n\n</td><td>\n\n\n</td><td>\n\n(fn: () =&gt; any) =&gt; Promise&lt;any&gt;\n\n\n</td><td>\n\nPerform operation on next tick.\n\n\n</td></tr>\n<tr><td>\n\n[raf](#)\n\n\n</td><td>\n\n\n</td><td>\n\n(fn: () =&gt; any) =&gt; Promise&lt;any&gt;\n\n\n</td><td>\n\nPerform operation on next request-animation-frame.\n\n\n</td></tr>\n</tbody></table>",
"content": "Low-level API for platform abstraction.\n\nDifferent platforms (browser, node, service workers) may have different ways of handling things such as `requestAnimationFrame` and imports. To make Qwik platform-independent Qwik uses the `CorePlatform` API to access the platform API.\n\n`CorePlatform` also is responsible for importing symbols. The import map is different on the client (browser) then on the server. For this reason, the server has a manifest that is used to map symbols to javascript chunks. The manifest is encapsulated in `CorePlatform`<!-- -->, for this reason, the `CorePlatform` can't be global as there may be multiple applications running at server concurrently.\n\nThis is a low-level API and there should not be a need for you to access this.\n\n\n```typescript\nexport interface CorePlatform \n```\n\n\n<table><thead><tr><th>\n\nProperty\n\n\n</th><th>\n\nModifiers\n\n\n</th><th>\n\nType\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[chunkForSymbol](#)\n\n\n</td><td>\n\n\n</td><td>\n\n(symbolName: string, chunk: string \\| null, parent?: string) =&gt; readonly \\[symbol: string, chunk: string\\] \\| undefined\n\n\n</td><td>\n\nRetrieve chunk name for the symbol.\n\nWhen the application is running on the server the symbols may be imported from different files (as server build is typically a single javascript chunk.) For this reason, it is necessary to convert the chunks from server format to client (browser) format. This is done by looking up symbols (which are globally unique) in the manifest. (Manifest is the mapping of symbols to the client chunk names.)\n\n\n</td></tr>\n<tr><td>\n\n[importSymbol](#)\n\n\n</td><td>\n\n\n</td><td>\n\n(containerEl: Element \\| undefined, url: string \\| URL \\| undefined \\| null, symbol: string) =&gt; [ValueOrPromise](#valueorpromise)<!-- -->&lt;any&gt;\n\n\n</td><td>\n\nRetrieve a symbol value from QRL.\n\nQwik needs to lazy load data and closures. For this Qwik uses QRLs that are serializable references of resources that are needed. The QRLs contain all the information necessary to retrieve the reference using `importSymbol`<!-- -->.\n\nWhy not use `import()`<!-- -->? Because `import()` is relative to the current file, and the current file is always the Qwik framework. So QRLs have additional information that allows them to serialize imports relative to application base rather than the Qwik framework file.\n\n\n</td></tr>\n<tr><td>\n\n[isServer](#)\n\n\n</td><td>\n\n\n</td><td>\n\nboolean\n\n\n</td><td>\n\nTrue of running on the server platform.\n\n\n</td></tr>\n<tr><td>\n\n[raf](#)\n\n\n</td><td>\n\n\n</td><td>\n\n(fn: () =&gt; any) =&gt; Promise&lt;any&gt;\n\n\n</td><td>\n\nPerform operation on next request-animation-frame.\n\n\n</td></tr>\n</tbody></table>",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/shared/platform/types.ts",
"mdFile": "core.coreplatform.md"
},
Expand Down Expand Up @@ -672,6 +672,20 @@
"content": "Use this to force running subscribers, for example when the calculated value mutates but remains the same object.\n\n\n```typescript\nforce(): void;\n```\n**Returns:**\n\nvoid",
"mdFile": "core.computedsignal.force.md"
},
{
"name": "forceStoreEffects",
"id": "forcestoreeffects",
"hierarchy": [
{
"name": "forceStoreEffects",
"id": "forcestoreeffects"
}
],
"kind": "Function",
"content": "Force a store to recompute and schedule effects.\n\n\n```typescript\nforceStoreEffects: (value: StoreTarget, prop: keyof StoreTarget) => void\n```\n\n\n<table><thead><tr><th>\n\nParameter\n\n\n</th><th>\n\nType\n\n\n</th><th>\n\nDescription\n\n\n</th></tr></thead>\n<tbody><tr><td>\n\nvalue\n\n\n</td><td>\n\nStoreTarget\n\n\n</td><td>\n\n\n</td></tr>\n<tr><td>\n\nprop\n\n\n</td><td>\n\nkeyof StoreTarget\n\n\n</td><td>\n\n\n</td></tr>\n</tbody></table>\n\n**Returns:**\n\nvoid",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/reactive-primitives/impl/store.ts",
"mdFile": "core.forcestoreeffects.md"
},
{
"name": "Fragment",
"id": "fragment",
Expand Down
66 changes: 51 additions & 15 deletions packages/docs/src/routes/api/qwik/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -683,21 +683,6 @@ True of running on the server platform.
</td></tr>
<tr><td>

[nextTick](#)

</td><td>

</td><td>

(fn: () =&gt; any) =&gt; Promise&lt;any&gt;

</td><td>

Perform operation on next tick.

</td></tr>
<tr><td>

[raf](#)

</td><td>
Expand Down Expand Up @@ -1318,6 +1303,57 @@ force(): void;

void

## forceStoreEffects

Force a store to recompute and schedule effects.

```typescript
forceStoreEffects: (value: StoreTarget, prop: keyof StoreTarget) => void
```

<table><thead><tr><th>

Parameter

</th><th>

Type

</th><th>

Description

</th></tr></thead>
<tbody><tr><td>

value

</td><td>

StoreTarget

</td><td>

</td></tr>
<tr><td>

prop

</td><td>

keyof StoreTarget

</td><td>

</td></tr>
</tbody></table>

**Returns:**

void

[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/reactive-primitives/impl/store.ts)

## Fragment

```typescript
Expand Down
2 changes: 1 addition & 1 deletion packages/qwik-router/src/buildtime/build-layout.unit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const test = testAppSuite('Build Layout');

test('total layouts', ({ ctx: { layouts } }) => {
// $ find starters/apps/qwikrouter-test/src/routes -name layout*tsx | wc -l
assert.equal(layouts.length, 12, JSON.stringify(layouts, null, 2));
assert.equal(layouts.length, 13, JSON.stringify(layouts, null, 2));
});

test('nested named layout', ({ assertLayout }) => {
Expand Down
7 changes: 4 additions & 3 deletions packages/qwik-router/src/runtime/src/link-component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,14 @@ export const Link = component$<LinkProps>((props) => {
})
: undefined;
const handleClick = clientNavPath
? $(async (event: Event, elm: HTMLAnchorElement) => {
? $((event: Event, elm: HTMLAnchorElement) => {
if (event.defaultPrevented) {
// If default was prevented, than it is up to us to make client side navigation.
if (elm.href) {
elm.setAttribute('aria-pressed', 'true');
await nav(elm.href, { forceReload: reload, replaceState, scroll });
elm.removeAttribute('aria-pressed');
nav(elm.href, { forceReload: reload, replaceState, scroll }).then(() => {
elm.removeAttribute('aria-pressed');
});
}
}
})
Expand Down
56 changes: 41 additions & 15 deletions packages/qwik-router/src/runtime/src/qwik-router-component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@ import {
_getContextContainer,
_getContextElement,
_getQContainerElement,
_UNINITIALIZED,
_waitUntilRendered,
_UNINITIALIZED,
SerializerSymbol,
type _ElementVNode,
type AsyncComputedReadonlySignal,
type SerializationStrategy,
forceStoreEffects,
_hasStoreEffects,
} from '@qwik.dev/core/internal';
import { clientNavigate } from './client-navigate';
import { CLIENT_DATA_CACHE, DEFAULT_LOADERS_SERIALIZATION_STRATEGY, Q_ROUTE } from './constants';
Expand Down Expand Up @@ -156,15 +158,13 @@ export const useQwikRouter = (props?: QwikRouterProps) => {
}

const url = new URL(urlEnv);
const routeLocation = useStore<MutableRouteLocation>(
{
url,
params: env.params,
isNavigating: false,
prevUrl: undefined,
},
{ deep: false }
);
const routeLocationTarget: MutableRouteLocation = {
url,
params: env.params,
isNavigating: false,
prevUrl: undefined,
};
const routeLocation = useStore<MutableRouteLocation>(routeLocationTarget, { deep: false });
const navResolver: { r?: () => void } = {};
const container = _getContextContainer();
const getSerializationStrategy = (loaderId: string): SerializationStrategy => {
Expand Down Expand Up @@ -470,14 +470,30 @@ export const useQwikRouter = (props?: QwikRouterProps) => {
if (navigation.dest.search && !!isSamePath(trackUrl, prevUrl)) {
trackUrl.search = navigation.dest.search;
}

let shouldForcePrevUrl = false;
let shouldForceUrl = false;
let shouldForceParams = false;
// Update route location
if (!isSamePath(trackUrl, prevUrl)) {
routeLocation.prevUrl = prevUrl;
if (_hasStoreEffects(routeLocation, 'prevUrl')) {
shouldForcePrevUrl = true;
}
routeLocationTarget.prevUrl = prevUrl;
}

if (routeLocationTarget.url !== trackUrl) {
if (_hasStoreEffects(routeLocation, 'url')) {
shouldForceUrl = true;
}
routeLocationTarget.url = trackUrl;
}

routeLocation.url = trackUrl;
routeLocation.params = { ...params };
if (routeLocationTarget.params !== params) {
if (_hasStoreEffects(routeLocation, 'params')) {
shouldForceParams = true;
}
routeLocationTarget.params = params;
}

(routeInternal as any).untrackedValue = { type: navType, dest: trackUrl };

Expand All @@ -493,7 +509,7 @@ export const useQwikRouter = (props?: QwikRouterProps) => {
// Update content
content.headings = pageModule.headings;
content.menu = menu;
contentInternal.value = noSerialize(contentModules);
(contentInternal as any).untrackedValue = noSerialize(contentModules);

// Update document head
documentHead.links = resolvedHead.links;
Expand Down Expand Up @@ -719,6 +735,7 @@ export const useQwikRouter = (props?: QwikRouterProps) => {

const navigate = () => {
clientNavigate(window, navType, prevUrl, trackUrl, replaceState);
(contentInternal as any).force();
return _waitUntilRendered(elm as Element);
};

Expand Down Expand Up @@ -746,6 +763,15 @@ export const useQwikRouter = (props?: QwikRouterProps) => {
callRestoreScrollOnDocument();
}

if (shouldForcePrevUrl) {
forceStoreEffects(routeLocation, 'prevUrl');
}
if (shouldForceUrl) {
forceStoreEffects(routeLocation, 'url');
}
if (shouldForceParams) {
forceStoreEffects(routeLocation, 'params');
}
routeLocation.isNavigating = false;
navResolver.r?.();
});
Expand Down
Loading
Loading