@simplestack/store 0.6.3 → 0.6.4
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 +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +404 -0
- package/dist/index.test.js.map +1 -0
- package/dist/integration.test.d.ts +2 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/integration.test.js +333 -0
- package/dist/integration.test.js.map +1 -0
- package/dist/react.js +2 -6
- package/dist/react.js.map +1 -1
- package/dist/react.test.d.ts +2 -0
- package/dist/react.test.d.ts.map +1 -0
- package/dist/react.test.js +389 -0
- package/dist/react.test.js.map +1 -0
- package/dist/test-setup.d.ts +2 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +2 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/test-utils.d.ts +6 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +8 -0
- package/dist/test-utils.js.map +1 -0
- package/package.json +15 -7
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { fireEvent, render, renderHook, screen, waitFor, } from "@testing-library/react";
|
|
3
|
+
import { act } from "react";
|
|
4
|
+
import { describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { store } from "./index.js";
|
|
6
|
+
import { useStoreValue } from "./react.js";
|
|
7
|
+
describe("useStoreValue", () => {
|
|
8
|
+
describe("basic usage", () => {
|
|
9
|
+
it("should return the current value of the store", () => {
|
|
10
|
+
const countStore = store(5);
|
|
11
|
+
const { result } = renderHook(() => useStoreValue(countStore));
|
|
12
|
+
expect(result.current).toBe(5);
|
|
13
|
+
});
|
|
14
|
+
it("should return undefined when store is undefined", () => {
|
|
15
|
+
const { result } = renderHook(() => useStoreValue(undefined));
|
|
16
|
+
expect(result.current).toBe(undefined);
|
|
17
|
+
});
|
|
18
|
+
it("should work with string store", () => {
|
|
19
|
+
const strStore = store("hello");
|
|
20
|
+
const { result } = renderHook(() => useStoreValue(strStore));
|
|
21
|
+
expect(result.current).toBe("hello");
|
|
22
|
+
});
|
|
23
|
+
it("should work with boolean store", () => {
|
|
24
|
+
const boolStore = store(true);
|
|
25
|
+
const { result } = renderHook(() => useStoreValue(boolStore));
|
|
26
|
+
expect(result.current).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
it("should work with object store", () => {
|
|
29
|
+
const objStore = store({ name: "Alice", age: 30 });
|
|
30
|
+
const { result } = renderHook(() => useStoreValue(objStore));
|
|
31
|
+
expect(result.current).toEqual({ name: "Alice", age: 30 });
|
|
32
|
+
});
|
|
33
|
+
it("should work with array store", () => {
|
|
34
|
+
const arrStore = store([1, 2, 3]);
|
|
35
|
+
const { result } = renderHook(() => useStoreValue(arrStore));
|
|
36
|
+
expect(result.current).toEqual([1, 2, 3]);
|
|
37
|
+
});
|
|
38
|
+
it("should work with null store", () => {
|
|
39
|
+
const nullStore = store(null);
|
|
40
|
+
const { result } = renderHook(() => useStoreValue(nullStore));
|
|
41
|
+
expect(result.current).toBe(null);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe("reactivity", () => {
|
|
45
|
+
it("should update when store value changes", async () => {
|
|
46
|
+
const countStore = store(0);
|
|
47
|
+
const { result } = renderHook(() => useStoreValue(countStore));
|
|
48
|
+
expect(result.current).toBe(0);
|
|
49
|
+
act(() => {
|
|
50
|
+
countStore.set(5);
|
|
51
|
+
});
|
|
52
|
+
await waitFor(() => {
|
|
53
|
+
expect(result.current).toBe(5);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
it("should update when store is updated multiple times", async () => {
|
|
57
|
+
const countStore = store(0);
|
|
58
|
+
const { result } = renderHook(() => useStoreValue(countStore));
|
|
59
|
+
expect(result.current).toBe(0);
|
|
60
|
+
act(() => {
|
|
61
|
+
countStore.set(1);
|
|
62
|
+
});
|
|
63
|
+
await waitFor(() => {
|
|
64
|
+
expect(result.current).toBe(1);
|
|
65
|
+
});
|
|
66
|
+
act(() => {
|
|
67
|
+
countStore.set(2);
|
|
68
|
+
});
|
|
69
|
+
await waitFor(() => {
|
|
70
|
+
expect(result.current).toBe(2);
|
|
71
|
+
});
|
|
72
|
+
act(() => {
|
|
73
|
+
countStore.set(3);
|
|
74
|
+
});
|
|
75
|
+
await waitFor(() => {
|
|
76
|
+
expect(result.current).toBe(3);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
it("should update when object store value changes", async () => {
|
|
80
|
+
const objStore = store({ count: 0 });
|
|
81
|
+
const { result } = renderHook(() => useStoreValue(objStore));
|
|
82
|
+
expect(result.current).toEqual({ count: 0 });
|
|
83
|
+
act(() => {
|
|
84
|
+
objStore.set({ count: 1 });
|
|
85
|
+
});
|
|
86
|
+
await waitFor(() => {
|
|
87
|
+
expect(result.current).toEqual({ count: 1 });
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
it("should not trigger re-render if value is the same (Object.is)", async () => {
|
|
91
|
+
const countStore = store(5);
|
|
92
|
+
const renderSpy = vi.fn();
|
|
93
|
+
function TestComponent() {
|
|
94
|
+
const count = useStoreValue(countStore);
|
|
95
|
+
renderSpy();
|
|
96
|
+
return _jsx("div", { children: count });
|
|
97
|
+
}
|
|
98
|
+
render(_jsx(TestComponent, {}));
|
|
99
|
+
const initialRenderCount = renderSpy.mock.calls.length;
|
|
100
|
+
act(() => {
|
|
101
|
+
countStore.set(5);
|
|
102
|
+
});
|
|
103
|
+
expect(renderSpy.mock.calls.length).toBe(initialRenderCount);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe("selected stores", () => {
|
|
107
|
+
it("should work with selected store", async () => {
|
|
108
|
+
const objStore = store({ name: "Alice", age: 30 });
|
|
109
|
+
const nameStore = objStore.select("name");
|
|
110
|
+
const { result } = renderHook(() => useStoreValue(nameStore));
|
|
111
|
+
expect(result.current).toBe("Alice");
|
|
112
|
+
act(() => {
|
|
113
|
+
nameStore.set("Bob");
|
|
114
|
+
});
|
|
115
|
+
await waitFor(() => {
|
|
116
|
+
expect(result.current).toBe("Bob");
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
it("should update when parent store changes selected value", async () => {
|
|
120
|
+
const objStore = store({ name: "Alice", age: 30 });
|
|
121
|
+
const nameStore = objStore.select("name");
|
|
122
|
+
const { result } = renderHook(() => useStoreValue(nameStore));
|
|
123
|
+
expect(result.current).toBe("Alice");
|
|
124
|
+
act(() => {
|
|
125
|
+
objStore.set({ name: "Bob", age: 30 });
|
|
126
|
+
});
|
|
127
|
+
await waitFor(() => {
|
|
128
|
+
expect(result.current).toBe("Bob");
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
it("should not update when parent changes but selected value stays same", async () => {
|
|
132
|
+
const objStore = store({ name: "Alice", age: 30 });
|
|
133
|
+
const nameStore = objStore.select("name");
|
|
134
|
+
const renderSpy = vi.fn();
|
|
135
|
+
function TestComponent() {
|
|
136
|
+
const name = useStoreValue(nameStore);
|
|
137
|
+
renderSpy();
|
|
138
|
+
return _jsx("div", { children: name });
|
|
139
|
+
}
|
|
140
|
+
render(_jsx(TestComponent, {}));
|
|
141
|
+
const initialRenderCount = renderSpy.mock.calls.length;
|
|
142
|
+
act(() => {
|
|
143
|
+
objStore.set({ name: "Alice", age: 31 });
|
|
144
|
+
});
|
|
145
|
+
expect(renderSpy.mock.calls.length).toBe(initialRenderCount);
|
|
146
|
+
});
|
|
147
|
+
it("should work with deeply nested selections", async () => {
|
|
148
|
+
const docStore = store({
|
|
149
|
+
meta: {
|
|
150
|
+
tags: ["draft", "internal"],
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
const tagsStore = docStore.select("meta").select("tags");
|
|
154
|
+
const { result } = renderHook(() => useStoreValue(tagsStore));
|
|
155
|
+
expect(result.current).toEqual(["draft", "internal"]);
|
|
156
|
+
act(() => {
|
|
157
|
+
tagsStore.set(["published"]);
|
|
158
|
+
});
|
|
159
|
+
await waitFor(() => {
|
|
160
|
+
expect(result.current).toEqual(["published"]);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe("multiple components", () => {
|
|
165
|
+
it("should allow multiple components to subscribe to same store", async () => {
|
|
166
|
+
const countStore = store(0);
|
|
167
|
+
function Counter1() {
|
|
168
|
+
const count = useStoreValue(countStore);
|
|
169
|
+
return _jsx("div", { "data-testid": "counter1", children: count });
|
|
170
|
+
}
|
|
171
|
+
function Counter2() {
|
|
172
|
+
const count = useStoreValue(countStore);
|
|
173
|
+
return _jsx("div", { "data-testid": "counter2", children: count });
|
|
174
|
+
}
|
|
175
|
+
render(_jsxs(_Fragment, { children: [_jsx(Counter1, {}), _jsx(Counter2, {})] }));
|
|
176
|
+
expect(screen.getByTestId("counter1")).toHaveTextContent("0");
|
|
177
|
+
expect(screen.getByTestId("counter2")).toHaveTextContent("0");
|
|
178
|
+
// Update store
|
|
179
|
+
act(() => {
|
|
180
|
+
countStore.set(5);
|
|
181
|
+
});
|
|
182
|
+
await waitFor(() => {
|
|
183
|
+
expect(screen.getByTestId("counter1")).toHaveTextContent("5");
|
|
184
|
+
});
|
|
185
|
+
// Both components should now have the updated value
|
|
186
|
+
expect(screen.getByTestId("counter1")).toHaveTextContent("5");
|
|
187
|
+
expect(screen.getByTestId("counter2")).toHaveTextContent("5");
|
|
188
|
+
});
|
|
189
|
+
it("should allow different components to subscribe to different selections", async () => {
|
|
190
|
+
const userStore = store({
|
|
191
|
+
name: "Alice",
|
|
192
|
+
age: 30,
|
|
193
|
+
});
|
|
194
|
+
const nameStore = userStore.select("name");
|
|
195
|
+
const ageStore = userStore.select("age");
|
|
196
|
+
function NameDisplay() {
|
|
197
|
+
const name = useStoreValue(nameStore);
|
|
198
|
+
return _jsx("div", { "data-testid": "name", children: name });
|
|
199
|
+
}
|
|
200
|
+
function AgeDisplay() {
|
|
201
|
+
const age = useStoreValue(ageStore);
|
|
202
|
+
return _jsx("div", { "data-testid": "age", children: age });
|
|
203
|
+
}
|
|
204
|
+
render(_jsxs(_Fragment, { children: [_jsx(NameDisplay, {}), _jsx(AgeDisplay, {})] }));
|
|
205
|
+
expect(screen.getByTestId("name")).toHaveTextContent("Alice");
|
|
206
|
+
expect(screen.getByTestId("age")).toHaveTextContent("30");
|
|
207
|
+
act(() => {
|
|
208
|
+
nameStore.set("Bob");
|
|
209
|
+
});
|
|
210
|
+
await waitFor(() => {
|
|
211
|
+
expect(screen.getByTestId("name")).toHaveTextContent("Bob");
|
|
212
|
+
});
|
|
213
|
+
expect(screen.getByTestId("age")).toHaveTextContent("30");
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
describe("cleanup", () => {
|
|
217
|
+
it("should unsubscribe when component unmounts", async () => {
|
|
218
|
+
const countStore = store(0);
|
|
219
|
+
const { result, unmount } = renderHook(() => useStoreValue(countStore));
|
|
220
|
+
expect(result.current).toBe(0);
|
|
221
|
+
unmount();
|
|
222
|
+
// After unmount, changing the store shouldn't cause errors
|
|
223
|
+
act(() => {
|
|
224
|
+
countStore.set(5);
|
|
225
|
+
});
|
|
226
|
+
// Just ensure no errors occurred
|
|
227
|
+
expect(true).toBe(true);
|
|
228
|
+
});
|
|
229
|
+
it("should handle rapid mount/unmount cycles", () => {
|
|
230
|
+
const countStore = store(0);
|
|
231
|
+
for (let i = 0; i < 10; i++) {
|
|
232
|
+
const { unmount } = renderHook(() => useStoreValue(countStore));
|
|
233
|
+
unmount();
|
|
234
|
+
}
|
|
235
|
+
// Should complete without errors
|
|
236
|
+
expect(true).toBe(true);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
describe("README examples", () => {
|
|
240
|
+
it("should handle the counter example from README", async () => {
|
|
241
|
+
const counterStore = store(0);
|
|
242
|
+
function Counter() {
|
|
243
|
+
const counter = useStoreValue(counterStore);
|
|
244
|
+
return (_jsx("button", { type: "button", "data-testid": "counter-btn", onClick: () => counterStore.set((n) => n + 1), children: counter }));
|
|
245
|
+
}
|
|
246
|
+
render(_jsx(Counter, {}));
|
|
247
|
+
expect(screen.getByTestId("counter-btn")).toHaveTextContent("0");
|
|
248
|
+
act(() => {
|
|
249
|
+
screen.getByTestId("counter-btn").click();
|
|
250
|
+
});
|
|
251
|
+
await waitFor(() => {
|
|
252
|
+
expect(screen.getByTestId("counter-btn")).toHaveTextContent("1");
|
|
253
|
+
});
|
|
254
|
+
act(() => {
|
|
255
|
+
screen.getByTestId("counter-btn").click();
|
|
256
|
+
});
|
|
257
|
+
await waitFor(() => {
|
|
258
|
+
expect(screen.getByTestId("counter-btn")).toHaveTextContent("2");
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
it("should handle the document example from README", async () => {
|
|
262
|
+
const documentStore = store({
|
|
263
|
+
title: "Untitled",
|
|
264
|
+
authors: ["Ada", "Ben"],
|
|
265
|
+
meta: {
|
|
266
|
+
pages: 3,
|
|
267
|
+
tags: ["draft", "internal"],
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
function Document() {
|
|
271
|
+
const doc = useStoreValue(documentStore);
|
|
272
|
+
return (_jsxs("div", { children: [_jsx("span", { "data-testid": "title", children: doc.title }), _jsx("span", { "data-testid": "tags", children: doc.meta.tags.join(", ") })] }));
|
|
273
|
+
}
|
|
274
|
+
render(_jsx(Document, {}));
|
|
275
|
+
expect(screen.getByTestId("title")).toHaveTextContent("Untitled");
|
|
276
|
+
expect(screen.getByTestId("tags")).toHaveTextContent("draft, internal");
|
|
277
|
+
});
|
|
278
|
+
it("should handle the title input example from README", async () => {
|
|
279
|
+
const documentStore = store({
|
|
280
|
+
title: "Untitled",
|
|
281
|
+
meta: { tags: ["draft"] },
|
|
282
|
+
});
|
|
283
|
+
const titleStore = documentStore.select("title");
|
|
284
|
+
function Title() {
|
|
285
|
+
const title = useStoreValue(titleStore);
|
|
286
|
+
return (_jsx("input", { "data-testid": "title-input", value: title, onChange: (e) => titleStore.set(e.target.value) }));
|
|
287
|
+
}
|
|
288
|
+
render(_jsx(Title, {}));
|
|
289
|
+
const input = screen.getByTestId("title-input");
|
|
290
|
+
expect(input.value).toBe("Untitled");
|
|
291
|
+
act(() => {
|
|
292
|
+
fireEvent.change(input, { target: { value: "My Document" } });
|
|
293
|
+
});
|
|
294
|
+
await waitFor(() => {
|
|
295
|
+
expect(input.value).toBe("My Document");
|
|
296
|
+
});
|
|
297
|
+
expect(documentStore.get().title).toBe("My Document");
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
describe("edge cases", () => {
|
|
301
|
+
it("should handle switching between different stores", async () => {
|
|
302
|
+
const store1 = store(1);
|
|
303
|
+
const store2 = store(2);
|
|
304
|
+
let currentStore = store1;
|
|
305
|
+
const { result, rerender } = renderHook(() => useStoreValue(currentStore));
|
|
306
|
+
expect(result.current).toBe(1);
|
|
307
|
+
currentStore = store2;
|
|
308
|
+
rerender();
|
|
309
|
+
await waitFor(() => {
|
|
310
|
+
expect(result.current).toBe(2);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
it("should handle switching from defined to undefined store", async () => {
|
|
314
|
+
const countStore = store(5);
|
|
315
|
+
let storeRef = countStore;
|
|
316
|
+
const { result, rerender } = renderHook(() => useStoreValue(storeRef));
|
|
317
|
+
expect(result.current).toBe(5);
|
|
318
|
+
storeRef = undefined;
|
|
319
|
+
rerender();
|
|
320
|
+
await waitFor(() => {
|
|
321
|
+
expect(result.current).toBe(undefined);
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
it("should handle switching from undefined to defined store", async () => {
|
|
325
|
+
const countStore = store(5);
|
|
326
|
+
let storeRef;
|
|
327
|
+
const { result, rerender } = renderHook(() => useStoreValue(storeRef));
|
|
328
|
+
expect(result.current).toBe(undefined);
|
|
329
|
+
storeRef = countStore;
|
|
330
|
+
rerender();
|
|
331
|
+
await waitFor(() => {
|
|
332
|
+
expect(result.current).toBe(5);
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
it("should handle store with undefined value", () => {
|
|
336
|
+
const undefinedStore = store(undefined);
|
|
337
|
+
const { result } = renderHook(() => useStoreValue(undefinedStore));
|
|
338
|
+
expect(result.current).toBe(undefined);
|
|
339
|
+
});
|
|
340
|
+
it("should handle store with null value", () => {
|
|
341
|
+
const nullStore = store(null);
|
|
342
|
+
const { result } = renderHook(() => useStoreValue(nullStore));
|
|
343
|
+
expect(result.current).toBe(null);
|
|
344
|
+
});
|
|
345
|
+
it("should handle store with empty string", () => {
|
|
346
|
+
const emptyStore = store("");
|
|
347
|
+
const { result } = renderHook(() => useStoreValue(emptyStore));
|
|
348
|
+
expect(result.current).toBe("");
|
|
349
|
+
});
|
|
350
|
+
it("should handle store with zero", () => {
|
|
351
|
+
const zeroStore = store(0);
|
|
352
|
+
const { result } = renderHook(() => useStoreValue(zeroStore));
|
|
353
|
+
expect(result.current).toBe(0);
|
|
354
|
+
});
|
|
355
|
+
it("should handle store with false", () => {
|
|
356
|
+
const falseStore = store(false);
|
|
357
|
+
const { result } = renderHook(() => useStoreValue(falseStore));
|
|
358
|
+
expect(result.current).toBe(false);
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
describe("performance", () => {
|
|
362
|
+
it("should only re-render when subscribed value changes", async () => {
|
|
363
|
+
const objStore = store({ a: 1, b: 2 });
|
|
364
|
+
const aStore = objStore.select("a");
|
|
365
|
+
const renderSpy = vi.fn();
|
|
366
|
+
function ComponentA() {
|
|
367
|
+
const a = useStoreValue(aStore);
|
|
368
|
+
renderSpy();
|
|
369
|
+
return _jsx("div", { children: a });
|
|
370
|
+
}
|
|
371
|
+
render(_jsx(ComponentA, {}));
|
|
372
|
+
const initialRenderCount = renderSpy.mock.calls.length;
|
|
373
|
+
// Change 'b', which component A doesn't care about
|
|
374
|
+
act(() => {
|
|
375
|
+
objStore.set({ a: 1, b: 3 });
|
|
376
|
+
});
|
|
377
|
+
// Should not have re-rendered
|
|
378
|
+
expect(renderSpy.mock.calls.length).toBe(initialRenderCount);
|
|
379
|
+
// Now change 'a'
|
|
380
|
+
act(() => {
|
|
381
|
+
objStore.set({ a: 2, b: 3 });
|
|
382
|
+
});
|
|
383
|
+
await waitFor(() => {
|
|
384
|
+
expect(renderSpy.mock.calls.length).toBe(initialRenderCount + 1);
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
//# sourceMappingURL=react.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.test.js","sourceRoot":"","sources":["../src/react.test.tsx"],"names":[],"mappings":";AAAA,OAAO,EACN,SAAS,EACT,MAAM,EACN,UAAU,EACV,MAAM,EACN,OAAO,GACP,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACvD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACzC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACtC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE/B,GAAG,CAAC,GAAG,EAAE;gBACR,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE/B,GAAG,CAAC,GAAG,EAAE;gBACR,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACR,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACR,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAE7C,GAAG,CAAC,GAAG,EAAE;gBACR,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAE1B,SAAS,aAAa;gBACrB,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;gBACxC,SAAS,EAAE,CAAC;gBACZ,OAAO,wBAAM,KAAK,GAAO,CAAC;YAC3B,CAAC;YAED,MAAM,CAAC,KAAC,aAAa,KAAG,CAAC,CAAC;YAE1B,MAAM,kBAAkB,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAEvD,GAAG,CAAC,GAAG,EAAE;gBACR,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAErC,GAAG,CAAC,GAAG,EAAE;gBACR,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAErC,GAAG,CAAC,GAAG,EAAE;gBACR,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAE1B,SAAS,aAAa;gBACrB,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;gBACtC,SAAS,EAAE,CAAC;gBACZ,OAAO,wBAAM,IAAI,GAAO,CAAC;YAC1B,CAAC;YAED,MAAM,CAAC,KAAC,aAAa,KAAG,CAAC,CAAC;YAE1B,MAAM,kBAAkB,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAEvD,GAAG,CAAC,GAAG,EAAE;gBACR,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,EAAE;oBACL,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;iBAC3B;aACD,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;YAEtD,GAAG,CAAC,GAAG,EAAE;gBACR,SAAS,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE5B,SAAS,QAAQ;gBAChB,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;gBACxC,OAAO,6BAAiB,UAAU,YAAE,KAAK,GAAO,CAAC;YAClD,CAAC;YAED,SAAS,QAAQ;gBAChB,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;gBACxC,OAAO,6BAAiB,UAAU,YAAE,KAAK,GAAO,CAAC;YAClD,CAAC;YAED,MAAM,CACL,8BACC,KAAC,QAAQ,KAAG,EACZ,KAAC,QAAQ,KAAG,IACV,CACH,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAE9D,eAAe;YACf,GAAG,CAAC,GAAG,EAAE;gBACR,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YAEH,oDAAoD;YACpD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;YACvF,MAAM,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,EAAE,OAAO;gBACb,GAAG,EAAE,EAAE;aACP,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzC,SAAS,WAAW;gBACnB,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;gBACtC,OAAO,6BAAiB,MAAM,YAAE,IAAI,GAAO,CAAC;YAC7C,CAAC;YAED,SAAS,UAAU;gBAClB,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACpC,OAAO,6BAAiB,KAAK,YAAE,GAAG,GAAO,CAAC;YAC3C,CAAC;YAED,MAAM,CACL,8BACC,KAAC,WAAW,KAAG,EACf,KAAC,UAAU,KAAG,IACZ,CACH,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE1D,GAAG,CAAC,GAAG,EAAE;gBACR,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YAExE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE/B,OAAO,EAAE,CAAC;YAEV,2DAA2D;YAC3D,GAAG,CAAC,GAAG,EAAE;gBACR,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,iCAAiC;YACjC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YACnD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;gBAChE,OAAO,EAAE,CAAC;YACX,CAAC;YAED,iCAAiC;YACjC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE9B,SAAS,OAAO;gBACf,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;gBAC5C,OAAO,CACN,iBACC,IAAI,EAAC,QAAQ,iBACD,aAAa,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAE5C,OAAO,GACA,CACT,CAAC;YACH,CAAC;YAED,MAAM,CAAC,KAAC,OAAO,KAAG,CAAC,CAAC;YAEpB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAEjE,GAAG,CAAC,GAAG,EAAE;gBACR,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE;gBACR,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,aAAa,GAAG,KAAK,CAAC;gBAC3B,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;gBACvB,IAAI,EAAE;oBACL,KAAK,EAAE,CAAC;oBACR,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;iBAC3B;aACD,CAAC,CAAC;YAEH,SAAS,QAAQ;gBAChB,MAAM,GAAG,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;gBACzC,OAAO,CACN,0BACC,8BAAkB,OAAO,YAAE,GAAG,CAAC,KAAK,GAAQ,EAC5C,8BAAkB,MAAM,YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAQ,IACrD,CACN,CAAC;YACH,CAAC;YAED,MAAM,CAAC,KAAC,QAAQ,KAAG,CAAC,CAAC;YAErB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,aAAa,GAAG,KAAK,CAAC;gBAC3B,KAAK,EAAE,UAAU;gBACjB,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;aACzB,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEjD,SAAS,KAAK;gBACb,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;gBACxC,OAAO,CACN,+BACa,aAAa,EACzB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAC9C,CACF,CAAC;YACH,CAAC;YAED,MAAM,CAAC,KAAC,KAAK,KAAG,CAAC,CAAC;YAElB,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,aAAa,CAAqB,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAErC,GAAG,CAAC,GAAG,EAAE;gBACR,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAExB,IAAI,YAAY,GAAG,MAAM,CAAC;YAE1B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAC5C,aAAa,CAAC,YAAY,CAAC,CAC3B,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE/B,YAAY,GAAG,MAAM,CAAC;YACtB,QAAQ,EAAE,CAAC;YAEX,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,QAAQ,GAAkC,UAAU,CAAC;YAEzD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE/B,QAAQ,GAAG,SAAS,CAAC;YACrB,QAAQ,EAAE,CAAC;YAEX,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,QAAuC,CAAC;YAE5C,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEvC,QAAQ,GAAG,UAAU,CAAC;YACtB,QAAQ,EAAE,CAAC;YAEX,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YACnD,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAChD,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACxC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACzC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEpC,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAE1B,SAAS,UAAU;gBAClB,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;gBAChC,SAAS,EAAE,CAAC;gBACZ,OAAO,wBAAM,CAAC,GAAO,CAAC;YACvB,CAAC;YAED,MAAM,CAAC,KAAC,UAAU,KAAG,CAAC,CAAC;YAEvB,MAAM,kBAAkB,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAEvD,mDAAmD;YACnD,GAAG,CAAC,GAAG,EAAE;gBACR,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,8BAA8B;YAC9B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAE7D,iBAAiB;YACjB,GAAG,CAAC,GAAG,EAAE;gBACR,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,EAAE;gBAClB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.d.ts","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper to wait for signal-polyfill's batched reactive updates to complete.
|
|
3
|
+
* After store.set(), reactive effects are queued in a microtask and run asynchronously.
|
|
4
|
+
*/
|
|
5
|
+
export declare const nextTick: () => Promise<void>;
|
|
6
|
+
//# sourceMappingURL=test-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,QAAQ,qBAEpB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper to wait for signal-polyfill's batched reactive updates to complete.
|
|
3
|
+
* After store.set(), reactive effects are queued in a microtask and run asynchronously.
|
|
4
|
+
*/
|
|
5
|
+
export const nextTick = () => {
|
|
6
|
+
return new Promise((resolve) => queueMicrotask(resolve));
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=test-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC5B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;AAChE,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplestack/store",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "A simple storage solution for React",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,16 +29,21 @@
|
|
|
29
29
|
"url": "https://github.com/bholmesdev/simplestack-store.git"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@biomejs/biome": "2.
|
|
33
|
-
"@
|
|
34
|
-
"react": "^
|
|
35
|
-
"
|
|
32
|
+
"@biomejs/biome": "2.3.3",
|
|
33
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
34
|
+
"@testing-library/react": "^16.3.0",
|
|
35
|
+
"@types/react": "^19.2.2",
|
|
36
|
+
"@vitest/ui": "^4.0.6",
|
|
37
|
+
"happy-dom": "^20.0.10",
|
|
38
|
+
"react": "^19.2.0",
|
|
39
|
+
"typescript": "^5.9.3",
|
|
40
|
+
"vitest": "^4.0.6"
|
|
36
41
|
},
|
|
37
42
|
"dependencies": {
|
|
38
43
|
"signal-polyfill": "^0.2.2"
|
|
39
44
|
},
|
|
40
45
|
"peerDependencies": {
|
|
41
|
-
"react": "^
|
|
46
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
42
47
|
},
|
|
43
48
|
"peerDependenciesMeta": {
|
|
44
49
|
"react": {
|
|
@@ -61,6 +66,9 @@
|
|
|
61
66
|
"scripts": {
|
|
62
67
|
"build": "tsc",
|
|
63
68
|
"dev": "tsc -w",
|
|
64
|
-
"check": "biome check"
|
|
69
|
+
"check": "biome check",
|
|
70
|
+
"check:fix": "biome check --write .",
|
|
71
|
+
"test": "vitest run",
|
|
72
|
+
"test:ui": "vitest --ui"
|
|
65
73
|
}
|
|
66
74
|
}
|