@simplestack/store 0.5.0 → 0.5.2

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/LICENSE.md ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Ben Holmes
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # Simple Store
2
+
3
+ A simple, `select`-xcellent state management library with the power of Jotai and Zustand combined.
4
+
5
+ ```ts
6
+ import { store } from "@simplestack/store";
7
+
8
+ // Define your store with an initial state
9
+ const documentStore = store({
10
+ title: "Untitled",
11
+ authors: ["Ada", "Ben"],
12
+ meta: {
13
+ pages: 3,
14
+ tags: ["draft", "internal"],
15
+ },
16
+ });
17
+
18
+ // Use getters and setters to update the store
19
+ documentStore.set((doc) => ({ ...doc, title: "Welcome to simple store!" }));
20
+ console.log(documentStore.get());
21
+ // { title: "Welcome to simple store!", authors: ["Ada", "Ben"], meta: { pages: 3, tags: ["draft", "internal"] } }
22
+
23
+ // Select parts of a store to listen and update individually
24
+ const titleStore = documentStore.select("title");
25
+ const tagsStore = documentStore.select("meta").select("tags");
26
+
27
+ titleStore.set("You're going to love selectors");
28
+ console.log(titleStore.get()); // "You're going to love selectors"
29
+ console.log(documentStore.get().title); // "You're going to love selectors"
30
+ ```
31
+
32
+ ## API
33
+
34
+ ### store(initial)
35
+
36
+ Creates a store with `get`, `set`, `listen`, and (for objects and arrays) `select`.
37
+
38
+ - Parameters: `initial: number | string | boolean | null | undefined | object`
39
+ - Returns: `Store<T>` where `T` is inferred from `initial` or supplied via generics
40
+
41
+ ```ts
42
+ import { store } from "@simplestack/store";
43
+
44
+ const counter = store(0);
45
+ counter.set((n) => n + 1);
46
+ console.log(counter.get()); // 1
47
+
48
+ // Select sub-stores for objects and arrays
49
+ const doc = store({ title: "x" });
50
+ const title = doc.select("title");
51
+ ```
52
+
53
+ ### React
54
+
55
+ #### useStoreValue(store)
56
+
57
+ React hook to subscribe to a store and get its current value.
58
+
59
+ - Parameters: `store: Store<T> | undefined`
60
+ - Returns: `T | undefined`
61
+
62
+ ```ts path=null start=null
63
+ import { store } from "simplestack-store";
64
+ import { useStoreValue } from "simplestack-store/react";
65
+
66
+ const counter = store(0);
67
+
68
+ function Counter() {
69
+ const value = useStoreValue(counter);
70
+ return <span>{value}</span>;
71
+ }
72
+ ```
73
+
74
+ ## Type Reference
75
+
76
+ These types are exported for TypeScript users.
77
+
78
+ - StateObject: `Record<string | number | symbol, any>`
79
+ - StatePrimitive: `string | number | boolean | null | undefined`
80
+ - Setter<T>: `T | ((state: T) => T)`
81
+ - Store<T>:
82
+ - `get(): T`
83
+ - `set(setter: Setter<T>): void`
84
+ - `listen(callback: (state: T) => void): () => void`
85
+ - `select(key: K): Store<SelectValue<T, K>>`: present only when `T` is an object or array
86
+
87
+ ## Contributing
88
+
89
+ Contributions are welcome! Please feel free to submit an issue or pull request.
90
+
91
+ ## License
92
+
93
+ This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.
package/dist/index.d.ts CHANGED
@@ -1,14 +1,90 @@
1
1
  export type StateObject = Record<string | number | symbol, any>;
2
2
  export type StatePrimitive = string | number | boolean | null | undefined;
3
+ /**
4
+ * Setter for the store.
5
+ * Can be either a value or a function that receives the current state and returns the new state.
6
+ * @see {@link Store}
7
+ */
3
8
  export type Setter<T extends StateObject | StatePrimitive> = T | ((state: T) => T);
4
9
  export type SelectValue<S, K extends keyof S> = S extends readonly (infer U)[] ? U | undefined : string extends keyof S ? S[K] | undefined : number extends keyof S ? S[K] | undefined : S[K];
5
10
  export type SelectFn<T extends StateObject | StatePrimitive> = T extends StateObject ? <K extends keyof T>(key: K) => Store<SelectValue<T, K>> : undefined;
