@veams/status-quo 1.0.0 → 1.2.0

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 (68) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +420 -130
  3. package/assets/statusquo-logo.png +0 -0
  4. package/dist/hooks/__tests__/state-selector.spec.d.ts +4 -0
  5. package/dist/hooks/__tests__/state-selector.spec.js +384 -0
  6. package/dist/hooks/__tests__/state-selector.spec.js.map +1 -0
  7. package/dist/hooks/__tests__/state-singleton.spec.d.ts +4 -0
  8. package/dist/hooks/__tests__/state-singleton.spec.js +97 -0
  9. package/dist/hooks/__tests__/state-singleton.spec.js.map +1 -0
  10. package/dist/hooks/index.d.ts +3 -0
  11. package/dist/hooks/index.js +3 -0
  12. package/dist/hooks/index.js.map +1 -1
  13. package/dist/hooks/state-actions.d.ts +2 -0
  14. package/dist/hooks/state-actions.js +5 -0
  15. package/dist/hooks/state-actions.js.map +1 -0
  16. package/dist/hooks/state-factory.d.ts +5 -0
  17. package/dist/hooks/state-factory.js +10 -6
  18. package/dist/hooks/state-factory.js.map +1 -1
  19. package/dist/hooks/state-handler.d.ts +2 -0
  20. package/dist/hooks/state-handler.js +9 -0
  21. package/dist/hooks/state-handler.js.map +1 -0
  22. package/dist/hooks/state-singleton.d.ts +4 -0
  23. package/dist/hooks/state-singleton.js +3 -5
  24. package/dist/hooks/state-singleton.js.map +1 -1
  25. package/dist/hooks/state-subscription-selector.d.ts +5 -0
  26. package/dist/hooks/state-subscription-selector.js +29 -0
  27. package/dist/hooks/state-subscription-selector.js.map +1 -0
  28. package/dist/hooks/state-subscription.d.ts +8 -1
  29. package/dist/hooks/state-subscription.js +49 -10
  30. package/dist/hooks/state-subscription.js.map +1 -1
  31. package/dist/index.d.ts +4 -4
  32. package/dist/index.js +2 -2
  33. package/dist/index.js.map +1 -1
  34. package/dist/store/__tests__/observable-state-handler.spec.js +4 -0
  35. package/dist/store/__tests__/observable-state-handler.spec.js.map +1 -1
  36. package/dist/store/base-state-handler.d.ts +4 -0
  37. package/dist/store/base-state-handler.js +6 -0
  38. package/dist/store/base-state-handler.js.map +1 -1
  39. package/dist/store/index.d.ts +1 -1
  40. package/dist/store/observable-state-handler.d.ts +2 -0
  41. package/dist/store/observable-state-handler.js +5 -1
  42. package/dist/store/observable-state-handler.js.map +1 -1
  43. package/dist/store/state-singleton.d.ts +4 -1
  44. package/dist/store/state-singleton.js +11 -2
  45. package/dist/store/state-singleton.js.map +1 -1
  46. package/docs/assets/index-Ci4A1zSh.js +187 -0
  47. package/docs/assets/index-WFTLEHd3.css +1 -0
  48. package/docs/assets/statusquo-logo-8GVRbxpc.png +0 -0
  49. package/docs/index.html +13 -0
  50. package/package.json +1 -1
  51. package/playground/src/App.tsx +284 -81
  52. package/playground/src/assets/statusquo-logo.png +0 -0
  53. package/playground/src/styles.css +137 -6
  54. package/src/hooks/__tests__/state-selector.spec.tsx +607 -0
  55. package/src/hooks/__tests__/state-singleton.spec.tsx +151 -0
  56. package/src/hooks/index.ts +3 -0
  57. package/src/hooks/state-actions.tsx +7 -0
  58. package/src/hooks/state-factory.tsx +32 -6
  59. package/src/hooks/state-handler.tsx +16 -0
  60. package/src/hooks/state-singleton.tsx +17 -7
  61. package/src/hooks/state-subscription-selector.tsx +70 -0
  62. package/src/hooks/state-subscription.tsx +98 -21
  63. package/src/index.ts +12 -3
  64. package/src/store/__tests__/observable-state-handler.spec.ts +6 -0
  65. package/src/store/base-state-handler.ts +9 -0
  66. package/src/store/index.ts +1 -1
  67. package/src/store/observable-state-handler.ts +6 -1
  68. package/src/store/state-singleton.ts +21 -3
