@solidjs/router 0.14.0 → 0.14.2

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.
package/README.md CHANGED
@@ -495,11 +495,19 @@ This is light wrapper over `createResource` that aims to serve as stand-in for a
495
495
  const user = createAsync((currentValue) => getUser(params.id))
496
496
  ```
497
497
 
498
+ It also preserves `latest` field from `createResource`. Note that it will be removed in the future.
499
+
500
+ ```jsx
501
+ const user = createAsync((currentValue) => getUser(params.id))
502
+ return <h1>{user.latest.name}</h1>;
503
+ ```
504
+
498
505
  Using `cache` in `createResource` directly won't work properly as the fetcher is not reactive and it won't invalidate properly.
499
506
 
500
507
  ### `createAsyncStore`
501
508
 
502
509
  Similar to `createAsync` except it uses a deeply reactive store. Perfect for applying fine-grained changes to large model data that updates.
510
+ It also supports `latest` field which will be removed in the future.
503
511
 
504
512
  ```jsx
505
513
  const todos = createAsyncStore(() => getTodos());
@@ -727,7 +735,7 @@ This is the main Router component for the browser.
727
735
  | base | string | Base url to use for matching routes |
728
736
  | actionBase | string | Root url for server actions, default: `/_server` |
729
737
  | preload | boolean | Enables/disables preloads globally, default: `true` |
730
- | explicitLinks | boolean | Disables all anchors being intercepted and instead requires `<A>`. default: `false` |
738
+ | explicitLinks | boolean | Disables all anchors being intercepted and instead requires `<A>`. Default: `false`. (To disable interception for a specific link, set `target` to any value, e.g. `<a target="_self">`.) |
731
739
 
732
740
  ### `<A>`
733
741
 
@@ -5,9 +5,9 @@ export type Action<T extends Array<any>, U> = (T extends [FormData] | [] ? JSX.S
5
5
  with<A extends any[], B extends any[]>(this: (this: any, ...args: [...A, ...B]) => Promise<NarrowResponse<U>>, ...args: A): Action<B, U>;
6
6
  };
7
7
  export declare const actions: Map<string, Action<any, any>>;
8
- export declare function useSubmissions<T extends Array<any>, U>(fn: Action<T, U>, filter?: (arg: T) => boolean): Submission<T, U>[] & {
8
+ export declare function useSubmissions<T extends Array<any>, U>(fn: Action<T, U>, filter?: (arg: T) => boolean): Submission<T, NarrowResponse<U>>[] & {
9
9
  pending: boolean;
10
10
  };
11
- export declare function useSubmission<T extends Array<any>, U>(fn: Action<T, U>, filter?: (arg: T) => boolean): Submission<T, U> | SubmissionStub;
11
+ export declare function useSubmission<T extends Array<any>, U>(fn: Action<T, U>, filter?: (arg: T) => boolean): Submission<T, NarrowResponse<U>> | SubmissionStub;
12
12
  export declare function useAction<T extends Array<any>, U>(action: Action<T, U>): (...args: Parameters<Action<T, U>>) => Promise<NarrowResponse<U>>;
13
13
  export declare function action<T extends Array<any>, U = void>(fn: (...args: T) => Promise<U>, name?: string): Action<T, U>;
@@ -1,27 +1,32 @@
1
+ import { type ReconcileOptions } from "solid-js/store";
1
2
  /**
2
- * This is mock of the eventual Solid 2.0 primitive. It is not fully featured.
3
+ * As `createAsync` and `createAsyncStore` are wrappers for `createResource`,
4
+ * this type allows to support `latest` field for these primitives.
5
+ * It will be removed in the future.
3
6
  */
4
- import { type Accessor } from "solid-js";
5
- import { type ReconcileOptions } from "solid-js/store";
7
+ export type AccessorWithLatest<T> = {
8
+ (): T;
9
+ latest: T;
10
+ };
6
11
  export declare function createAsync<T>(fn: (prev: T) => Promise<T>, options: {
7
12
  name?: string;
8
13
  initialValue: T;
9
14
  deferStream?: boolean;
10
- }): Accessor<T>;
15
+ }): AccessorWithLatest<T>;
11
16
  export declare function createAsync<T>(fn: (prev: T | undefined) => Promise<T>, options?: {
12
17
  name?: string;
13
18
  initialValue?: T;
14
19
  deferStream?: boolean;
15
- }): Accessor<T | undefined>;
20
+ }): AccessorWithLatest<T | undefined>;
16
21
  export declare function createAsyncStore<T>(fn: (prev: T) => Promise<T>, options: {
17
22
  name?: string;
18
23
  initialValue: T;
19
24
  deferStream?: boolean;
20
25
  reconcile?: ReconcileOptions;
21
- }): Accessor<T>;
26
+ }): AccessorWithLatest<T>;
22
27
  export declare function createAsyncStore<T>(fn: (prev: T | undefined) => Promise<T>, options?: {
23
28
  name?: string;
24
29
  initialValue?: T;
25
30
  deferStream?: boolean;
26
31
  reconcile?: ReconcileOptions;
27
- }): Accessor<T | undefined>;
32
+ }): AccessorWithLatest<T | undefined>;
@@ -8,7 +8,13 @@ export function createAsync(fn, options) {
8
8
  let resource;
9
9
  let prev = () => !resource || resource.state === "unresolved" ? undefined : resource.latest;
10
10
  [resource] = createResource(() => subFetch(fn, untrack(prev)), v => v, options);
11
- return () => resource();
11
+ const resultAccessor = (() => resource());
12
+ Object.defineProperty(resultAccessor, 'latest', {
13
+ get() {
14
+ return resource.latest;
15
+ }
16
+ });
17
+ return resultAccessor;
12
18
  }