6
11
  export type Store<T extends StateObject | StatePrimitive> = {
12
+ /**
13
+ * Get the current state of the store.
14
+ * @example
15
+ * const state = store(0).get();
16
+ * console.log(state); // 0
17
+ */
7
18
  get: () => T;
19
+ /**
20
+ * Set the state of the store.
21
+ * Can pass either a value or a function that receives the current state and returns the new state.
22
+ *
23
+ * @example
24
+ * const countStore = store(0);
25
+ * const increment = () => countStore.set((count) => count + 1);
26
+ * const setToZero = () => countStore.set(0);
27
+ */
8
28
  set: (setter: Setter<T>) => void;
29
+ /**
30
+ * Subscribe to the state of the store.
31
+ * Returns a function to unsubscribe.
32
+ *
33
+ * @param callback - The callback to subscribe to.
34
+ * @returns A function to unsubscribe.
35
+ * @example
36
+ * const countStore = store(0);
37
+ * const unsubscribe = countStore.listen((count) => {
38
+ * console.log(count);
39
+ * });
40
+ *
41
+ * // On component unmount or other cleanup:
42
+ * unsubscribe();
43
+ *
44
+ */
9
45
  listen: (callback: (state: T) => void) => () => void;
46
+ /**
47
+ * Select a key from the state of the store.
48
+ * This returns a new store with the selected key as the state.
49
+ * @example
50
+ * const documentStore = store({
51
+ * title: "Untitled",
52
+ * });
53
+ *
54
+ * const titleStore = documentStore.select("title");
55
+ * console.log(titleStore.get()); // "Untitled"
56
+ *
57
+ * titleStore.set("New Title");
58
+ * console.log(titleStore.get()); // "New Title"
59
+ * console.log(documentStore.get()); // { title: "New Title" }
60
+ */
10
61
  select: SelectFn<T>;
11
62
  };
63
+ /**
64
+ * Creates a store with properties for getting, setting, subscribing to, and selecting from the state.
65
+ *
66
+ * @param initial - The initial state of the store.
67
+ * @returns A store with the initial state applied.
68
+ * @example
69
+ * // Infer types from the initial state
70
+ * const documentStore = store({
71
+ * title: "Untitled",
72
+ * createdAt: new Date(),
73
+ * authors: [] as string[],
74
+ * });
75
+ *
76
+ * // Or manually specify the type
77
+ * type DocumentStore = {
78
+ * title: string;
79
+ * createdAt: Date;
80
+ * authors: string[];
81
+ * }
82
+ * const documentStore = store<DocumentStore>({
83
+ * title: "Untitled",
84
+ * createdAt: new Date(),
85
+ * authors: [],
86
+ * });
87
+ */
12
88
  export declare function store(initial: number): Store<number>;
13
89
  export declare function store(initial: string): Store<string>;
14
90
  export declare function store(initial: boolean): Store<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAE1E,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAInF,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAExC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,GAE5C,MAAM,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GACzC,MAAM,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GACzC,CAAC,CAAC,CAAC,CAAC,CAAC;AAGX,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IACvD,CAAC,SAAS,WAAW,GACnB,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACvD,SAAS,CAAC;AAEhB,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAAI;IACxD,GAAG,EAAE,MAAM,CAAC,CAAC;IACb,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACjC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IACrD,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;CACvB,CAAC;AAGF,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtD,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtD,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;AACxD,wBAAgB,KAAK,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAyFpF,wBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC,cAmBjE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAE1E;;;;GAIG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IACtD,CAAC,GACD,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAIrB,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAC3E,CAAC,GAAG,SAAS,GAEd,MAAM,SAAS,MAAM,CAAC,GACpB,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAChB,MAAM,SAAS,MAAM,CAAC,GACrB,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAChB,CAAC,CAAC,CAAC,CAAC,CAAC;AAGV,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAC1D,CAAC,SAAS,WAAW,GAClB,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACvD,SAAS,CAAC;AAEd,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAAI;IAC3D;;;;;OAKG;IACH,GAAG,EAAE,MAAM,CAAC,CAAC;IACb;;;;;;;;OAQG;IACH,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACjC;;;;;;;;;;;;;;;OAeG;IACH,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IACrD;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtD,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtD,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;AACxD,wBAAgB,KAAK,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAC3D,OAAO,EAAE,CAAC,GACR,KAAK,CAAC,CAAC,CAAC,CAAC;AAsFZ,wBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC,cAmBjE"}
package/dist/index.js CHANGED
@@ -11,54 +11,43 @@ const createStoreApi = (get, set) => {
11
11
  callback(get());
12
12
  });
13
13
  };
