cogsbox-state 0.5.3

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.
Files changed (60) hide show
  1. package/README.md +386 -0
  2. package/dist/CogsState.d.ts +279 -0
  3. package/dist/CogsState.jsx +608 -0
  4. package/dist/CogsState.jsx.map +1 -0
  5. package/dist/CogsStateClient.d.ts +12 -0
  6. package/dist/CogsStateClient.jsx +11 -0
  7. package/dist/CogsStateClient.jsx.map +1 -0
  8. package/dist/TRPCValidationLink.d.ts +4 -0
  9. package/dist/_virtual/_commonjsHelpers.js +7 -0
  10. package/dist/_virtual/_commonjsHelpers.js.map +1 -0
  11. package/dist/_virtual/index.js +5 -0
  12. package/dist/_virtual/index.js.map +1 -0
  13. package/dist/_virtual/jsx-runtime.jsx +5 -0
  14. package/dist/_virtual/jsx-runtime.jsx.map +1 -0
  15. package/dist/_virtual/react-jsx-runtime.jsx +5 -0
  16. package/dist/_virtual/react-jsx-runtime.jsx.map +1 -0
  17. package/dist/_virtual/react-jsx-runtime.production.jsx +5 -0
  18. package/dist/_virtual/react-jsx-runtime.production.jsx.map +1 -0
  19. package/dist/_virtual/react.js +5 -0
  20. package/dist/_virtual/react.js.map +1 -0
  21. package/dist/_virtual/react.production.js +5 -0
  22. package/dist/_virtual/react.production.js.map +1 -0
  23. package/dist/examples/index.d.ts +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.js +25 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/node_modules/react/cjs/react-jsx-runtime.jsx +605 -0
  28. package/dist/node_modules/react/cjs/react-jsx-runtime.jsx.map +1 -0
  29. package/dist/node_modules/react/cjs/react-jsx-runtime.production.jsx +29 -0
  30. package/dist/node_modules/react/cjs/react-jsx-runtime.production.jsx.map +1 -0
  31. package/dist/node_modules/react/cjs/react.js +1274 -0
  32. package/dist/node_modules/react/cjs/react.js.map +1 -0
  33. package/dist/node_modules/react/cjs/react.production.js +209 -0
  34. package/dist/node_modules/react/cjs/react.production.js.map +1 -0
  35. package/dist/node_modules/react/index.js +12 -0
  36. package/dist/node_modules/react/index.js.map +1 -0
  37. package/dist/node_modules/react/jsx-runtime.jsx +9 -0
  38. package/dist/node_modules/react/jsx-runtime.jsx.map +1 -0
  39. package/dist/node_modules/uuid/dist/esm-browser/native.js +7 -0
  40. package/dist/node_modules/uuid/dist/esm-browser/native.js.map +1 -0
  41. package/dist/node_modules/uuid/dist/esm-browser/rng.js +11 -0
  42. package/dist/node_modules/uuid/dist/esm-browser/rng.js.map +1 -0
  43. package/dist/node_modules/uuid/dist/esm-browser/stringify.js +10 -0
  44. package/dist/node_modules/uuid/dist/esm-browser/stringify.js.map +1 -0
  45. package/dist/node_modules/uuid/dist/esm-browser/v4.js +14 -0
  46. package/dist/node_modules/uuid/dist/esm-browser/v4.js.map +1 -0
  47. package/dist/node_modules/zustand/esm/react.js +20 -0
  48. package/dist/node_modules/zustand/esm/react.js.map +1 -0
  49. package/dist/node_modules/zustand/esm/vanilla.js +15 -0
  50. package/dist/node_modules/zustand/esm/vanilla.js.map +1 -0
  51. package/dist/store.d.ts +103 -0
  52. package/dist/store.js +225 -0
  53. package/dist/store.js.map +1 -0
  54. package/dist/updaterFunctions.d.ts +29 -0
  55. package/dist/updaterFunctions.jsx +177 -0
  56. package/dist/updaterFunctions.jsx.map +1 -0
  57. package/dist/utility.d.ts +19 -0
  58. package/dist/utility.js +189 -0
  59. package/dist/utility.js.map +1 -0
  60. package/package.json +62 -0