13
19
  export function createAsyncStore(fn, options = {}) {
14
20
  let resource;
@@ -17,7 +23,13 @@ export function createAsyncStore(fn, options = {}) {
17
23
  ...options,
18
24
  storage: (init) => createDeepSignal(init, options.reconcile)
19
25
  });
20
- return () => resource();
26
+ const resultAccessor = (() => resource());
27
+ Object.defineProperty(resultAccessor, 'latest', {
28
+ get() {
29
+ return resource.latest;
30
+ }
31
+ });
32
+ return resultAccessor;
21
33
  }
22
34
  function createDeepSignal(value, options) {
23
35
  const [store, setStore] = createStore({
@@ -1,4 +1,4 @@
1
- export { createAsync, createAsyncStore } from "./createAsync.js";
1
+ export { createAsync, createAsyncStore, type AccessorWithLatest } from "./createAsync.js";
2
2
  export { action, useSubmission, useSubmissions, useAction, type Action } from "./action.js";
3
3
  export { cache, revalidate, type CachedFunction } from "./cache.js";
4
4
  export { redirect, reload, json } from "./response.js";
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { isServer, getRequestEvent, createComponent as createComponent$1, memo, delegateEvents, spread, mergeProps as mergeProps$1, template } from 'solid-js/web';
2
- import { getOwner, runWithOwner, createMemo, createContext, onCleanup, useContext, untrack, createSignal, createRenderEffect, on, startTransition, resetErrorBoundaries, batch, createComponent, children, mergeProps, Show, createRoot, getListener, sharedConfig, $TRACK, splitProps, createResource } from 'solid-js';
2
+ import { getOwner, runWithOwner, createMemo, createContext, onCleanup, useContext, untrack, createSignal, createRenderEffect, on, startTransition, resetErrorBoundaries, batch, createComponent, children, mergeProps, Show, createRoot, sharedConfig, getListener, $TRACK, splitProps, createResource } from 'solid-js';
3
3
  import { createStore, reconcile, unwrap } from 'solid-js/store';
4
4
 
5
5
  function createBeforeLeave() {
@@ -840,6 +840,7 @@ function createRouter(config) {
840
840
  equals: (a, b) => a.value === b.value && a.state === b.state
841
841
  }), undefined, next => {
842
842
  !ignore && config.set(next);
843
+ if (sharedConfig.registry && !sharedConfig.done) sharedConfig.done = true;
843
844
  return next;
844
845
  });
845
846
  config.init && onCleanup(config.init((value = config.get()) => {
@@ -1521,11 +1522,24 @@ function Navigate(props) {
1521
1522
  /**
1522
1523
  * This is mock of the eventual Solid 2.0 primitive. It is not fully featured.
1523
1524
  */
1525
+
1526
+ /**
1527
+ * As `createAsync` and `createAsyncStore` are wrappers for `createResource`,
1528
+ * this type allows to support `latest` field for these primitives.
1529
+ * It will be removed in the future.
1530
+ */
1531
+
1524
1532
  function createAsync(fn, options) {
1525
1533
  let resource;
1526
1534
  let prev = () => !resource || resource.state === "unresolved" ? undefined : resource.latest;
1527
1535
  [resource] = createResource(() => subFetch(fn, untrack(prev)), v => v, options);
1528
- return () => resource();
1536
+ const resultAccessor = () => resource();
1537
+ Object.defineProperty(resultAccessor, 'latest', {
1538
+ get() {
1539
+ return resource.latest;
1540
+ }
1541
+ });
1542
+ return resultAccessor;
1529
1543
  }
1530
1544
  function createAsyncStore(fn, options = {}) {
1531
1545
  let resource;
@@ -1534,7 +1548,13 @@ function createAsyncStore(fn, options = {}) {
1534
1548
  ...options,
1535
1549
  storage: init => createDeepSignal(init, options.reconcile)
1536
1550
  });
1537
- return () => resource();
1551
+ const resultAccessor = () => resource();
1552
+ Object.defineProperty(resultAccessor, 'latest', {
1553
+ get() {
1554
+ return resource.latest;
1555
+ }
1556
+ });
1557
+ return resultAccessor;
1538
1558
  }
1539
1559
  function createDeepSignal(value, options) {
1540
1560
  const [store, setStore] = createStore({
@@ -1,4 +1,4 @@
1
- import { createSignal, onCleanup } from "solid-js";
1
+ import { createSignal, onCleanup, sharedConfig } from "solid-js";
2
2
  import { createRouterComponent } from "./components.jsx";
3
3
  function intercept([value, setValue], get, set) {
4
4
  return [get ? () => get(value()) : value, set ? (v) => setValue(set(v)) : setValue];
@@ -22,6 +22,8 @@ export function createRouter(config) {
22
22
  equals: (a, b) => a.value === b.value && a.state === b.state
23
23
  }), undefined, next => {
24
24
  !ignore && config.set(next);
25
+ if (sharedConfig.registry && !sharedConfig.done)
26
+ sharedConfig.done = true;
25
27
  return next;
26
28
  });
27
29
  config.init &&
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "Ryan Turnquist"
7
7
  ],
8
8
  "license": "MIT",
9
- "version": "0.14.0",
9
+ "version": "0.14.2",
10
10
  "homepage": "https://github.com/solidjs/solid-router#readme",
11
11
  "repository": {
12
12
  "type": "git",