@qwik.dev/router 2.0.0-beta.21 → 2.0.0-beta.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -740,7 +740,7 @@ async function workerRender(sys, opts, staticRoute, pendingPromises, callback) {
740
740
  stack: e.stack
741
741
  };
742
742
  });
743
- const serialized = await _serialize([qData]);
743
+ const serialized = await _serialize(qData);
744
744
  dataWriter.write(serialized);
745
745
  writePromises.push(
746
746
  new Promise((resolve) => {
@@ -50,7 +50,7 @@ const loadClientData = async (url, opts, retryCount = 0) => {
50
50
  }
51
51
  if ((rsp.headers.get("content-type") || "").includes("json")) {
52
52
  return rsp.text().then((text) => {
53
- const [clientData] = _deserialize(text);
53
+ const clientData = _deserialize(text);
54
54
  if (!clientData) {
55
55
  location.href = url.href;
56
56
  return;
@@ -347,7 +347,11 @@ const deepFreeze = (obj) => {
347
347
  Object.getOwnPropertyNames(obj).forEach((prop) => {
348
348
  const value = obj[prop];
349
349
  if (value && typeof value === "object" && !Object.isFrozen(value)) {
350
- deepFreeze(value);
350
+ try {
351
+ deepFreeze(value);
352
+ } catch {
353
+ return obj;
354
+ }
351
355
  }
352
356
  });
353
357
  return Object.freeze(obj);
@@ -426,4 +430,4 @@ const getMenuLoader = (menus, pathname) => {
426
430
  }
427
431
  };
428
432
 
429
- export { CLIENT_DATA_CACHE as C, DEFAULT_LOADERS_SERIALIZATION_STRATEGY as D, Q_ROUTE as Q, isSamePath as a, isSameOrigin as b, createLoaderSignal as c, loadRoute as d, clientNavigate as e, deepFreeze as f, getClientNavPath as g, QFN_KEY as h, isPromise as i, QACTION_KEY as j, QDATA_KEY as k, loadClientData as l, QLOADER_KEY as m, preloadRouteBundles as p, shouldPreload as s, toUrl as t };
433
+ export { CLIENT_DATA_CACHE as C, DEFAULT_LOADERS_SERIALIZATION_STRATEGY as D, Q_ROUTE as Q, isSamePath as a, isSameOrigin as b, createLoaderSignal as c, loadRoute as d, clientNavigate as e, QFN_KEY as f, getClientNavPath as g, QACTION_KEY as h, isPromise as i, QDATA_KEY as j, QLOADER_KEY as k, loadClientData as l, preloadRouteBundles as p, shouldPreload as s, toUrl as t };
package/lib/index.d.ts CHANGED
@@ -12,7 +12,6 @@ import { QRL } from '@qwik.dev/core';
12
12
  import { QRLEventHandlerMulti } from '@qwik.dev/core';
13
13
  import { QwikIntrinsicElements } from '@qwik.dev/core';
14
14
  import { QwikJSX } from '@qwik.dev/core';
15
- import type { ReadonlySignal } from '@qwik.dev/core';
16
15
  import { Render } from '@qwik.dev/core/server';
17
16
  import { RenderOptions } from '@qwik.dev/core/server';
18
17
  import { RequestEvent } from '@qwik.dev/router/middleware/request-handler';
@@ -23,6 +22,7 @@ import { RequestEventLoader } from '@qwik.dev/router/middleware/request-handler'
23
22
  import { RequestHandler } from '@qwik.dev/router/middleware/request-handler';
24
23
  import type { ResolveSyncValue } from '@qwik.dev/router/middleware/request-handler';
25
24
  import type { SerializationStrategy } from '@qwik.dev/core/internal';
25
+ import type { Signal } from '@qwik.dev/core';
26
26
  import type * as v from 'valibot';
27
27
  import type { ValueOrPromise } from '@qwik.dev/core';
28
28
  import { ValueOrPromise as ValueOrPromise_2 } from '@qwik.dev/core/internal';
@@ -437,7 +437,7 @@ export declare type JSONValue = string | number | boolean | {
437
437
  } | Array<JSONValue>;
438
438
 
439
439
  /** @public */
440
- declare type JSXChildren = string | number | boolean | null | undefined | Function | RegExp | JSXChildren[] | Promise<JSXChildren> | Signal<JSXChildren> | JSXNode;
440
+ declare type JSXChildren = string | number | boolean | null | undefined | Function | RegExp | JSXChildren[] | Promise<JSXChildren> | Signal_2<JSXChildren> | JSXNode;
441
441
 
442
442
  /**
443
443
  * A JSX Node, an internal structure. You probably want to use `JSXOutput` instead.
@@ -529,7 +529,7 @@ declare type LoaderOptions = {
529
529
  };
530
530
 
531
531
  /** @public */
532
- export declare type LoaderSignal<TYPE> = (TYPE extends () => ValueOrPromise<infer VALIDATOR> ? ReadonlySignal<ValueOrPromise<VALIDATOR>> : ReadonlySignal<TYPE>) & Pick<AsyncSignal, 'promise' | 'loading' | 'error'>;
532
+ export declare type LoaderSignal<TYPE> = (TYPE extends () => ValueOrPromise<infer VALIDATOR> ? Signal<ValueOrPromise<VALIDATOR>> : Signal<TYPE>) & Pick<AsyncSignal, 'promise' | 'loading' | 'error'>;
533
533
 
534
534
  /** @public */
535
535
  export declare type MenuData = [pathname: string, menuLoader: MenuModuleLoader];
@@ -715,11 +715,6 @@ export declare interface QwikRouterProps {
715
715
  /** @public This is a wrapper around the `useQwikRouter()` hook. We recommend using the hook instead of this component, unless you have a good reason to make your root component reactive. */
716
716
  export declare const QwikRouterProvider: Component<QwikRouterProps>;
717
717
 
718
- /** @public */
719
- declare interface ReadonlySignal_2<T = unknown> {
720
- readonly value: T;
721
- }
722
-
723
718
  /** @public */
724
719
  export declare type RendererOptions = Omit<RenderOptions, 'serverData'> & {
725
720
  serverData: ServerData;
@@ -873,8 +868,16 @@ export declare const ServiceWorkerRegister: (props: {
873
868
  *
874
869
  * @public
875
870
  */
876
- declare interface Signal<T = any> extends ReadonlySignal_2<T> {
871
+ declare interface Signal_2<T = any> {
872
+ /** Reading from this subscribes to updates; writing to this triggers updates. */
877
873
  value: T;
874
+ /** Reading from this does not subscribe to updates; writing to this does not trigger updates. */
875
+ untrackedValue: T;
876
+ /**
877
+ * Use this to trigger running subscribers, for example when the value mutated but remained the
878
+ * same object.
879
+ */
880
+ trigger(): void;
878
881
  }
879
882
 
880
883
  /** @public */
@@ -1,6 +1,6 @@
1
1
  import { jsx, Fragment, jsxs } from '@qwik.dev/core/jsx-runtime';
2
2
  import { component$, useErrorBoundary, useOnWindow, $, Slot, createContextId, useContext, implicit$FirstArg, noSerialize, useVisibleTask$, useServerData, useSignal, untrack, sync$, isDev, withLocale, event$, isServer, useStyles$, useStore, isBrowser, useContextProvider, useTask$, getLocale, jsx as jsx$1, SkipRender, createElement } from '@qwik.dev/core';
3
- import { g as getClientNavPath, s as shouldPreload, p as preloadRouteBundles, l as loadClientData, i as isPromise, a as isSamePath, c as createLoaderSignal, t as toUrl, b as isSameOrigin, d as loadRoute, D as DEFAULT_LOADERS_SERIALIZATION_STRATEGY, C as CLIENT_DATA_CACHE, Q as Q_ROUTE, e as clientNavigate, f as deepFreeze, h as QFN_KEY, j as QACTION_KEY, k as QDATA_KEY } from './chunks/routing.qwik.mjs';
3
+ import { g as getClientNavPath, s as shouldPreload, p as preloadRouteBundles, l as loadClientData, i as isPromise, a as isSamePath, c as createLoaderSignal, t as toUrl, b as isSameOrigin, d as loadRoute, D as DEFAULT_LOADERS_SERIALIZATION_STRATEGY, C as CLIENT_DATA_CACHE, Q as Q_ROUTE, e as clientNavigate, f as QFN_KEY, h as QACTION_KEY, j as QDATA_KEY } from './chunks/routing.qwik.mjs';
4
4
  import * as qwikRouterConfig from '@qwik-router-config';
5
5
  import { _getContextContainer, SerializerSymbol, _UNINITIALIZED, _hasStoreEffects, forceStoreEffects, _waitUntilRendered, _getContextHostElement, _getContextEvent, _serialize, _deserialize, _resolveContextWithoutSequentialScope } from '@qwik.dev/core/internal';
6
6
  import { _asyncRequestStore } from '@qwik.dev/router/middleware/request-handler';
@@ -882,7 +882,7 @@ const useQwikRouter = (props) => {
882
882
  }
883
883
  const navigate = () => {
884
884
  clientNavigate(window, navType, prevUrl, trackUrl, replaceState);
885
- contentInternal.force();
885
+ contentInternal.trigger();
886
886
  return _waitUntilRendered(container2);
887
887
  };
888
888
  const _waitNextPage = () => {
@@ -1322,9 +1322,9 @@ const serverQrl = (qrl, options) => {
1322
1322
  (v2) => v2 && Object.prototype.hasOwnProperty.call(v2, "sharedMap") && Object.prototype.hasOwnProperty.call(v2, "cookie")
1323
1323
  );
1324
1324
  }
1325
- return qrl.apply(requestEvent, isDev ? deepFreeze(args) : args);
1325
+ return qrl.apply(requestEvent, args);
1326
1326
  } else {
1327
- const filteredArgs = args.map((arg) => {
1327
+ let filteredArgs = args.map((arg) => {
1328
1328
  if (arg instanceof SubmitEvent && arg.target instanceof HTMLFormElement) {
1329
1329
  return new FormData(arg.target);
1330
1330
  } else if (arg instanceof Event) {
@@ -1334,6 +1334,9 @@ const serverQrl = (qrl, options) => {
1334
1334
  }
1335
1335
  return arg;
1336
1336
  });
1337
+ if (!filteredArgs.length) {
1338
+ filteredArgs = void 0;
1339
+ }
1337
1340
  const qrlHash = qrl.getHash();
1338
1341
  let query = "";
1339
1342
  const config = {
@@ -1349,11 +1352,11 @@ const serverQrl = (qrl, options) => {
1349
1352
  signal: abortSignal
1350
1353
  };
1351
1354
  const captured = qrl.getCaptured();
1352
- let toSend;
1355
+ let toSend = [filteredArgs];
1353
1356
  if (captured?.length) {
1354
- toSend = [filteredArgs, captured];
1357
+ toSend = [filteredArgs, ...captured];
1355
1358
  } else {
1356
- toSend = filteredArgs.length ? [filteredArgs] : [];
1359
+ toSend = filteredArgs ? [filteredArgs] : [];
1357
1360
  }
1358
1361
  const body = await _serialize(toSend);
1359
1362
  if (method === "GET") {
@@ -1377,7 +1380,7 @@ const serverQrl = (qrl, options) => {
1377
1380
  })();
1378
1381
  } else if (contentType === "application/qwik-json") {
1379
1382
  const str = await res.text();
1380
- const [obj] = _deserialize(str);
1383
+ const obj = _deserialize(str);
1381
1384
  if (res.status >= 400) {
1382
1385
  throw obj;
1383
1386
  }
@@ -1451,7 +1454,7 @@ const deserializeStream = async function* (stream, abortSignal) {
1451
1454
  const lines = buffer.split(/\n/);
1452
1455
  buffer = lines.pop();
1453
1456
  for (const line of lines) {
1454
- const [deserializedData] = _deserialize(line);
1457
+ const deserializedData = _deserialize(line);
1455
1458
  yield deserializedData;
1456
1459
  }
1457
1460
  }
@@ -1,5 +1,5 @@
1
1
  import { isServer } from '@qwik.dev/core/build';
2
- import { i as isPromise, k as QDATA_KEY, Q as Q_ROUTE, h as QFN_KEY, m as QLOADER_KEY, j as QACTION_KEY, d as loadRoute } from '../../chunks/routing.qwik.mjs';
2
+ import { i as isPromise, j as QDATA_KEY, Q as Q_ROUTE, f as QFN_KEY, k as QLOADER_KEY, h as QACTION_KEY, d as loadRoute } from '../../chunks/routing.qwik.mjs';
3
3
  import { inlinedQrl } from '@qwik.dev/core';
4
4
  import { _serialize, _UNINITIALIZED, _deserialize, _verifySerializable } from '@qwik.dev/core/internal';
5
5
  import { L as LoadedRouteProp } from '../../chunks/types.qwik.mjs';
@@ -337,7 +337,7 @@ async function runNext(requestEv, rebuildRouteInfo, resolve) {
337
337
  const accept = requestEv.request.headers.get("Accept");
338
338
  if (accept && !accept.includes("text/html")) {
339
339
  requestEv.headers.set("Content-Type", "application/qwik-json");
340
- requestEv.send(status, await _serialize([e.data]));
340
+ requestEv.send(status, await _serialize(e.data));
341
341
  } else {
342
342
  requestEv.html(status, getErrorHtml(status, e.data));
343
343
  }
@@ -1007,51 +1007,51 @@ async function runServerFunction(ev) {
1007
1007
  ev.exit();
1008
1008
  const isDev = getRequestMode(ev) === "dev";
1009
1009
  const data = await ev.parseBody();
1010
- if (Array.isArray(data)) {
1011
- const qrl = inlinedQrl(null, serverFnHash, data[1]);
1012
- let result;
1013
- try {
1010
+ if (!Array.isArray(data) || !(Array.isArray(data[0]) || data[0] === void 0)) {
1011
+ throw ev.error(500, "Invalid request");
1012
+ }
1013
+ const qrl = inlinedQrl(null, serverFnHash, data.slice(1));
1014
+ let result;
1015
+ try {
1016
+ if (isDev) {
1017
+ result = await measure(
1018
+ ev,
1019
+ `server_${serverFnHash}`,
1020
+ () => qrl.apply(ev, data[0])
1021
+ );
1022
+ } else {
1023
+ result = await qrl.apply(ev, data[0]);
1024
+ }
1025
+ } catch (err) {
1026
+ if (err instanceof ServerError$1) {
1027
+ throw ev.error(err.status, err.data);
1028
+ }
1029
+ console.error(`Server function ${serverFnHash} failed:`, err);
1030
+ throw ev.error(500, "Invalid request");
1031
+ }
1032
+ if (isAsyncIterator(result)) {
1033
+ ev.headers.set("Content-Type", "text/qwik-json-stream");
1034
+ const writable = ev.getWritableStream();
1035
+ const stream = writable.getWriter();
1036
+ for await (const item of result) {
1014
1037
  if (isDev) {
1015
- result = await measure(
1016
- ev,
1017
- `server_${serverFnHash}`,
1018
- () => qrl.apply(ev, data[0])
1019
- );
1020
- } else {
1021
- result = await qrl.apply(ev, data[0]);
1038
+ verifySerializable(item, qrl);
1022
1039
  }
1023
- } catch (err) {
1024
- if (err instanceof ServerError$1) {
1025
- throw ev.error(err.status, err.data);
1040
+ const message = await _serialize(item);
1041
+ if (ev.signal.aborted) {
1042
+ break;
1026
1043
  }
1027
- console.error(`Server function ${serverFnHash} failed:`, err);
1028
- throw ev.error(500, "Invalid request");
1029
- }
1030
- if (isAsyncIterator(result)) {
1031
- ev.headers.set("Content-Type", "text/qwik-json-stream");
1032
- const writable = ev.getWritableStream();
1033
- const stream = writable.getWriter();
1034
- for await (const item of result) {
1035
- if (isDev) {
1036
- verifySerializable(item, qrl);
1037
- }
1038
- const message = await _serialize([item]);
1039
- if (ev.signal.aborted) {
1040
- break;
1041
- }
1042
- await stream.write(encoder.encode(`${message}
1044
+ await stream.write(encoder.encode(`${message}
1043
1045
  `));
1044
- }
1045
- stream.close();
1046
- } else {
1047
- verifySerializable(result, qrl);
1048
- ev.headers.set("Content-Type", "application/qwik-json");
1049
- const message = await _serialize([result]);
1050
- ev.send(200, message);
1051
1046
  }
1052
- return;
1047
+ stream.close();
1048
+ } else {
1049
+ verifySerializable(result, qrl);
1050
+ ev.headers.set("Content-Type", "application/qwik-json");
1051
+ const message = await _serialize(result);
1052
+ ev.send(200, message);
1053
1053
  }
1054
- throw ev.error(500, "Invalid request");
1054
+ return;
1055
1055
  }
1056
1056
  }
1057
1057
  function fixTrailingSlash(ev) {
@@ -1251,7 +1251,7 @@ async function renderQData(requestEv) {
1251
1251
  isRewrite: requestEv.sharedMap.get(RequestEvIsRewrite)
1252
1252
  };
1253
1253
  const writer = requestEv.getWritableStream().getWriter();
1254
- const data = await _serialize([qData]);
1254
+ const data = await _serialize(qData);
1255
1255
  writer.write(encoder.encode(data));
1256
1256
  requestEv.sharedMap.set(RequestEvShareQData, qData);
1257
1257
  writer.close();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@qwik.dev/router",
3
3
  "description": "The router for Qwik.",
4
- "version": "2.0.0-beta.21",
4
+ "version": "2.0.0-beta.24",
5
5
  "bugs": "https://github.com/QwikDev/qwik/issues",
6
6
  "dependencies": {
7
7
  "@azure/functions": "3.5.1",
@@ -40,7 +40,7 @@
40
40
  "tsm": "2.3.0",
41
41
  "typescript": "5.9.3",
42
42
  "uvu": "0.5.6",
43
- "@qwik.dev/core": "2.0.0-beta.21"
43
+ "@qwik.dev/core": "2.0.0-beta.24"
44
44
  },
45
45
  "engines": {
46
46
  "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -169,7 +169,7 @@
169
169
  "main": "./lib/index.qwik.mjs",
170
170
  "peerDependencies": {
171
171
  "vite": ">=5 <8",
172
- "@qwik.dev/core": "^2.0.0-beta.21"
172
+ "@qwik.dev/core": "^2.0.0-beta.24"
173
173
  },
174
174
  "publishConfig": {
175
175
  "access": "public"