@nifrajs/web-solid 2.14.1 → 3.1.0
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/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -1
- package/dist/compose.d.ts.map +1 -1
- package/dist/compose.js +5 -1
- package/dist/compose.js.map +1 -1
- package/dist/fetcher.d.ts.map +1 -1
- package/dist/fetcher.js +6 -8
- package/dist/fetcher.js.map +1 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +5 -24
- package/dist/query.js.map +1 -1
- package/package.json +5 -5
- package/src/client.ts +3 -0
- package/src/compose.ts +6 -1
- package/src/fetcher.ts +12 -9
- package/src/query.ts +11 -24
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAmBnE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,mGAAmG;AACnG,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAE/F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAmBnE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,mGAAmG;AACnG,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAE/F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAkE7D"}
|
package/dist/client.js
CHANGED
|
@@ -72,6 +72,9 @@ export function mountRouter(options) {
|
|
|
72
72
|
get submission() {
|
|
73
73
|
return snapshot().submission;
|
|
74
74
|
},
|
|
75
|
+
get boundaries() {
|
|
76
|
+
return snapshot().boundaries;
|
|
77
|
+
},
|
|
75
78
|
};
|
|
76
79
|
// The matched chain is fixed for this mount (routeId is constant here); a route *change* disposes
|
|
77
80
|
// and re-mounts below, so the root render fn reads no signal and never re-runs on its own.
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,mGAAmG;AACnG,gGAAgG;AAChG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,cAAc,CAAA;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C,sGAAsG;AACtG,gFAAgF;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,mGAAmG;AACnG,MAAM,UAAU,OAAO,CAAC,KAAyB,EAAE,KAAkB,EAAE,SAAkB;IACvF,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,SAAoB,CAAC,CAAA;AAC3D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;IAC5D,gBAAgB,CAAC,MAAM,CAAC,CAAA,CAAC,kEAAkE;IAC3F,MAAM,EAAE,GAAG,SAAoB,CAAA;IAE/B,IAAI,OAAiC,CAAA;IACrC,IAAI,cAAc,GAAkB,IAAI,CAAA;IACxC,oGAAoG;IACpG,IAAI,MAAM,GAAoE,IAAI,CAAA;IAElF,MAAM,KAAK,GAAG,CAAC,KAAc,EAAQ,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QACjC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAA;QAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAA;QACnD,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE;YACtB,6FAA6F;YAC7F,6FAA6F;YAC7F,wEAAwE;YACxE,8FAA8F;YAC9F,+DAA+D;YAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;YACrD,MAAM,GAAG,WAAW,CAAA;YACpB,MAAM,KAAK,GAAG;gBACZ,IAAI,IAAI;oBACN,OAAO,QAAQ,EAAE,CAAC,IAAI,CAAA;gBACxB,CAAC;gBACD,IAAI,UAAU;oBACZ,OAAO,QAAQ,EAAE,CAAC,UAAU,CAAA;gBAC9B,CAAC;gBACD,IAAI,OAAO;oBACT,OAAO,QAAQ,EAAE,CAAC,OAAO,CAAA;gBAC3B,CAAC;gBACD,IAAI,MAAM;oBACR,+FAA+F;oBAC/F,wEAAwE;oBACxE,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAA;oBACpB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;oBAC/B,OAAO,aAAa,CAClB,aAAa,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAChC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CACpC,CAAA;gBACH,CAAC;gBACD,IAAI,UAAU;oBACZ,OAAO,QAAQ,EAAE,CAAC,UAAU,CAAA;gBAC9B,CAAC;gBACD,IAAI,UAAU;oBACZ,OAAO,QAAQ,EAAE,CAAC,UAAU,CAAA;gBAC9B,CAAC;aACa,CAAA;YAChB,kGAAkG;YAClG,2FAA2F;YAC3F,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,CAAA;QACxD,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC,CAAA;IAED,KAAK,CAAC,IAAI,CAAC,CAAA;IACX,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAClC,IAAI,QAAQ,CAAC,OAAO;YAAE,OAAM,CAAC,4CAA4C;QACzE,IAAI,QAAQ,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;YACxC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAA,CAAC,wEAAwE;QAC7F,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,EAAE,CAAA,CAAC,qDAAqD;YACjE,KAAK,CAAC,KAAK,CAAC,CAAA;QACd,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/compose.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAmC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAA;AAMpE;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAmC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAA;AAMpE;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,CAAC,OAAO,CA2BxF"}
|
package/dist/compose.js
CHANGED
|
@@ -20,7 +20,11 @@ export function compose(chain, props) {
|
|
|
20
20
|
// prefix, so `layoutData[i]` belongs to `chain[i]`; anything past that end (a client-only `_error`
|
|
21
21
|
// boundary marker, the page) reads `undefined` and is unaffected.
|
|
22
22
|
const layoutData = props.layoutData?.[i] ?? null;
|
|
23
|
-
node = () => createComponent(Layout, {
|
|
23
|
+
node = () => createComponent(Layout, {
|
|
24
|
+
data: layoutData,
|
|
25
|
+
...(props.boundaries !== undefined ? { boundaries: props.boundaries } : {}),
|
|
26
|
+
children: child(),
|
|
27
|
+
});
|
|
24
28
|
}
|
|
25
29
|
const inner = node;
|
|
26
30
|
// The provider `value` is an ACCESSOR reading `props.search` - a getter over the mount's snapshot on
|
package/dist/compose.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,eAAe,EAAY,MAAM,UAAU,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,sFAAsF;AACtF,MAAM,YAAY,GAAsC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAEzE;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAAC,KAAyB,EAAE,KAAkB;IACnE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;IAC7B,IAAI,IAAI,GAAsB,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAA2B,EAAE,KAAK,CAAC,CAAA;IACjG,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAyC,CAAA;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAA;QAClB,6FAA6F;QAC7F,mGAAmG;QACnG,kEAAkE;QAClE,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;QAChD,IAAI,GAAG,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,eAAe,EAAY,MAAM,UAAU,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,sFAAsF;AACtF,MAAM,YAAY,GAAsC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAEzE;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAAC,KAAyB,EAAE,KAAkB;IACnE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;IAC7B,IAAI,IAAI,GAAsB,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAA2B,EAAE,KAAK,CAAC,CAAA;IACjG,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAyC,CAAA;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAA;QAClB,6FAA6F;QAC7F,mGAAmG;QACnG,kEAAkE;QAClE,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;QAChD,IAAI,GAAG,GAAG,EAAE,CACV,eAAe,CAAC,MAAM,EAAE;YACtB,IAAI,EAAE,UAAU;YAChB,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,QAAQ,EAAE,KAAK,EAAE;SAClB,CAAC,CAAA;IACN,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAA;IAClB,qGAAqG;IACrG,sFAAsF;IACtF,OAAO,GAAG,EAAE,CACV,eAAe,CAAC,aAAa,CAAC,QAAQ,EAAE;QACtC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,YAAY,CAA4B;QACtE,IAAI,QAAQ;YACV,OAAO,KAAK,EAAE,CAAA;QAChB,CAAC;KACF,CAAC,CAAA;AACN,CAAC"}
|
package/dist/fetcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAMvE;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,KAAK,QAAQ,EAA2B,MAAM,UAAU,CAAA;AAIjE,oGAAoG;AACpG,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAEvE;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,oGAAoG;IACpG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAA;IACtC,qGAAqG;IACrG,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAUxD;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAAC,SAAS,OAAO,EAAE,CAAC,CAO1D"}
|
package/dist/fetcher.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createMountedRouterRef, IDLE_FETCHER_STATE, noopAsync, } from "@nifrajs/web/internal/fetcher-runtime";
|
|
1
2
|
/**
|
|
2
3
|
* `@nifrajs/web-solid/fetcher` - Solid bindings for concurrent fetchers. `createFetcher(key)` bridges an
|
|
3
4
|
* independent {@link Fetcher}'s `subscribe`/`snapshot` store into a Solid signal (the pattern the F16
|
|
@@ -11,22 +12,19 @@
|
|
|
11
12
|
* unchanged and the first client render after `mountRouter` takes over cleanly.
|
|
12
13
|
*/
|
|
13
14
|
import { createSignal, onCleanup } from "solid-js";
|
|
14
|
-
|
|
15
|
-
let mountedRouter;
|
|
15
|
+
const mountedRouter = createMountedRouterRef();
|
|
16
16
|
/** Register (or clear) the router that owns fetchers - called by `mountRouter`. Not for app use. */
|
|
17
17
|
export function setMountedRouter(router) {
|
|
18
|
-
mountedRouter
|
|
18
|
+
mountedRouter.set(router);
|
|
19
19
|
}
|
|
20
|
-
const IDLE = { pending: false, data: undefined };
|
|
21
|
-
const noopAsync = async () => { };
|
|
22
20
|
/**
|
|
23
21
|
* Bind the independent fetcher for `key` (created lazily, stable). Returns a reactive `state()`
|
|
24
22
|
* accessor + `load`/`submit`. Multiple `createFetcher` calls with different keys run concurrently
|
|
25
23
|
* without disturbing the active route or each other. Call inside a component (owns the subscription).
|
|
26
24
|
*/
|
|
27
25
|
export function createFetcher(key) {
|
|
28
|
-
const fetcher = mountedRouter?.fetcher(key);
|
|
29
|
-
const [state, setState] = createSignal(fetcher ? fetcher.snapshot() :
|
|
26
|
+
const fetcher = mountedRouter.get()?.fetcher(key);
|
|
27
|
+
const [state, setState] = createSignal(fetcher ? fetcher.snapshot() : IDLE_FETCHER_STATE);
|
|
30
28
|
if (fetcher !== undefined) {
|
|
31
29
|
onCleanup(fetcher.subscribe(() => setState(fetcher.snapshot())));
|
|
32
30
|
return { state, load: fetcher.load, submit: fetcher.submit };
|
|
@@ -38,7 +36,7 @@ export function createFetcher(key) {
|
|
|
38
36
|
* each entry's `.snapshot()` for its state. Updates whenever any fetcher transitions or one is created.
|
|
39
37
|
*/
|
|
40
38
|
export function useFetchers() {
|
|
41
|
-
const router = mountedRouter;
|
|
39
|
+
const router = mountedRouter.get();
|
|
42
40
|
const [list, setList] = createSignal(router ? router.fetchers() : []);
|
|
43
41
|
if (router !== undefined) {
|
|
44
42
|
onCleanup(router.subscribeFetchers(() => setList(router.fetchers())));
|
package/dist/fetcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AACH,OAAO,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEjE,
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,SAAS,GACV,MAAM,uCAAuC,CAAA;AAC9C;;;;;;;;;;;GAWG;AACH,OAAO,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEjE,MAAM,aAAa,GAAG,sBAAsB,EAAE,CAAA;AAE9C,oGAAoG;AACpG,MAAM,UAAU,gBAAgB,CAAC,MAAgC;IAC/D,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC;AAYD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CACpC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAClD,CAAA;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;QAChE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAA;IAC9D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,CAAA;IAClC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAqB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACzF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;IACvE,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/dist/query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAM3D;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,QAAQ,EAAoC,MAAM,UAAU,CAAA;AAE1E,wGAAwG;AACxG,wBAAgB,cAAc,IAAI,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAEvE;AAED,wDAAwD;AACxD,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,uGAAuG;IACvG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAA;CACnC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAgBvF"}
|
package/dist/query.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// server, which Vite's dev server evaluates rather than tree-shakes.
|
|
3
|
-
import { createQueryClient } from "@nifrajs/web/client";
|
|
1
|
+
import { createNoClientRefetch, getQueryClientSingleton, IDLE_QUERY_STATE, } from "@nifrajs/web/internal/query-runtime";
|
|
4
2
|
/**
|
|
5
3
|
* `@nifrajs/web-solid/query` - Solid bindings for the keyed query-cache. `createQuery(key, fn)` bridges a
|
|
6
4
|
* query's `subscribe`/`snapshot` store into a Solid signal and fetches on mount; `useQueryClient`
|
|
@@ -12,33 +10,18 @@ import { createQueryClient } from "@nifrajs/web/client";
|
|
|
12
10
|
* The `key` is captured once (Solid setup runs once); a reactive key is a documented future enhancement.
|
|
13
11
|
*/
|
|
14
12
|
import { createSignal, onCleanup, onMount } from "solid-js";
|
|
15
|
-
let client;
|
|
16
|
-
function getClient() {
|
|
17
|
-
if (typeof window === "undefined")
|
|
18
|
-
return undefined; // SSR → no client (queries render idle)
|
|
19
|
-
if (client === undefined)
|
|
20
|
-
client = createQueryClient({ now: () => Date.now() });
|
|
21
|
-
return client;
|
|
22
|
-
}
|
|
23
13
|
/** Access the query client to imperatively `invalidateQueries(keyOrPrefix)` (e.g. after a mutation). */
|
|
24
14
|
export function useQueryClient() {
|
|
25
|
-
return
|
|
15
|
+
return getQueryClientSingleton() ?? { invalidateQueries: () => { } };
|
|
26
16
|
}
|
|
27
|
-
const IDLE = Object.freeze({
|
|
28
|
-
status: "pending",
|
|
29
|
-
data: undefined,
|
|
30
|
-
error: undefined,
|
|
31
|
-
isFetching: false,
|
|
32
|
-
updatedAt: Number.NEGATIVE_INFINITY,
|
|
33
|
-
});
|
|
34
17
|
/**
|
|
35
18
|
* Bind the keyed query for `key`, fetched via `fn`. Returns a reactive `state()` accessor + `refetch`.
|
|
36
19
|
* Concurrent `createQuery`s with the same key share one cache entry + one in-flight fetch (dedup).
|
|
37
20
|
* Fetches on mount; SSR-idle. Call inside a component (owns the subscription).
|
|
38
21
|
*/
|
|
39
22
|
export function createQuery(key, fn) {
|
|
40
|
-
const handle =
|
|
41
|
-
const [state, setState] = createSignal(handle ? handle.snapshot() :
|
|
23
|
+
const handle = getQueryClientSingleton()?.query(key, fn);
|
|
24
|
+
const [state, setState] = createSignal(handle ? handle.snapshot() : IDLE_QUERY_STATE);
|
|
42
25
|
if (handle !== undefined) {
|
|
43
26
|
onCleanup(handle.subscribe(() => setState(() => handle.snapshot())));
|
|
44
27
|
onMount(() => {
|
|
@@ -48,9 +31,7 @@ export function createQuery(key, fn) {
|
|
|
48
31
|
}
|
|
49
32
|
return {
|
|
50
33
|
state,
|
|
51
|
-
refetch:
|
|
52
|
-
throw new Error("[nifra/web-solid] createQuery.refetch called with no query client (server?)");
|
|
53
|
-
},
|
|
34
|
+
refetch: createNoClientRefetch("[nifra/web-solid]", "createQuery.refetch"),
|
|
54
35
|
};
|
|
55
36
|
}
|
|
56
37
|
//# sourceMappingURL=query.js.map
|
package/dist/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AACA,
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,qCAAqC,CAAA;AAC5C;;;;;;;;;GASG;AACH,OAAO,EAAiB,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAE1E,wGAAwG;AACxG,MAAM,UAAU,cAAc;IAC5B,OAAO,uBAAuB,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAA;AACrE,CAAC;AAUD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAI,GAAY,EAAE,EAAoB;IAC/D,MAAM,MAAM,GAAG,uBAAuB,EAAE,EAAE,KAAK,CAAI,GAAG,EAAE,EAAE,CAAC,CAAA;IAC3D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CACpC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAC9C,CAAA;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;QACpE,OAAO,CAAC,GAAG,EAAE;YACX,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;QACF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAA;IAC3C,CAAC;IACD,OAAO;QACL,KAAK;QACL,OAAO,EAAE,qBAAqB,CAAI,mBAAmB,EAAE,qBAAqB,CAAC;KAC9E,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nifrajs/web-solid",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Solid render adapter for @nifrajs/web - SSR + hydration + the Solid Babel build plugin.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bun",
|
|
@@ -99,10 +99,10 @@
|
|
|
99
99
|
"dependencies": {
|
|
100
100
|
"@babel/core": "^7.26.0",
|
|
101
101
|
"@babel/preset-typescript": "^7.26.0",
|
|
102
|
-
"@nifrajs/core": "
|
|
103
|
-
"@nifrajs/i18n": "
|
|
104
|
-
"@nifrajs/image": "
|
|
105
|
-
"@nifrajs/web": "
|
|
102
|
+
"@nifrajs/core": "3.1.0",
|
|
103
|
+
"@nifrajs/i18n": "3.1.0",
|
|
104
|
+
"@nifrajs/image": "3.1.0",
|
|
105
|
+
"@nifrajs/web": "3.1.0",
|
|
106
106
|
"babel-preset-solid": "^1.9.3",
|
|
107
107
|
"solid-refresh": "^0.7.8"
|
|
108
108
|
},
|
package/src/client.ts
CHANGED
|
@@ -81,6 +81,9 @@ export function mountRouter(options: MountRouterOptions): void {
|
|
|
81
81
|
get submission() {
|
|
82
82
|
return snapshot().submission
|
|
83
83
|
},
|
|
84
|
+
get boundaries() {
|
|
85
|
+
return snapshot().boundaries
|
|
86
|
+
},
|
|
84
87
|
} as RenderProps
|
|
85
88
|
// The matched chain is fixed for this mount (routeId is constant here); a route *change* disposes
|
|
86
89
|
// and re-mounts below, so the root render fn reads no signal and never re-runs on its own.
|
package/src/compose.ts
CHANGED
|
@@ -23,7 +23,12 @@ export function compose(chain: readonly unknown[], props: RenderProps): () => JS
|
|
|
23
23
|
// prefix, so `layoutData[i]` belongs to `chain[i]`; anything past that end (a client-only `_error`
|
|
24
24
|
// boundary marker, the page) reads `undefined` and is unaffected.
|
|
25
25
|
const layoutData = props.layoutData?.[i] ?? null
|
|
26
|
-
node = () =>
|
|
26
|
+
node = () =>
|
|
27
|
+
createComponent(Layout, {
|
|
28
|
+
data: layoutData,
|
|
29
|
+
...(props.boundaries !== undefined ? { boundaries: props.boundaries } : {}),
|
|
30
|
+
children: child(),
|
|
31
|
+
})
|
|
27
32
|
}
|
|
28
33
|
const inner = node
|
|
29
34
|
// The provider `value` is an ACCESSOR reading `props.search` - a getter over the mount's snapshot on
|
package/src/fetcher.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { ClientRouter, Fetcher, FetcherState } from "@nifrajs/web"
|
|
2
|
+
import {
|
|
3
|
+
createMountedRouterRef,
|
|
4
|
+
IDLE_FETCHER_STATE,
|
|
5
|
+
noopAsync,
|
|
6
|
+
} from "@nifrajs/web/internal/fetcher-runtime"
|
|
2
7
|
/**
|
|
3
8
|
* `@nifrajs/web-solid/fetcher` - Solid bindings for concurrent fetchers. `createFetcher(key)` bridges an
|
|
4
9
|
* independent {@link Fetcher}'s `subscribe`/`snapshot` store into a Solid signal (the pattern the F16
|
|
@@ -13,17 +18,13 @@ import type { ClientRouter, Fetcher, FetcherState } from "@nifrajs/web"
|
|
|
13
18
|
*/
|
|
14
19
|
import { type Accessor, createSignal, onCleanup } from "solid-js"
|
|
15
20
|
|
|
16
|
-
|
|
17
|
-
let mountedRouter: ClientRouter | undefined
|
|
21
|
+
const mountedRouter = createMountedRouterRef()
|
|
18
22
|
|
|
19
23
|
/** Register (or clear) the router that owns fetchers - called by `mountRouter`. Not for app use. */
|
|
20
24
|
export function setMountedRouter(router: ClientRouter | undefined): void {
|
|
21
|
-
mountedRouter
|
|
25
|
+
mountedRouter.set(router)
|
|
22
26
|
}
|
|
23
27
|
|
|
24
|
-
const IDLE: FetcherState = { pending: false, data: undefined }
|
|
25
|
-
const noopAsync = async (): Promise<void> => {}
|
|
26
|
-
|
|
27
28
|
/** A fetcher's reactive state accessor plus its imperative `load`/`submit`. */
|
|
28
29
|
export interface FetcherHandle {
|
|
29
30
|
/** Reactive accessor for the fetcher's {@link FetcherState} (`pending`/`data`/`actionData`/...). */
|
|
@@ -40,8 +41,10 @@ export interface FetcherHandle {
|
|
|
40
41
|
* without disturbing the active route or each other. Call inside a component (owns the subscription).
|
|
41
42
|
*/
|
|
42
43
|
export function createFetcher(key: string): FetcherHandle {
|
|
43
|
-
const fetcher = mountedRouter?.fetcher(key)
|
|
44
|
-
const [state, setState] = createSignal<FetcherState>(
|
|
44
|
+
const fetcher = mountedRouter.get()?.fetcher(key)
|
|
45
|
+
const [state, setState] = createSignal<FetcherState>(
|
|
46
|
+
fetcher ? fetcher.snapshot() : IDLE_FETCHER_STATE,
|
|
47
|
+
)
|
|
45
48
|
if (fetcher !== undefined) {
|
|
46
49
|
onCleanup(fetcher.subscribe(() => setState(fetcher.snapshot())))
|
|
47
50
|
return { state, load: fetcher.load, submit: fetcher.submit }
|
|
@@ -54,7 +57,7 @@ export function createFetcher(key: string): FetcherHandle {
|
|
|
54
57
|
* each entry's `.snapshot()` for its state. Updates whenever any fetcher transitions or one is created.
|
|
55
58
|
*/
|
|
56
59
|
export function useFetchers(): Accessor<readonly Fetcher[]> {
|
|
57
|
-
const router = mountedRouter
|
|
60
|
+
const router = mountedRouter.get()
|
|
58
61
|
const [list, setList] = createSignal<readonly Fetcher[]>(router ? router.fetchers() : [])
|
|
59
62
|
if (router !== undefined) {
|
|
60
63
|
onCleanup(router.subscribeFetchers(() => setList(router.fetchers())))
|
package/src/query.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { QueryClient, QueryState } from "@nifrajs/web"
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import {
|
|
3
|
+
createNoClientRefetch,
|
|
4
|
+
getQueryClientSingleton,
|
|
5
|
+
IDLE_QUERY_STATE,
|
|
6
|
+
} from "@nifrajs/web/internal/query-runtime"
|
|
5
7
|
/**
|
|
6
8
|
* `@nifrajs/web-solid/query` - Solid bindings for the keyed query-cache. `createQuery(key, fn)` bridges a
|
|
7
9
|
* query's `subscribe`/`snapshot` store into a Solid signal and fetches on mount; `useQueryClient`
|
|
@@ -14,26 +16,11 @@ import { createQueryClient } from "@nifrajs/web/client"
|
|
|
14
16
|
*/
|
|
15
17
|
import { type Accessor, createSignal, onCleanup, onMount } from "solid-js"
|
|
16
18
|
|
|
17
|
-
let client: QueryClient | undefined
|
|
18
|
-
function getClient(): QueryClient | undefined {
|
|
19
|
-
if (typeof window === "undefined") return undefined // SSR → no client (queries render idle)
|
|
20
|
-
if (client === undefined) client = createQueryClient({ now: () => Date.now() })
|
|
21
|
-
return client
|
|
22
|
-
}
|
|
23
|
-
|
|
24
19
|
/** Access the query client to imperatively `invalidateQueries(keyOrPrefix)` (e.g. after a mutation). */
|
|
25
20
|
export function useQueryClient(): Pick<QueryClient, "invalidateQueries"> {
|
|
26
|
-
return
|
|
21
|
+
return getQueryClientSingleton() ?? { invalidateQueries: () => {} }
|
|
27
22
|
}
|
|
28
23
|
|
|
29
|
-
const IDLE: QueryState<never> = Object.freeze({
|
|
30
|
-
status: "pending",
|
|
31
|
-
data: undefined,
|
|
32
|
-
error: undefined,
|
|
33
|
-
isFetching: false,
|
|
34
|
-
updatedAt: Number.NEGATIVE_INFINITY,
|
|
35
|
-
})
|
|
36
|
-
|
|
37
24
|
/** A query's reactive state accessor plus `refetch`. */
|
|
38
25
|
export interface CreateQueryResult<T> {
|
|
39
26
|
/** Reactive accessor for the {@link QueryState} (`status`/`data`/`error`/`isFetching`/`updatedAt`). */
|
|
@@ -48,8 +35,10 @@ export interface CreateQueryResult<T> {
|
|
|
48
35
|
* Fetches on mount; SSR-idle. Call inside a component (owns the subscription).
|
|
49
36
|
*/
|
|
50
37
|
export function createQuery<T>(key: unknown, fn: () => Promise<T>): CreateQueryResult<T> {
|
|
51
|
-
const handle =
|
|
52
|
-
const [state, setState] = createSignal<QueryState<T>>(
|
|
38
|
+
const handle = getQueryClientSingleton()?.query<T>(key, fn)
|
|
39
|
+
const [state, setState] = createSignal<QueryState<T>>(
|
|
40
|
+
handle ? handle.snapshot() : IDLE_QUERY_STATE,
|
|
41
|
+
)
|
|
53
42
|
if (handle !== undefined) {
|
|
54
43
|
onCleanup(handle.subscribe(() => setState(() => handle.snapshot())))
|
|
55
44
|
onMount(() => {
|
|
@@ -59,8 +48,6 @@ export function createQuery<T>(key: unknown, fn: () => Promise<T>): CreateQueryR
|
|
|
59
48
|
}
|
|
60
49
|
return {
|
|
61
50
|
state,
|
|
62
|
-
refetch:
|
|
63
|
-
throw new Error("[nifra/web-solid] createQuery.refetch called with no query client (server?)")
|
|
64
|
-
},
|
|
51
|
+
refetch: createNoClientRefetch<T>("[nifra/web-solid]", "createQuery.refetch"),
|
|
65
52
|
}
|
|
66
53
|
}
|