@@ -0,0 +1,384 @@
1
+ import React from 'react';
2
+ import { act } from 'react';
3
+ import { createRoot } from 'react-dom/client';
4
+ import { makeStateSingleton } from '../../store/state-singleton.js';
5
+ import { useStateActions } from '../state-actions.js';
6
+ import { useStateFactory } from '../state-factory.js';
7
+ import { useStateHandler } from '../state-handler.js';
8
+ import { useStateSingleton } from '../state-singleton.js';
9
+ import { useStateSubscription } from '../state-subscription.js';
10
+ class TestStateHandler {
11
+ initialState;
12
+ state;
13
+ listeners = new Set();
14
+ destroy = jest.fn();
15
+ constructor(initialState) {
16
+ this.initialState = initialState;
17
+ this.state = initialState;
18
+ }
19
+ subscribe = (listener) => {
20
+ this.listeners.add(listener);
21
+ return () => {
22
+ this.listeners.delete(listener);
23
+ };
24
+ };
25
+ getSnapshot = () => {
26
+ return this.state;
27
+ };
28
+ getInitialState = () => {
29
+ return this.initialState;
30
+ };
31
+ getActions = () => {
32
+ return {
33
+ setName: (name) => {
34
+ this.state = {
35
+ ...this.state,
36
+ user: {
37
+ ...this.state.user,
38
+ name,
39
+ },
40
+ };
41
+ this.emitStateChange();
42
+ },
43
+ increment: () => {
44
+ this.state = {
45
+ ...this.state,
46
+ counter: this.state.counter + 1,
47
+ };
48
+ this.emitStateChange();
49
+ },
50
+ };
51
+ };
52
+ emitStateChange() {
53
+ this.listeners.forEach((listener) => listener());
54
+ }
55
+ }
56
+ const ComposedHooksConsumer = ({ createStateHandler, onStateRender, onActionsReady, }) => {
57
+ const stateHandler = useStateHandler(createStateHandler, []);
58
+ const actions = useStateActions(stateHandler);
59
+ const [userName] = useStateSubscription(stateHandler, (state) => state.user.name);
60
+ onActionsReady(actions);
61
+ onStateRender(userName);
62
+ return React.createElement("span", null, userName);
63
+ };
64
+ const ActionsOnlyConsumer = ({ createStateHandler, onRender, onActionsReady }) => {
65
+ const stateHandler = useStateHandler(createStateHandler, []);
66
+ const actions = useStateActions(stateHandler);
67
+ onRender();
68
+ onActionsReady(actions);
69
+ return React.createElement("span", null, "actions-only");
70
+ };
71
+ const FactoryShortcutConsumer = ({ createStateHandler, onRender }) => {
72
+ const [userName] = useStateFactory(createStateHandler, (state) => state.user.name, Object.is, []);
73
+ onRender(userName);
74
+ return React.createElement("span", null, userName);
75
+ };
76
+ const FactoryShortcutWithoutEqualityConsumer = ({ createStateHandler, onRender, }) => {
77
+ const [userName] = useStateFactory(createStateHandler, (state) => state.user.name, []);
78
+ onRender(userName);
79
+ return React.createElement("span", null, userName);
80
+ };
81
+ const SingletonShortcutConsumer = ({ singleton, onRender }) => {
82
+ const [userName] = useStateSingleton(singleton, (state) => state.user.name);
83
+ onRender(userName);
84
+ return React.createElement("span", null, userName);
85
+ };
86
+ const SingletonSubscriptionConsumer = ({ singleton, onRender, onActionsReady, }) => {
87
+ const [name, actions] = useStateSubscription(singleton, (state) => state.user.name);
88
+ onRender(name);
89
+ onActionsReady(actions);
90
+ return React.createElement("span", null, name);
91
+ };
92
+ const FullSubscriptionConsumer = ({ createStateHandler, onRender, onActionsReady, }) => {
93
+ const stateHandler = useStateHandler(createStateHandler, []);
94
+ const [state, actions] = useStateSubscription(stateHandler);
95
+ onRender(state);
96
+ onActionsReady(actions);
97
+ return React.createElement("span", null, state.user.name);
98
+ };
99
+ describe('Selector hooks', () => {
100
+ let container;
101
+ let root;
102
+ beforeAll(() => {
103
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
104
+ });
105
+ beforeEach(() => {
106
+ container = document.createElement('div');
107
+ document.body.appendChild(container);
108
+ root = createRoot(container);
109
+ });
110
+ afterEach(() => {
111
+ act(() => {
112
+ root.unmount();
113
+ });
114
+ container.remove();
115
+ });
116
+ afterAll(() => {
117
+ globalThis.IS_REACT_ACT_ENVIRONMENT = false;
118
+ });
119
+ it('useStateFactory selector should only rerender when selected state changes', () => {
120
+ let stateHandler = null;
121
+ const createStateHandler = jest.fn(() => {
122
+ if (!stateHandler) {
123
+ stateHandler = new TestStateHandler({
124
+ user: { name: 'Ada' },
125
+ counter: 0,
126
+ });
127
+ }
128
+ return stateHandler;
129
+ });
130
+ const renderSpy = jest.fn();
131
+ act(() => {
132
+ root.render(React.createElement(FactoryShortcutConsumer, { createStateHandler: createStateHandler, onRender: renderSpy }));
133
+ });
134
+ expect(stateHandler).not.toBeNull();
135
+ expect(renderSpy).toHaveBeenCalledTimes(1);
136
+ expect(renderSpy).toHaveBeenLastCalledWith('Ada');
137
+ act(() => {
138
+ stateHandler.getActions().increment();
139
+ });
140
+ expect(renderSpy).toHaveBeenCalledTimes(1);
141
+ act(() => {
142
+ stateHandler.getActions().setName('Grace');
143
+ });
144
+ expect(renderSpy).toHaveBeenCalledTimes(2);
145
+ expect(renderSpy).toHaveBeenLastCalledWith('Grace');
146
+ expect(createStateHandler).toHaveBeenCalledTimes(1);
147
+ act(() => {
148
+ root.render(React.createElement(React.Fragment, null));
149
+ });
150
+ expect(stateHandler.destroy).toHaveBeenCalledTimes(1);
151
+ });
152
+ it('composed hook interface should support selector subscription and actions', () => {
153
+ let stateHandler = null;
154
+ const createStateHandler = jest.fn(() => {
155
+ if (!stateHandler) {
156
+ stateHandler = new TestStateHandler({
157
+ user: { name: 'Ada' },
158
+ counter: 0,
159
+ });
160
+ }
161
+ return stateHandler;
162
+ });
163
+ const stateRenderSpy = jest.fn();
164
+ const actionsReadySpy = jest.fn();
165
+ act(() => {
166
+ root.render(React.createElement(ComposedHooksConsumer, { createStateHandler: createStateHandler, onStateRender: stateRenderSpy, onActionsReady: actionsReadySpy }));
167
+ });
168
+ expect(stateRenderSpy).toHaveBeenCalledTimes(1);
169
+ expect(stateRenderSpy).toHaveBeenLastCalledWith('Ada');
170
+ expect(actionsReadySpy).toHaveBeenCalledTimes(1);
171
+ act(() => {
172
+ stateHandler.getActions().increment();
173
+ });
174
+ expect(stateRenderSpy).toHaveBeenCalledTimes(1);
175
+ act(() => {
176
+ stateHandler.getActions().setName('Grace');
177
+ });
178
+ expect(stateRenderSpy).toHaveBeenCalledTimes(2);
179
+ expect(stateRenderSpy).toHaveBeenLastCalledWith('Grace');
180
+ expect(actionsReadySpy).toHaveBeenCalledTimes(2);
181
+ expect(createStateHandler).toHaveBeenCalledTimes(1);
182
+ });
183
+ it('useStateActions should not subscribe when used without useStateSubscription', () => {
184
+ let stateHandler = null;
185
+ const createStateHandler = jest.fn(() => {
186
+ if (!stateHandler) {
187
+ stateHandler = new TestStateHandler({
188
+ user: { name: 'Ada' },
189
+ counter: 0,
190
+ });
191
+ }
192
+ return stateHandler;
193
+ });
194
+ const renderSpy = jest.fn();
195
+ const actionsReadySpy = jest.fn();
196
+ act(() => {
197
+ root.render(React.createElement(ActionsOnlyConsumer, { createStateHandler: createStateHandler, onRender: renderSpy, onActionsReady: actionsReadySpy }));
198
+ });
199
+ const actions = actionsReadySpy.mock.calls[0][0];
200
+ act(() => {
201
+ actions.increment();
202
+ actions.setName('Grace');
203
+ });
204
+ expect(renderSpy).toHaveBeenCalledTimes(1);
205
+ expect(createStateHandler).toHaveBeenCalledTimes(1);
206
+ });
207
+ it('useStateFactory shortcut should support selector, equality and params as last argument', () => {
208
+ let stateHandler = null;
209
+ const createStateHandler = jest.fn(() => {
210
+ if (!stateHandler) {
211
+ stateHandler = new TestStateHandler({
212
+ user: { name: 'Ada' },
213
+ counter: 0,
214
+ });
215
+ }
216
+ return stateHandler;
217
+ });
218
+ const renderSpy = jest.fn();
219
+ act(() => {
220
+ root.render(React.createElement(FactoryShortcutConsumer, { createStateHandler: createStateHandler, onRender: renderSpy }));
221
+ });
222
+ act(() => {
223
+ stateHandler.getActions().increment();
224
+ });
225
+ expect(renderSpy).toHaveBeenCalledTimes(1);
226
+ expect(createStateHandler).toHaveBeenCalledTimes(1);
227
+ });
228
+ it('useStateFactory should support selector and params without custom equality', () => {
229
+ let stateHandler = null;
230
+ const createStateHandler = jest.fn(() => {
231
+ if (!stateHandler) {
232
+ stateHandler = new TestStateHandler({
233
+ user: { name: 'Ada' },
234
+ counter: 0,
235
+ });
236
+ }
237
+ return stateHandler;
238
+ });
239
+ const renderSpy = jest.fn();
240
+ act(() => {
241
+ root.render(React.createElement(FactoryShortcutWithoutEqualityConsumer, { createStateHandler: createStateHandler, onRender: renderSpy }));
242
+ });
243
+ act(() => {
244
+ stateHandler.getActions().increment();
245
+ });
246
+ expect(renderSpy).toHaveBeenCalledTimes(1);
247
+ act(() => {
248
+ stateHandler.getActions().setName('Grace');
249
+ });
250
+ expect(renderSpy).toHaveBeenCalledTimes(2);
251
+ });
252
+ it('useStateSubscription should return full snapshot when no selector is provided', () => {
253
+ let stateHandler = null;
254
+ const createStateHandler = jest.fn(() => {
255
+ if (!stateHandler) {
256
+ stateHandler = new TestStateHandler({
257
+ user: { name: 'Ada' },
258
+ counter: 0,
259
+ });
260
+ }
261
+ return stateHandler;
262
+ });
263
+ const renderSpy = jest.fn();
264
+ const actionsReadySpy = jest.fn();
265
+ act(() => {
266
+ root.render(React.createElement(FullSubscriptionConsumer, { createStateHandler: createStateHandler, onRender: renderSpy, onActionsReady: actionsReadySpy }));
267
+ });
268
+ expect(renderSpy).toHaveBeenLastCalledWith({
269
+ user: { name: 'Ada' },
270
+ counter: 0,
271
+ });
272
+ const actions = actionsReadySpy.mock.calls[0][0];
273
+ act(() => {
274
+ actions.increment();
275
+ });
276
+ expect(renderSpy).toHaveBeenLastCalledWith({
277
+ user: { name: 'Ada' },
278
+ counter: 1,
279
+ });
280
+ });
281
+ it('useStateSingleton selector should keep singleton alive while consumers exist', () => {
282
+ const stateHandler = new TestStateHandler({
283
+ user: { name: 'Ada' },
284
+ counter: 0,
285
+ });
286
+ const singleton = makeStateSingleton(() => stateHandler);
287
+ const firstRenderSpy = jest.fn();
288
+ const secondRenderSpy = jest.fn();
289
+ act(() => {
290
+ root.render(React.createElement(React.Fragment, null,
291
+ React.createElement(SingletonShortcutConsumer, { singleton: singleton, onRender: firstRenderSpy }),
292
+ React.createElement(SingletonShortcutConsumer, { singleton: singleton, onRender: secondRenderSpy })));
293
+ });
294
+ act(() => {
295
+ stateHandler.getActions().increment();
296
+ });
297
+ expect(firstRenderSpy).toHaveBeenCalledTimes(1);
298
+ expect(secondRenderSpy).toHaveBeenCalledTimes(1);
299
+ act(() => {
300
+ stateHandler.getActions().setName('Linus');
301
+ });
302
+ expect(firstRenderSpy).toHaveBeenCalledTimes(2);
303
+ expect(secondRenderSpy).toHaveBeenCalledTimes(2);
304
+ act(() => {
305
+ root.render(React.createElement(SingletonShortcutConsumer, { singleton: singleton, onRender: firstRenderSpy }));
306
+ });
307
+ expect(stateHandler.destroy).not.toHaveBeenCalled();
308
+ act(() => {
309
+ root.render(React.createElement(React.Fragment, null));
310
+ });
311
+ expect(stateHandler.destroy).toHaveBeenCalledTimes(1);
312
+ });
313
+ it('useStateSingleton shortcut should support selector without rerender fanout', () => {
314
+ const stateHandler = new TestStateHandler({
315
+ user: { name: 'Ada' },
316
+ counter: 0,
317
+ });
318
+ const singleton = makeStateSingleton(() => stateHandler);
319
+ const renderSpy = jest.fn();
320
+ act(() => {
321
+ root.render(React.createElement(SingletonShortcutConsumer, { singleton: singleton, onRender: renderSpy }));
322
+ });
323
+ act(() => {
324
+ stateHandler.getActions().increment();
325
+ });
326
+ expect(renderSpy).toHaveBeenCalledTimes(1);
327
+ act(() => {
328
+ stateHandler.getActions().setName('Grace');
329
+ });
330
+ expect(renderSpy).toHaveBeenCalledTimes(2);
331
+ });
332
+ it('useStateSubscription should accept singleton sources directly', () => {
333
+ const stateHandler = new TestStateHandler({
334
+ user: { name: 'Ada' },
335
+ counter: 0,
336
+ });
337
+ const singleton = makeStateSingleton(() => stateHandler);
338
+ const renderSpy = jest.fn();
339
+ const actionsReadySpy = jest.fn();
340
+ act(() => {
341
+ root.render(React.createElement(SingletonSubscriptionConsumer, { singleton: singleton, onRender: renderSpy, onActionsReady: actionsReadySpy }));
342
+ });
343
+ const actions = actionsReadySpy.mock.calls[0][0];
344
+ act(() => {
345
+ actions.increment();
346
+ });
347
+ expect(renderSpy).toHaveBeenCalledTimes(1);
348
+ act(() => {
349
+ actions.setName('Grace');
350
+ });
351
+ expect(renderSpy).toHaveBeenCalledTimes(2);
352
+ });
353
+ it('useStateSingleton selector should respect destroyOnNoConsumers false', () => {
354
+ const firstHandler = new TestStateHandler({
355
+ user: { name: 'Ada' },
356
+ counter: 0,
357
+ });
358
+ const secondHandler = new TestStateHandler({
359
+ user: { name: 'Grace' },
360
+ counter: 0,
361
+ });
362
+ const createStateHandler = jest
363
+ .fn(() => firstHandler)
364
+ .mockReturnValueOnce(firstHandler)
365
+ .mockReturnValueOnce(secondHandler);
366
+ const singleton = makeStateSingleton(createStateHandler, {
367
+ destroyOnNoConsumers: false,
368
+ });
369
+ const renderSpy = jest.fn();
370
+ act(() => {
371
+ root.render(React.createElement(SingletonShortcutConsumer, { singleton: singleton, onRender: renderSpy }));
372
+ });
373
+ act(() => {
374
+ root.render(React.createElement(React.Fragment, null));
375
+ });
376
+ expect(firstHandler.destroy).not.toHaveBeenCalled();
377
+ act(() => {
378
+ root.render(React.createElement(SingletonShortcutConsumer, { singleton: singleton, onRender: renderSpy }));
379
+ });
380
+ expect(createStateHandler).toHaveBeenCalledTimes(1);
381
+ expect(renderSpy).toHaveBeenLastCalledWith('Ada');
382
+ });
383
+ });
384
+ //# sourceMappingURL=state-selector.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-selector.spec.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/state-selector.spec.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAuBhE,MAAM,gBAAgB;IACH,YAAY,CAAY;IACjC,KAAK,CAAY;IACR,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAEnD,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAEpB,YAAY,YAAuB;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;IAC5B,CAAC;IAED,SAAS,GAAG,CAAC,QAAoB,EAAE,EAAE;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,WAAW,GAAG,GAAG,EAAE;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC,CAAC;IAEF,eAAe,GAAG,GAAG,EAAE;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC,CAAC;IAEF,UAAU,GAAG,GAAG,EAAE;QAChB,OAAO;YACL,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE;gBACxB,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,IAAI,EAAE;wBACJ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;wBAClB,IAAI;qBACL;iBACF,CAAC;gBAEF,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC;YACD,SAAS,EAAE,GAAG,EAAE;gBACd,IAAI,CAAC,KAAK,GAAG;oBACX,GAAG,IAAI,CAAC,KAAK;oBACb,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC;iBAChC,CAAC;gBAEF,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;IAEM,eAAe;QACrB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;CACF;AAQD,MAAM,qBAAqB,GAAG,CAAC,EAC7B,kBAAkB,EAClB,aAAa,EACb,cAAc,GACa,EAAE,EAAE;IAC/B,MAAM,YAAY,GAAG,eAAe,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,CAAC,QAAQ,CAAC,GAAG,oBAAoB,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElF,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,aAAa,CAAC,QAAQ,CAAC,CAAC;IAExB,OAAO,kCAAO,QAAQ,CAAQ,CAAC;AACjC,CAAC,CAAC;AAQF,MAAM,mBAAmB,GAAG,CAAC,EAAE,kBAAkB,EAAE,QAAQ,EAAE,cAAc,EAA4B,EAAE,EAAE;IACzG,MAAM,YAAY,GAAG,eAAe,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAE9C,QAAQ,EAAE,CAAC;IACX,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,iDAAyB,CAAC;AACnC,CAAC,CAAC;AAOF,MAAM,uBAAuB,GAAG,CAAC,EAAE,kBAAkB,EAAE,QAAQ,EAAgC,EAAE,EAAE;IACjG,MAAM,CAAC,QAAQ,CAAC,GAAG,eAAe,CAChC,kBAAkB,EAClB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAC1B,MAAM,CAAC,EAAE,EACT,EAAE,CACH,CAAC;IACF,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEnB,OAAO,kCAAO,QAAQ,CAAQ,CAAC;AACjC,CAAC,CAAC;AAOF,MAAM,sCAAsC,GAAG,CAAC,EAC9C,kBAAkB,EAClB,QAAQ,GACoC,EAAE,EAAE;IAChD,MAAM,CAAC,QAAQ,CAAC,GAAG,eAAe,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvF,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEnB,OAAO,kCAAO,QAAQ,CAAQ,CAAC;AACjC,CAAC,CAAC;AAOF,MAAM,yBAAyB,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAkC,EAAE,EAAE;IAC5F,MAAM,CAAC,QAAQ,CAAC,GAAG,iBAAiB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEnB,OAAO,kCAAO,QAAQ,CAAQ,CAAC;AACjC,CAAC,CAAC;AAQF,MAAM,6BAA6B,GAAG,CAAC,EACrC,SAAS,EACT,QAAQ,EACR,cAAc,GACqB,EAAE,EAAE;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpF,QAAQ,CAAC,IAAI,CAAC,CAAC;IACf,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,kCAAO,IAAI,CAAQ,CAAC;AAC7B,CAAC,CAAC;AAQF,MAAM,wBAAwB,GAAG,CAAC,EAChC,kBAAkB,EAClB,QAAQ,EACR,cAAc,GACgB,EAAE,EAAE;IAClC,MAAM,YAAY,GAAG,eAAe,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAE5D,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChB,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,kCAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAQ,CAAC;AACxC,CAAC,CAAC;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,SAAyB,CAAC;IAC9B,IAAI,IAAmC,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,UAAU,CAAC,wBAAwB,GAAG,KAAK,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,YAAY,GAAG,IAAI,gBAAgB,CAAC;oBAClC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;oBACrB,OAAO,EAAE,CAAC;iBACX,CAAC,CAAC;YACL,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAE5B,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CACT,oBAAC,uBAAuB,IAAC,kBAAkB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,GAAI,CACzF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAEpC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAElD,GAAG,CAAC,GAAG,EAAE;YACP,YAAa,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE3C,GAAG,CAAC,GAAG,EAAE;YACP,YAAa,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEpD,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,yCAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,YAAa,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,YAAY,GAAG,IAAI,gBAAgB,CAAC;oBAClC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;oBACrB,OAAO,EAAE,CAAC;iBACX,CAAC,CAAC;YACL,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAElC,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CACT,oBAAC,qBAAqB,IACpB,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,cAAc,EAC7B,cAAc,EAAE,eAAe,GAC/B,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEjD,GAAG,CAAC,GAAG,EAAE;YACP,YAAa,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEhD,GAAG,CAAC,GAAG,EAAE;YACP,YAAa,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,YAAY,GAAG,IAAI,gBAAgB,CAAC;oBAClC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;oBACrB,OAAO,EAAE,CAAC;iBACX,CAAC,CAAC;YACL,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAElC,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CACT,oBAAC,mBAAmB,IAClB,kBAAkB,EAAE,kBAAkB,EACtC,QAAQ,EAAE,SAAS,EACnB,cAAc,EAAE,eAAe,GAC/B,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC;QAEhE,GAAG,CAAC,GAAG,EAAE;YACP,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,YAAY,GAAG,IAAI,gBAAgB,CAAC;oBAClC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;oBACrB,OAAO,EAAE,CAAC;iBACX,CAAC,CAAC;YACL,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAE5B,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,uBAAuB,IAAC,kBAAkB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,GAAI,CAAC,CAAC;QACxG,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE;YACP,YAAa,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,YAAY,GAAG,IAAI,gBAAgB,CAAC;oBAClC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;oBACrB,OAAO,EAAE,CAAC;iBACX,CAAC,CAAC;YACL,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAE5B,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CACT,oBAAC,sCAAsC,IACrC,kBAAkB,EAAE,kBAAkB,EACtC,QAAQ,EAAE,SAAS,GACnB,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE;YACP,YAAa,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE3C,GAAG,CAAC,GAAG,EAAE;YACP,YAAa,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,IAAI,YAAY,GAA4B,IAAI,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,YAAY,GAAG,IAAI,gBAAgB,CAAC;oBAClC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;oBACrB,OAAO,EAAE,CAAC;iBACX,CAAC,CAAC;YACL,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAElC,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CACT,oBAAC,wBAAwB,IACvB,kBAAkB,EAAE,kBAAkB,EACtC,QAAQ,EAAE,SAAS,EACnB,cAAc,EAAE,eAAe,GAC/B,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC;YACzC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACrB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC;QAEhE,GAAG,CAAC,GAAG,EAAE;YACP,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC;YACzC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACrB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC;YACxC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACrB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAElC,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CACT;gBACE,oBAAC,yBAAyB,IAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAI;gBAC7E,oBAAC,yBAAyB,IAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,GAAI,CAC7E,CACJ,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE;YACP,YAAY,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEjD,GAAG,CAAC,GAAG,EAAE;YACP,YAAY,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEjD,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,yBAAyB,IAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAI,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEpD,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,yCAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC;YACxC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACrB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAE5B,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,yBAAyB,IAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,GAAI,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE;YACP,YAAY,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE3C,GAAG,CAAC,GAAG,EAAE;YACP,YAAY,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC;YACxC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACrB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAElC,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CACT,oBAAC,6BAA6B,IAC5B,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,SAAS,EACnB,cAAc,EAAE,eAAe,GAC/B,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC;QAEhE,GAAG,CAAC,GAAG,EAAE;YACP,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE3C,GAAG,CAAC,GAAG,EAAE;YACP,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,YAAY,GAAG,IAAI,gBAAgB,CAAC;YACxC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACrB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,gBAAgB,CAAC;YACzC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;YACvB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,MAAM,kBAAkB,GAAG,IAAI;aAC5B,EAAE,CAAC,GAAG,EAAE,CAAC,YAAgE,CAAC;aAC1E,mBAAmB,CAAC,YAAY,CAAC;aACjC,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,kBAAkB,CAAyB,kBAAkB,EAAE;YAC/E,oBAAoB,EAAE,KAAK;SAC5B,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAE5B,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,yBAAyB,IAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,GAAI,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,yCAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEpD,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,oBAAC,yBAAyB,IAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,GAAI,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ declare global {
2
+ var IS_REACT_ACT_ENVIRONMENT: boolean;
3
+ }
4
+ export {};
@@ -0,0 +1,97 @@
1
+ import React from 'react';
2
+ import { act } from 'react';
3
+ import { createRoot } from 'react-dom/client';
4
+ import { useStateSingleton } from '../state-singleton.js';
5
+ import { makeStateSingleton } from '../../store';
6
+ const createStateHandler = (value) => {
7
+ const snapshot = { value };
8
+ const actions = { noop: jest.fn() };
9
+ return {
10
+ subscribe: () => () => undefined,
11
+ getSnapshot: () => snapshot,
12
+ getInitialState: () => snapshot,
13
+ getActions: () => actions,
14
+ destroy: jest.fn(),
15
+ };
16
+ };
17
+ const SingletonConsumer = ({ singleton }) => {
18
+ useStateSingleton(singleton);
19
+ return null;
20
+ };
21
+ describe('useStateSingleton', () => {
22
+ let container;
23
+ let root;
24
+ beforeAll(() => {
25
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
26
+ });
27
+ beforeEach(() => {
28
+ container = document.createElement('div');
29
+ document.body.appendChild(container);
30
+ root = createRoot(container);
31
+ });
32
+ afterEach(() => {
33
+ act(() => {
34
+ root.unmount();
35
+ });
36
+ container.remove();
37
+ });
38
+ afterAll(() => {
39
+ globalThis.IS_REACT_ACT_ENVIRONMENT = false;
40
+ });
41
+ it('should keep singleton alive while at least one consumer is mounted', () => {
42
+ const firstHandler = createStateHandler(1);
43
+ const singleton = makeStateSingleton(() => firstHandler);
44
+ act(() => {
45
+ root.render(React.createElement(React.Fragment, null,
46
+ React.createElement(SingletonConsumer, { singleton: singleton }),
47
+ React.createElement(SingletonConsumer, { singleton: singleton })));
48
+ });
49
+ act(() => {
50
+ root.render(React.createElement(SingletonConsumer, { singleton: singleton }));
51
+ });
52
+ expect(firstHandler.destroy).not.toHaveBeenCalled();
53
+ act(() => {
54
+ root.render(React.createElement(React.Fragment, null));
55
+ });
56
+ expect(firstHandler.destroy).toHaveBeenCalledTimes(1);
57
+ });
58
+ it('should create a new singleton instance after all consumers unmount', () => {
59
+ const firstHandler = createStateHandler(1);
60
+ const secondHandler = createStateHandler(2);
61
+ const factory = jest.fn(() => firstHandler);
62
+ factory.mockReturnValueOnce(firstHandler).mockReturnValueOnce(secondHandler);
63
+ const singleton = makeStateSingleton(factory);
64
+ act(() => {
65
+ root.render(React.createElement(SingletonConsumer, { singleton: singleton }));
66
+ });
67
+ act(() => {
68
+ root.render(React.createElement(React.Fragment, null));
69
+ });
70
+ expect(firstHandler.destroy).toHaveBeenCalledTimes(1);
71
+ act(() => {
72
+ root.render(React.createElement(SingletonConsumer, { singleton: singleton }));
73
+ });
74
+ expect(factory).toHaveBeenCalledTimes(2);
75
+ expect(singleton.getInstance().getSnapshot()).toStrictEqual({ value: 2 });
76
+ });
77
+ it('should keep singleton instance alive when destroyOnNoConsumers is false', () => {
78
+ const firstHandler = createStateHandler(1);
79
+ const factory = jest.fn(() => firstHandler);
80
+ const singleton = makeStateSingleton(factory, {
81
+ destroyOnNoConsumers: false,
82
+ });
83
+ act(() => {
84
+ root.render(React.createElement(SingletonConsumer, { singleton: singleton }));
85
+ });
86
+ act(() => {
87
+ root.render(React.createElement(React.Fragment, null));
88
+ });
89
+ expect(firstHandler.destroy).not.toHaveBeenCalled();
90
+ act(() => {
91
+ root.render(React.createElement(SingletonConsumer, { singleton: singleton }));
92
+ });
93
+ expect(factory).toHaveBeenCalledTimes(1);
94
+ expect(singleton.getInstance().getSnapshot()).toStrictEqual({ value: 1 });
95
+ });
96
+ });
97
+ //# sourceMappingURL=state-singleton.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-singleton.spec.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/state-singleton.spec.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +1,5 @@
1
+ export { useStateActions } from './state-actions.js';
1
2
  export { useStateFactory } from './state-factory.js';
