@yakocloud/state-vocab 4.0.0 → 4.0.1
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 +15 -15
- package/dist/server.cjs.js +1 -1
- package/dist/server.es.js +41 -54
- package/dist/types/setup.server.d.ts +6 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -359,7 +359,7 @@ export default async function Page() {
|
|
|
359
359
|
|
|
360
360
|
return (
|
|
361
361
|
<StateVocabProvider
|
|
362
|
-
value={serverStorage({
|
|
362
|
+
value={serverStorage.set({
|
|
363
363
|
user: { name: user.name, role: user.role },
|
|
364
364
|
person: { address: { city: user.city } },
|
|
365
365
|
})}
|
|
@@ -398,21 +398,21 @@ export default function UserInfoClient() {
|
|
|
398
398
|
|
|
399
399
|
#### `serverify(storage)`
|
|
400
400
|
|
|
401
|
-
Converts a storage tree into its server-side counterpart. Each leaf gains a `.getState()` method that reads the value seeded into the nearest `StateVocabProvider`.
|
|
401
|
+
Converts a storage tree into its server-side counterpart. Each leaf gains a `.getState()` method that reads the value seeded into the nearest `StateVocabProvider`. Each namespace node (including the root) gains a `.set()` method that returns the input wrapped under its full ancestor path, ready for `StateVocabProvider`'s `value` prop.
|
|
402
402
|
|
|
403
|
-
|
|
403
|
+
**`.set()` syntax:**
|
|
404
404
|
|
|
405
405
|
```ts
|
|
406
|
-
// Full tree at once — root
|
|
407
|
-
serverStorage({ user: { name: 'Alice', role: 'Admin' } })
|
|
406
|
+
// Full tree at once — root .set() returns input as-is
|
|
407
|
+
serverStorage.set({ user: { name: 'Alice', role: 'Admin' } })
|
|
408
408
|
// → { user: { name: 'Alice', role: 'Admin' } }
|
|
409
409
|
|
|
410
410
|
// Single namespace — wraps input under its key
|
|
411
|
-
serverStorage.user({ name: 'Alice', role: 'Admin' })
|
|
411
|
+
serverStorage.user.set({ name: 'Alice', role: 'Admin' })
|
|
412
412
|
// → { user: { name: 'Alice', role: 'Admin' } }
|
|
413
413
|
|
|
414
414
|
// Nested namespace — wraps up to the root
|
|
415
|
-
serverStorage.person.address({ city: 'NY' })
|
|
415
|
+
serverStorage.person.address.set({ city: 'NY' })
|
|
416
416
|
// → { person: { address: { city: 'NY' } } }
|
|
417
417
|
```
|
|
418
418
|
|
|
@@ -421,8 +421,8 @@ All three forms return a value ready to pass as `StateVocabProvider`'s `value` p
|
|
|
421
421
|
```tsx
|
|
422
422
|
<StateVocabProvider
|
|
423
423
|
value={{
|
|
424
|
-
...serverStorage.user({ name: 'Alice', role: 'Admin' }),
|
|
425
|
-
...serverStorage.person.address({ city: 'NY' }),
|
|
424
|
+
...serverStorage.user.set({ name: 'Alice', role: 'Admin' }),
|
|
425
|
+
...serverStorage.person.address.set({ city: 'NY' }),
|
|
426
426
|
}}
|
|
427
427
|
>
|
|
428
428
|
```
|
|
@@ -649,7 +649,7 @@ A React context provider that initializes a `VocabStore` for its subtree. Requir
|
|
|
649
649
|
Accepts an optional `value` prop (imported from `@yakocloud/state-vocab/server` in RSC contexts) to pre-seed the store with server-fetched data:
|
|
650
650
|
|
|
651
651
|
```tsx
|
|
652
|
-
<StateVocabProvider value={serverStorage({ user: { name: 'Alice' } })}>
|
|
652
|
+
<StateVocabProvider value={serverStorage.set({ user: { name: 'Alice' } })}>
|
|
653
653
|
<App />
|
|
654
654
|
</StateVocabProvider>
|
|
655
655
|
```
|
|
@@ -658,16 +658,16 @@ Accepts an optional `value` prop (imported from `@yakocloud/state-vocab/server`
|
|
|
658
658
|
|
|
659
659
|
Converts a storage tree to its server-side counterpart. Available from `@yakocloud/state-vocab/server`.
|
|
660
660
|
|
|
661
|
-
Each leaf gains `.getState()` — reads the value from the nearest `StateVocabProvider`. Each namespace node
|
|
661
|
+
Each leaf gains `.getState()` — reads the value from the nearest `StateVocabProvider`. Each namespace node gains `.set()`, which returns the input wrapped under its full ancestor path (ready for `StateVocabProvider`'s `value` prop).
|
|
662
662
|
|
|
663
663
|
```ts
|
|
664
664
|
import { serverify } from '@yakocloud/state-vocab/server'
|
|
665
665
|
const serverStorage = serverify(storage)
|
|
666
666
|
|
|
667
|
-
serverStorage.user.name.getState()
|
|
668
|
-
serverStorage.user({ name: 'Alice' })
|
|
669
|
-
serverStorage.person.address({ city: 'NY' })
|
|
670
|
-
serverStorage({ user: { name: 'Alice' } })
|
|
667
|
+
serverStorage.user.name.getState() // reads "user.name" from context
|
|
668
|
+
serverStorage.user.set({ name: 'Alice' }) // → { user: { name: 'Alice' } }
|
|
669
|
+
serverStorage.person.address.set({ city: 'NY' }) // → { person: { address: { city: 'NY' } } }
|
|
670
|
+
serverStorage.set({ user: { name: 'Alice' } }) // → { user: { name: 'Alice' } } (identity)
|
|
671
671
|
```
|
|
672
672
|
|
|
673
673
|
### `clientify<T>(storage: T)`
|
package/dist/server.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),d=require("react"),v=require("node:async_hooks"),f=require("./provider.client--OPImdtY.js"),l=require("./utils-33NqsZoR.js");function b(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const y=b(v),a=e=>{if(d.useState)throw new Error(`${e} only intended for Server Components`)};let s=null;try{a("StateVocabServerContext"),s=new y.AsyncLocalStorage}catch{s=null}const p=({value:e})=>(s?.enterWith({value:e}),null),g=({children:e})=>e,P=async e=>{a("StateVocabServerContext.Provider");const{value:t,children:r}=e;return c.jsxs(c.Fragment,{children:[c.jsx(p,{value:t}),r]})},h=()=>(a("getStateVocab"),s?.getStore()?.value),j={Provider:s?P:g},V=({value:e,children:t})=>c.jsx(j.Provider,{value:e,children:t});function m(e){const{children:t,value:r={}}=e;return c.jsx(V,{value:r,children:c.jsx(f.StateVocabClientProvider,{value:r,children:t})})}function x(){const e=this[l.STATE_PATH],t=h();if(!t)throw new Error("Make sure your component is wrapped in StateVocabProvider");return l.get(t,e)}function O(e){return typeof e=="object"&&e!==null&&"serverSlot"in e}function u(e,t){const r={};for(const o in e){const n=e[o];if(O(n))r[o]=n.serverSlot({getState(...i){return x.apply(this,i)}}),delete r[o].serverSlot,delete r[o].clientSlot;else if(n!==null&&typeof n=="object"){const i=S=>t({[o]:S});r[o]=u(n,i)}else r[o]=n}return r.set=o=>t(o),r}function k(e){return u(e,t=>t)}exports.StateVocabProvider=m;exports.serverify=k;
|
package/dist/server.es.js
CHANGED
|
@@ -1,77 +1,64 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import * as
|
|
4
|
-
import { S as
|
|
5
|
-
import { S as
|
|
6
|
-
const
|
|
7
|
-
if (
|
|
1
|
+
import { jsxs as u, Fragment as v, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import f from "react";
|
|
3
|
+
import * as d from "node:async_hooks";
|
|
4
|
+
import { S as p } from "./provider.client-CtAC9tPr.mjs";
|
|
5
|
+
import { S as h, g as m } from "./utils-t8tYdd6B.mjs";
|
|
6
|
+
const i = (e) => {
|
|
7
|
+
if (f.useState)
|
|
8
8
|
throw new Error(`${e} only intended for Server Components`);
|
|
9
9
|
};
|
|
10
10
|
let c = null;
|
|
11
11
|
try {
|
|
12
|
-
|
|
12
|
+
i("StateVocabServerContext"), c = new d.AsyncLocalStorage();
|
|
13
13
|
} catch {
|
|
14
14
|
c = null;
|
|
15
15
|
}
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
const { value: t, children:
|
|
19
|
-
return /* @__PURE__ */ v
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
-
|
|
16
|
+
const y = ({ value: e }) => (c?.enterWith({ value: e }), null), b = ({ children: e }) => e, P = async (e) => {
|
|
17
|
+
i("StateVocabServerContext.Provider");
|
|
18
|
+
const { value: t, children: r } = e;
|
|
19
|
+
return /* @__PURE__ */ u(v, { children: [
|
|
20
|
+
/* @__PURE__ */ s(y, { value: t }),
|
|
21
|
+
r
|
|
22
22
|
] });
|
|
23
|
-
},
|
|
24
|
-
Provider: c ?
|
|
25
|
-
},
|
|
26
|
-
function
|
|
27
|
-
const { children: t, value:
|
|
28
|
-
return /* @__PURE__ */
|
|
23
|
+
}, g = () => (i("getStateVocab"), c?.getStore()?.value), V = {
|
|
24
|
+
Provider: c ? P : b
|
|
25
|
+
}, x = ({ value: e, children: t }) => /* @__PURE__ */ s(V.Provider, { value: e, children: t });
|
|
26
|
+
function T(e) {
|
|
27
|
+
const { children: t, value: r = {} } = e;
|
|
28
|
+
return /* @__PURE__ */ s(x, { value: r, children: /* @__PURE__ */ s(p, { value: r, children: t }) });
|
|
29
29
|
}
|
|
30
|
-
function
|
|
31
|
-
const e = this[
|
|
30
|
+
function C() {
|
|
31
|
+
const e = this[h], t = g();
|
|
32
32
|
if (!t)
|
|
33
33
|
throw new Error("Make sure your component is wrapped in StateVocabProvider");
|
|
34
34
|
return m(t, e);
|
|
35
35
|
}
|
|
36
|
-
function
|
|
37
|
-
return new Proxy(e, {
|
|
38
|
-
get(n, r, o) {
|
|
39
|
-
return r in t ? Reflect.get(t, r, o) : Reflect.get(n, r, o);
|
|
40
|
-
},
|
|
41
|
-
has(n, r) {
|
|
42
|
-
return r in t || r in n;
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
function k(e) {
|
|
36
|
+
function w(e) {
|
|
47
37
|
return typeof e == "object" && e !== null && "serverSlot" in e;
|
|
48
38
|
}
|
|
49
|
-
function
|
|
50
|
-
const
|
|
51
|
-
for (const
|
|
52
|
-
const
|
|
53
|
-
if (
|
|
54
|
-
|
|
39
|
+
function l(e, t) {
|
|
40
|
+
const r = {};
|
|
41
|
+
for (const o in e) {
|
|
42
|
+
const n = e[o];
|
|
43
|
+
if (w(n))
|
|
44
|
+
r[o] = n.serverSlot({
|
|
55
45
|
// Slot definition
|
|
56
|
-
getState(...
|
|
57
|
-
return
|
|
46
|
+
getState(...a) {
|
|
47
|
+
return C.apply(this, a);
|
|
58
48
|
}
|
|
59
|
-
}), delete
|
|
60
|
-
else if (
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
(s) => i(s),
|
|
64
|
-
f
|
|
65
|
-
);
|
|
49
|
+
}), delete r[o].serverSlot, delete r[o].clientSlot;
|
|
50
|
+
else if (n !== null && typeof n == "object") {
|
|
51
|
+
const a = (S) => t({ [o]: S });
|
|
52
|
+
r[o] = l(n, a);
|
|
66
53
|
} else
|
|
67
|
-
|
|
54
|
+
r[o] = n;
|
|
68
55
|
}
|
|
69
|
-
return
|
|
56
|
+
return r.set = (o) => t(o), r;
|
|
70
57
|
}
|
|
71
|
-
function
|
|
72
|
-
return
|
|
58
|
+
function H(e) {
|
|
59
|
+
return l(e, (t) => t);
|
|
73
60
|
}
|
|
74
61
|
export {
|
|
75
|
-
|
|
76
|
-
|
|
62
|
+
T as StateVocabProvider,
|
|
63
|
+
H as serverify
|
|
77
64
|
};
|
|
@@ -8,10 +8,14 @@ type Slot<V> = {
|
|
|
8
8
|
type ServerifiedValue<R> = {
|
|
9
9
|
[K in keyof R]?: R[K] extends Slot<infer V> ? V : R[K] extends object ? ServerifiedValue<R[K]> : R[K];
|
|
10
10
|
};
|
|
11
|
-
type Serverified<R> = R extends Slot<infer TValue> ? Placeholder<TValue> : R extends object ?
|
|
11
|
+
type Serverified<R> = R extends Slot<infer TValue> ? Placeholder<TValue> : R extends object ? {
|
|
12
|
+
set(input: ServerifiedValue<R>): Vocab;
|
|
13
|
+
} & {
|
|
12
14
|
[K in keyof R]: Serverified<R[K]>;
|
|
13
15
|
} : R;
|
|
14
|
-
type ServerifyResult<R extends object> =
|
|
16
|
+
type ServerifyResult<R extends object> = {
|
|
17
|
+
set(input: ServerifiedValue<R>): Vocab;
|
|
18
|
+
} & {
|
|
15
19
|
[K in keyof R]: Serverified<R[K]>;
|
|
16
20
|
};
|
|
17
21
|
export declare function serverify<R extends object>(tree: R): ServerifyResult<R>;
|