dharma-core 0.1.0 → 0.2.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
@@ -1 +1 @@
1
- # Package A
1
+ # Dharma Core
@@ -23,7 +23,7 @@ export type PersistentStoreOptions<TState extends object> = StoreOptions<TState>
23
23
  *
24
24
  * @param {string} key - A unique key to identify the store in storage.
25
25
  * @param {TState} initialState - The initial state of the store.
26
- * @param {DefineActions<TState, TActions> | null} [defineActions] - A function to define actions for the store.
26
+ * @param {DefineActions<TState, TActions>} [defineActions] - A function to define actions for the store.
27
27
  * @param {PersistentStoreOptions<TState>} [options] - Additional options for the persistent store.
28
28
  *
29
29
  * @returns {Store<TState, TActions>} The created store.
@@ -31,7 +31,7 @@ export type PersistentStoreOptions<TState extends object> = StoreOptions<TState>
31
31
  * @example
32
32
  * Basic usage:
33
33
  * ```ts
34
- * import { createPersistentStore } from "@fransek/statekit";
34
+ * import { createPersistentStore } from "dharma-core";
35
35
  *
36
36
  * const store = createPersistentStore("count", { count: 0 }, (set) => ({
37
37
  * increment: () => set((state) => ({ count: state.count + 1 })),
@@ -42,7 +42,7 @@ export type PersistentStoreOptions<TState extends object> = StoreOptions<TState>
42
42
  * @example
43
43
  * With superjson serialization and session storage:
44
44
  * ```ts
45
- * import { createPersistentStore } from "@fransek/statekit";
45
+ * import { createPersistentStore } from "dharma-core";
46
46
  * import superjson from "superjson";
47
47
  *
