@kdeveloper/kvark 0.6.7 → 0.6.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"family.js","names":[],"sources":["../src/internal/stable-family-key.ts"],"sourcesContent":["/**\n * Produces a deterministic string key for plain-object/array/primitive values.\n *\n * Supported types: string, number, boolean, null, undefined, bigint,\n * plain objects (incl. nested), arrays.\n *\n * Not supported (throws or produces non-unique output): circular references,\n * class instances other than plain Object/Array, Map, Set, Symbol, functions.\n * Treat the parameter as immutable — mutating an object after its first key is\n * computed via a WeakMap memo will silently return the stale cached key.\n */\n\nconst memo = new WeakMap<object, string>();\n\nfunction formatUnknownForError(value: unknown): string {\n switch (typeof value) {\n case \"string\":\n return JSON.stringify(value);\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n return String(value);\n case \"symbol\":\n return value.description ?? \"(symbol)\";\n case \"function\":\n return `function ${value.name}`;\n default:\n return \"(unknown)\";\n }\n}\n\nexport function stableFamilyKey(value: unknown): string {\n if (value !== null && typeof value === \"object\") {\n const cached = memo.get(value);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = serializeValue(value);\n memo.set(value, result);\n return result;\n }\n\n return serializeValue(value);\n}\n\nfunction serializeValue(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n if (value === undefined) {\n return \"undefined\";\n }\n\n const t = typeof value;\n\n if (t === \"string\") {\n return JSON.stringify(value);\n }\n if (t === \"number\") {\n return String(value as number);\n }\n if (t === \"boolean\") {\n return String(value as boolean);\n }\n if (t === \"bigint\") {\n return `${String(value as bigint)}n`;\n }\n\n if (t !== \"object\") {\n throw new TypeError(`stableFamilyKey: unsupported type \"${t}\" (${formatUnknownForError(value)})`);\n }\n\n if (Array.isArray(value)) {\n const items = (value as unknown[]).map(serializeValue);\n return `[${items.join(\",\")}]`;\n }\n\n const proto = Object.getPrototypeOf(value as object) as object | null;\n if (proto !== Object.prototype && proto !== null) {\n const ctorName = (value as { constructor?: { name?: string } }).constructor?.name ?? \"unknown\";\n throw new TypeError(`stableFamilyKey: only plain objects are supported (got ${ctorName})`);\n }\n\n const keys = Object.keys(value as Record<string, unknown>).sort();\n const pairs = keys.map((k) => {\n const v = (value as Record<string, unknown>)[k];\n return `${JSON.stringify(k)}:${serializeValue(v)}`;\n });\n return `{${pairs.join(\",\")}}`;\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,uBAAO,IAAI,SAAyB;AAE1C,SAAS,sBAAsB,OAAwB;AACrD,SAAQ,OAAO,OAAf;EACE,KAAK,SACH,QAAO,KAAK,UAAU,MAAM;EAC9B,KAAK;EACL,KAAK;EACL,KAAK,SACH,QAAO,OAAO,MAAM;EACtB,KAAK,SACH,QAAO,MAAM,eAAe;EAC9B,KAAK,WACH,QAAO,YAAY,MAAM;EAC3B,QACE,QAAO;;;AAIb,SAAgB,gBAAgB,OAAwB;AACtD,KAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;EAC/C,MAAM,SAAS,KAAK,IAAI,MAAM;AAC9B,MAAI,WAAW,KAAA,EACb,QAAO;EAGT,MAAM,SAAS,eAAe,MAAM;AACpC,OAAK,IAAI,OAAO,OAAO;AACvB,SAAO;;AAGT,QAAO,eAAe,MAAM;;AAG9B,SAAS,eAAe,OAAwB;AAC9C,KAAI,UAAU,KACZ,QAAO;AAET,KAAI,UAAU,KAAA,EACZ,QAAO;CAGT,MAAM,IAAI,OAAO;AAEjB,KAAI,MAAM,SACR,QAAO,KAAK,UAAU,MAAM;AAE9B,KAAI,MAAM,SACR,QAAO,OAAO,MAAgB;AAEhC,KAAI,MAAM,UACR,QAAO,OAAO,MAAiB;AAEjC,KAAI,MAAM,SACR,QAAO,GAAG,OAAO,MAAgB,CAAC;AAGpC,KAAI,MAAM,SACR,OAAM,IAAI,UAAU,sCAAsC,EAAE,KAAK,sBAAsB,MAAM,CAAC,GAAG;AAGnG,KAAI,MAAM,QAAQ,MAAM,CAEtB,QAAO,IADQ,MAAoB,IAAI,eAAe,CACrC,KAAK,IAAI,CAAC;CAG7B,MAAM,QAAQ,OAAO,eAAe,MAAgB;AACpD,KAAI,UAAU,OAAO,aAAa,UAAU,MAAM;EAChD,MAAM,WAAY,MAA8C,aAAa,QAAQ;AACrF,QAAM,IAAI,UAAU,0DAA0D,SAAS,GAAG;;AAQ5F,QAAO,IALM,OAAO,KAAK,MAAiC,CAAC,MAAM,CAC9C,KAAK,MAAM;EAC5B,MAAM,IAAK,MAAkC;AAC7C,SAAO,GAAG,KAAK,UAAU,EAAE,CAAC,GAAG,eAAe,EAAE;GAChD,CACe,KAAK,IAAI,CAAC"}
1
+ {"version":3,"file":"family.js","names":[],"sources":["../src/internal/stable-family-key.ts"],"sourcesContent":["/**\n * Produces a deterministic string key for plain-object/array/primitive values.\n *\n * Supported types: string, number, boolean, null, undefined, bigint,\n * plain objects (incl. nested), arrays.\n *\n * Not supported (throws or produces non-unique output): circular references,\n * class instances other than plain Object/Array, Map, Set, Symbol, functions.\n * Treat the parameter as immutable — mutating an object after its first key is\n * computed via a WeakMap memo will silently return the stale cached key.\n */\n\nconst memo = new WeakMap<object, string>();\n\nfunction formatUnknownForError(value: unknown): string {\n switch (typeof value) {\n case \"string\":\n return JSON.stringify(value);\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n return String(value);\n case \"symbol\":\n return value.description ?? \"(symbol)\";\n case \"function\":\n return `function ${value.name}`;\n default:\n return \"(unknown)\";\n }\n}\n\nexport function stableFamilyKey(value: unknown): string {\n if (value !== null && typeof value === \"object\") {\n const cached = memo.get(value);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = serializeValue(value);\n memo.set(value, result);\n return result;\n }\n\n return serializeValue(value);\n}\n\nfunction serializeValue(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n if (value === undefined) {\n return \"undefined\";\n }\n\n const t = typeof value;\n\n if (t === \"string\") {\n return JSON.stringify(value);\n }\n if (t === \"number\") {\n return String(value as number);\n }\n if (t === \"boolean\") {\n return String(value as boolean);\n }\n if (t === \"bigint\") {\n return `${String(value as bigint)}n`;\n }\n\n if (t !== \"object\") {\n throw new TypeError(\n `stableFamilyKey: unsupported type \"${t}\" (${formatUnknownForError(value)})`,\n );\n }\n\n if (Array.isArray(value)) {\n const items = (value as unknown[]).map(serializeValue);\n return `[${items.join(\",\")}]`;\n }\n\n const proto = Object.getPrototypeOf(value as object) as object | null;\n if (proto !== Object.prototype && proto !== null) {\n const ctorName = (value as { constructor?: { name?: string } }).constructor?.name ?? \"unknown\";\n throw new TypeError(`stableFamilyKey: only plain objects are supported (got ${ctorName})`);\n }\n\n const keys = Object.keys(value as Record<string, unknown>).sort();\n const pairs = keys.map((k) => {\n const v = (value as Record<string, unknown>)[k];\n return `${JSON.stringify(k)}:${serializeValue(v)}`;\n });\n return `{${pairs.join(\",\")}}`;\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,uBAAO,IAAI,SAAyB;AAE1C,SAAS,sBAAsB,OAAwB;AACrD,SAAQ,OAAO,OAAf;EACE,KAAK,SACH,QAAO,KAAK,UAAU,MAAM;EAC9B,KAAK;EACL,KAAK;EACL,KAAK,SACH,QAAO,OAAO,MAAM;EACtB,KAAK,SACH,QAAO,MAAM,eAAe;EAC9B,KAAK,WACH,QAAO,YAAY,MAAM;EAC3B,QACE,QAAO;;;AAIb,SAAgB,gBAAgB,OAAwB;AACtD,KAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;EAC/C,MAAM,SAAS,KAAK,IAAI,MAAM;AAC9B,MAAI,WAAW,KAAA,EACb,QAAO;EAGT,MAAM,SAAS,eAAe,MAAM;AACpC,OAAK,IAAI,OAAO,OAAO;AACvB,SAAO;;AAGT,QAAO,eAAe,MAAM;;AAG9B,SAAS,eAAe,OAAwB;AAC9C,KAAI,UAAU,KACZ,QAAO;AAET,KAAI,UAAU,KAAA,EACZ,QAAO;CAGT,MAAM,IAAI,OAAO;AAEjB,KAAI,MAAM,SACR,QAAO,KAAK,UAAU,MAAM;AAE9B,KAAI,MAAM,SACR,QAAO,OAAO,MAAgB;AAEhC,KAAI,MAAM,UACR,QAAO,OAAO,MAAiB;AAEjC,KAAI,MAAM,SACR,QAAO,GAAG,OAAO,MAAgB,CAAC;AAGpC,KAAI,MAAM,SACR,OAAM,IAAI,UACR,sCAAsC,EAAE,KAAK,sBAAsB,MAAM,CAAC,GAC3E;AAGH,KAAI,MAAM,QAAQ,MAAM,CAEtB,QAAO,IADQ,MAAoB,IAAI,eAAe,CACrC,KAAK,IAAI,CAAC;CAG7B,MAAM,QAAQ,OAAO,eAAe,MAAgB;AACpD,KAAI,UAAU,OAAO,aAAa,UAAU,MAAM;EAChD,MAAM,WAAY,MAA8C,aAAa,QAAQ;AACrF,QAAM,IAAI,UAAU,0DAA0D,SAAS,GAAG;;AAQ5F,QAAO,IALM,OAAO,KAAK,MAAiC,CAAC,MAAM,CAC9C,KAAK,MAAM;EAC5B,MAAM,IAAK,MAAkC;AAC7C,SAAO,GAAG,KAAK,UAAU,EAAE,CAAC,GAAG,eAAe,EAAE;GAChD,CACe,KAAK,IAAI,CAAC"}
@@ -32,5 +32,8 @@ declare function useAtom<V, A extends readonly unknown[]>(atom: WritableAtom<V,
32
32
  //#region src/react/use-atom-context.d.ts
33
33
  declare function useAtomContext<R>(callback: (ctx: StoreClient) => Promise<R>): () => Promise<R>;
34
34
  //#endregion
35
- export { Provider, useAtom, useAtomContext, useAtomValue, useSetAtom, useStore };
35
+ //#region src/react/use-stable-fn.d.ts
36
+ declare function useStableFn<Args extends unknown[], R>(fn: (...args: Args) => R): (...args: Args) => R;
37
+ //#endregion
38
+ export { Provider, useAtom, useAtomContext, useAtomValue, useSetAtom, useStableFn, useStore };
36
39
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/react/provider.tsx","../../src/react/use-atom-value.ts","../../src/react/use-set-atom.ts","../../src/react/use-atom.ts","../../src/react/use-atom-context.ts"],"mappings":";;;;KAKY,aAAA;EACV,KAAA,EAAO,KAAA;EACP,QAAA,EAAU,SAAA;AAAA;AAAA,iBAGI,QAAA,CAAA;EAAW,KAAA;EAAO;AAAA,GAAY,aAAA,GAAgB,SAAA;AAAA,iBAI9C,QAAA,CAAA,GAAY,KAAA;;;KCTvB,aAAA;EACH,KAAA,EAAO,CAAA;EACP,OAAA;EACA,KAAA;AAAA;AAAA,iBAGc,YAAA,GAAA,CAAgB,IAAA,EAAM,IAAA,CAAK,CAAA,IAAK,CAAA;AAAA,iBAChC,YAAA,GAAA,CAAgB,IAAA,EAAM,IAAA,CAAK,CAAA,GAAI,IAAA;EAAQ,OAAA;AAAA,IAAkB,aAAA,CAAc,CAAA;;;iBCRvE,UAAA,iCAAA,CACd,IAAA,EAAM,YAAA,CAAa,CAAA,EAAG,CAAA,QACjB,IAAA,EAAM,CAAA,KAAM,OAAA;;;iBCFH,OAAA,iCAAA,CACd,IAAA,EAAM,YAAA,CAAa,CAAA,EAAG,CAAA,cACX,CAAA,MAAO,IAAA,EAAM,CAAA,KAAM,OAAA;;;iBCFhB,cAAA,GAAA,CAAkB,QAAA,GAAW,GAAA,EAAK,WAAA,KAAgB,OAAA,CAAQ,CAAA,UAAW,OAAA,CAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/react/provider.tsx","../../src/react/use-atom-value.ts","../../src/react/use-set-atom.ts","../../src/react/use-atom.ts","../../src/react/use-atom-context.ts","../../src/react/use-stable-fn.ts"],"mappings":";;;;KAKY,aAAA;EACV,KAAA,EAAO,KAAA;EACP,QAAA,EAAU,SAAA;AAAA;AAAA,iBAGI,QAAA,CAAA;EAAW,KAAA;EAAO;AAAA,GAAY,aAAA,GAAgB,SAAA;AAAA,iBAI9C,QAAA,CAAA,GAAY,KAAA;;;KCRvB,aAAA;EACH,KAAA,EAAO,CAAA;EACP,OAAA;EACA,KAAA;AAAA;AAAA,iBAGc,YAAA,GAAA,CAAgB,IAAA,EAAM,IAAA,CAAK,CAAA,IAAK,CAAA;AAAA,iBAChC,YAAA,GAAA,CAAgB,IAAA,EAAM,IAAA,CAAK,CAAA,GAAI,IAAA;EAAQ,OAAA;AAAA,IAAkB,aAAA,CAAc,CAAA;;;iBCTvE,UAAA,iCAAA,CACd,IAAA,EAAM,YAAA,CAAa,CAAA,EAAG,CAAA,QACjB,IAAA,EAAM,CAAA,KAAM,OAAA;;;iBCFH,OAAA,iCAAA,CACd,IAAA,EAAM,YAAA,CAAa,CAAA,EAAG,CAAA,cACX,CAAA,MAAO,IAAA,EAAM,CAAA,KAAM,OAAA;;;iBCFhB,cAAA,GAAA,CAAkB,QAAA,GAAW,GAAA,EAAK,WAAA,KAAgB,OAAA,CAAQ,CAAA,UAAW,OAAA,CAAQ,CAAA;;;iBCF7E,WAAA,2BAAA,CACd,EAAA,MAAQ,IAAA,EAAM,IAAA,KAAS,CAAA,OAClB,IAAA,EAAM,IAAA,KAAS,CAAA"}
@@ -1,10 +1,10 @@
1
1
  import { t as CONFIG } from "../types-B2mzc3A5.js";
2
- import { createContext, useCallback, useContext, useSyncExternalStore } from "react";
2
+ import { createContext, useCallback, useContext, useRef, useSyncExternalStore } from "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/react/provider.tsx
5
5
  const StoreContext = createContext(null);
6
6
  function Provider({ store, children }) {
7
- return /* @__PURE__ */ jsx(StoreContext, {
7
+ return /* @__PURE__ */ jsx(StoreContext.Provider, {
8
8
  value: store,
9
9
  children
10
10
  });
@@ -15,10 +15,17 @@ function useStore() {
15
15
  return store;
16
16
  }
17
17
  //#endregion
18
+ //#region src/react/use-stable-fn.ts
19
+ function useStableFn(fn) {
20
+ const ref = useRef(fn);
21
+ ref.current = fn;
22
+ return useCallback((...args) => ref.current(...args), []);
23
+ }
24
+ //#endregion
18
25
  //#region src/react/use-atom-value.ts
19
26
  function useAtomValue(atom, opts) {
20
27
  const store = useStore();
21
- const snapshot = useSyncExternalStore((notify) => store.subscribe(atom, notify), () => store.getSnapshot(atom), () => store.getServerSnapshot(atom));
28
+ const snapshot = useSyncExternalStore(useStableFn((notify) => store.subscribe(atom, notify)), useStableFn(() => store.getSnapshot(atom)), useStableFn(() => store.getServerSnapshot(atom)));
22
29
  const stalePolicy = atom[CONFIG].stalePolicy ?? "keep";
23
30
  if (snapshot.status === "pending") throw store.resolve(atom);
24
31
  if (snapshot.status === "stale") {
@@ -64,6 +71,6 @@ function useAtomContext(callback) {
64
71
  return useCallback(() => callback(store.getClient()), [store, callback]);
65
72
  }
66
73
  //#endregion
67
- export { Provider, useAtom, useAtomContext, useAtomValue, useSetAtom, useStore };
74
+ export { Provider, useAtom, useAtomContext, useAtomValue, useSetAtom, useStableFn, useStore };
68
75
 
69
76
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/react/provider.tsx","../../src/react/use-atom-value.ts","../../src/react/use-set-atom.ts","../../src/react/use-atom.ts","../../src/react/use-atom-context.ts"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\";\nimport type { Store } from \"@/internal/store.js\";\n\nconst StoreContext = createContext<Store | null>(null);\n\nexport type ProviderProps = {\n store: Store;\n children: ReactNode;\n};\n\nexport function Provider({ store, children }: ProviderProps): ReactNode {\n return <StoreContext value={store}>{children}</StoreContext>;\n}\n\nexport function useStore(): Store {\n const store = useContext(StoreContext);\n if (store == null) {\n throw new Error(\"useStore must be used within a <Provider>\");\n }\n return store;\n}\n","import { useSyncExternalStore } from \"react\";\nimport type { Atom, AtomState, StalePolicy } from \"@/internal/types.js\";\nimport { CONFIG } from \"@/internal/types.js\";\nimport { useStore } from \"@/react/provider.js\";\n\ntype ObservedValue<V> = {\n value: V;\n isStale: boolean;\n error: unknown;\n};\n\nexport function useAtomValue<V>(atom: Atom<V>): V;\nexport function useAtomValue<V>(atom: Atom<V>, opts: { observe: true }): ObservedValue<V>;\nexport function useAtomValue<V>(atom: Atom<V>, opts?: { observe: true }): V | ObservedValue<V> {\n const store = useStore();\n\n const snapshot: AtomState<V> = useSyncExternalStore(\n (notify) => store.subscribe(atom, notify),\n () => store.getSnapshot(atom),\n () => store.getServerSnapshot(atom),\n );\n\n const stalePolicy: StalePolicy = atom[CONFIG].stalePolicy ?? \"keep\";\n\n if (snapshot.status === \"pending\") {\n throw store.resolve(atom);\n }\n\n if (snapshot.status === \"stale\") {\n if (stalePolicy === \"suspend\") {\n throw store.resolve(atom);\n }\n // \"keep\" or \"reset\" while stale: trigger background revalidation\n void store.resolve(atom);\n\n if (opts?.observe === true) {\n return { value: snapshot.value, isStale: true, error: undefined };\n }\n return snapshot.value;\n }\n\n if (snapshot.status === \"error\") {\n if (opts?.observe === true && snapshot.value !== undefined) {\n return {\n value: snapshot.value as V,\n isStale: false,\n error: snapshot.error,\n };\n }\n throw snapshot.error;\n }\n\n // status === \"fresh\"\n if (opts?.observe === true) {\n return { value: snapshot.value, isStale: false, error: undefined };\n }\n return snapshot.value;\n}\n","import { useCallback } from \"react\";\nimport type { WritableAtom } from \"@/internal/types.js\";\nimport { useStore } from \"@/react/provider.js\";\n\nexport function useSetAtom<V, A extends readonly unknown[]>(\n atom: WritableAtom<V, A>,\n): (...args: A) => Promise<void> {\n const store = useStore();\n return useCallback((...args: A): Promise<void> => store.set(atom, ...args), [store, atom]);\n}\n","import type { WritableAtom } from \"@/internal/types.js\";\nimport { useAtomValue } from \"@/react/use-atom-value.js\";\nimport { useSetAtom } from \"@/react/use-set-atom.js\";\n\nexport function useAtom<V, A extends readonly unknown[]>(\n atom: WritableAtom<V, A>,\n): readonly [V, (...args: A) => Promise<void>] {\n const value = useAtomValue(atom);\n const setter = useSetAtom(atom);\n return [value, setter] as const;\n}\n","import { useCallback } from \"react\";\nimport type { StoreClient } from \"@/internal/store.js\";\nimport { useStore } from \"@/react/provider.js\";\n\nexport function useAtomContext<R>(callback: (ctx: StoreClient) => Promise<R>): () => Promise<R> {\n const store = useStore();\n return useCallback((): Promise<R> => callback(store.getClient()), [store, callback]);\n}\n"],"mappings":";;;;AAGA,MAAM,eAAe,cAA4B,KAAK;AAOtD,SAAgB,SAAS,EAAE,OAAO,YAAsC;AACtE,QAAO,oBAAC,cAAD;EAAc,OAAO;EAAQ;EAAwB,CAAA;;AAG9D,SAAgB,WAAkB;CAChC,MAAM,QAAQ,WAAW,aAAa;AACtC,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,4CAA4C;AAE9D,QAAO;;;;ACNT,SAAgB,aAAgB,MAAe,MAAgD;CAC7F,MAAM,QAAQ,UAAU;CAExB,MAAM,WAAyB,sBAC5B,WAAW,MAAM,UAAU,MAAM,OAAO,QACnC,MAAM,YAAY,KAAK,QACvB,MAAM,kBAAkB,KAAK,CACpC;CAED,MAAM,cAA2B,KAAK,QAAQ,eAAe;AAE7D,KAAI,SAAS,WAAW,UACtB,OAAM,MAAM,QAAQ,KAAK;AAG3B,KAAI,SAAS,WAAW,SAAS;AAC/B,MAAI,gBAAgB,UAClB,OAAM,MAAM,QAAQ,KAAK;AAGtB,QAAM,QAAQ,KAAK;AAExB,MAAI,MAAM,YAAY,KACpB,QAAO;GAAE,OAAO,SAAS;GAAO,SAAS;GAAM,OAAO,KAAA;GAAW;AAEnE,SAAO,SAAS;;AAGlB,KAAI,SAAS,WAAW,SAAS;AAC/B,MAAI,MAAM,YAAY,QAAQ,SAAS,UAAU,KAAA,EAC/C,QAAO;GACL,OAAO,SAAS;GAChB,SAAS;GACT,OAAO,SAAS;GACjB;AAEH,QAAM,SAAS;;AAIjB,KAAI,MAAM,YAAY,KACpB,QAAO;EAAE,OAAO,SAAS;EAAO,SAAS;EAAO,OAAO,KAAA;EAAW;AAEpE,QAAO,SAAS;;;;ACpDlB,SAAgB,WACd,MAC+B;CAC/B,MAAM,QAAQ,UAAU;AACxB,QAAO,aAAa,GAAG,SAA2B,MAAM,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC,OAAO,KAAK,CAAC;;;;ACJ5F,SAAgB,QACd,MAC6C;AAG7C,QAAO,CAFO,aAAa,KAAK,EACjB,WAAW,KAAK,CACT;;;;ACLxB,SAAgB,eAAkB,UAA8D;CAC9F,MAAM,QAAQ,UAAU;AACxB,QAAO,kBAA8B,SAAS,MAAM,WAAW,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/react/provider.tsx","../../src/react/use-stable-fn.ts","../../src/react/use-atom-value.ts","../../src/react/use-set-atom.ts","../../src/react/use-atom.ts","../../src/react/use-atom-context.ts"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\";\nimport type { Store } from \"@/internal/store.js\";\n\nconst StoreContext = createContext<Store | null>(null);\n\nexport type ProviderProps = {\n store: Store;\n children: ReactNode;\n};\n\nexport function Provider({ store, children }: ProviderProps): ReactNode {\n return <StoreContext.Provider value={store}>{children}</StoreContext.Provider>;\n}\n\nexport function useStore(): Store {\n const store = useContext(StoreContext);\n if (store == null) {\n throw new Error(\"useStore must be used within a <Provider>\");\n }\n return store;\n}\n","import { useCallback, useRef } from \"react\";\n\nexport function useStableFn<Args extends unknown[], R>(\n fn: (...args: Args) => R,\n): (...args: Args) => R {\n const ref = useRef(fn);\n ref.current = fn;\n\n return useCallback((...args: Args) => ref.current(...args), []);\n}\n","import { useSyncExternalStore } from \"react\";\nimport type { Atom, AtomState, StalePolicy } from \"@/internal/types.js\";\nimport { CONFIG } from \"@/internal/types.js\";\nimport { useStore } from \"@/react/provider.js\";\nimport { useStableFn } from \"@/react/use-stable-fn.js\";\n\ntype ObservedValue<V> = {\n value: V;\n isStale: boolean;\n error: unknown;\n};\n\nexport function useAtomValue<V>(atom: Atom<V>): V;\nexport function useAtomValue<V>(atom: Atom<V>, opts: { observe: true }): ObservedValue<V>;\nexport function useAtomValue<V>(atom: Atom<V>, opts?: { observe: true }): V | ObservedValue<V> {\n const store = useStore();\n\n const subscribe = useStableFn((notify: () => void) => store.subscribe(atom, notify));\n const getSnapshot = useStableFn(() => store.getSnapshot(atom));\n const getServerSnapshot = useStableFn(() => store.getServerSnapshot(atom));\n\n const snapshot: AtomState<V> = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n\n const stalePolicy: StalePolicy = atom[CONFIG].stalePolicy ?? \"keep\";\n\n if (snapshot.status === \"pending\") {\n throw store.resolve(atom);\n }\n\n if (snapshot.status === \"stale\") {\n if (stalePolicy === \"suspend\") {\n throw store.resolve(atom);\n }\n // \"keep\" or \"reset\" while stale: trigger background revalidation\n void store.resolve(atom);\n\n if (opts?.observe === true) {\n return { value: snapshot.value, isStale: true, error: undefined };\n }\n return snapshot.value;\n }\n\n if (snapshot.status === \"error\") {\n if (opts?.observe === true && snapshot.value !== undefined) {\n return {\n value: snapshot.value as V,\n isStale: false,\n error: snapshot.error,\n };\n }\n throw snapshot.error;\n }\n\n // status === \"fresh\"\n if (opts?.observe === true) {\n return { value: snapshot.value, isStale: false, error: undefined };\n }\n return snapshot.value;\n}\n","import { useCallback } from \"react\";\nimport type { WritableAtom } from \"@/internal/types.js\";\nimport { useStore } from \"@/react/provider.js\";\n\nexport function useSetAtom<V, A extends readonly unknown[]>(\n atom: WritableAtom<V, A>,\n): (...args: A) => Promise<void> {\n const store = useStore();\n return useCallback((...args: A): Promise<void> => store.set(atom, ...args), [store, atom]);\n}\n","import type { WritableAtom } from \"@/internal/types.js\";\nimport { useAtomValue } from \"@/react/use-atom-value.js\";\nimport { useSetAtom } from \"@/react/use-set-atom.js\";\n\nexport function useAtom<V, A extends readonly unknown[]>(\n atom: WritableAtom<V, A>,\n): readonly [V, (...args: A) => Promise<void>] {\n const value = useAtomValue(atom);\n const setter = useSetAtom(atom);\n return [value, setter] as const;\n}\n","import { useCallback } from \"react\";\nimport type { StoreClient } from \"@/internal/store.js\";\nimport { useStore } from \"@/react/provider.js\";\n\nexport function useAtomContext<R>(callback: (ctx: StoreClient) => Promise<R>): () => Promise<R> {\n const store = useStore();\n return useCallback((): Promise<R> => callback(store.getClient()), [store, callback]);\n}\n"],"mappings":";;;;AAGA,MAAM,eAAe,cAA4B,KAAK;AAOtD,SAAgB,SAAS,EAAE,OAAO,YAAsC;AACtE,QAAO,oBAAC,aAAa,UAAd;EAAuB,OAAO;EAAQ;EAAiC,CAAA;;AAGhF,SAAgB,WAAkB;CAChC,MAAM,QAAQ,WAAW,aAAa;AACtC,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,4CAA4C;AAE9D,QAAO;;;;ACjBT,SAAgB,YACd,IACsB;CACtB,MAAM,MAAM,OAAO,GAAG;AACtB,KAAI,UAAU;AAEd,QAAO,aAAa,GAAG,SAAe,IAAI,QAAQ,GAAG,KAAK,EAAE,EAAE,CAAC;;;;ACMjE,SAAgB,aAAgB,MAAe,MAAgD;CAC7F,MAAM,QAAQ,UAAU;CAMxB,MAAM,WAAyB,qBAJb,aAAa,WAAuB,MAAM,UAAU,MAAM,OAAO,CAAC,EAChE,kBAAkB,MAAM,YAAY,KAAK,CAAC,EACpC,kBAAkB,MAAM,kBAAkB,KAAK,CAAC,CAEoB;CAE9F,MAAM,cAA2B,KAAK,QAAQ,eAAe;AAE7D,KAAI,SAAS,WAAW,UACtB,OAAM,MAAM,QAAQ,KAAK;AAG3B,KAAI,SAAS,WAAW,SAAS;AAC/B,MAAI,gBAAgB,UAClB,OAAM,MAAM,QAAQ,KAAK;AAGtB,QAAM,QAAQ,KAAK;AAExB,MAAI,MAAM,YAAY,KACpB,QAAO;GAAE,OAAO,SAAS;GAAO,SAAS;GAAM,OAAO,KAAA;GAAW;AAEnE,SAAO,SAAS;;AAGlB,KAAI,SAAS,WAAW,SAAS;AAC/B,MAAI,MAAM,YAAY,QAAQ,SAAS,UAAU,KAAA,EAC/C,QAAO;GACL,OAAO,SAAS;GAChB,SAAS;GACT,OAAO,SAAS;GACjB;AAEH,QAAM,SAAS;;AAIjB,KAAI,MAAM,YAAY,KACpB,QAAO;EAAE,OAAO,SAAS;EAAO,SAAS;EAAO,OAAO,KAAA;EAAW;AAEpE,QAAO,SAAS;;;;ACrDlB,SAAgB,WACd,MAC+B;CAC/B,MAAM,QAAQ,UAAU;AACxB,QAAO,aAAa,GAAG,SAA2B,MAAM,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC,OAAO,KAAK,CAAC;;;;ACJ5F,SAAgB,QACd,MAC6C;AAG7C,QAAO,CAFO,aAAa,KAAK,EACjB,WAAW,KAAK,CACT;;;;ACLxB,SAAgB,eAAkB,UAA8D;CAC9F,MAAM,QAAQ,UAAU;AACxB,QAAO,kBAA8B,SAAS,MAAM,WAAW,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kdeveloper/kvark",
3
- "version": "0.6.7",
3
+ "version": "0.6.9",
4
4
  "description": "Atomic state management with explicit dependency graphs",
5
5
  "license": "MIT",
6
6
  "files": [