3
+ export { useStateHandler } from './state-handler.js';
2
4
  export { useStateSingleton } from './state-singleton.js';
5
+ export { useStateSubscription } from './state-subscription.js';
@@ -1,3 +1,6 @@
1
+ export { useStateActions } from './state-actions.js';
1
2
  export { useStateFactory } from './state-factory.js';
3
+ export { useStateHandler } from './state-handler.js';
2
4
  export { useStateSingleton } from './state-singleton.js';
5
+ export { useStateSubscription } from './state-subscription.js';
3
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { StateSubscriptionHandler } from '../types/types.js';
2
+ export declare function useStateActions<V, A>(stateSubscriptionHandler: StateSubscriptionHandler<V, A>): A;
@@ -0,0 +1,5 @@
1
+ import { useMemo } from 'react';
2
+ export function useStateActions(stateSubscriptionHandler) {
3
+ return useMemo(() => stateSubscriptionHandler.getActions(), [stateSubscriptionHandler]);
4
+ }
5
+ //# sourceMappingURL=state-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-actions.js","sourceRoot":"","sources":["../../src/hooks/state-actions.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAIhC,MAAM,UAAU,eAAe,CAAO,wBAAwD;IAC5F,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,UAAU,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAC1F,CAAC"}
@@ -1,2 +1,7 @@
1
1
  import type { StateSubscriptionHandler } from '../types/types.js';