@@ -0,0 +1,177 @@
1
+ import { j as S } from "./node_modules/react/jsx-runtime.jsx";
2
+ import { isFunction as F, getNestedValue as N, updateNestedProperty as j } from "./utility.js";
3
+ import v, { r as f } from "./node_modules/react/index.js";
4
+ import { getGlobalStore as g } from "./store.js";
5
+ function $(s, t, e, n) {
6
+ s(
7
+ (o) => {
8
+ if (F(t)) {
9
+ const r = t(N(o, e));
10
+ let u = j(e, o, r);
11
+ return typeof u == "string" && (u = u.trim()), u;
12
+ } else {
13
+ let r = !e || e.length == 0 ? t : j(e, o, t);
14
+ return typeof r == "string" && (r = r.trim()), r;
15
+ }
16
+ },
17
+ e,
18
+ { updateType: "update" },
19
+ n
20
+ );
21
+ }
22
+ function P(s, t, e, n, o) {
23
+ const r = g.getState().getNestedState(n, e);
24
+ s(
25
+ (u) => {
26
+ let c = !e || e.length == 0 ? u : N(u, [...e]), i = [...c];
27
+ return i.splice(
28
+ Number(o) == 0 ? o : c.length,
29
+ 0,
30
+ F(t) ? t(c) : t
31
+ ), e.length == 0 ? i : j([...e], u, i);
32
+ },
33
+ [
34
+ ...e,
35
+ (r.length - 1).toString()
36
+ ],
37
+ {
38
+ updateType: "insert"
39
+ }
40
+ );
41
+ }
42
+ function U(s, t, e, n) {
43
+ const o = g.getState().getNestedState(e, t);
44
+ s(
45
+ (r) => {
46
+ const u = N(r, [...t]);
47
+ if (n < 0 || n >= u?.length)
48
+ throw new Error(`Index ${n} does not exist in the array.`);
49
+ const c = n || Number(n) == 0 ? n : u.length - 1, i = [
50
+ ...u.slice(0, c),
51
+ ...u.slice(c + 1)
52
+ ];
53
+ return console.log(n), t.length == 0 ? i : j([...t], r, i);
54
+ },
55
+ [
56
+ ...t,
57
+ n || n === 0 ? n?.toString() : (o.length - 1).toString()
58
+ ],
59
+ { updateType: "cut" }
60
+ );
61
+ }
62
+ const b = (s, t, e = (n, o) => JSON.stringify(n) === JSON.stringify(o)) => {
63
+ const [n, o] = f.useState(
64
+ () => t(g.getState(), s)
65
+ ), r = f.useRef(n);
66
+ return f.useEffect(() => {
67
+ const u = g.subscribe((c) => {
68
+ const i = t(c, s);
69
+ e(r.current, i) || (r.current = i, o(i));
70
+ });
71
+ return () => u();
72
+ }, [s]), n;
73
+ }, y = (s, t, e) => {
74
+ const n = s + "." + (t.length > 0 ? [t.join(".")] : []) + (e && e.length > 0 ? "." + e : "");
75
+ return e?.length === 0 ? [] : b(
76
+ n,
77
+ (o, r) => o.getValidationErrors(r) || []
78
+ );
79
+ }, C = (s, t) => {
80
+ const e = `${s}:${t.join(".")}`;
81
+ return b(
82
+ e,
83
+ (n, o) => n.getSyncInfo(o)
84
+ );
85
+ }, G = (s, t) => b(
86
+ `${s}:${t.join(".")}`,
87
+ (e, n) => e.getNestedState(s, t)
88
+ ), D = ({
89
+ setState: s,
90
+ validationKey: t,
91
+ path: e,
92
+ child: n,
93
+ formOpts: o,
94
+ stateKey: r
95
+ }) => {
96
+ const { getInitialOptions: u, getValidationErrors: c, removeValidationError: i } = g.getState();
97
+ y(t, e), g.getState().serverSyncActions[r], g.getState().serverState[r];
98
+ const l = G(r, e), [m, d] = f.useState(
99
+ g.getState().getNestedState(r, e)
100
+ );
101
+ f.useEffect(() => {
102
+ d(l);
103
+ }, [r, e.join("."), l]);
104
+ const a = f.useRef();
105
+ let T = (E, I) => {
106
+ d(E), a.current && clearTimeout(a.current), a.current = setTimeout(() => {
107
+ $(s, E, e, t);
108
+ }, o?.debounceTime ?? 300);
109
+ };
110
+ f.useEffect(() => () => {
111
+ a.current && clearTimeout(a.current);
112
+ }, []);
113
+ const V = C(r, e), w = V ? {
114
+ ...V,
115
+ date: new Date(V.timeStamp)
116
+ } : null, R = n({
117
+ get: () => m || g.getState().getNestedState(r, e),
118
+ set: T,
119
+ syncStatus: w,
120
+ path: e,
121
+ validationErrors: () => c(t + "." + e.join(".")),
122
+ // Add default input props
123
+ inputProps: {
124
+ value: m || g.getState().getNestedState(r, e) || "",
125
+ onChange: (E) => T(E.target.value)
126
+ }
127
+ });
128
+ return /* @__PURE__ */ S.jsx(S.Fragment, { children: /* @__PURE__ */ S.jsx(
129
+ A,
130
+ {
131
+ formOpts: o,
132
+ path: e,
133
+ validationKey: t,
134
+ stateKey: r,
135
+ children: R
136
+ }
137
+ ) });
138
+ };
139
+ function A({
140
+ formOpts: s,
141
+ path: t,
142
+ validationKey: e,
143
+ stateKey: n,
144
+ children: o,
145
+ validIndices: r
146
+ }) {
147
+ const { getInitialOptions: u, getValidationErrors: c } = g.getState(), i = y(
148
+ e,
149
+ t,
150
+ r
151
+ ), l = [];
152
+ if (i) {
153
+ const a = i.join(", ");
154
+ l.includes(a) || l.push(a);
155
+ }
156
+ let m = l?.length > 0 ? l?.join(", ") : "";
157
+ const d = u(n);
158
+ return /* @__PURE__ */ S.jsx(S.Fragment, { children: d?.formElements?.validation && !s?.validation?.disable ? d.formElements.validation({
159
+ children: /* @__PURE__ */ S.jsx(v.Fragment, { children: o }, t.toString()),
160
+ active: m != "",
161
+ message: s?.validation?.message ? s?.validation?.message : s?.validation?.message == "" ? "" : m,
162
+ path: t,
163
+ ...s?.key && { key: s?.key }
164
+ }) : /* @__PURE__ */ S.jsx(v.Fragment, { children: o }, t.toString()) });
165
+ }
166
+ export {
167
+ D as FormControlComponent,
168
+ A as ValidationWrapper,
169
+ U as cutFunc,
170
+ P as pushFunc,
171
+ $ as updateFn,
172
+ G as useGetKeyState,
173
+ C as useGetSyncInfo,
174
+ y as useGetValidationErrors,
175
+ b as useStoreSubscription
176
+ };
177
+ //# sourceMappingURL=updaterFunctions.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updaterFunctions.jsx","sources":["../src/updaterFunctions.tsx"],"sourcesContent":["import type {\r\n EffectiveSetState,\r\n FormElementParmas,\r\n FormOptsType,\r\n UpdateArg,\r\n UpdateOpts,\r\n} from \"./CogsState\";\r\n\r\nimport { getNestedValue, isFunction, updateNestedProperty } from \"./utility\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport React from \"react\";\r\nimport { getGlobalStore } from \"./store\";\r\n\r\nexport function updateFn<U>(\r\n setState: EffectiveSetState<U>,\r\n payload: UpdateArg<U>,\r\n path: string[],\r\n validationKey?: string,\r\n): void {\r\n setState(\r\n (prevState) => {\r\n if (isFunction<U>(payload)) {\r\n const nestedValue = payload(getNestedValue(prevState, path));\r\n let value = updateNestedProperty(path, prevState, nestedValue);\r\n if (typeof value == \"string\") {\r\n value = value.trim();\r\n }\r\n return value;\r\n } else {\r\n let value =\r\n !path || path.length == 0\r\n ? payload\r\n : updateNestedProperty(path, prevState, payload);\r\n if (typeof value == \"string\") {\r\n value = value.trim();\r\n }\r\n return value;\r\n }\r\n },\r\n path,\r\n { updateType: \"update\" },\r\n validationKey,\r\n );\r\n}\r\n\r\nexport function pushFunc<U>(\r\n setState: EffectiveSetState<U>,\r\n payload: UpdateArg<U>,\r\n path: string[],\r\n stateKey: string,\r\n index?: number,\r\n): void {\r\n const array = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as U[];\r\n setState(\r\n (prevState) => {\r\n let arrayToUpdate =\r\n !path || path.length == 0\r\n ? prevState\r\n : getNestedValue(prevState, [...path]);\r\n let returnedArray = [...arrayToUpdate];\r\n\r\n returnedArray.splice(\r\n index || Number(index) == 0 ? index : arrayToUpdate.length,\r\n 0,\r\n isFunction<U>(payload)\r\n ? payload(index == -1 ? undefined : arrayToUpdate)\r\n : payload,\r\n );\r\n const value =\r\n path.length == 0\r\n ? returnedArray\r\n : updateNestedProperty([...path], prevState, returnedArray);\r\n\r\n return value as U;\r\n },\r\n [\r\n ...path,\r\n index || index === 0\r\n ? index?.toString()\r\n : (array!.length - 1).toString(),\r\n ],\r\n {\r\n updateType: \"insert\",\r\n },\r\n );\r\n}\r\n\r\nexport function cutFunc<U>(\r\n setState: EffectiveSetState<U>,\r\n path: string[],\r\n stateKey: string,\r\n index: number,\r\n): void {\r\n const array = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as U[];\r\n setState(\r\n (prevState) => {\r\n const arrayToUpdate = getNestedValue(prevState, [...path]);\r\n if (index < 0 || index >= arrayToUpdate?.length) {\r\n throw new Error(`Index ${index} does not exist in the array.`);\r\n }\r\n const indexToCut =\r\n index || Number(index) == 0 ? index : arrayToUpdate.length - 1;\r\n\r\n const updatedArray = [\r\n ...arrayToUpdate.slice(0, indexToCut),\r\n ...arrayToUpdate.slice(indexToCut + 1),\r\n ] as U;\r\n\r\n console.log(index);\r\n return path.length == 0\r\n ? updatedArray\r\n : updateNestedProperty([...path], prevState, updatedArray);\r\n },\r\n [\r\n ...path,\r\n index || index === 0\r\n ? index?.toString()\r\n : (array!.length - 1).toString(),\r\n ],\r\n { updateType: \"cut\" },\r\n );\r\n}\r\n\r\nexport const useStoreSubscription = <T,>(\r\n fullPath: string,\r\n selector: (\r\n store: ReturnType<typeof getGlobalStore.getState>,\r\n path: string,\r\n ) => T,\r\n compare: (a: T, b: T) => boolean = (a, b) =>\r\n JSON.stringify(a) === JSON.stringify(b),\r\n) => {\r\n const [value, setValue] = useState<T>(() =>\r\n selector(getGlobalStore.getState(), fullPath),\r\n );\r\n const previousValueRef = useRef<T>(value);\r\n\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore.subscribe((store) => {\r\n const newValue = selector(store, fullPath);\r\n if (!compare(previousValueRef.current, newValue)) {\r\n previousValueRef.current = newValue;\r\n setValue(newValue);\r\n }\r\n });\r\n\r\n return () => unsubscribe();\r\n }, [fullPath]);\r\n\r\n return value;\r\n};\r\nexport const useGetValidationErrors = (\r\n validationKey: string,\r\n path: string[],\r\n validIndices?: number[],\r\n) => {\r\n // Construct the full path the same way as ValidationWrapper\r\n const fullPath =\r\n validationKey +\r\n \".\" +\r\n (path.length > 0 ? [path.join(\".\")] : []) +\r\n (validIndices && validIndices.length > 0 ? \".\" + validIndices : \"\");\r\n\r\n // Skip subscription if we have empty indices\r\n if (validIndices?.length === 0) {\r\n return [];\r\n }\r\n\r\n return useStoreSubscription(\r\n fullPath,\r\n (store, path) => store.getValidationErrors(path) || [],\r\n );\r\n};\r\n\r\nexport const useGetSyncInfo = (key: string, path: string[]) => {\r\n const syncKey = `${key}:${path.join(\".\")}`;\r\n return useStoreSubscription(syncKey, (store, path) =>\r\n store.getSyncInfo(path),\r\n );\r\n};\r\nexport const useGetKeyState = (key: string, path: string[]) => {\r\n return useStoreSubscription(`${key}:${path.join(\".\")}`, (store, fullPath) =>\r\n store.getNestedState(key, path),\r\n );\r\n};\r\ninterface FormControlComponentProps<TStateObject> {\r\n setState: EffectiveSetState<TStateObject>;\r\n validationKey: string;\r\n path: string[];\r\n child: (obj: FormElementParmas<TStateObject>) => JSX.Element;\r\n formOpts?: FormOptsType;\r\n stateKey: string;\r\n}\r\nexport const FormControlComponent = <TStateObject,>({\r\n setState,\r\n validationKey,\r\n path,\r\n child,\r\n formOpts,\r\n stateKey,\r\n}: FormControlComponentProps<TStateObject>) => {\r\n const { getInitialOptions, getValidationErrors, removeValidationError } =\r\n getGlobalStore.getState();\r\n const validationErrors = useGetValidationErrors(validationKey, path);\r\n const serverSyncActions =\r\n getGlobalStore.getState().serverSyncActions[stateKey!];\r\n const serverState = getGlobalStore.getState().serverState[stateKey!];\r\n\r\n const stateValue = useGetKeyState(stateKey, path);\r\n const [inputValue, setInputValue] = useState<any>(\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n );\r\n\r\n useEffect(() => {\r\n setInputValue(stateValue);\r\n }, [stateKey, path.join(\".\"), stateValue]);\r\n\r\n const timeoutRef = useRef<NodeJS.Timeout>();\r\n\r\n let updater = (payload: UpdateArg<TStateObject>, opts?: UpdateOpts) => {\r\n setInputValue(payload);\r\n\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n\r\n timeoutRef.current = setTimeout(() => {\r\n updateFn(setState, payload, path, validationKey);\r\n }, formOpts?.debounceTime ?? 300);\r\n };\r\n\r\n // Clear timeout on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n const rawSyncStatus = useGetSyncInfo(stateKey, path);\r\n const syncStatus = rawSyncStatus\r\n ? {\r\n ...rawSyncStatus,\r\n date: new Date(rawSyncStatus.timeStamp),\r\n }\r\n : null;\r\n const childElement = child({\r\n get: () =>\r\n inputValue ||\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n set: updater,\r\n syncStatus,\r\n path: path,\r\n validationErrors: () =>\r\n getValidationErrors(validationKey + \".\" + path.join(\".\")),\r\n\r\n // Add default input props\r\n inputProps: {\r\n value:\r\n inputValue ||\r\n getGlobalStore.getState().getNestedState(stateKey, path) ||\r\n \"\",\r\n onChange: (e: any) => updater(e.target.value),\r\n },\r\n });\r\n\r\n return (\r\n <>\r\n <ValidationWrapper\r\n {...{\r\n formOpts,\r\n path,\r\n validationKey,\r\n stateKey,\r\n }}\r\n >\r\n {childElement}\r\n </ValidationWrapper>\r\n </>\r\n );\r\n};\r\n\r\nexport function ValidationWrapper({\r\n formOpts,\r\n path,\r\n validationKey,\r\n stateKey,\r\n children,\r\n validIndices,\r\n}: {\r\n formOpts?: FormOptsType;\r\n path: string[];\r\n validationKey: string;\r\n stateKey?: string;\r\n children: React.ReactNode;\r\n validIndices?: number[];\r\n}) {\r\n const { getInitialOptions, getValidationErrors } =\r\n getGlobalStore.getState();\r\n const validationErrors = useGetValidationErrors(\r\n validationKey,\r\n path,\r\n validIndices,\r\n );\r\n const thesMessages: string[] = [];\r\n\r\n if (validationErrors) {\r\n const newMessage = validationErrors!.join(\", \");\r\n if (!thesMessages.includes(newMessage)) {\r\n thesMessages.push(newMessage);\r\n }\r\n }\r\n let fullMessageString =\r\n thesMessages?.length > 0 ? thesMessages?.join(\", \") : \"\";\r\n\r\n const thisStateOpts = getInitialOptions(stateKey!);\r\n\r\n return (\r\n <>\r\n {thisStateOpts?.formElements?.validation &&\r\n !formOpts?.validation?.disable ? (\r\n thisStateOpts.formElements!.validation!({\r\n children: (\r\n <React.Fragment key={path.toString()}>\r\n {children}\r\n </React.Fragment>\r\n ),\r\n active: fullMessageString != \"\" ? true : false,\r\n message: formOpts?.validation?.message\r\n ? formOpts?.validation?.message\r\n : formOpts?.validation?.message == \"\"\r\n ? \"\"\r\n : fullMessageString,\r\n path,\r\n\r\n ...(formOpts?.key && { key: formOpts?.key }),\r\n })\r\n ) : (\r\n <React.Fragment key={path.toString()}>\r\n {children}\r\n </React.Fragment>\r\n )}\r\n </>\r\n );\r\n}\r\n"],"names":["updateFn","setState","payload","path","validationKey","prevState","isFunction","nestedValue","getNestedValue","value","updateNestedProperty","pushFunc","stateKey","index","array","getGlobalStore","arrayToUpdate","returnedArray","cutFunc","indexToCut","updatedArray","useStoreSubscription","fullPath","selector","compare","a","b","setValue","useState","previousValueRef","useRef","useEffect","unsubscribe","store","newValue","useGetValidationErrors","validIndices","useGetSyncInfo","key","syncKey","useGetKeyState","FormControlComponent","child","formOpts","getInitialOptions","getValidationErrors","removeValidationError","stateValue","inputValue","setInputValue","timeoutRef","updater","opts","rawSyncStatus","syncStatus","childElement","e","jsx","Fragment","ValidationWrapper","children","validationErrors","thesMessages","newMessage","fullMessageString","thisStateOpts","React"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { TransformedStateType } from './CogsState';
2
+
3
+ export declare const isObject: (item: any) => item is Record<string, any>;
4
+ export type GenericObject = Record<string, any>;
5
+ export declare const isFunction: <TStateObject extends unknown>(arg: any) => arg is (prev: TStateObject) => TStateObject;
6
+ export declare const isArray: (item: any) => item is Array<any>;
7
+ export declare const isDeepEqual: (object1?: Record<string, any>, object2?: Record<string, any>, opts?: {
8
+ get?: () => void;
9
+ }, currentPath?: string[]) => boolean;
10
+ export declare function updateNestedProperty(path: string[], state: any, update: any): any;
11
+ export declare function deleteNestedProperty(path: string[], state: any): any;
12
+ export declare function getNestedValue<TStateObject extends unknown>(obj: TStateObject, pathArray: string[]): any;
13
+ type DifferencePaths = string[];
14
+ export declare function getDifferences(obj1: any, obj2: any, currentPath?: string): DifferencePaths;
15
+ export declare function getDifferencesArray(obj1: any, obj2: any): string[][];
16
+ export declare function getArrayLengthDifferences(obj1: any, obj2: any, currentPath?: string): string[];
17
+ export declare function getArrayLengthDifferencesArray(obj1: any, obj2: any): string[][];
18
+ export declare function transformStateFunc<State extends unknown>(initialState: State): [TransformedStateType<State>, GenericObject];
19
+ export {};
@@ -0,0 +1,189 @@
1
+ const a = (e) => e && typeof e == "object" && !Array.isArray(e) && e !== null, A = (e) => typeof e == "function", u = (e) => Array.isArray(e), g = (e, r, i = {}, n = []) => {
2
+ if (a(e) && a(r)) {
3
+ const t = Object.keys(e), l = Object.keys(r);
4
+ if (t.length !== l.length)
5
+ return !1;
6
+ for (let f of t) {
7
+ const o = e[f], s = r[f];
8
+ if (!(f in e) || !(f in r))
9
+ return !1;
10
+ const c = [...n, f];
11
+ if (!g(o, s, i, c))
12
+ return !1;
13
+ }
14
+ return !0;
15
+ } else if (u(e) && u(r)) {
16
+ if (e.length !== r.length)
17
+ return !1;
18
+ for (let t = 0; t < e.length; t++)
19
+ if (!g(e[t], r[t], i, [
20
+ ...n,
21
+ t.toString()
22
+ ]))
23
+ return !1;
24
+ return !0;
25
+ } else
26
+ return e === r || Number.isNaN(e) && Number.isNaN(r);
27
+ };
28
+ function d(e, r, i) {
29
+ if (!e || e.length === 0) return i;
30
+ const n = e[0], t = e.slice(1);
31
+ if (Array.isArray(r)) {
32
+ const l = Number(n);
33
+ if (!isNaN(l) && l >= 0 && l < r.length)
34
+ return [
35
+ ...r.slice(0, l),
36
+ d(t, r[l], i),
37
+ ...r.slice(l + 1)
38
+ ];
39
+ throw console.log("errorstate", r, e), new Error(
40
+ `Invalid array index "${l}" in path "${e.join(".")}".`
41
+ );
42
+ } else if (typeof r == "object" && r !== null) {
43
+ if (n && n in r)
44
+ return {
45
+ ...r,
46
+ [n]: d(t, r[n], i)
47
+ };
48
+ throw console.log("Invalid property", n, t, e), new Error(
49
+ `Invalid property "${n}" in path "${e.join(".")}".`
50
+ );
51
+ } else
52
+ throw new Error(
53
+ `Cannot update nested property at path "${e.join(".")}". The path does not exist.`
54
+ );
55
+ }
56
+ function h(e, r) {
57
+ if (!e || e.length === 0) return r;
58
+ const i = e[0], n = e.slice(1);
59
+ if (Array.isArray(r)) {
60
+ const t = Number(i);
61
+ if (!isNaN(t) && t >= 0 && t < r.length)
62
+ return n.length === 0 ? [...r.slice(0, t), ...r.slice(t + 1)] : [
63
+ ...r.slice(0, t),
64
+ h(n, r[t]),
65
+ ...r.slice(t + 1)
66
+ ];
67
+ throw new Error(
68
+ `Invalid array index "${t}" in path "${e.join(".")}".`
69
+ );
70
+ } else if (typeof r == "object" && r !== null)
71
+ if (n.length === 0) {
72
+ const { [i]: t, ...l } = r;
73
+ return l;
74
+ } else {
75
+ if (i in r)
76
+ return {
77
+ ...r,
78
+ [i]: h(n, r[i])
79
+ };
80
+ throw new Error(
81
+ `Invalid property "${i}" in path "${e.join(".")}".`
82
+ );
83
+ }
84
+ else
85
+ throw new Error(
86
+ `Cannot delete nested property at path "${e.join(".")}". The path does not exist.`
87
+ );
88
+ }
89
+ function w(e, r) {
90
+ let i = e;
91
+ for (let n = 0; n < r.length; n++) {
92
+ const t = r[n];
93
+ if (!t)
94
+ throw new Error("Invalid path");
95
+ if (Array.isArray(i))
96
+ i = i[parseInt(t)];
97
+ else {
98
+ if (!i)
99
+ return;
100
+ i = i[t];
101
+ }
102
+ }
103
+ return i;
104
+ }
105
+ function y(e, r, i = "") {
106
+ let n = [];
107
+ if (typeof e == "function" && typeof r == "function")
108
+ return n;
109
+ if (e == null || r === null || r === void 0)
110
+ return e !== r ? [i] : n;
111
+ if (typeof e != "object" || typeof r != "object")
112
+ return e !== r ? [i] : n;
113
+ if (Array.isArray(e) && Array.isArray(r)) {
114
+ e.length !== r.length && n.push(`${i}.length`);
115
+ const o = Math.min(e.length, r.length);
116
+ for (let s = 0; s < o; s++)
117
+ e[s] !== r[s] && (n = n.concat(
118
+ y(e[s], r[s], `${i}[${s}]`)
119
+ ));
120
+ if (e.length !== r.length) {
121
+ const s = e.length > r.length ? e : r;
122
+ for (let c = o; c < s.length; c++)
123
+ n.push(`${i}[${c}]`);
124
+ }
125
+ return n;
126
+ }
127
+ const t = Object.keys(e), l = Object.keys(r);
128
+ return Array.from(/* @__PURE__ */ new Set([...t, ...l])).forEach((o) => {
129
+ const s = i ? `${i}.${o}` : o;
130
+ n = n.concat(
131
+ y(e[o], r[o], s)
132
+ );
133
+ }), n;
134
+ }
135
+ function $(e, r) {
136
+ return y(e, r).map(
137
+ (n) => n.replace(/\[(\w+)\]/g, ".$1").split(".").filter(Boolean)
138
+ );
139
+ }
140
+ function p(e, r, i = "") {
141
+ let n = [];
142
+ if (e == null || r === null || r === void 0)
143
+ return n;
144
+ if (Array.isArray(e) && Array.isArray(r))
145
+ e.length !== r.length && n.push(i);
146
+ else if (typeof e == "object" && typeof r == "object") {
147
+ const t = /* @__PURE__ */ new Set([...Object.keys(e), ...Object.keys(r)]);
148
+ for (const l of t) {
149
+ const f = i ? `${i}.${l}` : l;
150
+ (Array.isArray(e[l]) || Array.isArray(r[l])) && (n = n.concat(
151
+ p(e[l], r[l], f)
152
+ ));
153
+ }
154
+ }
155
+ return n;
156
+ }
157
+ function v(e, r) {
158
+ return p(e, r).map(
159
+ (n) => n.replace(/\[(\w+)\]/g, ".$1").split(".").filter(Boolean)
160
+ );
161
+ }
162
+ function N(e) {
163
+ const r = (l) => Object.values(l).some(
164
+ (f) => f?.hasOwnProperty("initialState")
165
+ );
166
+ let i = {};
167
+ const n = (l) => {
168
+ const f = {};
169
+ return Object.entries(l).forEach(([o, s]) => {
170
+ s?.initialState ? (i = { ...i ?? {}, [o]: s }, f[o] = { ...s.initialState }) : f[o] = s;
171
+ }), f;
172
+ };
173
+ return [r(e) ? n(e) : e, i];
174
+ }
175
+ export {
176
+ h as deleteNestedProperty,
177
+ p as getArrayLengthDifferences,
178
+ v as getArrayLengthDifferencesArray,
179
+ y as getDifferences,
180
+ $ as getDifferencesArray,
181
+ w as getNestedValue,
182
+ u as isArray,
183
+ g as isDeepEqual,
184
+ A as isFunction,
185
+ a as isObject,
186
+ N as transformStateFunc,
187
+ d as updateNestedProperty
188
+ };
189
+ //# sourceMappingURL=utility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utility.js","sources":["../src/utility.ts"],"sourcesContent":["import type { InitialStateType, TransformedStateType } from \"./CogsState\";\r\nexport const isObject = (item: any): item is Record<string, any> => {\r\n return (\r\n item &&\r\n typeof item === \"object\" &&\r\n !Array.isArray(item) &&\r\n item !== null\r\n );\r\n};\r\nexport type GenericObject = Record<string, any>;\r\n\r\nexport const isFunction = <TStateObject extends unknown>(\r\n arg: any,\r\n): arg is (prev: TStateObject) => TStateObject => typeof arg === \"function\";\r\n\r\nexport const isArray = (item: any): item is Array<any> => {\r\n return Array.isArray(item);\r\n};\r\nexport const isDeepEqual = (\r\n object1?: Record<string, any>,\r\n object2?: Record<string, any>,\r\n opts: { get?: () => void } = {},\r\n currentPath: string[] = [],\r\n): boolean => {\r\n if (isObject(object1) && isObject(object2)) {\r\n const objKeys1 = Object.keys(object1);\r\n const objKeys2 = Object.keys(object2);\r\n\r\n if (objKeys1.length !== objKeys2.length) {\r\n // console.log(\"not equal\", objKeys1, objKeys2);\r\n return false;\r\n }\r\n\r\n for (let key of objKeys1) {\r\n const value1 = object1[key];\r\n const value2 = object2[key];\r\n\r\n // Check if the key exists in both objects\r\n if (!(key in object1) || !(key in object2)) {\r\n // console.log(\"not equal\", key);\r\n return false;\r\n }\r\n\r\n const newPath = [...currentPath, key];\r\n\r\n // If current path is in ignoreArray, continue to the next key\r\n\r\n if (!isDeepEqual(value1, value2, opts, newPath)) {\r\n // console.log(\"not equal\", value1, value2);\r\n return false;\r\n }\r\n }\r\n return true;\r\n } else if (isArray(object1) && isArray(object2)) {\r\n if (object1.length !== object2.length) {\r\n // console.log(\"not equal\", object1);\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < object1.length; i++) {\r\n if (\r\n !isDeepEqual(object1[i], object2[i], opts, [\r\n ...currentPath,\r\n i.toString(),\r\n ])\r\n ) {\r\n // console.log(\"not equal\", object1[i]);\r\n return false;\r\n }\r\n }\r\n return true;\r\n } else {\r\n return (\r\n object1 === object2 ||\r\n (Number.isNaN(object1) && Number.isNaN(object2))\r\n );\r\n }\r\n};\r\nexport function updateNestedProperty(\r\n path: string[],\r\n state: any,\r\n update: any,\r\n): any {\r\n if (!path || path.length === 0) return update;\r\n const head = path[0];\r\n const tail = path.slice(1);\r\n\r\n if (Array.isArray(state)) {\r\n const index = Number(head);\r\n\r\n if (!isNaN(index) && index >= 0 && index < state.length) {\r\n return [\r\n ...state.slice(0, index),\r\n updateNestedProperty(tail, state[index], update),\r\n ...state.slice(index + 1),\r\n ];\r\n } else {\r\n console.log(\"errorstate\", state, path);\r\n throw new Error(\r\n `Invalid array index \"${index}\" in path \"${path.join(\".\")}\".`,\r\n );\r\n }\r\n } else if (typeof state === \"object\" && state !== null) {\r\n if (head && head in state) {\r\n return {\r\n ...state,\r\n [head!]: updateNestedProperty(tail, state[head!], update),\r\n };\r\n } else {\r\n console.log(`Invalid property`, head, tail, path);\r\n throw new Error(\r\n `Invalid property \"${head}\" in path \"${path.join(\".\")}\".`,\r\n );\r\n }\r\n } else {\r\n throw new Error(\r\n `Cannot update nested property at path \"${path.join(\".\")}\". The path does not exist.`,\r\n );\r\n }\r\n}\r\n\r\nexport function deleteNestedProperty(path: string[], state: any): any {\r\n if (!path || path.length === 0) return state;\r\n const head = path[0] as string;\r\n const tail = path.slice(1);\r\n\r\n if (Array.isArray(state)) {\r\n const index = Number(head);\r\n\r\n if (!isNaN(index) && index >= 0 && index < state.length) {\r\n if (tail.length === 0) {\r\n // Remove the item at the index\r\n return [...state.slice(0, index), ...state.slice(index + 1)];\r\n } else {\r\n return [\r\n ...state.slice(0, index),\r\n deleteNestedProperty(tail, state[index]),\r\n ...state.slice(index + 1),\r\n ];\r\n }\r\n } else {\r\n throw new Error(\r\n `Invalid array index \"${index}\" in path \"${path.join(\".\")}\".`,\r\n );\r\n }\r\n } else if (typeof state === \"object\" && state !== null) {\r\n if (tail.length === 0) {\r\n // Delete the property and return the new object\r\n const { [head]: _, ...rest } = state;\r\n return rest;\r\n } else if (head in state) {\r\n return {\r\n ...state,\r\n [head]: deleteNestedProperty(tail, state[head]),\r\n };\r\n } else {\r\n throw new Error(\r\n `Invalid property \"${head}\" in path \"${path.join(\".\")}\".`,\r\n );\r\n }\r\n } else {\r\n throw new Error(\r\n `Cannot delete nested property at path \"${path.join(\".\")}\". The path does not exist.`,\r\n );\r\n }\r\n}\r\n\r\nexport function getNestedValue<TStateObject extends unknown>(\r\n obj: TStateObject,\r\n pathArray: string[],\r\n) {\r\n let value: any = obj;\r\n\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const key = pathArray[i];\r\n // console.log(key, \"loooo\");\r\n if (!key) {\r\n throw new Error(\"Invalid path\");\r\n }\r\n if (Array.isArray(value)) {\r\n value = value[parseInt(key)];\r\n } else {\r\n if (!value) {\r\n // console.log(key, value, pathArray);\r\n return;\r\n }\r\n\r\n value = value[key];\r\n }\r\n }\r\n return value;\r\n}\r\ntype DifferencePaths = string[];\r\n\r\nexport function getDifferences(\r\n obj1: any,\r\n obj2: any,\r\n currentPath: string = \"\",\r\n): DifferencePaths {\r\n let differences: DifferencePaths = [];\r\n // Handling null and undefined cases\r\n if (typeof obj1 === \"function\" && typeof obj2 === \"function\") {\r\n return differences;\r\n }\r\n if (\r\n obj1 === null ||\r\n obj1 === undefined ||\r\n obj2 === null ||\r\n obj2 === undefined\r\n ) {\r\n if (obj1 !== obj2) {\r\n // console.log(obj1, obj2);\r\n return [currentPath];\r\n }\r\n return differences;\r\n }\r\n\r\n // Handling primitive types\r\n if (typeof obj1 !== \"object\" || typeof obj2 !== \"object\") {\r\n if (obj1 !== obj2) {\r\n return [currentPath];\r\n }\r\n return differences;\r\n }\r\n\r\n // Handling arrays\r\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\r\n // Handle changes in length directly\r\n if (obj1.length !== obj2.length) {\r\n differences.push(`${currentPath}.length`);\r\n }\r\n\r\n // Use the shorter length for comparison to detect shifts or changes\r\n const commonLength = Math.min(obj1.length, obj2.length);\r\n for (let i = 0; i < commonLength; i++) {\r\n if (obj1[i] !== obj2[i]) {\r\n differences = differences.concat(\r\n getDifferences(obj1[i], obj2[i], `${currentPath}[${i}]`),\r\n );\r\n }\r\n }\r\n\r\n // If an array is shorter post-cut, the remaining items in the longer array are implicitly shifted/deleted\r\n if (obj1.length !== obj2.length) {\r\n const longerArrayPath = obj1.length > obj2.length ? obj1 : obj2;\r\n for (let i = commonLength; i < longerArrayPath.length; i++) {\r\n differences.push(`${currentPath}[${i}]`);\r\n }\r\n }\r\n return differences;\r\n }\r\n // Handling objects\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n const allKeys = Array.from(new Set([...keys1, ...keys2]));\r\n\r\n allKeys.forEach((key) => {\r\n const newPath = currentPath ? `${currentPath}.${key}` : key;\r\n differences = differences.concat(\r\n getDifferences(obj1[key], obj2[key], newPath),\r\n );\r\n });\r\n return differences;\r\n}\r\n\r\nexport function getDifferencesArray(obj1: any, obj2: any) {\r\n const convertedDiff = getDifferences(obj1, obj2).map((string) =>\r\n string\r\n .replace(/\\[(\\w+)\\]/g, \".$1\")\r\n .split(\".\")\r\n .filter(Boolean),\r\n );\r\n\r\n return convertedDiff;\r\n}\r\nexport function getArrayLengthDifferences(\r\n obj1: any,\r\n obj2: any,\r\n currentPath: string = \"\",\r\n): string[] {\r\n let differences: string[] = [];\r\n\r\n // Check for null or undefined in entire objects\r\n if (\r\n obj1 === null ||\r\n obj1 === undefined ||\r\n obj2 === null ||\r\n obj2 === undefined\r\n ) {\r\n return differences;\r\n }\r\n\r\n // Check and compare only array lengths\r\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\r\n if (obj1.length !== obj2.length) {\r\n differences.push(currentPath);\r\n }\r\n } else if (typeof obj1 === \"object\" && typeof obj2 === \"object\") {\r\n // Recursively check for nested arrays\r\n const keys = new Set([...Object.keys(obj1), ...Object.keys(obj2)]);\r\n for (const key of keys) {\r\n const newPath = currentPath ? `${currentPath}.${key}` : key;\r\n\r\n // Perform recursive checks only for array fields\r\n if (Array.isArray(obj1[key]) || Array.isArray(obj2[key])) {\r\n differences = differences.concat(\r\n getArrayLengthDifferences(obj1[key], obj2[key], newPath),\r\n );\r\n }\r\n }\r\n }\r\n\r\n return differences;\r\n}\r\n\r\nexport function getArrayLengthDifferencesArray(obj1: any, obj2: any) {\r\n const convertedDiff = getArrayLengthDifferences(obj1, obj2).map((string) =>\r\n string\r\n .replace(/\\[(\\w+)\\]/g, \".$1\")\r\n .split(\".\")\r\n .filter(Boolean),\r\n );\r\n\r\n return convertedDiff;\r\n}\r\n// export function determineUpdateType(prevState: any, newState: any): UpdateTypeDetail[] {\r\n// console.time(\"determineUpdateType\");\r\n// const updateDetails: UpdateTypeDetail[] = [];\r\n\r\n// function checkForUpdates(prev: any, next: any, path: string[] = []) {\r\n// if (Array.isArray(prev) && Array.isArray(next)) {\r\n// if (prev.length !== next.length) {\r\n// updateDetails.push({\r\n// updateType: prev.length < next.length ? \"push\" : \"cut\",\r\n// path,\r\n// oldValue: prev,\r\n// newValue: next,\r\n// });\r\n// // If an array has changed size, no need to check deeper for this path\r\n// return;\r\n// } else {\r\n// // Check for updates within the array\r\n// for (let i = 0; i < prev.length; i++) {\r\n// checkForUpdates(prev[i], next[i], path.concat(i.toString()));\r\n// }\r\n// }\r\n// } else if (typeof prev === \"object\" && typeof next === \"object\" && prev !== null && next !== null) {\r\n// const keys = new Set([...Object.keys(prev), ...Object.keys(next)]);\r\n// for (let key of keys) {\r\n// checkForUpdates(prev[key], next[key], path.concat(key));\r\n// }\r\n// } else if (prev !== next) {\r\n// updateDetails.push({\r\n// updateType: \"updated\",\r\n// path,\r\n// oldValue: prev,\r\n// newValue: next,\r\n// });\r\n// }\r\n// }\r\n\r\n// checkForUpdates(prevState, newState);\r\n// console.timeEnd(\"determineUpdateType\");\r\n// console.log(\"updateDetails\", updateDetails);\r\n// return updateDetails;\r\n// }\r\n\r\nexport function transformStateFunc<State extends unknown>(initialState: State) {\r\n const isInitialStateType = (\r\n state: any,\r\n ): state is InitialStateType<State> => {\r\n return Object.values(state).some((value) =>\r\n value?.hasOwnProperty(\"initialState\"),\r\n );\r\n };\r\n let initalOptions: GenericObject = {};\r\n const transformInitialState = (\r\n state: InitialStateType<State>,\r\n ): GenericObject | GenericObject[] => {\r\n const transformedState: GenericObject | GenericObject[] = {};\r\n Object.entries(state).forEach(([key, value]) => {\r\n if (value?.initialState) {\r\n initalOptions = { ...(initalOptions ?? {}), [key]: value };\r\n\r\n transformedState[key] = { ...value.initialState };\r\n } else {\r\n transformedState[key] = value;\r\n }\r\n });\r\n\r\n return transformedState;\r\n };\r\n\r\n const transformedInitialState = isInitialStateType(initialState)\r\n ? (transformInitialState(initialState) as State)\r\n : (initialState as State);\r\n\r\n return [transformedInitialState, initalOptions] as [\r\n TransformedStateType<State>,\r\n GenericObject,\r\n ];\r\n}\r\n"],"names":["isObject","item","isFunction","arg","isArray","isDeepEqual","object1","object2","opts","currentPath","objKeys1","objKeys2","key","value1","value2","newPath","i","updateNestedProperty","path","state","update","head","tail","index","deleteNestedProperty","_","rest","getNestedValue","obj","pathArray","value","getDifferences","obj1","obj2","differences","commonLength","longerArrayPath","keys1","keys2","getDifferencesArray","string","getArrayLengthDifferences","keys","getArrayLengthDifferencesArray","transformStateFunc","initialState","isInitialStateType","initalOptions","transformInitialState","transformedState"],"mappings":"AACa,MAAAA,IAAW,CAACC,MAEjBA,KACA,OAAOA,KAAS,YAChB,CAAC,MAAM,QAAQA,CAAI,KACnBA,MAAS,MAKJC,IAAa,CACtBC,MAC8C,OAAOA,KAAQ,YAEpDC,IAAU,CAACH,MACb,MAAM,QAAQA,CAAI,GAEhBI,IAAc,CACvBC,GACAC,GACAC,IAA6B,CAAC,GAC9BC,IAAwB,OACd;AACV,MAAIT,EAASM,CAAO,KAAKN,EAASO,CAAO,GAAG;AAClC,UAAAG,IAAW,OAAO,KAAKJ,CAAO,GAC9BK,IAAW,OAAO,KAAKJ,CAAO;AAEhC,QAAAG,EAAS,WAAWC,EAAS;AAEtB,aAAA;AAGX,aAASC,KAAOF,GAAU;AAChB,YAAAG,IAASP,EAAQM,CAAG,GACpBE,IAASP,EAAQK,CAAG;AAG1B,UAAI,EAAEA,KAAON,MAAY,EAAEM,KAAOL;AAEvB,eAAA;AAGX,YAAMQ,IAAU,CAAC,GAAGN,GAAaG,CAAG;AAIpC,UAAI,CAACP,EAAYQ,GAAQC,GAAQN,GAAMO,CAAO;AAEnC,eAAA;AAAA,IACX;AAEG,WAAA;AAAA,aACAX,EAAQE,CAAO,KAAKF,EAAQG,CAAO,GAAG;AACzC,QAAAD,EAAQ,WAAWC,EAAQ;AAEpB,aAAA;AAGX,aAASS,IAAI,GAAGA,IAAIV,EAAQ,QAAQU;AAE5B,UAAA,CAACX,EAAYC,EAAQU,CAAC,GAAGT,EAAQS,CAAC,GAAGR,GAAM;AAAA,QACvC,GAAGC;AAAA,QACHO,EAAE,SAAS;AAAA,MAAA,CACd;AAGM,eAAA;AAGR,WAAA;AAAA,EAAA;AAGH,WAAAV,MAAYC,KACX,OAAO,MAAMD,CAAO,KAAK,OAAO,MAAMC,CAAO;AAG1D;AACgB,SAAAU,EACZC,GACAC,GACAC,GACG;AACH,MAAI,CAACF,KAAQA,EAAK,WAAW,EAAU,QAAAE;AACjC,QAAAC,IAAOH,EAAK,CAAC,GACbI,IAAOJ,EAAK,MAAM,CAAC;AAErB,MAAA,MAAM,QAAQC,CAAK,GAAG;AAChB,UAAAI,IAAQ,OAAOF,CAAI;AAErB,QAAA,CAAC,MAAME,CAAK,KAAKA,KAAS,KAAKA,IAAQJ,EAAM;AACtC,aAAA;AAAA,QACH,GAAGA,EAAM,MAAM,GAAGI,CAAK;AAAA,QACvBN,EAAqBK,GAAMH,EAAMI,CAAK,GAAGH,CAAM;AAAA,QAC/C,GAAGD,EAAM,MAAMI,IAAQ,CAAC;AAAA,MAC5B;AAEQ,kBAAA,IAAI,cAAcJ,GAAOD,CAAI,GAC/B,IAAI;AAAA,MACN,wBAAwBK,CAAK,cAAcL,EAAK,KAAK,GAAG,CAAC;AAAA,IAC7D;AAAA,EAEG,WAAA,OAAOC,KAAU,YAAYA,MAAU,MAAM;AAChD,QAAAE,KAAQA,KAAQF;AACT,aAAA;AAAA,QACH,GAAGA;AAAA,QACH,CAACE,CAAK,GAAGJ,EAAqBK,GAAMH,EAAME,CAAK,GAAGD,CAAM;AAAA,MAC5D;AAEA,kBAAQ,IAAI,oBAAoBC,GAAMC,GAAMJ,CAAI,GAC1C,IAAI;AAAA,MACN,qBAAqBG,CAAI,cAAcH,EAAK,KAAK,GAAG,CAAC;AAAA,IACzD;AAAA,EACJ;AAEA,UAAM,IAAI;AAAA,MACN,0CAA0CA,EAAK,KAAK,GAAG,CAAC;AAAA,IAC5D;AAER;AAEgB,SAAAM,EAAqBN,GAAgBC,GAAiB;AAClE,MAAI,CAACD,KAAQA,EAAK,WAAW,EAAU,QAAAC;AACjC,QAAAE,IAAOH,EAAK,CAAC,GACbI,IAAOJ,EAAK,MAAM,CAAC;AAErB,MAAA,MAAM,QAAQC,CAAK,GAAG;AAChB,UAAAI,IAAQ,OAAOF,CAAI;AAErB,QAAA,CAAC,MAAME,CAAK,KAAKA,KAAS,KAAKA,IAAQJ,EAAM;AACzC,aAAAG,EAAK,WAAW,IAET,CAAC,GAAGH,EAAM,MAAM,GAAGI,CAAK,GAAG,GAAGJ,EAAM,MAAMI,IAAQ,CAAC,CAAC,IAEpD;AAAA,QACH,GAAGJ,EAAM,MAAM,GAAGI,CAAK;AAAA,QACvBC,EAAqBF,GAAMH,EAAMI,CAAK,CAAC;AAAA,QACvC,GAAGJ,EAAM,MAAMI,IAAQ,CAAC;AAAA,MAC5B;AAGJ,UAAM,IAAI;AAAA,MACN,wBAAwBA,CAAK,cAAcL,EAAK,KAAK,GAAG,CAAC;AAAA,IAC7D;AAAA,EAEG,WAAA,OAAOC,KAAU,YAAYA,MAAU;AAC1C,QAAAG,EAAK,WAAW,GAAG;AAEnB,YAAM,EAAE,CAACD,CAAI,GAAGI,GAAG,GAAGC,EAAS,IAAAP;AACxB,aAAAO;AAAA,IAAA,OACX;AAAA,UAAWL,KAAQF;AACR,eAAA;AAAA,UACH,GAAGA;AAAA,UACH,CAACE,CAAI,GAAGG,EAAqBF,GAAMH,EAAME,CAAI,CAAC;AAAA,QAClD;AAEA,YAAM,IAAI;AAAA,QACN,qBAAqBA,CAAI,cAAcH,EAAK,KAAK,GAAG,CAAC;AAAA,MACzD;AAAA;AAAA;AAGJ,UAAM,IAAI;AAAA,MACN,0CAA0CA,EAAK,KAAK,GAAG,CAAC;AAAA,IAC5D;AAER;AAEgB,SAAAS,EACZC,GACAC,GACF;AACE,MAAIC,IAAaF;AAEjB,WAASZ,IAAI,GAAGA,IAAIa,EAAU,QAAQb,KAAK;AACjC,UAAAJ,IAAMiB,EAAUb,CAAC;AAEvB,QAAI,CAACJ;AACK,YAAA,IAAI,MAAM,cAAc;AAE9B,QAAA,MAAM,QAAQkB,CAAK;AACX,MAAAA,IAAAA,EAAM,SAASlB,CAAG,CAAC;AAAA,SACxB;AACH,UAAI,CAACkB;AAED;AAGJ,MAAAA,IAAQA,EAAMlB,CAAG;AAAA,IAAA;AAAA,EACrB;AAEG,SAAAkB;AACX;AAGO,SAASC,EACZC,GACAC,GACAxB,IAAsB,IACP;AACf,MAAIyB,IAA+B,CAAC;AAEpC,MAAI,OAAOF,KAAS,cAAc,OAAOC,KAAS;AACvC,WAAAC;AAEX,MACIF,KAAS,QAETC,MAAS,QACTA,MAAS;AAET,WAAID,MAASC,IAEF,CAACxB,CAAW,IAEhByB;AAIX,MAAI,OAAOF,KAAS,YAAY,OAAOC,KAAS;AAC5C,WAAID,MAASC,IACF,CAACxB,CAAW,IAEhByB;AAIX,MAAI,MAAM,QAAQF,CAAI,KAAK,MAAM,QAAQC,CAAI,GAAG;AAExC,IAAAD,EAAK,WAAWC,EAAK,UACTC,EAAA,KAAK,GAAGzB,CAAW,SAAS;AAI5C,UAAM0B,IAAe,KAAK,IAAIH,EAAK,QAAQC,EAAK,MAAM;AACtD,aAASjB,IAAI,GAAGA,IAAImB,GAAcnB;AAC9B,MAAIgB,EAAKhB,CAAC,MAAMiB,EAAKjB,CAAC,MAClBkB,IAAcA,EAAY;AAAA,QACtBH,EAAeC,EAAKhB,CAAC,GAAGiB,EAAKjB,CAAC,GAAG,GAAGP,CAAW,IAAIO,CAAC,GAAG;AAAA,MAC3D;AAKJ,QAAAgB,EAAK,WAAWC,EAAK,QAAQ;AAC7B,YAAMG,IAAkBJ,EAAK,SAASC,EAAK,SAASD,IAAOC;AAC3D,eAASjB,IAAImB,GAAcnB,IAAIoB,EAAgB,QAAQpB;AACnD,QAAAkB,EAAY,KAAK,GAAGzB,CAAW,IAAIO,CAAC,GAAG;AAAA,IAC3C;AAEG,WAAAkB;AAAA,EAAA;AAGL,QAAAG,IAAQ,OAAO,KAAKL,CAAI,GACxBM,IAAQ,OAAO,KAAKL,CAAI;AAGtB,SAFQ,MAAM,KAAS,oBAAA,IAAI,CAAC,GAAGI,GAAO,GAAGC,CAAK,CAAC,CAAC,EAEhD,QAAQ,CAAC1B,MAAQ;AACrB,UAAMG,IAAUN,IAAc,GAAGA,CAAW,IAAIG,CAAG,KAAKA;AACxD,IAAAsB,IAAcA,EAAY;AAAA,MACtBH,EAAeC,EAAKpB,CAAG,GAAGqB,EAAKrB,CAAG,GAAGG,CAAO;AAAA,IAChD;AAAA,EAAA,CACH,GACMmB;AACX;AAEgB,SAAAK,EAAoBP,GAAWC,GAAW;AAQ/C,SAPeF,EAAeC,GAAMC,CAAI,EAAE;AAAA,IAAI,CAACO,MAClDA,EACK,QAAQ,cAAc,KAAK,EAC3B,MAAM,GAAG,EACT,OAAO,OAAO;AAAA,EACvB;AAGJ;AACO,SAASC,EACZT,GACAC,GACAxB,IAAsB,IACd;AACR,MAAIyB,IAAwB,CAAC;AAG7B,MACIF,KAAS,QAETC,MAAS,QACTA,MAAS;AAEF,WAAAC;AAIX,MAAI,MAAM,QAAQF,CAAI,KAAK,MAAM,QAAQC,CAAI;AACrC,IAAAD,EAAK,WAAWC,EAAK,UACrBC,EAAY,KAAKzB,CAAW;AAAA,WAEzB,OAAOuB,KAAS,YAAY,OAAOC,KAAS,UAAU;AAE7D,UAAMS,IAAO,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAKV,CAAI,GAAG,GAAG,OAAO,KAAKC,CAAI,CAAC,CAAC;AACjE,eAAWrB,KAAO8B,GAAM;AACpB,YAAM3B,IAAUN,IAAc,GAAGA,CAAW,IAAIG,CAAG,KAAKA;AAGpD,OAAA,MAAM,QAAQoB,EAAKpB,CAAG,CAAC,KAAK,MAAM,QAAQqB,EAAKrB,CAAG,CAAC,OACnDsB,IAAcA,EAAY;AAAA,QACtBO,EAA0BT,EAAKpB,CAAG,GAAGqB,EAAKrB,CAAG,GAAGG,CAAO;AAAA,MAC3D;AAAA,IACJ;AAAA,EACJ;AAGG,SAAAmB;AACX;AAEgB,SAAAS,EAA+BX,GAAWC,GAAW;AAQ1D,SAPeQ,EAA0BT,GAAMC,CAAI,EAAE;AAAA,IAAI,CAACO,MAC7DA,EACK,QAAQ,cAAc,KAAK,EAC3B,MAAM,GAAG,EACT,OAAO,OAAO;AAAA,EACvB;AAGJ;AA2CO,SAASI,EAA0CC,GAAqB;AACrE,QAAAC,IAAqB,CACvB3B,MAEO,OAAO,OAAOA,CAAK,EAAE;AAAA,IAAK,CAACW,MAC9BA,GAAO,eAAe,cAAc;AAAA,EACxC;AAEJ,MAAIiB,IAA+B,CAAC;AAC9B,QAAAC,IAAwB,CAC1B7B,MACkC;AAClC,UAAM8B,IAAoD,CAAC;AACpD,kBAAA,QAAQ9B,CAAK,EAAE,QAAQ,CAAC,CAACP,GAAKkB,CAAK,MAAM;AAC5C,MAAIA,GAAO,gBACSiB,IAAA,EAAE,GAAIA,KAAiB,IAAK,CAACnC,CAAG,GAAGkB,EAAM,GAEzDmB,EAAiBrC,CAAG,IAAI,EAAE,GAAGkB,EAAM,aAAa,KAEhDmB,EAAiBrC,CAAG,IAAIkB;AAAA,IAC5B,CACH,GAEMmB;AAAA,EACX;AAMO,SAAA,CAJyBH,EAAmBD,CAAY,IACxDG,EAAsBH,CAAY,IAClCA,GAE0BE,CAAa;AAIlD;"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "cogsbox-state",
3
+ "version": "0.5.3",
4
+ "description": "React state management library with form controls and server sync",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "repository": "github:cogsbox/cogsbox-state",
20
+ "scripts": {
21
+ "build": "vite build",
22
+ "lint": "eslint src --ext ts,tsx",
23
+ "format": "prettier --write \"src/**/*.{ts,tsx}\"",
24
+ "dev": "vite src/examples"
25
+ },
26
+ "dependencies": {
27
+ "rollup-preserve-directives": "^1.1.3",
28
+ "uuid": "^9.0.1",
29
+ "zod": "^3.22.4",
30
+ "zustand": "^5.0.3"
31
+ },
32
+ "peerDependencies": {
33
+ "@types/react": "^18.0.0",
34
+ "react": "^18.2.0",
35
+ "react-dom": "^18.2.0",
36
+ "@trpc/next": "^10.0.0"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^20.11.0",
40
+ "@types/react": "^18.2.0",
41
+ "@types/react-dom": "^18.2.0",
42
+ "@types/uuid": "^9.0.7",
43
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
44
+ "@typescript-eslint/parser": "^6.21.0",
45
+ "@vitejs/plugin-react": "^4.2.0",
46
+ "eslint": "^8.57.0",
47
+ "eslint-plugin-react": "^7.33.2",
48
+ "eslint-plugin-react-hooks": "^4.6.0",
49
+ "prettier": "^3.4.0",
50
+ "typescript": "^5.3.0",
51
+ "vite": "^5.0.0",
52
+ "vite-plugin-dts": "^3.7.0"
53
+ },
54
+ "keywords": [
55
+ "react",
56
+ "state-management",
57
+ "forms",
58
+ "typescript"
59
+ ],
60
+ "author": "",
61
+ "license": "MIT"
62
+ }