14
- const api = { get, set, listen };
14
+ if (isStatePrimitive(get())) {
15
+ return { get, set, listen, select: undefined };
16
+ }
15
17
  function select(key) {
16
18
  const getSelected = () => {
17
19
  const state = get();
18
- if (!isStateObject(state)) {
19
- throw new Error(getUnexpectedSelectError(typeof state));
20
+ if (isStatePrimitive(state)) {
21
+ throw new Error(UNEXPECTED_SELECT_ERROR);
20
22
  }
21
23
  return state[key];
22
24
  };
23
25
  const setSelected = (setter) => {
24
26
  set((state) => {
25
- if (!isStateObject(state)) {
26
- throw new Error(getUnexpectedSelectError(typeof state));
27
+ if (isStatePrimitive(state)) {
28
+ throw new Error(UNEXPECTED_SELECT_ERROR);
27
29
  }
28
- const prev = state[key];
29
- const next = typeof setter === "function" ? setter(prev) : setter;
30
+ const stateObj = state;
31
+ const prev = stateObj[key];
32
+ const next = typeof setter === "function"
33
+ ? setter(prev)
34
+ : setter;
30
35
  if (Object.is(prev, next))
31
36
  return state;
32
- return { ...state, [key]: next };
37
+ return { ...stateObj, [key]: next };
33
38
  });
34
39
  };
35
40
  return createStoreApi(getSelected, setSelected);
36
41
  }
37
- ;
38
- if (isStateObject(get())) {
39
- Object.assign(api, { select });
40
- }
41
- else {
42
- // Hide select method to prevent accidental usage on primitive stores
43
- // but still log useful error messages
44
- Object.defineProperty(api, 'select', {
45
- value: select,
46
- enumerable: false,
47
- writable: false,
48
- configurable: false
49
- });
50
- }
51
- return api;
42
+ return { get, set, listen, select: select };
52
43
  };
53
- function getUnexpectedSelectError(objType) {
54
- let error = `\`.select()\` was unexpectedly called on a state value that wasn't an object. Received type: ${objType}.`;
55
- if (objType === 'undefined') {
56
- error += ` It's possible you tried to select a nested value on an object key or an array index. If so, try checking if the key is defined before calling \`.select()\`.`;
57
- }
58
- return error;
59
- }
60
- function isStateObject(state) {
61
- return typeof state === "object" && state !== null;
44
+ const UNEXPECTED_SELECT_ERROR = "Internal: select() was unexpectedly called on a state value that wasn't an object.";
45
+ function isStatePrimitive(state) {
46
+ return (typeof state === "string" ||
47
+ typeof state === "number" ||
48
+ typeof state === "boolean" ||
49
+ state === null ||
50
+ state === undefined);
62
51
  }
63
52
  let needsEnqueue = true;
64
53
  const w = new Signal.subtle.Watcher(() => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/react.d.ts CHANGED
@@ -1,5 +1,14 @@
1
1
  import type { StateObject, StatePrimitive, Store } from "./index.js";
2
+ /**
3
+ * Subscribe to the state of the store.
4
+ * @param store - The store to subscribe to.
5
+ * @returns The current state of the store.
6
+ * @example
7
+ * const countStore = store(0);
8
+ * const count = useStoreValue(countStore);
9
+ * console.log(count); // 0
10
+ */
2
11
  export declare function useStoreValue<T extends StateObject | StatePrimitive>(store: Store<T>): T;
3
12
  export declare function useStoreValue<T extends StateObject | StatePrimitive>(store: Store<T> | undefined): T | undefined;
4
- export declare function useStoreValue<T extends StateObject | StatePrimitive>(store: undefined): undefined;
13
+ export declare function useStoreValue(store: undefined): undefined;
5
14
  //# sourceMappingURL=react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAErE,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1F,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC;AAClH,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAErE;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EACnE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GACb,CAAC,CAAC;AACL,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EACnE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GACzB,CAAC,GAAG,SAAS,CAAC;AACjB,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC"}
package/dist/react.js CHANGED
@@ -1,4 +1,4 @@
1
- import { useState, useEffect } from "react";
1
+ import { useEffect, useState } from "react";
2
2
  export function useStoreValue(store) {
3
3
  const [state, setState] = useState(store?.get());
4
4
  useEffect(() => {
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAM5C,MAAM,UAAU,aAAa,CAAyC,KAA2B;IAC7F,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAChE,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,OAAO,KAAK,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAmB5C,MAAM,UAAU,aAAa,CAC5B,KAA2B;IAE3B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAChE,SAAS,CAAC,GAAG,EAAE;QACd,OAAO,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,OAAO,KAAK,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplestack/store",
3
- "version": "0.5.0",
3
+ "version": "0.5.2",
4
4
  "description": "A simple storage solution for React",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -24,6 +24,7 @@
24
24
  "author": "bholmesdev",
25
25
  "license": "MIT",
26
26
  "devDependencies": {
27
+ "@biomejs/biome": "2.2.2",
27
28
  "@types/react": "^19.1.12",
28
29
  "react": "^19.0.0",
29
30
  "typescript": "^5.9.2"
@@ -54,6 +55,7 @@
54
55
  ],
55
56
  "scripts": {
56
57
  "build": "tsc",
57
- "dev": "tsc -w"
58
+ "dev": "tsc -w",
59
+ "check": "biome check"
58
60
  }
59
61
  }