@kdeveloper/kvark 0.6.7 → 0.6.8
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/family.js.map +1 -1
- package/dist/react/index.d.ts +4 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +10 -3
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
package/dist/family.js.map
CHANGED
|
@@ -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)})
|
|
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"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -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
|
-
|
|
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;;;
|
|
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"}
|
package/dist/react/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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);
|
|
@@ -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
|
package/dist/react/index.js.map
CHANGED
|
@@ -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
|
|
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 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 { 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,cAAD;EAAc,OAAO;EAAQ;EAAwB,CAAA;;AAG9D,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"}
|