2
+ type StateSelector<State, SelectedState> = (state: State) => SelectedState;
3
+ type EqualityFn<SelectedState> = (current: SelectedState, next: SelectedState) => boolean;
2
4
  export declare function useStateFactory<V, A, P extends unknown[]>(stateFactoryFunction: (...args: P) => StateSubscriptionHandler<V, A>, params?: P): [V, A];
5
+ export declare function useStateFactory<V, A, P extends unknown[], Sel>(stateFactoryFunction: (...args: P) => StateSubscriptionHandler<V, A>, selector: StateSelector<V, Sel>, params?: P): [Sel, A];
6
+ export declare function useStateFactory<V, A, P extends unknown[], Sel>(stateFactoryFunction: (...args: P) => StateSubscriptionHandler<V, A>, selector: StateSelector<V, Sel>, isEqual?: EqualityFn<Sel>, params?: P): [Sel, A];
7
+ export {};
@@ -1,9 +1,13 @@
1
- import { useRef } from 'react';
1
+ import { useStateHandler } from './state-handler.js';
2
2
  import { useStateSubscription } from './state-subscription.js';
3
- export function useStateFactory(stateFactoryFunction, params = []) {
4
- const stateHandler = useRef(stateFactoryFunction(...params));
5
- const actions = useRef(stateHandler.current.getActions());
6
- const state = useStateSubscription(stateHandler.current);
7
- return [state, actions.current];
3
+ const identitySelector = (state) => state;
4
+ export function useStateFactory(stateFactoryFunction, selectorOrParams = [], isEqualOrParams = Object.is, params = []) {
5
+ const hasSelector = typeof selectorOrParams === 'function';
6
+ const selector = (hasSelector ? selectorOrParams : identitySelector);
7
+ const hasCustomEquality = hasSelector && typeof isEqualOrParams === 'function';
8
+ const isEqual = (hasCustomEquality ? isEqualOrParams : Object.is);
9
+ const stateFactoryParams = (hasSelector ? (hasCustomEquality ? params : isEqualOrParams) : selectorOrParams);
10
+ const stateHandler = useStateHandler(stateFactoryFunction, stateFactoryParams);
11
+ return useStateSubscription(stateHandler, selector, isEqual);
8
12
  }
9
13
  //# sourceMappingURL=state-factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-factory.js","sourceRoot":"","sources":["../../src/hooks/state-factory.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAI/D,MAAM,UAAU,eAAe,CAC7B,oBAAoE,EACpE,SAAY,EAAkB;IAE9B,MAAM,YAAY,GAAG,MAAM,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAEzD,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAW,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"state-factory.js","sourceRoot":"","sources":["../../src/hooks/state-factory.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAO/D,MAAM,gBAAgB,GAAG,CAAS,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC;AAiBzD,MAAM,UAAU,eAAe,CAC7B,oBAAoE,EACpE,mBAA8C,EAAkB,EAChE,kBAAuC,MAAM,CAAC,EAAqB,EACnE,SAAY,EAAkB;IAE9B,MAAM,WAAW,GAAG,OAAO,gBAAgB,KAAK,UAAU,CAAC;IAC3D,MAAM,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAA0B,CAAC;IAC9F,MAAM,iBAAiB,GAAG,WAAW,IAAI,OAAO,eAAe,KAAK,UAAU,CAAC;IAC/E,MAAM,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAoB,CAAC;IACrF,MAAM,kBAAkB,GAAG,CACzB,WAAW,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAC3E,CAAC;IACP,MAAM,YAAY,GAAG,eAAe,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;IAE/E,OAAO,oBAAoB,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { StateSubscriptionHandler } from '../types/types.js';
2
+ export declare function useStateHandler<V, A, P extends unknown[]>(stateFactoryFunction: (...args: P) => StateSubscriptionHandler<V, A>, params?: P): StateSubscriptionHandler<V, A>;
@@ -0,0 +1,9 @@
1
+ import { useRef } from 'react';
2
+ export function useStateHandler(stateFactoryFunction, params = []) {
3
+ const stateHandlerRef = useRef(null);
4
+ if (!stateHandlerRef.current) {
5
+ stateHandlerRef.current = stateFactoryFunction(...params);
6
+ }
7
+ return stateHandlerRef.current;
8
+ }
9
+ //# sourceMappingURL=state-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-handler.js","sourceRoot":"","sources":["../../src/hooks/state-handler.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAI/B,MAAM,UAAU,eAAe,CAC7B,oBAAoE,EACpE,SAAY,EAAkB;IAE9B,MAAM,eAAe,GAAG,MAAM,CAAwC,IAAI,CAAC,CAAC;IAE5E,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC7B,eAAe,CAAC,OAAO,GAAG,oBAAoB,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,eAAe,CAAC,OAAO,CAAC;AACjC,CAAC"}
@@ -1,2 +1,6 @@
1
1
  import type { StateSingleton } from '../store/state-singleton.js';
2
+ type StateSelector<State, SelectedState> = (state: State) => SelectedState;
3
+ type EqualityFn<SelectedState> = (current: SelectedState, next: SelectedState) => boolean;
2
4
  export declare function useStateSingleton<V, A>(stateSingleton: StateSingleton<V, A>): [V, A];
5
+ export declare function useStateSingleton<V, A, Sel>(stateSingleton: StateSingleton<V, A>, selector: StateSelector<V, Sel>, isEqual?: EqualityFn<Sel>): [Sel, A];
6
+ export {};
@@ -1,9 +1,7 @@
1
- import { useMemo } from 'react';
2
1
  import { useStateSubscription } from './state-subscription.js';
3
- export function useStateSingleton(stateSingleton) {
4
- const stateHandler = useMemo(() => stateSingleton.getInstance(), [stateSingleton]);
5
- const actions = useMemo(() => stateHandler.getActions(), [stateHandler]);
6
- const state = useStateSubscription(stateHandler);
2
+ const identitySelector = (state) => state;
3
+ export function useStateSingleton(stateSingleton, selector = identitySelector, isEqual = Object.is) {
4
+ const [state, actions] = useStateSubscription(stateSingleton, selector, isEqual);
7
5
  return [state, actions];
8
6
  }
9
7
  //# sourceMappingURL=state-singleton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-singleton.js","sourceRoot":"","sources":["../../src/hooks/state-singleton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAI/D,MAAM,UAAU,iBAAiB,CAAO,cAAoC;IAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEzE,MAAM,KAAK,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAEjD,OAAO,CAAC,KAAK,EAAE,OAAO,CAAW,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"state-singleton.js","sourceRoot":"","sources":["../../src/hooks/state-singleton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAO/D,MAAM,gBAAgB,GAAG,CAAS,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC;AAQzD,MAAM,UAAU,iBAAiB,CAC/B,cAAoC,EACpC,WAAkC,gBAAyC,EAC3E,UAA2B,MAAM,CAAC,EAAE;IAEpC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEjF,OAAO,CAAC,KAAK,EAAE,OAAO,CAAa,CAAC;AACtC,CAAC"}