48
48
  * const store = createPersistentStore(
@@ -61,4 +61,4 @@ export type PersistentStoreOptions<TState extends object> = StoreOptions<TState>
61
61
  * ```
62
62
  * @group Core
63
63
  */
64
- export declare const createPersistentStore: <TState extends object, TActions extends object = Record<never, never>>(key: string, initialState: TState, defineActions?: DefineActions<TState, TActions> | null, { storage: _storage, serializer, onAttach, onDetach, onStateChange, ...options }?: PersistentStoreOptions<TState>) => Store<TState, TActions>;
64
+ export declare const createPersistentStore: <TState extends object, TActions extends object = Record<never, never>>(key: string, initialState: TState, defineActions: DefineActions<TState, TActions>, { storage: _storage, serializer, onAttach, onDetach, onChange, ...options }?: PersistentStoreOptions<TState>) => Store<TState, TActions>;
@@ -11,7 +11,7 @@ var createStore = require('./createStore.js');
11
11
  *
12
12
  * @param {string} key - A unique key to identify the store in storage.
13
13
  * @param {TState} initialState - The initial state of the store.
14
- * @param {DefineActions<TState, TActions> | null} [defineActions] - A function to define actions for the store.
14
+ * @param {DefineActions<TState, TActions>} [defineActions] - A function to define actions for the store.
15
15
  * @param {PersistentStoreOptions<TState>} [options] - Additional options for the persistent store.
16
16
  *
17
17
  * @returns {Store<TState, TActions>} The created store.
@@ -19,7 +19,7 @@ var createStore = require('./createStore.js');
19
19
  * @example
20
20
  * Basic usage:
21
21
  * ```ts
22
- * import { createPersistentStore } from "@fransek/statekit";
22
+ * import { createPersistentStore } from "dharma-core";
23
23
  *
24
24
  * const store = createPersistentStore("count", { count: 0 }, (set) => ({
25
25
  * increment: () => set((state) => ({ count: state.count + 1 })),
@@ -30,7 +30,7 @@ var createStore = require('./createStore.js');
30
30
  * @example
31
31
  * With superjson serialization and session storage:
32
32
  * ```ts
33
- * import { createPersistentStore } from "@fransek/statekit";
33
+ * import { createPersistentStore } from "dharma-core";
34
34
  * import superjson from "superjson";
35
35
  *
36
36
  * const store = createPersistentStore(
@@ -49,7 +49,7 @@ var createStore = require('./createStore.js');
49
49
  * ```
50
50
  * @group Core
51
51
  */
52
- const createPersistentStore = (key, initialState, defineActions = null, { storage: _storage = "local", serializer = JSON, onAttach, onDetach, onStateChange, ...options } = {}) => {
52
+ const createPersistentStore = (key, initialState, defineActions, { storage: _storage = "local", serializer = JSON, onAttach, onDetach, onChange, ...options } = {}) => {
53
53
  if (typeof window === "undefined") {
54
54
  return createStore.createStore(initialState, defineActions, options);
55
55
  }
@@ -86,8 +86,8 @@ const createPersistentStore = (key, initialState, defineActions = null, { storag
86
86
  onDetach?.(...args);
87
87
  window.removeEventListener("focus", updateState);
88
88
  },
89
- onStateChange: (state, ...args) => {
90
- onStateChange?.(state, ...args);
89
+ onChange: (state, ...args) => {
90
+ onChange?.(state, ...args);
91
91
  updateSnapshot(state);
92
92
  },
93
93
  ...options,
@@ -1 +1 @@
1
- {"version":3,"file":"createPersistentStore.js","sources":["../../../src/lib/createPersistentStore.ts"],"sourcesContent":["import { createStore, DefineActions, Store, StoreOptions } from \"./createStore\";\n\nexport type StorageAPI = {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Serializer<T = any> = {\n stringify: (value: T) => string;\n parse: (value: string) => T;\n};\n\nexport type PersistentStoreOptions<TState extends object> =\n StoreOptions<TState> & {\n /** The storage to use for persisting the state. Defaults to local storage. */\n storage?: StorageAPI | \"local\" | \"session\";\n /** The serializer to use for storing the state. Defaults to JSON. */\n serializer?: Serializer<TState>;\n };\n\n/**\n * Creates a store that persists its state in local or session storage.\n * Defaults to local storage but this can be changed in the options.\n *\n * **Note:** The state needs to be serializable by whatever serializer you use. (JSON by default)\n * If you need something more versatile I would recommend using a library like [superjson](https://github.com/flightcontrolhq/superjson).\n *\n * @param {string} key - A unique key to identify the store in storage.\n * @param {TState} initialState - The initial state of the store.\n * @param {DefineActions<TState, TActions> | null} [defineActions] - A function to define actions for the store.\n * @param {PersistentStoreOptions<TState>} [options] - Additional options for the persistent store.\n *\n * @returns {Store<TState, TActions>} The created store.\n *\n * @example\n * Basic usage:\n * ```ts\n * import { createPersistentStore } from \"@fransek/statekit\";\n *\n * const store = createPersistentStore(\"count\", { count: 0 }, (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }));\n * ```\n * @example\n * With superjson serialization and session storage:\n * ```ts\n * import { createPersistentStore } from \"@fransek/statekit\";\n * import superjson from \"superjson\";\n *\n * const store = createPersistentStore(\n * \"count\",\n * { count: 0 },\n * (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }),\n * {\n * serializer: superjson,\n * storage: \"session\",\n * },\n * );\n * ```\n * @group Core\n */\nexport const createPersistentStore = <\n TState extends object,\n TActions extends object = Record<never, never>,\n>(\n key: string,\n initialState: TState,\n defineActions: DefineActions<TState, TActions> | null = null,\n {\n storage: _storage = \"local\",\n serializer = JSON,\n onAttach,\n onDetach,\n onStateChange,\n ...options\n }: PersistentStoreOptions<TState> = {},\n): Store<TState, TActions> => {\n if (typeof window === \"undefined\") {\n return createStore(initialState, defineActions, options);\n }\n\n const storage = getStorage(_storage);\n const stateKey = `store_${key}`;\n const initialStateKey = `init_${key}`;\n const initialStateSnapshot = storage.getItem(initialStateKey);\n const initialStateString = serializer.stringify(initialState);\n\n if (initialStateSnapshot !== initialStateString) {\n storage.setItem(initialStateKey, initialStateString);\n storage.removeItem(stateKey);\n }\n\n const updateSnapshot = (newState: TState) => {\n const currentSnapshot = storage.getItem(stateKey);\n const newSnapshot = serializer.stringify(newState);\n\n if (newSnapshot !== currentSnapshot) {\n storage.setItem(stateKey, newSnapshot);\n }\n };\n\n const updateState = () => {\n const currentSnapshot = storage.getItem(stateKey);\n\n if (\n currentSnapshot &&\n currentSnapshot !== serializer.stringify(store.get())\n ) {\n store.set(serializer.parse(currentSnapshot));\n }\n };\n\n const store = createStore(initialState, defineActions, {\n onAttach: (...args) => {\n onAttach?.(...args);\n updateState();\n window.addEventListener(\"focus\", updateState);\n },\n onDetach: (...args) => {\n onDetach?.(...args);\n window.removeEventListener(\"focus\", updateState);\n },\n onStateChange: (state, ...args) => {\n onStateChange?.(state, ...args);\n updateSnapshot(state);\n },\n ...options,\n });\n\n return store;\n};\n\nconst getStorage = (storage: StorageAPI | \"local\" | \"session\"): StorageAPI => {\n switch (storage) {\n case \"local\":\n return localStorage;\n case \"session\":\n return sessionStorage;\n default:\n return storage;\n }\n};\n"],"names":["createStore"],"mappings":";;;;AAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CG;AACI,MAAM,qBAAqB,GAAG,CAInC,GAAW,EACX,YAAoB,EACpB,gBAAwD,IAAI,EAC5D,EACE,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC3B,UAAU,GAAG,IAAI,EACjB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,GAAG,OAAO,EAAA,GACwB,EAAE,KACX;AAC3B,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,OAAOA,uBAAW,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC;IAC1D;AAEA,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC;AACpC,IAAA,MAAM,QAAQ,GAAG,CAAA,MAAA,EAAS,GAAG,EAAE;AAC/B,IAAA,MAAM,eAAe,GAAG,CAAA,KAAA,EAAQ,GAAG,EAAE;IACrC,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;IAC7D,MAAM,kBAAkB,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC;AAE7D,IAAA,IAAI,oBAAoB,KAAK,kBAAkB,EAAE;AAC/C,QAAA,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC;AACpD,QAAA,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC9B;AAEA,IAAA,MAAM,cAAc,GAAG,CAAC,QAAgB,KAAI;QAC1C,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QACjD,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC;AAElD,QAAA,IAAI,WAAW,KAAK,eAAe,EAAE;AACnC,YAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC;QACxC;AACF,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAK;QACvB,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;AAEjD,QAAA,IACE,eAAe;YACf,eAAe,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EACrD;YACA,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC9C;AACF,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAGA,uBAAW,CAAC,YAAY,EAAE,aAAa,EAAE;AACrD,QAAA,QAAQ,EAAE,CAAC,GAAG,IAAI,KAAI;AACpB,YAAA,QAAQ,GAAG,GAAG,IAAI,CAAC;AACnB,YAAA,WAAW,EAAE;AACb,YAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;QAC/C,CAAC;AACD,QAAA,QAAQ,EAAE,CAAC,GAAG,IAAI,KAAI;AACpB,YAAA,QAAQ,GAAG,GAAG,IAAI,CAAC;AACnB,YAAA,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC;QAClD,CAAC;AACD,QAAA,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,KAAI;AAChC,YAAA,aAAa,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;YAC/B,cAAc,CAAC,KAAK,CAAC;QACvB,CAAC;AACD,QAAA,GAAG,OAAO;AACX,KAAA,CAAC;AAEF,IAAA,OAAO,KAAK;AACd;AAEA,MAAM,UAAU,GAAG,CAAC,OAAyC,KAAgB;IAC3E,QAAQ,OAAO;AACb,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,YAAY;AACrB,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,cAAc;AACvB,QAAA;AACE,YAAA,OAAO,OAAO;;AAEpB,CAAC;;;;"}
1
+ {"version":3,"file":"createPersistentStore.js","sources":["../../../src/lib/createPersistentStore.ts"],"sourcesContent":["import { createStore, DefineActions, Store, StoreOptions } from \"./createStore\";\n\nexport type StorageAPI = {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Serializer<T = any> = {\n stringify: (value: T) => string;\n parse: (value: string) => T;\n};\n\nexport type PersistentStoreOptions<TState extends object> =\n StoreOptions<TState> & {\n /** The storage to use for persisting the state. Defaults to local storage. */\n storage?: StorageAPI | \"local\" | \"session\";\n /** The serializer to use for storing the state. Defaults to JSON. */\n serializer?: Serializer<TState>;\n };\n\n/**\n * Creates a store that persists its state in local or session storage.\n * Defaults to local storage but this can be changed in the options.\n *\n * **Note:** The state needs to be serializable by whatever serializer you use. (JSON by default)\n * If you need something more versatile I would recommend using a library like [superjson](https://github.com/flightcontrolhq/superjson).\n *\n * @param {string} key - A unique key to identify the store in storage.\n * @param {TState} initialState - The initial state of the store.\n * @param {DefineActions<TState, TActions>} [defineActions] - A function to define actions for the store.\n * @param {PersistentStoreOptions<TState>} [options] - Additional options for the persistent store.\n *\n * @returns {Store<TState, TActions>} The created store.\n *\n * @example\n * Basic usage:\n * ```ts\n * import { createPersistentStore } from \"dharma-core\";\n *\n * const store = createPersistentStore(\"count\", { count: 0 }, (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }));\n * ```\n * @example\n * With superjson serialization and session storage:\n * ```ts\n * import { createPersistentStore } from \"dharma-core\";\n * import superjson from \"superjson\";\n *\n * const store = createPersistentStore(\n * \"count\",\n * { count: 0 },\n * (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }),\n * {\n * serializer: superjson,\n * storage: \"session\",\n * },\n * );\n * ```\n * @group Core\n */\nexport const createPersistentStore = <\n TState extends object,\n TActions extends object = Record<never, never>,\n>(\n key: string,\n initialState: TState,\n defineActions: DefineActions<TState, TActions>,\n {\n storage: _storage = \"local\",\n serializer = JSON,\n onAttach,\n onDetach,\n onChange,\n ...options\n }: PersistentStoreOptions<TState> = {},\n): Store<TState, TActions> => {\n if (typeof window === \"undefined\") {\n return createStore(initialState, defineActions, options);\n }\n\n const storage = getStorage(_storage);\n const stateKey = `store_${key}`;\n const initialStateKey = `init_${key}`;\n const initialStateSnapshot = storage.getItem(initialStateKey);\n const initialStateString = serializer.stringify(initialState);\n\n if (initialStateSnapshot !== initialStateString) {\n storage.setItem(initialStateKey, initialStateString);\n storage.removeItem(stateKey);\n }\n\n const updateSnapshot = (newState: TState) => {\n const currentSnapshot = storage.getItem(stateKey);\n const newSnapshot = serializer.stringify(newState);\n\n if (newSnapshot !== currentSnapshot) {\n storage.setItem(stateKey, newSnapshot);\n }\n };\n\n const updateState = () => {\n const currentSnapshot = storage.getItem(stateKey);\n\n if (\n currentSnapshot &&\n currentSnapshot !== serializer.stringify(store.get())\n ) {\n store.set(serializer.parse(currentSnapshot));\n }\n };\n\n const store = createStore(initialState, defineActions, {\n onAttach: (...args) => {\n onAttach?.(...args);\n updateState();\n window.addEventListener(\"focus\", updateState);\n },\n onDetach: (...args) => {\n onDetach?.(...args);\n window.removeEventListener(\"focus\", updateState);\n },\n onChange: (state, ...args) => {\n onChange?.(state, ...args);\n updateSnapshot(state);\n },\n ...options,\n });\n\n return store;\n};\n\nconst getStorage = (storage: StorageAPI | \"local\" | \"session\"): StorageAPI => {\n switch (storage) {\n case \"local\":\n return localStorage;\n case \"session\":\n return sessionStorage;\n default:\n return storage;\n }\n};\n"],"names":["createStore"],"mappings":";;;;AAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CG;AACI,MAAM,qBAAqB,GAAG,CAInC,GAAW,EACX,YAAoB,EACpB,aAA8C,EAC9C,EACE,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC3B,UAAU,GAAG,IAAI,EACjB,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,OAAO,EAAA,GACwB,EAAE,KACX;AAC3B,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,OAAOA,uBAAW,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC;IAC1D;AAEA,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC;AACpC,IAAA,MAAM,QAAQ,GAAG,CAAA,MAAA,EAAS,GAAG,EAAE;AAC/B,IAAA,MAAM,eAAe,GAAG,CAAA,KAAA,EAAQ,GAAG,EAAE;IACrC,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;IAC7D,MAAM,kBAAkB,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC;AAE7D,IAAA,IAAI,oBAAoB,KAAK,kBAAkB,EAAE;AAC/C,QAAA,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC;AACpD,QAAA,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC9B;AAEA,IAAA,MAAM,cAAc,GAAG,CAAC,QAAgB,KAAI;QAC1C,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QACjD,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC;AAElD,QAAA,IAAI,WAAW,KAAK,eAAe,EAAE;AACnC,YAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC;QACxC;AACF,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAK;QACvB,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;AAEjD,QAAA,IACE,eAAe;YACf,eAAe,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EACrD;YACA,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC9C;AACF,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAGA,uBAAW,CAAC,YAAY,EAAE,aAAa,EAAE;AACrD,QAAA,QAAQ,EAAE,CAAC,GAAG,IAAI,KAAI;AACpB,YAAA,QAAQ,GAAG,GAAG,IAAI,CAAC;AACnB,YAAA,WAAW,EAAE;AACb,YAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;QAC/C,CAAC;AACD,QAAA,QAAQ,EAAE,CAAC,GAAG,IAAI,KAAI;AACpB,YAAA,QAAQ,GAAG,GAAG,IAAI,CAAC;AACnB,YAAA,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC;QAClD,CAAC;AACD,QAAA,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,KAAI;AAC3B,YAAA,QAAQ,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;YAC1B,cAAc,CAAC,KAAK,CAAC;QACvB,CAAC;AACD,QAAA,GAAG,OAAO;AACX,KAAA,CAAC;AAEF,IAAA,OAAO,KAAK;AACd;AAEA,MAAM,UAAU,GAAG,CAAC,OAAyC,KAAgB;IAC3E,QAAQ,OAAO;AACb,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,YAAY;AACrB,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,cAAc;AACvB,QAAA;AACE,YAAA,OAAO,OAAO;;AAEpB,CAAC;;;;"}
@@ -21,22 +21,20 @@ export type StoreOptions<TState extends object> = {
21
21
  /** Invoked when the store is unsubscribed from. */
22
22
  onDetach?: StoreEventHandler<TState>;
23
23
  /** Invoked whenever the state changes. */
24
- onStateChange?: StoreEventHandler<TState>;
25
- /** Whether to reset the state to the initial state when the store is detached. */
26
- resetOnDetach?: boolean;
24
+ onChange?: StoreEventHandler<TState>;
27
25
  };
28
26
  /**
29
27
  * Creates a store with an initial state and actions that can modify the state.
30
28
  *
31
29
  * @param {TState} initialState - The initial state of the store.
32
- * @param {DefineActions<TState, TActions> | null} [defineActions] - A function that defines actions that can modify the state.
30
+ * @param {DefineActions<TState, TActions>} [defineActions] - A function that defines actions that can modify the state.
33
31
  * @param {StoreOptions<TState>} [options] - Additional options for the store.
34
32
  *
35
33
  * @returns {Store<TState, TActions>} The created store with state management methods.
36
34
  *
37
35
  * @example
38
36
  * ```ts
39
- * import { createStore } from "@fransek/statekit";
37
+ * import { createStore } from "dharma-core";
40
38
  *
41
39
  * const store = createStore({ count: 0 }, (set) => ({
42
40
  * increment: () => set((state) => ({ count: state.count + 1 })),
@@ -46,5 +44,5 @@ export type StoreOptions<TState extends object> = {
46
44
  * ```
47
45
  * @group Core
48
46
  */
49
- export declare const createStore: <TState extends object, TActions extends object = Record<never, never>>(initialState: TState, defineActions?: DefineActions<TState, TActions> | null, { onLoad, onAttach, onDetach, onStateChange, resetOnDetach, }?: StoreOptions<TState>) => Store<TState, TActions>;
47
+ export declare const createStore: <TState extends object, TActions extends object = Record<never, never>>(initialState: TState, defineActions: DefineActions<TState, TActions>, { onLoad, onAttach, onDetach, onChange }?: StoreOptions<TState>) => Store<TState, TActions>;
50
48
  export {};
@@ -6,14 +6,14 @@ var merge = require('./merge.js');
6
6
  * Creates a store with an initial state and actions that can modify the state.
7
7
  *
8
8
  * @param {TState} initialState - The initial state of the store.
9
- * @param {DefineActions<TState, TActions> | null} [defineActions] - A function that defines actions that can modify the state.
9
+ * @param {DefineActions<TState, TActions>} [defineActions] - A function that defines actions that can modify the state.
10
10
  * @param {StoreOptions<TState>} [options] - Additional options for the store.
11
11
  *
12
12
  * @returns {Store<TState, TActions>} The created store with state management methods.
13
13
  *
14
14
  * @example
15
15
  * ```ts
16
- * import { createStore } from "@fransek/statekit";
16
+ * import { createStore } from "dharma-core";
17
17
  *
18
18
  * const store = createStore({ count: 0 }, (set) => ({
19
19
  * increment: () => set((state) => ({ count: state.count + 1 })),
@@ -23,7 +23,7 @@ var merge = require('./merge.js');
23
23
  * ```
24
24
  * @group Core
25
25
  */
26
- const createStore = (initialState, defineActions = null, { onLoad, onAttach, onDetach, onStateChange, resetOnDetach = false, } = {}) => {
26
+ const createStore = (initialState, defineActions, { onLoad, onAttach, onDetach, onChange } = {}) => {
27
27
  let state = initialState;
28
28
  const listeners = new Set();
29
29
  const get = () => state;
@@ -32,7 +32,7 @@ const createStore = (initialState, defineActions = null, { onLoad, onAttach, onD
32
32
  return state;
33
33
  };
34
34
  const dispatch = () => {
35
- onStateChange?.(state, setSilently);
35
+ onChange?.(state, setSilently);
36
36
  listeners.forEach((listener) => listener());
37
37
  };
38
38
  const set = (stateModifier) => {
@@ -49,9 +49,6 @@ const createStore = (initialState, defineActions = null, { onLoad, onAttach, onD
49
49
  listeners.delete(listener);
50
50
  if (listeners.size === 0) {
51
51
  onDetach?.(state, set);
52
- if (resetOnDetach) {
53
- set(initialState);
54
- }
55
52
  }
56
53
  };
57
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createStore.js","sources":["../../../src/lib/createStore.ts"],"sourcesContent":["import { merge } from \"./merge\";\n\nexport type Store<TState extends object, TActions extends object> = {\n /** Returns the current state of the store. */\n get: () => TState;\n /** Sets the state of the store. */\n set: (stateModifier: StateModifier<TState>) => TState;\n /** Actions that can modify the state of the store. */\n actions: TActions;\n /** Subscribes to changes in the state of the store. Returns an unsubscribe function. */\n subscribe: (listener: Listener) => Listener;\n};\n\ntype Listener = () => void;\n\nexport type StoreEventHandler<TState extends object> = (\n state: TState,\n set: SetState<TState>,\n) => void;\n\nexport type SetState<TState extends object> = (\n stateModifier: StateModifier<TState>,\n) => TState;\n\nexport type StateModifier<TState extends object> =\n | Partial<TState>\n | ((state: TState) => Partial<TState>);\n\nexport type DefineActions<TState extends object, TActions> = (\n set: (stateModifier: StateModifier<TState>) => TState,\n get: () => TState,\n) => TActions;\n\nexport type StoreOptions<TState extends object> = {\n /** Invoked when the store is created. */\n onLoad?: StoreEventHandler<TState>;\n /** Invoked when the store is subscribed to. */\n onAttach?: StoreEventHandler<TState>;\n /** Invoked when the store is unsubscribed from. */\n onDetach?: StoreEventHandler<TState>;\n /** Invoked whenever the state changes. */\n onStateChange?: StoreEventHandler<TState>;\n /** Whether to reset the state to the initial state when the store is detached. */\n resetOnDetach?: boolean;\n};\n\n/**\n * Creates a store with an initial state and actions that can modify the state.\n *\n * @param {TState} initialState - The initial state of the store.\n * @param {DefineActions<TState, TActions> | null} [defineActions] - A function that defines actions that can modify the state.\n * @param {StoreOptions<TState>} [options] - Additional options for the store.\n *\n * @returns {Store<TState, TActions>} The created store with state management methods.\n *\n * @example\n * ```ts\n * import { createStore } from \"@fransek/statekit\";\n *\n * const store = createStore({ count: 0 }, (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }));\n * ```\n * @group Core\n */\nexport const createStore = <\n TState extends object,\n TActions extends object = Record<never, never>,\n>(\n initialState: TState,\n defineActions: DefineActions<TState, TActions> | null = null,\n {\n onLoad,\n onAttach,\n onDetach,\n onStateChange,\n resetOnDetach = false,\n }: StoreOptions<TState> = {},\n): Store<TState, TActions> => {\n let state = initialState;\n const listeners = new Set<Listener>();\n\n const get = () => state;\n\n const setSilently = (stateModifier: StateModifier<TState>) => {\n state = merge(state, stateModifier);\n return state;\n };\n\n const dispatch = () => {\n onStateChange?.(state, setSilently);\n listeners.forEach((listener) => listener());\n };\n\n const set = (stateModifier: StateModifier<TState>) => {\n setSilently(stateModifier);\n dispatch();\n return state;\n };\n\n const subscribe = (listener: Listener) => {\n if (listeners.size === 0) {\n onAttach?.(state, set);\n }\n\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n\n if (listeners.size === 0) {\n onDetach?.(state, set);\n\n if (resetOnDetach) {\n set(initialState);\n }\n }\n };\n };\n\n const actions = defineActions ? defineActions(set, get) : ({} as TActions);\n\n onLoad?.(state, set);\n\n return {\n get,\n set,\n subscribe,\n actions,\n };\n};\n"],"names":["merge"],"mappings":";;;;AA8CA;;;;;;;;;;;;;;;;;;;;AAoBG;AACI,MAAM,WAAW,GAAG,CAIzB,YAAoB,EACpB,aAAA,GAAwD,IAAI,EAC5D,EACE,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,aAAa,GAAG,KAAK,GAAA,GACG,EAAE,KACD;IAC3B,IAAI,KAAK,GAAG,YAAY;AACxB,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAY;AAErC,IAAA,MAAM,GAAG,GAAG,MAAM,KAAK;AAEvB,IAAA,MAAM,WAAW,GAAG,CAAC,aAAoC,KAAI;AAC3D,QAAA,KAAK,GAAGA,WAAK,CAAC,KAAK,EAAE,aAAa,CAAC;AACnC,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;IAED,MAAM,QAAQ,GAAG,MAAK;AACpB,QAAA,aAAa,GAAG,KAAK,EAAE,WAAW,CAAC;QACnC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;AAC7C,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,GAAG,CAAC,aAAoC,KAAI;QACnD,WAAW,CAAC,aAAa,CAAC;AAC1B,QAAA,QAAQ,EAAE;AACV,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;AAED,IAAA,MAAM,SAAS,GAAG,CAAC,QAAkB,KAAI;AACvC,QAAA,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;AACxB,YAAA,QAAQ,GAAG,KAAK,EAAE,GAAG,CAAC;QACxB;AAEA,QAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAEvB,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AAE1B,YAAA,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;AACxB,gBAAA,QAAQ,GAAG,KAAK,EAAE,GAAG,CAAC;gBAEtB,IAAI,aAAa,EAAE;oBACjB,GAAG,CAAC,YAAY,CAAC;gBACnB;YACF;AACF,QAAA,CAAC;AACH,IAAA,CAAC;AAED,IAAA,MAAM,OAAO,GAAG,aAAa,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAI,EAAe;AAE1E,IAAA,MAAM,GAAG,KAAK,EAAE,GAAG,CAAC;IAEpB,OAAO;QACL,GAAG;QACH,GAAG;QACH,SAAS;QACT,OAAO;KACR;AACH;;;;"}
1
+ {"version":3,"file":"createStore.js","sources":["../../../src/lib/createStore.ts"],"sourcesContent":["import { merge } from \"./merge\";\n\nexport type Store<TState extends object, TActions extends object> = {\n /** Returns the current state of the store. */\n get: () => TState;\n /** Sets the state of the store. */\n set: (stateModifier: StateModifier<TState>) => TState;\n /** Actions that can modify the state of the store. */\n actions: TActions;\n /** Subscribes to changes in the state of the store. Returns an unsubscribe function. */\n subscribe: (listener: Listener) => Listener;\n};\n\ntype Listener = () => void;\n\nexport type StoreEventHandler<TState extends object> = (\n state: TState,\n set: SetState<TState>,\n) => void;\n\nexport type SetState<TState extends object> = (\n stateModifier: StateModifier<TState>,\n) => TState;\n\nexport type StateModifier<TState extends object> =\n | Partial<TState>\n | ((state: TState) => Partial<TState>);\n\nexport type DefineActions<TState extends object, TActions> = (\n set: (stateModifier: StateModifier<TState>) => TState,\n get: () => TState,\n) => TActions;\n\nexport type StoreOptions<TState extends object> = {\n /** Invoked when the store is created. */\n onLoad?: StoreEventHandler<TState>;\n /** Invoked when the store is subscribed to. */\n onAttach?: StoreEventHandler<TState>;\n /** Invoked when the store is unsubscribed from. */\n onDetach?: StoreEventHandler<TState>;\n /** Invoked whenever the state changes. */\n onChange?: StoreEventHandler<TState>;\n};\n\n/**\n * Creates a store with an initial state and actions that can modify the state.\n *\n * @param {TState} initialState - The initial state of the store.\n * @param {DefineActions<TState, TActions>} [defineActions] - A function that defines actions that can modify the state.\n * @param {StoreOptions<TState>} [options] - Additional options for the store.\n *\n * @returns {Store<TState, TActions>} The created store with state management methods.\n *\n * @example\n * ```ts\n * import { createStore } from \"dharma-core\";\n *\n * const store = createStore({ count: 0 }, (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }));\n * ```\n * @group Core\n */\nexport const createStore = <\n TState extends object,\n TActions extends object = Record<never, never>,\n>(\n initialState: TState,\n defineActions: DefineActions<TState, TActions>,\n { onLoad, onAttach, onDetach, onChange }: StoreOptions<TState> = {},\n): Store<TState, TActions> => {\n let state = initialState;\n const listeners = new Set<Listener>();\n\n const get = () => state;\n\n const setSilently = (stateModifier: StateModifier<TState>) => {\n state = merge(state, stateModifier);\n return state;\n };\n\n const dispatch = () => {\n onChange?.(state, setSilently);\n listeners.forEach((listener) => listener());\n };\n\n const set = (stateModifier: StateModifier<TState>) => {\n setSilently(stateModifier);\n dispatch();\n return state;\n };\n\n const subscribe = (listener: Listener) => {\n if (listeners.size === 0) {\n onAttach?.(state, set);\n }\n\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n\n if (listeners.size === 0) {\n onDetach?.(state, set);\n }\n };\n };\n\n const actions = defineActions ? defineActions(set, get) : ({} as TActions);\n\n onLoad?.(state, set);\n\n return {\n get,\n set,\n subscribe,\n actions,\n };\n};\n"],"names":["merge"],"mappings":";;;;AA4CA;;;;;;;;;;;;;;;;;;;;AAoBG;MACU,WAAW,GAAG,CAIzB,YAAoB,EACpB,aAA8C,EAC9C,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAA,GAA2B,EAAE,KACxC;IAC3B,IAAI,KAAK,GAAG,YAAY;AACxB,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAY;AAErC,IAAA,MAAM,GAAG,GAAG,MAAM,KAAK;AAEvB,IAAA,MAAM,WAAW,GAAG,CAAC,aAAoC,KAAI;AAC3D,QAAA,KAAK,GAAGA,WAAK,CAAC,KAAK,EAAE,aAAa,CAAC;AACnC,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;IAED,MAAM,QAAQ,GAAG,MAAK;AACpB,QAAA,QAAQ,GAAG,KAAK,EAAE,WAAW,CAAC;QAC9B,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;AAC7C,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,GAAG,CAAC,aAAoC,KAAI;QACnD,WAAW,CAAC,aAAa,CAAC;AAC1B,QAAA,QAAQ,EAAE;AACV,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;AAED,IAAA,MAAM,SAAS,GAAG,CAAC,QAAkB,KAAI;AACvC,QAAA,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;AACxB,YAAA,QAAQ,GAAG,KAAK,EAAE,GAAG,CAAC;QACxB;AAEA,QAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAEvB,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AAE1B,YAAA,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;AACxB,gBAAA,QAAQ,GAAG,KAAK,EAAE,GAAG,CAAC;YACxB;AACF,QAAA,CAAC;AACH,IAAA,CAAC;AAED,IAAA,MAAM,OAAO,GAAG,aAAa,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAI,EAAe;AAE1E,IAAA,MAAM,GAAG,KAAK,EAAE,GAAG,CAAC;IAEpB,OAAO;QACL,GAAG;QACH,GAAG;QACH,SAAS;QACT,OAAO;KACR;AACH;;;;"}
@@ -9,7 +9,7 @@ import { StateModifier } from "./createStore";
9
9
  *
10
10
  * @example
11
11
  * ```ts
12
- * import { createStore, merge, StateModifier } from "@fransek/statekit";
12
+ * import { createStore, merge, StateModifier } from "dharma-core";
13
13
  *
14
14
  * const store = createStore(
15
15
  * {
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * @example
12
12
  * ```ts
13
- * import { createStore, merge, StateModifier } from "@fransek/statekit";
13
+ * import { createStore, merge, StateModifier } from "dharma-core";
14
14
  *
15
15
  * const store = createStore(
16
16
  * {
@@ -1 +1 @@
1
- {"version":3,"file":"merge.js","sources":["../../../src/lib/merge.ts"],"sourcesContent":["import { StateModifier } from \"./createStore\";\n\n/**\n * Merges the current state with a state modifier.\n * Useful for creating custom set functions.\n *\n * @param {T} stateModifier - A function or object that modifies the state.\n * @param {StateModifier<T>} stateModifier - The current state object.\n * @returns {T} The new state object, which is a combination of the current state and the state modifier.\n *\n * @example\n * ```ts\n * import { createStore, merge, StateModifier } from \"@fransek/statekit\";\n *\n * const store = createStore(\n * {\n * counter: {\n * count: 0,\n * },\n * // ...\n * },\n * (set) => {\n * const setCounter = (counter: StateModifier<{ count: number }>) =>\n * set((state) => ({\n * counter: merge(state.counter, counter),\n * }));\n *\n * return {\n * increment: () => setCounter((state) => ({ count: state.count + 1 })),\n * decrement: () => setCounter((state) => ({ count: state.count - 1 })),\n * reset: () => setCounter({ count: 0 }),\n * // ...\n * };\n * },\n * );\n * ```\n * @group Utilities\n */\nexport const merge = <T extends object>(\n currentState: T,\n stateModifier: StateModifier<T>,\n): T => {\n const newState =\n typeof stateModifier === \"function\"\n ? stateModifier(currentState)\n : stateModifier;\n return { ...currentState, ...newState };\n};\n"],"names":[],"mappings":";;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;MACU,KAAK,GAAG,CACnB,YAAe,EACf,aAA+B,KAC1B;AACL,IAAA,MAAM,QAAQ,GACZ,OAAO,aAAa,KAAK;AACvB,UAAE,aAAa,CAAC,YAAY;UAC1B,aAAa;AACnB,IAAA,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,QAAQ,EAAE;AACzC;;;;"}
1
+ {"version":3,"file":"merge.js","sources":["../../../src/lib/merge.ts"],"sourcesContent":["import { StateModifier } from \"./createStore\";\n\n/**\n * Merges the current state with a state modifier.\n * Useful for creating custom set functions.\n *\n * @param {T} stateModifier - A function or object that modifies the state.\n * @param {StateModifier<T>} stateModifier - The current state object.\n * @returns {T} The new state object, which is a combination of the current state and the state modifier.\n *\n * @example\n * ```ts\n * import { createStore, merge, StateModifier } from \"dharma-core\";\n *\n * const store = createStore(\n * {\n * counter: {\n * count: 0,\n * },\n * // ...\n * },\n * (set) => {\n * const setCounter = (counter: StateModifier<{ count: number }>) =>\n * set((state) => ({\n * counter: merge(state.counter, counter),\n * }));\n *\n * return {\n * increment: () => setCounter((state) => ({ count: state.count + 1 })),\n * decrement: () => setCounter((state) => ({ count: state.count - 1 })),\n * reset: () => setCounter({ count: 0 }),\n * // ...\n * };\n * },\n * );\n * ```\n * @group Utilities\n */\nexport const merge = <T extends object>(\n currentState: T,\n stateModifier: StateModifier<T>,\n): T => {\n const newState =\n typeof stateModifier === \"function\"\n ? stateModifier(currentState)\n : stateModifier;\n return { ...currentState, ...newState };\n};\n"],"names":[],"mappings":";;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;MACU,KAAK,GAAG,CACnB,YAAe,EACf,aAA+B,KAC1B;AACL,IAAA,MAAM,QAAQ,GACZ,OAAO,aAAa,KAAK;AACvB,UAAE,aAAa,CAAC,YAAY;UAC1B,aAAa;AACnB,IAAA,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,QAAQ,EAAE;AACzC;;;;"}
@@ -23,7 +23,7 @@ export type PersistentStoreOptions<TState extends object> = StoreOptions<TState>
23
23
  *
24
24
  * @param {string} key - A unique key to identify the store in storage.
25
25
  * @param {TState} initialState - The initial state of the store.
26
- * @param {DefineActions<TState, TActions> | null} [defineActions] - A function to define actions for the store.
26
+ * @param {DefineActions<TState, TActions>} [defineActions] - A function to define actions for the store.
27
27
  * @param {PersistentStoreOptions<TState>} [options] - Additional options for the persistent store.
28
28
  *
29
29
  * @returns {Store<TState, TActions>} The created store.
@@ -31,7 +31,7 @@ export type PersistentStoreOptions<TState extends object> = StoreOptions<TState>
31
31
  * @example
32
32
  * Basic usage:
33
33
  * ```ts
34
- * import { createPersistentStore } from "@fransek/statekit";
34
+ * import { createPersistentStore } from "dharma-core";
35
35
  *
36
36
  * const store = createPersistentStore("count", { count: 0 }, (set) => ({
37
37
  * increment: () => set((state) => ({ count: state.count + 1 })),
@@ -42,7 +42,7 @@ export type PersistentStoreOptions<TState extends object> = StoreOptions<TState>
42
42
  * @example
43
43
  * With superjson serialization and session storage:
44
44
  * ```ts
45
- * import { createPersistentStore } from "@fransek/statekit";
45
+ * import { createPersistentStore } from "dharma-core";
46
46
  * import superjson from "superjson";
47
47
  *
48
48
  * const store = createPersistentStore(
@@ -61,4 +61,4 @@ export type PersistentStoreOptions<TState extends object> = StoreOptions<TState>
61
61
  * ```
62
62
  * @group Core
63
63
  */
64
- export declare const createPersistentStore: <TState extends object, TActions extends object = Record<never, never>>(key: string, initialState: TState, defineActions?: DefineActions<TState, TActions> | null, { storage: _storage, serializer, onAttach, onDetach, onStateChange, ...options }?: PersistentStoreOptions<TState>) => Store<TState, TActions>;
64
+ export declare const createPersistentStore: <TState extends object, TActions extends object = Record<never, never>>(key: string, initialState: TState, defineActions: DefineActions<TState, TActions>, { storage: _storage, serializer, onAttach, onDetach, onChange, ...options }?: PersistentStoreOptions<TState>) => Store<TState, TActions>;
@@ -9,7 +9,7 @@ import { createStore } from './createStore.js';
9
9
  *
10
10
  * @param {string} key - A unique key to identify the store in storage.
11
11
  * @param {TState} initialState - The initial state of the store.
12
- * @param {DefineActions<TState, TActions> | null} [defineActions] - A function to define actions for the store.
12
+ * @param {DefineActions<TState, TActions>} [defineActions] - A function to define actions for the store.
13
13
  * @param {PersistentStoreOptions<TState>} [options] - Additional options for the persistent store.
14
14
  *
15
15
  * @returns {Store<TState, TActions>} The created store.
@@ -17,7 +17,7 @@ import { createStore } from './createStore.js';
17
17
  * @example
18
18
  * Basic usage:
19
19
  * ```ts
20
- * import { createPersistentStore } from "@fransek/statekit";
20
+ * import { createPersistentStore } from "dharma-core";
21
21
  *
22
22
  * const store = createPersistentStore("count", { count: 0 }, (set) => ({
23
23
  * increment: () => set((state) => ({ count: state.count + 1 })),
@@ -28,7 +28,7 @@ import { createStore } from './createStore.js';
28
28
  * @example
29
29
  * With superjson serialization and session storage:
30
30
  * ```ts
31
- * import { createPersistentStore } from "@fransek/statekit";
31
+ * import { createPersistentStore } from "dharma-core";
32
32
  * import superjson from "superjson";
33
33
  *
34
34
  * const store = createPersistentStore(
@@ -47,7 +47,7 @@ import { createStore } from './createStore.js';
47
47
  * ```
48
48
  * @group Core
49
49
  */
50
- const createPersistentStore = (key, initialState, defineActions = null, { storage: _storage = "local", serializer = JSON, onAttach, onDetach, onStateChange, ...options } = {}) => {
50
+ const createPersistentStore = (key, initialState, defineActions, { storage: _storage = "local", serializer = JSON, onAttach, onDetach, onChange, ...options } = {}) => {
51
51
  if (typeof window === "undefined") {
52
52
  return createStore(initialState, defineActions, options);
53
53
  }
@@ -84,8 +84,8 @@ const createPersistentStore = (key, initialState, defineActions = null, { storag
84
84
  onDetach?.(...args);
85
85
  window.removeEventListener("focus", updateState);
86
86
  },
87
- onStateChange: (state, ...args) => {
88
- onStateChange?.(state, ...args);
87
+ onChange: (state, ...args) => {
88
+ onChange?.(state, ...args);
89
89
  updateSnapshot(state);
90
90
  },
91
91
  ...options,
@@ -1 +1 @@
1
- {"version":3,"file":"createPersistentStore.js","sources":["../../../src/lib/createPersistentStore.ts"],"sourcesContent":["import { createStore, DefineActions, Store, StoreOptions } from \"./createStore\";\n\nexport type StorageAPI = {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Serializer<T = any> = {\n stringify: (value: T) => string;\n parse: (value: string) => T;\n};\n\nexport type PersistentStoreOptions<TState extends object> =\n StoreOptions<TState> & {\n /** The storage to use for persisting the state. Defaults to local storage. */\n storage?: StorageAPI | \"local\" | \"session\";\n /** The serializer to use for storing the state. Defaults to JSON. */\n serializer?: Serializer<TState>;\n };\n\n/**\n * Creates a store that persists its state in local or session storage.\n * Defaults to local storage but this can be changed in the options.\n *\n * **Note:** The state needs to be serializable by whatever serializer you use. (JSON by default)\n * If you need something more versatile I would recommend using a library like [superjson](https://github.com/flightcontrolhq/superjson).\n *\n * @param {string} key - A unique key to identify the store in storage.\n * @param {TState} initialState - The initial state of the store.\n * @param {DefineActions<TState, TActions> | null} [defineActions] - A function to define actions for the store.\n * @param {PersistentStoreOptions<TState>} [options] - Additional options for the persistent store.\n *\n * @returns {Store<TState, TActions>} The created store.\n *\n * @example\n * Basic usage:\n * ```ts\n * import { createPersistentStore } from \"@fransek/statekit\";\n *\n * const store = createPersistentStore(\"count\", { count: 0 }, (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }));\n * ```\n * @example\n * With superjson serialization and session storage:\n * ```ts\n * import { createPersistentStore } from \"@fransek/statekit\";\n * import superjson from \"superjson\";\n *\n * const store = createPersistentStore(\n * \"count\",\n * { count: 0 },\n * (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }),\n * {\n * serializer: superjson,\n * storage: \"session\",\n * },\n * );\n * ```\n * @group Core\n */\nexport const createPersistentStore = <\n TState extends object,\n TActions extends object = Record<never, never>,\n>(\n key: string,\n initialState: TState,\n defineActions: DefineActions<TState, TActions> | null = null,\n {\n storage: _storage = \"local\",\n serializer = JSON,\n onAttach,\n onDetach,\n onStateChange,\n ...options\n }: PersistentStoreOptions<TState> = {},\n): Store<TState, TActions> => {\n if (typeof window === \"undefined\") {\n return createStore(initialState, defineActions, options);\n }\n\n const storage = getStorage(_storage);\n const stateKey = `store_${key}`;\n const initialStateKey = `init_${key}`;\n const initialStateSnapshot = storage.getItem(initialStateKey);\n const initialStateString = serializer.stringify(initialState);\n\n if (initialStateSnapshot !== initialStateString) {\n storage.setItem(initialStateKey, initialStateString);\n storage.removeItem(stateKey);\n }\n\n const updateSnapshot = (newState: TState) => {\n const currentSnapshot = storage.getItem(stateKey);\n const newSnapshot = serializer.stringify(newState);\n\n if (newSnapshot !== currentSnapshot) {\n storage.setItem(stateKey, newSnapshot);\n }\n };\n\n const updateState = () => {\n const currentSnapshot = storage.getItem(stateKey);\n\n if (\n currentSnapshot &&\n currentSnapshot !== serializer.stringify(store.get())\n ) {\n store.set(serializer.parse(currentSnapshot));\n }\n };\n\n const store = createStore(initialState, defineActions, {\n onAttach: (...args) => {\n onAttach?.(...args);\n updateState();\n window.addEventListener(\"focus\", updateState);\n },\n onDetach: (...args) => {\n onDetach?.(...args);\n window.removeEventListener(\"focus\", updateState);\n },\n onStateChange: (state, ...args) => {\n onStateChange?.(state, ...args);\n updateSnapshot(state);\n },\n ...options,\n });\n\n return store;\n};\n\nconst getStorage = (storage: StorageAPI | \"local\" | \"session\"): StorageAPI => {\n switch (storage) {\n case \"local\":\n return localStorage;\n case \"session\":\n return sessionStorage;\n default:\n return storage;\n }\n};\n"],"names":[],"mappings":";;AAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CG;AACI,MAAM,qBAAqB,GAAG,CAInC,GAAW,EACX,YAAoB,EACpB,gBAAwD,IAAI,EAC5D,EACE,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC3B,UAAU,GAAG,IAAI,EACjB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,GAAG,OAAO,EAAA,GACwB,EAAE,KACX;AAC3B,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,OAAO,WAAW,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC;IAC1D;AAEA,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC;AACpC,IAAA,MAAM,QAAQ,GAAG,CAAA,MAAA,EAAS,GAAG,EAAE;AAC/B,IAAA,MAAM,eAAe,GAAG,CAAA,KAAA,EAAQ,GAAG,EAAE;IACrC,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;IAC7D,MAAM,kBAAkB,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC;AAE7D,IAAA,IAAI,oBAAoB,KAAK,kBAAkB,EAAE;AAC/C,QAAA,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC;AACpD,QAAA,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC9B;AAEA,IAAA,MAAM,cAAc,GAAG,CAAC,QAAgB,KAAI;QAC1C,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QACjD,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC;AAElD,QAAA,IAAI,WAAW,KAAK,eAAe,EAAE;AACnC,YAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC;QACxC;AACF,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAK;QACvB,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;AAEjD,QAAA,IACE,eAAe;YACf,eAAe,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EACrD;YACA,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC9C;AACF,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,EAAE,aAAa,EAAE;AACrD,QAAA,QAAQ,EAAE,CAAC,GAAG,IAAI,KAAI;AACpB,YAAA,QAAQ,GAAG,GAAG,IAAI,CAAC;AACnB,YAAA,WAAW,EAAE;AACb,YAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;QAC/C,CAAC;AACD,QAAA,QAAQ,EAAE,CAAC,GAAG,IAAI,KAAI;AACpB,YAAA,QAAQ,GAAG,GAAG,IAAI,CAAC;AACnB,YAAA,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC;QAClD,CAAC;AACD,QAAA,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,KAAI;AAChC,YAAA,aAAa,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;YAC/B,cAAc,CAAC,KAAK,CAAC;QACvB,CAAC;AACD,QAAA,GAAG,OAAO;AACX,KAAA,CAAC;AAEF,IAAA,OAAO,KAAK;AACd;AAEA,MAAM,UAAU,GAAG,CAAC,OAAyC,KAAgB;IAC3E,QAAQ,OAAO;AACb,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,YAAY;AACrB,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,cAAc;AACvB,QAAA;AACE,YAAA,OAAO,OAAO;;AAEpB,CAAC;;;;"}
1
+ {"version":3,"file":"createPersistentStore.js","sources":["../../../src/lib/createPersistentStore.ts"],"sourcesContent":["import { createStore, DefineActions, Store, StoreOptions } from \"./createStore\";\n\nexport type StorageAPI = {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Serializer<T = any> = {\n stringify: (value: T) => string;\n parse: (value: string) => T;\n};\n\nexport type PersistentStoreOptions<TState extends object> =\n StoreOptions<TState> & {\n /** The storage to use for persisting the state. Defaults to local storage. */\n storage?: StorageAPI | \"local\" | \"session\";\n /** The serializer to use for storing the state. Defaults to JSON. */\n serializer?: Serializer<TState>;\n };\n\n/**\n * Creates a store that persists its state in local or session storage.\n * Defaults to local storage but this can be changed in the options.\n *\n * **Note:** The state needs to be serializable by whatever serializer you use. (JSON by default)\n * If you need something more versatile I would recommend using a library like [superjson](https://github.com/flightcontrolhq/superjson).\n *\n * @param {string} key - A unique key to identify the store in storage.\n * @param {TState} initialState - The initial state of the store.\n * @param {DefineActions<TState, TActions>} [defineActions] - A function to define actions for the store.\n * @param {PersistentStoreOptions<TState>} [options] - Additional options for the persistent store.\n *\n * @returns {Store<TState, TActions>} The created store.\n *\n * @example\n * Basic usage:\n * ```ts\n * import { createPersistentStore } from \"dharma-core\";\n *\n * const store = createPersistentStore(\"count\", { count: 0 }, (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }));\n * ```\n * @example\n * With superjson serialization and session storage:\n * ```ts\n * import { createPersistentStore } from \"dharma-core\";\n * import superjson from \"superjson\";\n *\n * const store = createPersistentStore(\n * \"count\",\n * { count: 0 },\n * (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }),\n * {\n * serializer: superjson,\n * storage: \"session\",\n * },\n * );\n * ```\n * @group Core\n */\nexport const createPersistentStore = <\n TState extends object,\n TActions extends object = Record<never, never>,\n>(\n key: string,\n initialState: TState,\n defineActions: DefineActions<TState, TActions>,\n {\n storage: _storage = \"local\",\n serializer = JSON,\n onAttach,\n onDetach,\n onChange,\n ...options\n }: PersistentStoreOptions<TState> = {},\n): Store<TState, TActions> => {\n if (typeof window === \"undefined\") {\n return createStore(initialState, defineActions, options);\n }\n\n const storage = getStorage(_storage);\n const stateKey = `store_${key}`;\n const initialStateKey = `init_${key}`;\n const initialStateSnapshot = storage.getItem(initialStateKey);\n const initialStateString = serializer.stringify(initialState);\n\n if (initialStateSnapshot !== initialStateString) {\n storage.setItem(initialStateKey, initialStateString);\n storage.removeItem(stateKey);\n }\n\n const updateSnapshot = (newState: TState) => {\n const currentSnapshot = storage.getItem(stateKey);\n const newSnapshot = serializer.stringify(newState);\n\n if (newSnapshot !== currentSnapshot) {\n storage.setItem(stateKey, newSnapshot);\n }\n };\n\n const updateState = () => {\n const currentSnapshot = storage.getItem(stateKey);\n\n if (\n currentSnapshot &&\n currentSnapshot !== serializer.stringify(store.get())\n ) {\n store.set(serializer.parse(currentSnapshot));\n }\n };\n\n const store = createStore(initialState, defineActions, {\n onAttach: (...args) => {\n onAttach?.(...args);\n updateState();\n window.addEventListener(\"focus\", updateState);\n },\n onDetach: (...args) => {\n onDetach?.(...args);\n window.removeEventListener(\"focus\", updateState);\n },\n onChange: (state, ...args) => {\n onChange?.(state, ...args);\n updateSnapshot(state);\n },\n ...options,\n });\n\n return store;\n};\n\nconst getStorage = (storage: StorageAPI | \"local\" | \"session\"): StorageAPI => {\n switch (storage) {\n case \"local\":\n return localStorage;\n case \"session\":\n return sessionStorage;\n default:\n return storage;\n }\n};\n"],"names":[],"mappings":";;AAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CG;AACI,MAAM,qBAAqB,GAAG,CAInC,GAAW,EACX,YAAoB,EACpB,aAA8C,EAC9C,EACE,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC3B,UAAU,GAAG,IAAI,EACjB,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,OAAO,EAAA,GACwB,EAAE,KACX;AAC3B,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,OAAO,WAAW,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC;IAC1D;AAEA,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC;AACpC,IAAA,MAAM,QAAQ,GAAG,CAAA,MAAA,EAAS,GAAG,EAAE;AAC/B,IAAA,MAAM,eAAe,GAAG,CAAA,KAAA,EAAQ,GAAG,EAAE;IACrC,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;IAC7D,MAAM,kBAAkB,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC;AAE7D,IAAA,IAAI,oBAAoB,KAAK,kBAAkB,EAAE;AAC/C,QAAA,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC;AACpD,QAAA,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC9B;AAEA,IAAA,MAAM,cAAc,GAAG,CAAC,QAAgB,KAAI;QAC1C,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QACjD,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC;AAElD,QAAA,IAAI,WAAW,KAAK,eAAe,EAAE;AACnC,YAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC;QACxC;AACF,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAK;QACvB,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;AAEjD,QAAA,IACE,eAAe;YACf,eAAe,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EACrD;YACA,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC9C;AACF,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,EAAE,aAAa,EAAE;AACrD,QAAA,QAAQ,EAAE,CAAC,GAAG,IAAI,KAAI;AACpB,YAAA,QAAQ,GAAG,GAAG,IAAI,CAAC;AACnB,YAAA,WAAW,EAAE;AACb,YAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;QAC/C,CAAC;AACD,QAAA,QAAQ,EAAE,CAAC,GAAG,IAAI,KAAI;AACpB,YAAA,QAAQ,GAAG,GAAG,IAAI,CAAC;AACnB,YAAA,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC;QAClD,CAAC;AACD,QAAA,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,KAAI;AAC3B,YAAA,QAAQ,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;YAC1B,cAAc,CAAC,KAAK,CAAC;QACvB,CAAC;AACD,QAAA,GAAG,OAAO;AACX,KAAA,CAAC;AAEF,IAAA,OAAO,KAAK;AACd;AAEA,MAAM,UAAU,GAAG,CAAC,OAAyC,KAAgB;IAC3E,QAAQ,OAAO;AACb,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,YAAY;AACrB,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,cAAc;AACvB,QAAA;AACE,YAAA,OAAO,OAAO;;AAEpB,CAAC;;;;"}
@@ -21,22 +21,20 @@ export type StoreOptions<TState extends object> = {
21
21
  /** Invoked when the store is unsubscribed from. */
22
22
  onDetach?: StoreEventHandler<TState>;
23
23
  /** Invoked whenever the state changes. */
24
- onStateChange?: StoreEventHandler<TState>;
25
- /** Whether to reset the state to the initial state when the store is detached. */
26
- resetOnDetach?: boolean;
24
+ onChange?: StoreEventHandler<TState>;
27
25
  };
28
26
  /**
29
27
  * Creates a store with an initial state and actions that can modify the state.
30
28
  *
31
29
  * @param {TState} initialState - The initial state of the store.
32
- * @param {DefineActions<TState, TActions> | null} [defineActions] - A function that defines actions that can modify the state.
30
+ * @param {DefineActions<TState, TActions>} [defineActions] - A function that defines actions that can modify the state.
33
31
  * @param {StoreOptions<TState>} [options] - Additional options for the store.
34
32
  *
35
33
  * @returns {Store<TState, TActions>} The created store with state management methods.
36
34
  *
37
35
  * @example
38
36
  * ```ts
39
- * import { createStore } from "@fransek/statekit";
37
+ * import { createStore } from "dharma-core";
40
38
  *
41
39
  * const store = createStore({ count: 0 }, (set) => ({
42
40
  * increment: () => set((state) => ({ count: state.count + 1 })),
@@ -46,5 +44,5 @@ export type StoreOptions<TState extends object> = {
46
44
  * ```
47
45
  * @group Core
48
46
  */
49
- export declare const createStore: <TState extends object, TActions extends object = Record<never, never>>(initialState: TState, defineActions?: DefineActions<TState, TActions> | null, { onLoad, onAttach, onDetach, onStateChange, resetOnDetach, }?: StoreOptions<TState>) => Store<TState, TActions>;
47
+ export declare const createStore: <TState extends object, TActions extends object = Record<never, never>>(initialState: TState, defineActions: DefineActions<TState, TActions>, { onLoad, onAttach, onDetach, onChange }?: StoreOptions<TState>) => Store<TState, TActions>;
50
48
  export {};
@@ -4,14 +4,14 @@ import { merge } from './merge.js';
4
4
  * Creates a store with an initial state and actions that can modify the state.
5
5
  *
6
6
  * @param {TState} initialState - The initial state of the store.
7
- * @param {DefineActions<TState, TActions> | null} [defineActions] - A function that defines actions that can modify the state.
7
+ * @param {DefineActions<TState, TActions>} [defineActions] - A function that defines actions that can modify the state.
8
8
  * @param {StoreOptions<TState>} [options] - Additional options for the store.
9
9
  *
10
10
  * @returns {Store<TState, TActions>} The created store with state management methods.
11
11
  *
12
12
  * @example
13
13
  * ```ts
14
- * import { createStore } from "@fransek/statekit";
14
+ * import { createStore } from "dharma-core";
15
15
  *
16
16
  * const store = createStore({ count: 0 }, (set) => ({
17
17
  * increment: () => set((state) => ({ count: state.count + 1 })),
@@ -21,7 +21,7 @@ import { merge } from './merge.js';
21
21
  * ```
22
22
  * @group Core
23
23
  */
24
- const createStore = (initialState, defineActions = null, { onLoad, onAttach, onDetach, onStateChange, resetOnDetach = false, } = {}) => {
24
+ const createStore = (initialState, defineActions, { onLoad, onAttach, onDetach, onChange } = {}) => {
25
25
  let state = initialState;
26
26
  const listeners = new Set();
27
27
  const get = () => state;
@@ -30,7 +30,7 @@ const createStore = (initialState, defineActions = null, { onLoad, onAttach, onD
30
30
  return state;
31
31
  };
32
32
  const dispatch = () => {
33
- onStateChange?.(state, setSilently);
33
+ onChange?.(state, setSilently);
34
34
  listeners.forEach((listener) => listener());
35
35
  };
36
36
  const set = (stateModifier) => {
@@ -47,9 +47,6 @@ const createStore = (initialState, defineActions = null, { onLoad, onAttach, onD
47
47
  listeners.delete(listener);
48
48
  if (listeners.size === 0) {
49
49
  onDetach?.(state, set);
50
- if (resetOnDetach) {
51
- set(initialState);
52
- }
53
50
  }
54
51
  };
55
52
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createStore.js","sources":["../../../src/lib/createStore.ts"],"sourcesContent":["import { merge } from \"./merge\";\n\nexport type Store<TState extends object, TActions extends object> = {\n /** Returns the current state of the store. */\n get: () => TState;\n /** Sets the state of the store. */\n set: (stateModifier: StateModifier<TState>) => TState;\n /** Actions that can modify the state of the store. */\n actions: TActions;\n /** Subscribes to changes in the state of the store. Returns an unsubscribe function. */\n subscribe: (listener: Listener) => Listener;\n};\n\ntype Listener = () => void;\n\nexport type StoreEventHandler<TState extends object> = (\n state: TState,\n set: SetState<TState>,\n) => void;\n\nexport type SetState<TState extends object> = (\n stateModifier: StateModifier<TState>,\n) => TState;\n\nexport type StateModifier<TState extends object> =\n | Partial<TState>\n | ((state: TState) => Partial<TState>);\n\nexport type DefineActions<TState extends object, TActions> = (\n set: (stateModifier: StateModifier<TState>) => TState,\n get: () => TState,\n) => TActions;\n\nexport type StoreOptions<TState extends object> = {\n /** Invoked when the store is created. */\n onLoad?: StoreEventHandler<TState>;\n /** Invoked when the store is subscribed to. */\n onAttach?: StoreEventHandler<TState>;\n /** Invoked when the store is unsubscribed from. */\n onDetach?: StoreEventHandler<TState>;\n /** Invoked whenever the state changes. */\n onStateChange?: StoreEventHandler<TState>;\n /** Whether to reset the state to the initial state when the store is detached. */\n resetOnDetach?: boolean;\n};\n\n/**\n * Creates a store with an initial state and actions that can modify the state.\n *\n * @param {TState} initialState - The initial state of the store.\n * @param {DefineActions<TState, TActions> | null} [defineActions] - A function that defines actions that can modify the state.\n * @param {StoreOptions<TState>} [options] - Additional options for the store.\n *\n * @returns {Store<TState, TActions>} The created store with state management methods.\n *\n * @example\n * ```ts\n * import { createStore } from \"@fransek/statekit\";\n *\n * const store = createStore({ count: 0 }, (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }));\n * ```\n * @group Core\n */\nexport const createStore = <\n TState extends object,\n TActions extends object = Record<never, never>,\n>(\n initialState: TState,\n defineActions: DefineActions<TState, TActions> | null = null,\n {\n onLoad,\n onAttach,\n onDetach,\n onStateChange,\n resetOnDetach = false,\n }: StoreOptions<TState> = {},\n): Store<TState, TActions> => {\n let state = initialState;\n const listeners = new Set<Listener>();\n\n const get = () => state;\n\n const setSilently = (stateModifier: StateModifier<TState>) => {\n state = merge(state, stateModifier);\n return state;\n };\n\n const dispatch = () => {\n onStateChange?.(state, setSilently);\n listeners.forEach((listener) => listener());\n };\n\n const set = (stateModifier: StateModifier<TState>) => {\n setSilently(stateModifier);\n dispatch();\n return state;\n };\n\n const subscribe = (listener: Listener) => {\n if (listeners.size === 0) {\n onAttach?.(state, set);\n }\n\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n\n if (listeners.size === 0) {\n onDetach?.(state, set);\n\n if (resetOnDetach) {\n set(initialState);\n }\n }\n };\n };\n\n const actions = defineActions ? defineActions(set, get) : ({} as TActions);\n\n onLoad?.(state, set);\n\n return {\n get,\n set,\n subscribe,\n actions,\n };\n};\n"],"names":[],"mappings":";;AA8CA;;;;;;;;;;;;;;;;;;;;AAoBG;AACI,MAAM,WAAW,GAAG,CAIzB,YAAoB,EACpB,aAAA,GAAwD,IAAI,EAC5D,EACE,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,aAAa,GAAG,KAAK,GAAA,GACG,EAAE,KACD;IAC3B,IAAI,KAAK,GAAG,YAAY;AACxB,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAY;AAErC,IAAA,MAAM,GAAG,GAAG,MAAM,KAAK;AAEvB,IAAA,MAAM,WAAW,GAAG,CAAC,aAAoC,KAAI;AAC3D,QAAA,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC;AACnC,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;IAED,MAAM,QAAQ,GAAG,MAAK;AACpB,QAAA,aAAa,GAAG,KAAK,EAAE,WAAW,CAAC;QACnC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;AAC7C,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,GAAG,CAAC,aAAoC,KAAI;QACnD,WAAW,CAAC,aAAa,CAAC;AAC1B,QAAA,QAAQ,EAAE;AACV,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;AAED,IAAA,MAAM,SAAS,GAAG,CAAC,QAAkB,KAAI;AACvC,QAAA,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;AACxB,YAAA,QAAQ,GAAG,KAAK,EAAE,GAAG,CAAC;QACxB;AAEA,QAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAEvB,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AAE1B,YAAA,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;AACxB,gBAAA,QAAQ,GAAG,KAAK,EAAE,GAAG,CAAC;gBAEtB,IAAI,aAAa,EAAE;oBACjB,GAAG,CAAC,YAAY,CAAC;gBACnB;YACF;AACF,QAAA,CAAC;AACH,IAAA,CAAC;AAED,IAAA,MAAM,OAAO,GAAG,aAAa,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAI,EAAe;AAE1E,IAAA,MAAM,GAAG,KAAK,EAAE,GAAG,CAAC;IAEpB,OAAO;QACL,GAAG;QACH,GAAG;QACH,SAAS;QACT,OAAO;KACR;AACH;;;;"}
1
+ {"version":3,"file":"createStore.js","sources":["../../../src/lib/createStore.ts"],"sourcesContent":["import { merge } from \"./merge\";\n\nexport type Store<TState extends object, TActions extends object> = {\n /** Returns the current state of the store. */\n get: () => TState;\n /** Sets the state of the store. */\n set: (stateModifier: StateModifier<TState>) => TState;\n /** Actions that can modify the state of the store. */\n actions: TActions;\n /** Subscribes to changes in the state of the store. Returns an unsubscribe function. */\n subscribe: (listener: Listener) => Listener;\n};\n\ntype Listener = () => void;\n\nexport type StoreEventHandler<TState extends object> = (\n state: TState,\n set: SetState<TState>,\n) => void;\n\nexport type SetState<TState extends object> = (\n stateModifier: StateModifier<TState>,\n) => TState;\n\nexport type StateModifier<TState extends object> =\n | Partial<TState>\n | ((state: TState) => Partial<TState>);\n\nexport type DefineActions<TState extends object, TActions> = (\n set: (stateModifier: StateModifier<TState>) => TState,\n get: () => TState,\n) => TActions;\n\nexport type StoreOptions<TState extends object> = {\n /** Invoked when the store is created. */\n onLoad?: StoreEventHandler<TState>;\n /** Invoked when the store is subscribed to. */\n onAttach?: StoreEventHandler<TState>;\n /** Invoked when the store is unsubscribed from. */\n onDetach?: StoreEventHandler<TState>;\n /** Invoked whenever the state changes. */\n onChange?: StoreEventHandler<TState>;\n};\n\n/**\n * Creates a store with an initial state and actions that can modify the state.\n *\n * @param {TState} initialState - The initial state of the store.\n * @param {DefineActions<TState, TActions>} [defineActions] - A function that defines actions that can modify the state.\n * @param {StoreOptions<TState>} [options] - Additional options for the store.\n *\n * @returns {Store<TState, TActions>} The created store with state management methods.\n *\n * @example\n * ```ts\n * import { createStore } from \"dharma-core\";\n *\n * const store = createStore({ count: 0 }, (set) => ({\n * increment: () => set((state) => ({ count: state.count + 1 })),\n * decrement: () => set((state) => ({ count: state.count - 1 })),\n * reset: () => set({ count: 0 }),\n * }));\n * ```\n * @group Core\n */\nexport const createStore = <\n TState extends object,\n TActions extends object = Record<never, never>,\n>(\n initialState: TState,\n defineActions: DefineActions<TState, TActions>,\n { onLoad, onAttach, onDetach, onChange }: StoreOptions<TState> = {},\n): Store<TState, TActions> => {\n let state = initialState;\n const listeners = new Set<Listener>();\n\n const get = () => state;\n\n const setSilently = (stateModifier: StateModifier<TState>) => {\n state = merge(state, stateModifier);\n return state;\n };\n\n const dispatch = () => {\n onChange?.(state, setSilently);\n listeners.forEach((listener) => listener());\n };\n\n const set = (stateModifier: StateModifier<TState>) => {\n setSilently(stateModifier);\n dispatch();\n return state;\n };\n\n const subscribe = (listener: Listener) => {\n if (listeners.size === 0) {\n onAttach?.(state, set);\n }\n\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n\n if (listeners.size === 0) {\n onDetach?.(state, set);\n }\n };\n };\n\n const actions = defineActions ? defineActions(set, get) : ({} as TActions);\n\n onLoad?.(state, set);\n\n return {\n get,\n set,\n subscribe,\n actions,\n };\n};\n"],"names":[],"mappings":";;AA4CA;;;;;;;;;;;;;;;;;;;;AAoBG;MACU,WAAW,GAAG,CAIzB,YAAoB,EACpB,aAA8C,EAC9C,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAA,GAA2B,EAAE,KACxC;IAC3B,IAAI,KAAK,GAAG,YAAY;AACxB,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAY;AAErC,IAAA,MAAM,GAAG,GAAG,MAAM,KAAK;AAEvB,IAAA,MAAM,WAAW,GAAG,CAAC,aAAoC,KAAI;AAC3D,QAAA,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC;AACnC,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;IAED,MAAM,QAAQ,GAAG,MAAK;AACpB,QAAA,QAAQ,GAAG,KAAK,EAAE,WAAW,CAAC;QAC9B,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;AAC7C,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,GAAG,CAAC,aAAoC,KAAI;QACnD,WAAW,CAAC,aAAa,CAAC;AAC1B,QAAA,QAAQ,EAAE;AACV,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;AAED,IAAA,MAAM,SAAS,GAAG,CAAC,QAAkB,KAAI;AACvC,QAAA,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;AACxB,YAAA,QAAQ,GAAG,KAAK,EAAE,GAAG,CAAC;QACxB;AAEA,QAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAEvB,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AAE1B,YAAA,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;AACxB,gBAAA,QAAQ,GAAG,KAAK,EAAE,GAAG,CAAC;YACxB;AACF,QAAA,CAAC;AACH,IAAA,CAAC;AAED,IAAA,MAAM,OAAO,GAAG,aAAa,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAI,EAAe;AAE1E,IAAA,MAAM,GAAG,KAAK,EAAE,GAAG,CAAC;IAEpB,OAAO;QACL,GAAG;QACH,GAAG;QACH,SAAS;QACT,OAAO;KACR;AACH;;;;"}
@@ -9,7 +9,7 @@ import { StateModifier } from "./createStore";
9
9
  *
10
10
  * @example
11
11
  * ```ts
12
- * import { createStore, merge, StateModifier } from "@fransek/statekit";
12
+ * import { createStore, merge, StateModifier } from "dharma-core";
13
13
  *
14
14
  * const store = createStore(
15
15
  * {
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * @example
10
10
  * ```ts
11
- * import { createStore, merge, StateModifier } from "@fransek/statekit";
11
+ * import { createStore, merge, StateModifier } from "dharma-core";
12
12
  *
13
13
  * const store = createStore(
14
14
  * {
@@ -1 +1 @@
1
- {"version":3,"file":"merge.js","sources":["../../../src/lib/merge.ts"],"sourcesContent":["import { StateModifier } from \"./createStore\";\n\n/**\n * Merges the current state with a state modifier.\n * Useful for creating custom set functions.\n *\n * @param {T} stateModifier - A function or object that modifies the state.\n * @param {StateModifier<T>} stateModifier - The current state object.\n * @returns {T} The new state object, which is a combination of the current state and the state modifier.\n *\n * @example\n * ```ts\n * import { createStore, merge, StateModifier } from \"@fransek/statekit\";\n *\n * const store = createStore(\n * {\n * counter: {\n * count: 0,\n * },\n * // ...\n * },\n * (set) => {\n * const setCounter = (counter: StateModifier<{ count: number }>) =>\n * set((state) => ({\n * counter: merge(state.counter, counter),\n * }));\n *\n * return {\n * increment: () => setCounter((state) => ({ count: state.count + 1 })),\n * decrement: () => setCounter((state) => ({ count: state.count - 1 })),\n * reset: () => setCounter({ count: 0 }),\n * // ...\n * };\n * },\n * );\n * ```\n * @group Utilities\n */\nexport const merge = <T extends object>(\n currentState: T,\n stateModifier: StateModifier<T>,\n): T => {\n const newState =\n typeof stateModifier === \"function\"\n ? stateModifier(currentState)\n : stateModifier;\n return { ...currentState, ...newState };\n};\n"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;MACU,KAAK,GAAG,CACnB,YAAe,EACf,aAA+B,KAC1B;AACL,IAAA,MAAM,QAAQ,GACZ,OAAO,aAAa,KAAK;AACvB,UAAE,aAAa,CAAC,YAAY;UAC1B,aAAa;AACnB,IAAA,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,QAAQ,EAAE;AACzC;;;;"}
1
+ {"version":3,"file":"merge.js","sources":["../../../src/lib/merge.ts"],"sourcesContent":["import { StateModifier } from \"./createStore\";\n\n/**\n * Merges the current state with a state modifier.\n * Useful for creating custom set functions.\n *\n * @param {T} stateModifier - A function or object that modifies the state.\n * @param {StateModifier<T>} stateModifier - The current state object.\n * @returns {T} The new state object, which is a combination of the current state and the state modifier.\n *\n * @example\n * ```ts\n * import { createStore, merge, StateModifier } from \"dharma-core\";\n *\n * const store = createStore(\n * {\n * counter: {\n * count: 0,\n * },\n * // ...\n * },\n * (set) => {\n * const setCounter = (counter: StateModifier<{ count: number }>) =>\n * set((state) => ({\n * counter: merge(state.counter, counter),\n * }));\n *\n * return {\n * increment: () => setCounter((state) => ({ count: state.count + 1 })),\n * decrement: () => setCounter((state) => ({ count: state.count - 1 })),\n * reset: () => setCounter({ count: 0 }),\n * // ...\n * };\n * },\n * );\n * ```\n * @group Utilities\n */\nexport const merge = <T extends object>(\n currentState: T,\n stateModifier: StateModifier<T>,\n): T => {\n const newState =\n typeof stateModifier === \"function\"\n ? stateModifier(currentState)\n : stateModifier;\n return { ...currentState, ...newState };\n};\n"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;MACU,KAAK,GAAG,CACnB,YAAe,EACf,aAA+B,KAC1B;AACL,IAAA,MAAM,QAAQ,GACZ,OAAO,aAAa,KAAK;AACvB,UAAE,aAAa,CAAC,YAAY;UAC1B,aAAa;AACnB,IAAA,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,QAAQ,EAAE;AACzC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dharma-core",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "author": "Frans Ekman <fransedvinekman@gmail.com>",
5
5
  "license": "MIT",
6
6
  "description": "My package description",