@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 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`. All namespace nodes become callable functions that build the `value` shape expected by `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
- **Namespace callable syntax:**
403
+ **`.set()` syntax:**
404
404
 
405
405
  ```ts
406
- // Full tree at once — root call is identity (returns input as-is)
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 becomes callable, returning the input wrapped under its full ancestor path (ready for `StateVocabProvider`'s `value` prop).
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() // reads "user.name" from context
668
- serverStorage.user({ name: 'Alice' }) // → { user: { name: 'Alice' } }
669
- serverStorage.person.address({ city: 'NY' }) // → { person: { address: { city: 'NY' } } }
670
- serverStorage({ user: { name: 'Alice' } }) // → { user: { name: 'Alice' } } (identity)
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)`
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),v=require("react"),b=require("node:async_hooks"),y=require("./provider.client--OPImdtY.js"),u=require("./utils-33NqsZoR.js");function g(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const P=g(b),l=e=>{if(v.useState)throw new Error(`${e} only intended for Server Components`)};let i=null;try{l("StateVocabServerContext"),i=new P.AsyncLocalStorage}catch{i=null}const h=({value:e})=>(i?.enterWith({value:e}),null),j=({children:e})=>e,x=async e=>{l("StateVocabServerContext.Provider");const{value:t,children:r}=e;return c.jsxs(c.Fragment,{children:[c.jsx(h,{value:t}),r]})},V=()=>(l("getStateVocab"),i?.getStore()?.value),m={Provider:i?x:j},p=({value:e,children:t})=>c.jsx(m.Provider,{value:e,children:t});function w(e){const{children:t,value:r={}}=e;return c.jsx(p,{value:r,children:c.jsx(y.StateVocabClientProvider,{value:r,children:t})})}function O(){const e=this[u.STATE_PATH],t=V();if(!t)throw new Error("Make sure your component is wrapped in StateVocabProvider");return u.get(t,e)}function f(e,t){return new Proxy(e,{get(r,n,o){return n in t?Reflect.get(t,n,o):Reflect.get(r,n,o)},has(r,n){return n in t||n in r}})}function k(e){return typeof e=="object"&&e!==null&&"serverSlot"in e}function S(e,t){const r={};for(const n in e){const o=e[n];if(k(o))r[n]=o.serverSlot({getState(...s){return O.apply(this,s)}}),delete r[n].serverSlot,delete r[n].clientSlot;else if(o!==null&&typeof o=="object"){const s=a=>t({[n]:a}),d=S(o,s);r[n]=f(a=>s(a),d)}else r[n]=o}return f(n=>t(n),r)}function C(e){return S(e,t=>t)}exports.StateVocabProvider=w;exports.serverify=C;
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 v, Fragment as d, jsx as a } from "react/jsx-runtime";
2
- import h from "react";
3
- import * as y from "node:async_hooks";
4
- import { S as b } from "./provider.client-CtAC9tPr.mjs";
5
- import { S as g, g as m } from "./utils-t8tYdd6B.mjs";
6
- const l = (e) => {
7
- if (h.useState)
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
- l("StateVocabServerContext"), c = new y.AsyncLocalStorage();
12
+ i("StateVocabServerContext"), c = new d.AsyncLocalStorage();
13
13
  } catch {
14
14
  c = null;
15
15
  }
16
- const P = ({ value: e }) => (c?.enterWith({ value: e }), null), V = ({ children: e }) => e, x = async (e) => {
17
- l("StateVocabServerContext.Provider");
18
- const { value: t, children: n } = e;
19
- return /* @__PURE__ */ v(d, { children: [
20
- /* @__PURE__ */ a(P, { value: t }),
21
- n
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
- }, w = () => (l("getStateVocab"), c?.getStore()?.value), C = {
24
- Provider: c ? x : V
25
- }, p = ({ value: e, children: t }) => /* @__PURE__ */ a(C.Provider, { value: e, children: t });
26
- function H(e) {
27
- const { children: t, value: n = {} } = e;
28
- return /* @__PURE__ */ a(p, { value: n, children: /* @__PURE__ */ a(b, { value: n, children: t }) });
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 j() {
31
- const e = this[g], t = w();
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 u(e, t) {
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 S(e, t) {
50
- const n = {};
51
- for (const r in e) {
52
- const o = e[r];
53
- if (k(o))
54
- n[r] = o.serverSlot({
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(...i) {
57
- return j.apply(this, i);
46
+ getState(...a) {
47
+ return C.apply(this, a);
58
48
  }
59
- }), delete n[r].serverSlot, delete n[r].clientSlot;
60
- else if (o !== null && typeof o == "object") {
61
- const i = (s) => t({ [r]: s }), f = S(o, i);
62
- n[r] = u(
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
- n[r] = o;
54
+ r[o] = n;
68
55
  }
69
- return u((r) => t(r), n);
56
+ return r.set = (o) => t(o), r;
70
57
  }
71
- function W(e) {
72
- return S(e, (t) => t);
58
+ function H(e) {
59
+ return l(e, (t) => t);
73
60
  }
74
61
  export {
75
- H as StateVocabProvider,
76
- W as serverify
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 ? ((input: ServerifiedValue<R>) => Vocab) & {
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> = ((input: ServerifiedValue<R>) => Vocab) & {
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>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yakocloud/state-vocab",
3
- "version": "4.0.0",
3
+ "version": "4.0.1",
4
4
  "main": "dist/index.cjs.js",
5
5
  "module": "dist/index.es.js",
6
6
  "types": "dist/types/index.d.ts",