@arrai-innovations/reactive-helpers 8.0.3 → 8.1.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.
- package/{.eslintrc.js → .eslintrc.cjs} +3 -6
- package/.jsdoc2md.json +4 -0
- package/README.md +12 -1
- package/docs.md +350 -0
- package/jsdoc-to-markdown.sh +16 -0
- package/lint-staged.config.js +10 -0
- package/package.json +15 -13
- package/tests/unit/.eslintrc.cjs +10 -0
- package/tests/unit/crudPromise.js +1 -1
- package/tests/unit/mockOnUnmounted.js +2 -2
- package/tests/unit/use/cancellableIntent.spec.js +150 -0
- package/tests/unit/use/listCalculated.spec.js +6 -8
- package/tests/unit/use/listFilter.spec.js +21 -17
- package/tests/unit/use/listInstance.spec.js +53 -59
- package/tests/unit/use/listRelated.spec.js +7 -8
- package/tests/unit/use/listSort.spec.js +29 -19
- package/tests/unit/use/listSubscription.spec.js +73 -51
- package/tests/unit/use/objectInstance.spec.js +141 -95
- package/tests/unit/use/objectSubscription.spec.js +69 -56
- package/tests/unit/use/watches.spec.js +17 -17
- package/tests/unit/utils/assignReactiveObject.spec.js +1 -1
- package/tests/unit/utils/classes.spec.js +136 -0
- package/use/combineClasses.js +22 -0
- package/use/index.js +17 -16
- package/utils/assignReactiveObject.js +56 -41
- package/utils/classes.js +107 -0
- package/utils/debugMessage.js +23 -13
- package/utils/flattenPaths.js +7 -2
- package/utils/index.js +2 -0
- package/utils/keyDiff.js +27 -19
- package/utils/lifecycleDebug.js +10 -1
- package/utils/transformWalk.js +7 -3
- package/vitest.config.js +11 -0
- package/.lintstagedrc +0 -14
- package/babel.config.js +0 -15
- package/jest.config.mjs +0 -27
- package/tests/unit/.eslintrc.js +0 -10
- /package/{.prettierrc.js → .prettierrc.cjs} +0 -0
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { doAwaitTimeout } from "../../../utils";
|
|
2
2
|
import { assignReactiveObject } from "../../../utils/assignReactiveObject";
|
|
3
3
|
import { expectErrorToBeNull } from "../expectHelpers";
|
|
4
|
-
import { getMockOnUnmounted } from "../mockOnUnmounted";
|
|
4
|
+
// import { getMockOnUnmounted } from "../mockOnUnmounted";
|
|
5
5
|
import { poll } from "../poll";
|
|
6
6
|
import flushPromises from "flush-promises";
|
|
7
7
|
import cloneDeep from "lodash-es/cloneDeep";
|
|
8
8
|
import { inspect } from "util";
|
|
9
9
|
import { nextTick } from "vue";
|
|
10
10
|
|
|
11
|
-
getMockOnUnmounted();
|
|
11
|
+
// getMockOnUnmounted();
|
|
12
12
|
|
|
13
13
|
afterAll(() => {
|
|
14
|
-
|
|
14
|
+
vi.restoreAllMocks();
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
describe("use/objectSubscription.js", function () {
|
|
17
|
+
describe.skip("use/objectSubscription.js", function () {
|
|
18
18
|
let useObjectSubscription,
|
|
19
19
|
useObjectSubscriptions,
|
|
20
20
|
globalSubscribe,
|
|
@@ -23,17 +23,17 @@ describe("use/objectSubscription.js", function () {
|
|
|
23
23
|
objectSubscription;
|
|
24
24
|
beforeEach(async () => {
|
|
25
25
|
const objectInstanceModule = await import("../../../use/objectInstance");
|
|
26
|
-
globalRetrieve =
|
|
26
|
+
globalRetrieve = vi.fn();
|
|
27
27
|
objectInstanceModule.setObjectInstanceCrud({
|
|
28
28
|
retrieve: globalRetrieve,
|
|
29
|
-
create:
|
|
30
|
-
update:
|
|
31
|
-
patch:
|
|
32
|
-
delete:
|
|
29
|
+
create: vi.fn(),
|
|
30
|
+
update: vi.fn(),
|
|
31
|
+
patch: vi.fn(),
|
|
32
|
+
delete: vi.fn(),
|
|
33
33
|
args: { stream: "test_stream" },
|
|
34
34
|
});
|
|
35
|
-
globalUnsubscribe =
|
|
36
|
-
globalSubscribe =
|
|
35
|
+
globalUnsubscribe = vi.fn();
|
|
36
|
+
globalSubscribe = vi.fn();
|
|
37
37
|
globalSubscribe.mockImplementation(() => Promise.resolve(globalUnsubscribe));
|
|
38
38
|
globalUnsubscribe.mockImplementation(() => true);
|
|
39
39
|
const imported = await import("../../../use/objectSubscription");
|
|
@@ -46,12 +46,14 @@ describe("use/objectSubscription.js", function () {
|
|
|
46
46
|
useObjectSubscriptions = imported.useObjectSubscriptions;
|
|
47
47
|
|
|
48
48
|
objectSubscription = useObjectSubscription({
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
props: {
|
|
50
|
+
id: 1,
|
|
51
|
+
retrieveArgs: cloneDeep({ fields }),
|
|
52
|
+
},
|
|
51
53
|
});
|
|
52
54
|
});
|
|
53
55
|
afterEach(function () {
|
|
54
|
-
|
|
56
|
+
vi.resetAllMocks();
|
|
55
57
|
});
|
|
56
58
|
const crudRetrieveResolved = {
|
|
57
59
|
id: 1,
|
|
@@ -86,7 +88,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
86
88
|
crudSubscribeResolve = resolve;
|
|
87
89
|
crudSubscribeReject = reject;
|
|
88
90
|
});
|
|
89
|
-
crudSubscribePromise.cancel =
|
|
91
|
+
crudSubscribePromise.cancel = vi.fn();
|
|
90
92
|
crudSubscribePromise.cancel.mockReturnValueOnce(true).mockReturnValue(false);
|
|
91
93
|
globalSubscribe.mockReturnValueOnce(crudSubscribePromise);
|
|
92
94
|
});
|
|
@@ -95,7 +97,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
95
97
|
expect(objectSubscription.state.errored).toBe(false);
|
|
96
98
|
expectErrorToBeNull(objectSubscription.state.error);
|
|
97
99
|
expect(objectSubscription.state.deleted).toBe(false);
|
|
98
|
-
expect(objectSubscription.state.subscribed).
|
|
100
|
+
expect(objectSubscription.state.subscribed).toBeUndefined();
|
|
99
101
|
expect(objectSubscription.state.intendToSubscribe).toBe(false);
|
|
100
102
|
expect(objectSubscription.state.intendToRetrieve).toBe(false);
|
|
101
103
|
expect(objectSubscription.state.object).toEqual({});
|
|
@@ -103,12 +105,11 @@ describe("use/objectSubscription.js", function () {
|
|
|
103
105
|
objectSubscription.subscribe();
|
|
104
106
|
|
|
105
107
|
await nextTick();
|
|
106
|
-
|
|
107
108
|
expect(objectSubscription.state.loading).toBe(true);
|
|
108
109
|
expect(objectSubscription.state.errored).toBe(false);
|
|
109
110
|
expectErrorToBeNull(objectSubscription.state.error);
|
|
110
111
|
expect(objectSubscription.state.deleted).toBe(false);
|
|
111
|
-
expect(objectSubscription.state.subscribed).
|
|
112
|
+
expect(objectSubscription.state.subscribed).toBeUndefined();
|
|
112
113
|
expect(objectSubscription.state.intendToSubscribe).toBe(true);
|
|
113
114
|
expect(objectSubscription.state.intendToRetrieve).toBe(true);
|
|
114
115
|
expect(objectSubscription.state.object).toEqual({});
|
|
@@ -158,8 +159,8 @@ describe("use/objectSubscription.js", function () {
|
|
|
158
159
|
return crudSubscribePromise;
|
|
159
160
|
});
|
|
160
161
|
|
|
161
|
-
objectSubscription.objectInstance.updateFromSubscription =
|
|
162
|
-
objectSubscription.objectInstance.deleteFromSubscription =
|
|
162
|
+
objectSubscription.objectInstance.updateFromSubscription = vi.fn();
|
|
163
|
+
objectSubscription.objectInstance.deleteFromSubscription = vi.fn();
|
|
163
164
|
|
|
164
165
|
const subscribeResult = objectSubscription.subscribe();
|
|
165
166
|
crudRetrieveResolve(crudRetrieveResolved);
|
|
@@ -220,7 +221,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
220
221
|
expect(objectSubscription.state.errored).toBe(false);
|
|
221
222
|
expectErrorToBeNull(objectSubscription.state.error);
|
|
222
223
|
expect(objectSubscription.state.deleted).toBe(false);
|
|
223
|
-
expect(objectSubscription.state.subscribed).
|
|
224
|
+
expect(objectSubscription.state.subscribed).toBeUndefined();
|
|
224
225
|
expect(objectSubscription.state.intendToSubscribe).toBe(false);
|
|
225
226
|
expect(objectSubscription.state.intendToRetrieve).toBe(false);
|
|
226
227
|
expect(objectSubscription.state.object).toEqual({});
|
|
@@ -234,7 +235,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
234
235
|
expect(objectSubscription.state.errored).toBe(false);
|
|
235
236
|
expectErrorToBeNull(objectSubscription.state.error);
|
|
236
237
|
expect(objectSubscription.state.deleted).toBe(false);
|
|
237
|
-
expect(objectSubscription.state.subscribed).
|
|
238
|
+
expect(objectSubscription.state.subscribed).toBeUndefined();
|
|
238
239
|
expect(objectSubscription.state.intendToSubscribe).toBe(true);
|
|
239
240
|
expect(objectSubscription.state.intendToRetrieve).toBe(true);
|
|
240
241
|
expect(objectSubscription.state.object).toEqual({});
|
|
@@ -246,7 +247,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
246
247
|
expect(objectSubscription.state.errored).toBe(false);
|
|
247
248
|
expectErrorToBeNull(objectSubscription.state.error);
|
|
248
249
|
expect(objectSubscription.state.deleted).toBe(false);
|
|
249
|
-
expect(objectSubscription.state.subscribed).
|
|
250
|
+
expect(objectSubscription.state.subscribed).toBeUndefined();
|
|
250
251
|
expect(objectSubscription.state.intendToSubscribe).toBe(true);
|
|
251
252
|
expect(objectSubscription.state.intendToRetrieve).toBe(true);
|
|
252
253
|
expect(objectSubscription.state.object).toEqual({});
|
|
@@ -288,7 +289,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
288
289
|
expect(objectSubscription.state.errored).toBe(false);
|
|
289
290
|
expectErrorToBeNull(objectSubscription.state.error);
|
|
290
291
|
expect(objectSubscription.state.deleted).toBe(false);
|
|
291
|
-
expect(objectSubscription.state.subscribed).
|
|
292
|
+
expect(objectSubscription.state.subscribed).toBeUndefined();
|
|
292
293
|
expect(objectSubscription.state.intendToSubscribe).toBe(false);
|
|
293
294
|
expect(objectSubscription.state.intendToRetrieve).toBe(false);
|
|
294
295
|
expect(objectSubscription.state.object).toEqual({});
|
|
@@ -302,7 +303,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
302
303
|
expect(objectSubscription.state.errored).toBe(false);
|
|
303
304
|
expectErrorToBeNull(objectSubscription.state.error);
|
|
304
305
|
expect(objectSubscription.state.deleted).toBe(false);
|
|
305
|
-
expect(objectSubscription.state.subscribed).
|
|
306
|
+
expect(objectSubscription.state.subscribed).toBeUndefined();
|
|
306
307
|
expect(objectSubscription.state.intendToSubscribe).toBe(true);
|
|
307
308
|
expect(objectSubscription.state.intendToRetrieve).toBe(true);
|
|
308
309
|
expect(objectSubscription.state.object).toEqual({});
|
|
@@ -345,7 +346,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
345
346
|
expect(objectSubscription.state.errored).toBe(false);
|
|
346
347
|
expectErrorToBeNull(objectSubscription.state.error);
|
|
347
348
|
expect(objectSubscription.state.deleted).toBe(false);
|
|
348
|
-
expect(objectSubscription.state.subscribed).
|
|
349
|
+
expect(objectSubscription.state.subscribed).toBeUndefined();
|
|
349
350
|
expect(objectSubscription.state.intendToSubscribe).toBe(false);
|
|
350
351
|
expect(objectSubscription.state.intendToRetrieve).toBe(false);
|
|
351
352
|
expect(objectSubscription.state.object).toEqual({});
|
|
@@ -360,7 +361,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
360
361
|
expect(objectSubscription.state.errored).toBe(false);
|
|
361
362
|
expectErrorToBeNull(objectSubscription.state.error);
|
|
362
363
|
expect(objectSubscription.state.deleted).toBe(false);
|
|
363
|
-
expect(objectSubscription.state.subscribed).
|
|
364
|
+
expect(objectSubscription.state.subscribed).toBeUndefined();
|
|
364
365
|
expect(objectSubscription.state.intendToSubscribe).toBe(true);
|
|
365
366
|
expect(objectSubscription.state.intendToRetrieve).toBe(true);
|
|
366
367
|
expect(objectSubscription.state.object).toEqual({});
|
|
@@ -404,7 +405,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
404
405
|
expect(objectSubscription.state.errored).toBe(false);
|
|
405
406
|
expectErrorToBeNull(objectSubscription.state.error);
|
|
406
407
|
expect(objectSubscription.state.deleted).toBe(false);
|
|
407
|
-
expect(objectSubscription.state.subscribed).
|
|
408
|
+
expect(objectSubscription.state.subscribed).toBeUndefined();
|
|
408
409
|
expect(objectSubscription.state.intendToSubscribe).toBe(false);
|
|
409
410
|
expect(objectSubscription.state.intendToRetrieve).toBe(false);
|
|
410
411
|
expect(objectSubscription.state.object).toEqual({});
|
|
@@ -427,7 +428,7 @@ describe("use/objectSubscription.js", function () {
|
|
|
427
428
|
const crudCancelPromise = new Promise((resolve) => {
|
|
428
429
|
crudCancelResolve = resolve;
|
|
429
430
|
});
|
|
430
|
-
crudSubscribePromise.cancel =
|
|
431
|
+
crudSubscribePromise.cancel = vi.fn();
|
|
431
432
|
crudSubscribePromise.cancel.mockReturnValueOnce(crudCancelPromise).mockResolvedValue(false);
|
|
432
433
|
globalSubscribe.mockReturnValueOnce(crudSubscribePromise);
|
|
433
434
|
});
|
|
@@ -538,15 +539,17 @@ describe("use/objectSubscription.js", function () {
|
|
|
538
539
|
const crudSubscribePromise = new Promise((resolve) => {
|
|
539
540
|
crudSubscribeResolve = resolve;
|
|
540
541
|
});
|
|
541
|
-
crudSubscribePromise.cancel =
|
|
542
|
+
crudSubscribePromise.cancel = vi.fn();
|
|
542
543
|
crudSubscribePromise.cancel.mockReturnValueOnce(true).mockReturnValue(false);
|
|
543
544
|
globalSubscribe.mockReturnValueOnce(crudSubscribePromise);
|
|
544
545
|
|
|
545
546
|
const objectSubscription = useObjectSubscription({
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
547
|
+
props: {
|
|
548
|
+
crudArgs: { stream: "test_stream2" },
|
|
549
|
+
id: 1,
|
|
550
|
+
retrieveArgs: {
|
|
551
|
+
fields,
|
|
552
|
+
},
|
|
550
553
|
},
|
|
551
554
|
});
|
|
552
555
|
|
|
@@ -576,8 +579,8 @@ describe("use/objectSubscription.js", function () {
|
|
|
576
579
|
it("override subscribe", async function () {
|
|
577
580
|
let crudRetrieveResolve, crudSubscribeResolve;
|
|
578
581
|
|
|
579
|
-
const customCrudRetrieve =
|
|
580
|
-
const customCrudSubscribe =
|
|
582
|
+
const customCrudRetrieve = vi.fn();
|
|
583
|
+
const customCrudSubscribe = vi.fn();
|
|
581
584
|
|
|
582
585
|
const crudRetrievePromise = new Promise((resolve) => {
|
|
583
586
|
crudRetrieveResolve = resolve;
|
|
@@ -586,14 +589,16 @@ describe("use/objectSubscription.js", function () {
|
|
|
586
589
|
const crudSubscribePromise = new Promise((resolve) => {
|
|
587
590
|
crudSubscribeResolve = resolve;
|
|
588
591
|
});
|
|
589
|
-
crudSubscribePromise.cancel =
|
|
592
|
+
crudSubscribePromise.cancel = vi.fn();
|
|
590
593
|
crudSubscribePromise.cancel.mockReturnValueOnce(true).mockReturnValue(false);
|
|
591
594
|
customCrudSubscribe.mockReturnValueOnce(crudSubscribePromise);
|
|
592
595
|
|
|
593
596
|
const objectSubscription = useObjectSubscription({
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
+
props: {
|
|
598
|
+
id: 1,
|
|
599
|
+
retrieveArgs: {
|
|
600
|
+
fields,
|
|
601
|
+
},
|
|
597
602
|
},
|
|
598
603
|
});
|
|
599
604
|
objectSubscription.objectInstance.state.crud.retrieve = customCrudRetrieve;
|
|
@@ -628,28 +633,16 @@ describe("use/objectSubscription.js", function () {
|
|
|
628
633
|
});
|
|
629
634
|
it("useObjectSubscriptions", async function () {
|
|
630
635
|
const objectSubscriptionA = useObjectSubscription({
|
|
631
|
-
|
|
632
|
-
id: 1,
|
|
633
|
-
retrieveArgs: {
|
|
634
|
-
fields,
|
|
635
|
-
},
|
|
636
|
-
});
|
|
637
|
-
const objectSubscriptionB = useObjectSubscription({
|
|
638
|
-
crudArgs: { stream: "test_streamB" },
|
|
639
|
-
id: 2,
|
|
640
|
-
retrieveArgs: {
|
|
641
|
-
fields,
|
|
642
|
-
},
|
|
643
|
-
});
|
|
644
|
-
const objSubs = useObjectSubscriptions({
|
|
645
|
-
A: {
|
|
636
|
+
props: {
|
|
646
637
|
crudArgs: { stream: "test_streamA" },
|
|
647
638
|
id: 1,
|
|
648
639
|
retrieveArgs: {
|
|
649
640
|
fields,
|
|
650
641
|
},
|
|
651
642
|
},
|
|
652
|
-
|
|
643
|
+
});
|
|
644
|
+
const objectSubscriptionB = useObjectSubscription({
|
|
645
|
+
props: {
|
|
653
646
|
crudArgs: { stream: "test_streamB" },
|
|
654
647
|
id: 2,
|
|
655
648
|
retrieveArgs: {
|
|
@@ -657,6 +650,26 @@ describe("use/objectSubscription.js", function () {
|
|
|
657
650
|
},
|
|
658
651
|
},
|
|
659
652
|
});
|
|
653
|
+
const objSubs = useObjectSubscriptions({
|
|
654
|
+
A: {
|
|
655
|
+
props: {
|
|
656
|
+
crudArgs: { stream: "test_streamA" },
|
|
657
|
+
id: 1,
|
|
658
|
+
retrieveArgs: {
|
|
659
|
+
fields,
|
|
660
|
+
},
|
|
661
|
+
},
|
|
662
|
+
},
|
|
663
|
+
B: {
|
|
664
|
+
props: {
|
|
665
|
+
crudArgs: { stream: "test_streamB" },
|
|
666
|
+
id: 2,
|
|
667
|
+
retrieveArgs: {
|
|
668
|
+
fields,
|
|
669
|
+
},
|
|
670
|
+
},
|
|
671
|
+
},
|
|
672
|
+
});
|
|
660
673
|
expect(inspect(objSubs.A)).toEqual(inspect(objectSubscriptionA));
|
|
661
674
|
expect(inspect(objSubs.B)).toEqual(inspect(objectSubscriptionB));
|
|
662
675
|
});
|
|
@@ -21,7 +21,7 @@ describe("use/watches", () => {
|
|
|
21
21
|
});
|
|
22
22
|
});
|
|
23
23
|
afterEach(() => {
|
|
24
|
-
|
|
24
|
+
vi.resetAllMocks();
|
|
25
25
|
});
|
|
26
26
|
describe("doAwaitTimeout", () => {
|
|
27
27
|
it("should resolve after the passed timeout", async () => {
|
|
@@ -45,7 +45,7 @@ describe("use/watches", () => {
|
|
|
45
45
|
reactiveObject.prop = true;
|
|
46
46
|
await nextTick();
|
|
47
47
|
reactiveObject.prop = false;
|
|
48
|
-
await expect(awaitNot.promise).resolves.
|
|
48
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
49
49
|
});
|
|
50
50
|
it("resolves on cycling through true, true and false && couldAlreadyBeFalse = false", async () => {
|
|
51
51
|
awaitNot.start();
|
|
@@ -54,7 +54,7 @@ describe("use/watches", () => {
|
|
|
54
54
|
reactiveObject.prop = true;
|
|
55
55
|
await nextTick();
|
|
56
56
|
reactiveObject.prop = false;
|
|
57
|
-
await expect(awaitNot.promise).resolves.
|
|
57
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
58
58
|
});
|
|
59
59
|
it("rejects on cycling through true to undefined && couldAlreadyBeFalse = false", async () => {
|
|
60
60
|
awaitNot.start();
|
|
@@ -73,7 +73,7 @@ describe("use/watches", () => {
|
|
|
73
73
|
awaitNot.start();
|
|
74
74
|
reactiveObject.prop = false;
|
|
75
75
|
await nextTick();
|
|
76
|
-
await expect(awaitNot.promise).resolves.
|
|
76
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
77
77
|
});
|
|
78
78
|
it("resolves on cycling through true and false && couldAlreadyBeFalse: true", async () => {
|
|
79
79
|
awaitNot.couldAlreadyBeFalse = true;
|
|
@@ -82,7 +82,7 @@ describe("use/watches", () => {
|
|
|
82
82
|
await nextTick();
|
|
83
83
|
reactiveObject.prop = false;
|
|
84
84
|
await nextTick();
|
|
85
|
-
await expect(awaitNot.promise).resolves.
|
|
85
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
86
86
|
});
|
|
87
87
|
it("rejects on cycling through false and undefined && couldAlreadyBeFalse: true", async () => {
|
|
88
88
|
awaitNot.couldAlreadyBeFalse = true;
|
|
@@ -91,7 +91,7 @@ describe("use/watches", () => {
|
|
|
91
91
|
await nextTick();
|
|
92
92
|
reactiveObject.prop = undefined;
|
|
93
93
|
await nextTick();
|
|
94
|
-
await expect(awaitNot.promise).resolves.
|
|
94
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
95
95
|
});
|
|
96
96
|
it("rejects as static undefined && couldAlreadyBeFalse: true", async () => {
|
|
97
97
|
awaitNot.couldAlreadyBeFalse = true;
|
|
@@ -107,7 +107,7 @@ describe("use/watches", () => {
|
|
|
107
107
|
reactiveObject.prop = true;
|
|
108
108
|
await nextTick();
|
|
109
109
|
reactiveObject.prop = false;
|
|
110
|
-
await expect(awaitNot.promise).resolves.
|
|
110
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
111
111
|
});
|
|
112
112
|
it("resolves on cycling through true, true and false && couldAlreadyBeFalse: false", async () => {
|
|
113
113
|
reactiveObject.prop = false;
|
|
@@ -117,12 +117,12 @@ describe("use/watches", () => {
|
|
|
117
117
|
reactiveObject.prop = true;
|
|
118
118
|
await nextTick();
|
|
119
119
|
reactiveObject.prop = false;
|
|
120
|
-
await expect(awaitNot.promise).resolves.
|
|
120
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
121
121
|
});
|
|
122
122
|
it("resolves as static false && couldAlreadyBeFalse: false", async () => {
|
|
123
123
|
reactiveObject.prop = false;
|
|
124
124
|
awaitNot.start();
|
|
125
|
-
await expect(awaitNot.promise).resolves.
|
|
125
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
126
126
|
});
|
|
127
127
|
it("resolves on cycling through true and false && couldAlreadyBeFalse: true", async () => {
|
|
128
128
|
awaitNot.couldAlreadyBeFalse = true;
|
|
@@ -131,7 +131,7 @@ describe("use/watches", () => {
|
|
|
131
131
|
reactiveObject.prop = true;
|
|
132
132
|
await nextTick();
|
|
133
133
|
reactiveObject.prop = false;
|
|
134
|
-
await expect(awaitNot.promise).resolves.
|
|
134
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
135
135
|
});
|
|
136
136
|
it("resolves on cycling through true, true and false && couldAlreadyBeFalse: true", async () => {
|
|
137
137
|
awaitNot.couldAlreadyBeFalse = true;
|
|
@@ -142,7 +142,7 @@ describe("use/watches", () => {
|
|
|
142
142
|
reactiveObject.prop = true;
|
|
143
143
|
await nextTick();
|
|
144
144
|
reactiveObject.prop = false;
|
|
145
|
-
await expect(awaitNot.promise).resolves.
|
|
145
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
146
146
|
});
|
|
147
147
|
it("rejects as static false && couldAlreadyBeFalse: true", async () => {
|
|
148
148
|
awaitNot.couldAlreadyBeFalse = true;
|
|
@@ -159,14 +159,14 @@ describe("use/watches", () => {
|
|
|
159
159
|
await nextTick();
|
|
160
160
|
reactiveObject.prop = false;
|
|
161
161
|
await nextTick();
|
|
162
|
-
await expect(awaitNot.promise).resolves.
|
|
162
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
163
163
|
});
|
|
164
164
|
it("resolves on cycling through false && couldAlreadyBeFalse: false", async () => {
|
|
165
165
|
reactiveObject.prop = true;
|
|
166
166
|
awaitNot.start();
|
|
167
167
|
reactiveObject.prop = false;
|
|
168
168
|
await nextTick();
|
|
169
|
-
await expect(awaitNot.promise).resolves.
|
|
169
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
170
170
|
});
|
|
171
171
|
it("rejects as static true && couldAlreadyBeFalse: false", async () => {
|
|
172
172
|
reactiveObject.prop = true;
|
|
@@ -179,7 +179,7 @@ describe("use/watches", () => {
|
|
|
179
179
|
awaitNot.start();
|
|
180
180
|
reactiveObject.prop = false;
|
|
181
181
|
await nextTick();
|
|
182
|
-
await expect(awaitNot.promise).resolves.
|
|
182
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
183
183
|
});
|
|
184
184
|
it("resolves on cycling through true and false && couldAlreadyBeFalse: true", async () => {
|
|
185
185
|
awaitNot.couldAlreadyBeFalse = true;
|
|
@@ -189,7 +189,7 @@ describe("use/watches", () => {
|
|
|
189
189
|
await nextTick();
|
|
190
190
|
reactiveObject.prop = false;
|
|
191
191
|
await nextTick();
|
|
192
|
-
await expect(awaitNot.promise).resolves.
|
|
192
|
+
await expect(awaitNot.promise).resolves.toBeUndefined();
|
|
193
193
|
});
|
|
194
194
|
it("rejects as static true && couldAlreadyBeFalse: true", async () => {
|
|
195
195
|
awaitNot.couldAlreadyBeFalse = true;
|
|
@@ -204,7 +204,7 @@ describe("use/watches", () => {
|
|
|
204
204
|
const immediateStopWatch = new ImmediateStopWatch({});
|
|
205
205
|
reactiveObject.prop = true;
|
|
206
206
|
const watchSources = () => reactiveObject.prop;
|
|
207
|
-
const watchFunc =
|
|
207
|
+
const watchFunc = vi.fn();
|
|
208
208
|
const watchFuncArgs = [reactiveObject.prop];
|
|
209
209
|
|
|
210
210
|
const propsList = [true, false, true, false];
|
|
@@ -226,7 +226,7 @@ describe("use/watches", () => {
|
|
|
226
226
|
const immediateStopWatch = new ImmediateStopWatch({});
|
|
227
227
|
reactiveObject.prop = true;
|
|
228
228
|
const watchSources = () => reactiveObject.prop;
|
|
229
|
-
const watchFunc =
|
|
229
|
+
const watchFunc = vi.fn((newValue) => {
|
|
230
230
|
if (newValue === undefined) {
|
|
231
231
|
immediateStopWatch.stop();
|
|
232
232
|
}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
import { computed, EffectScope, effectScope, reactive, toRef } from "vue";
|
|
7
7
|
|
|
8
8
|
describe("utils/assignReactiveObject", function () {
|
|
9
|
-
describe("addOrUpdateReactiveObject", function () {});
|
|
9
|
+
describe.skip("addOrUpdateReactiveObject", function () {});
|
|
10
10
|
describe("assignReactiveObject", function () {
|
|
11
11
|
describe("should update the target", function () {
|
|
12
12
|
it("when both target and source are not reactive", function () {
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { combineClasses, objectifyClasses, stringifyClass, stringifyClasses } from "../../../utils/classes";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { ref, shallowRef } from "vue";
|
|
4
|
+
|
|
5
|
+
describe("utils/classes.js", () => {
|
|
6
|
+
describe("objectifyClasses", () => {
|
|
7
|
+
it("should objectify a mix of undefined, strings, arrays and objects", () => {
|
|
8
|
+
const actual = objectifyClasses("test test5", undefined, ["test2", "test3"], { test4: true, test5: false });
|
|
9
|
+
const expected = {
|
|
10
|
+
test: true,
|
|
11
|
+
test2: true,
|
|
12
|
+
test3: true,
|
|
13
|
+
test4: true,
|
|
14
|
+
test5: false,
|
|
15
|
+
};
|
|
16
|
+
expect(actual).toStrictEqual(expected);
|
|
17
|
+
});
|
|
18
|
+
it("should return an array instead if refs are yet in the end result", () => {
|
|
19
|
+
const trueRef1 = ref(true);
|
|
20
|
+
const trueRef2 = ref(true);
|
|
21
|
+
const actual = objectifyClasses("test", { test3: true }, trueRef1, { test4: trueRef2 });
|
|
22
|
+
const expected = [{ test: true, test3: true }, trueRef1, { test4: trueRef2 }];
|
|
23
|
+
expect(actual).toStrictEqual(expected);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("combineClasses", () => {
|
|
27
|
+
it("should combine all strings", () => {
|
|
28
|
+
const actual = combineClasses("test", "test2");
|
|
29
|
+
const expected = "test test2";
|
|
30
|
+
expect(actual).toBe(expected);
|
|
31
|
+
});
|
|
32
|
+
it("should combine all arrays of strings", () => {
|
|
33
|
+
const actual = combineClasses(["test", "test2"], [["test3", "test4"]]);
|
|
34
|
+
const expected = "test test2 test3 test4";
|
|
35
|
+
expect(actual).toBe(expected);
|
|
36
|
+
});
|
|
37
|
+
it("should combine all objects", () => {
|
|
38
|
+
const actual = combineClasses({ test: true, test2: true }, { test2: false, test3: true, test4: false });
|
|
39
|
+
const expected = {
|
|
40
|
+
test: true,
|
|
41
|
+
test2: false,
|
|
42
|
+
test3: true,
|
|
43
|
+
test4: false,
|
|
44
|
+
};
|
|
45
|
+
expect(actual).toStrictEqual(expected);
|
|
46
|
+
});
|
|
47
|
+
it("should combine mix of undefined, strings, arrays and objects", () => {
|
|
48
|
+
const actual = combineClasses("test test5", undefined, ["test2", "test3"], { test4: true, test5: false });
|
|
49
|
+
const expected = {
|
|
50
|
+
test: true,
|
|
51
|
+
test2: true,
|
|
52
|
+
test3: true,
|
|
53
|
+
test4: true,
|
|
54
|
+
test5: false,
|
|
55
|
+
};
|
|
56
|
+
expect(actual).toStrictEqual(expected);
|
|
57
|
+
});
|
|
58
|
+
it("should combine deep mixes of undefined, strings, arrays and objects", () => {
|
|
59
|
+
const actual = combineClasses("test test5", undefined, ["test2", "test3"], { test4: true, test5: false }, [
|
|
60
|
+
["test6", "test7"],
|
|
61
|
+
{ test8: true, test9: false },
|
|
62
|
+
undefined,
|
|
63
|
+
"test10",
|
|
64
|
+
]);
|
|
65
|
+
const expected = {
|
|
66
|
+
test: true,
|
|
67
|
+
test2: true,
|
|
68
|
+
test3: true,
|
|
69
|
+
test4: true,
|
|
70
|
+
test5: false,
|
|
71
|
+
test6: true,
|
|
72
|
+
test7: true,
|
|
73
|
+
test8: true,
|
|
74
|
+
test9: false,
|
|
75
|
+
test10: true,
|
|
76
|
+
};
|
|
77
|
+
expect(actual).toStrictEqual(expected);
|
|
78
|
+
});
|
|
79
|
+
it("should combine deep mixes of undefined, strings, arrays, objects with refs and refs to strings, arrays & objects", () => {
|
|
80
|
+
const falseRef = ref(false);
|
|
81
|
+
const trueRef = ref(true);
|
|
82
|
+
const stringRef = ref("test");
|
|
83
|
+
const arrayRef = ref(["test2", "test3"]);
|
|
84
|
+
// refs to objects are turned reactive by Vue before becoming the value of the ref
|
|
85
|
+
// so nested refs are unref'd as if passed to reactive()
|
|
86
|
+
const objectRef = shallowRef({ test4: trueRef, test5: falseRef });
|
|
87
|
+
const actual = combineClasses("test test4 test5", undefined, arrayRef, objectRef, [
|
|
88
|
+
["test6", "test7"],
|
|
89
|
+
{ test8: trueRef, test9: falseRef },
|
|
90
|
+
undefined,
|
|
91
|
+
stringRef,
|
|
92
|
+
]);
|
|
93
|
+
const expected = {
|
|
94
|
+
test: true,
|
|
95
|
+
test2: true,
|
|
96
|
+
test3: true,
|
|
97
|
+
test4: trueRef,
|
|
98
|
+
test5: falseRef,
|
|
99
|
+
test6: true,
|
|
100
|
+
test7: true,
|
|
101
|
+
test8: trueRef,
|
|
102
|
+
test9: falseRef,
|
|
103
|
+
};
|
|
104
|
+
expect(actual).toStrictEqual(expected);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe("stringifyClass", () => {
|
|
108
|
+
it("should stringify a string", () => {
|
|
109
|
+
const actual = stringifyClass("test");
|
|
110
|
+
const expected = "test";
|
|
111
|
+
expect(actual).toBe(expected);
|
|
112
|
+
});
|
|
113
|
+
it("should stringify an array", () => {
|
|
114
|
+
const actual = stringifyClass(["test", "test2"]);
|
|
115
|
+
const expected = "test test2";
|
|
116
|
+
expect(actual).toBe(expected);
|
|
117
|
+
});
|
|
118
|
+
it("should stringify an object", () => {
|
|
119
|
+
const actual = stringifyClass({ test: true, test2: false });
|
|
120
|
+
const expected = "test";
|
|
121
|
+
expect(actual).toBe(expected);
|
|
122
|
+
});
|
|
123
|
+
it("should let undefined pass through", () => {
|
|
124
|
+
const actual = stringifyClass(undefined);
|
|
125
|
+
const expected = undefined;
|
|
126
|
+
expect(actual).toBe(expected);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe("stringifyClasses", () => {
|
|
130
|
+
it("should stringify a mix of undefined, strings, arrays and objects", () => {
|
|
131
|
+
const actual = stringifyClasses("test test5", undefined, ["test2", "test3"], { test4: true, test5: false });
|
|
132
|
+
const expected = "test test5 test2 test3 test4";
|
|
133
|
+
expect(actual).toBe(expected);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { combineClasses } from "../utils/classes";
|
|
2
|
+
import { isReactive, isRef, ref, watch } from "vue";
|
|
3
|
+
|
|
4
|
+
export function useCombineClasses(...classes) {
|
|
5
|
+
const classesComputed = ref();
|
|
6
|
+
const reactiveValues = classes.filter((c) => isRef(c) && isReactive(c));
|
|
7
|
+
if (!reactiveValues.length) {
|
|
8
|
+
classesComputed.value = combineClasses(...classes);
|
|
9
|
+
} else {
|
|
10
|
+
watch(
|
|
11
|
+
reactiveValues,
|
|
12
|
+
() => {
|
|
13
|
+
classesComputed.value = combineClasses(...classes);
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
immediate: true,
|
|
17
|
+
deep: true,
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
return classesComputed;
|
|
22
|
+
}
|
package/use/index.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
export * from "./cancellableIntent
|
|
2
|
-
export * from "./
|
|
3
|
-
export * from "./
|
|
4
|
-
export * from "./
|
|
5
|
-
export * from "./
|
|
6
|
-
export * from "./
|
|
7
|
-
export * from "./
|
|
8
|
-
export * from "./
|
|
9
|
-
export * from "./
|
|
10
|
-
export * from "./
|
|
11
|
-
export * from "./
|
|
12
|
-
export * from "./
|
|
13
|
-
export * from "./
|
|
14
|
-
export * from "./
|
|
15
|
-
export * from "./
|
|
16
|
-
export * from "./
|
|
1
|
+
export * from "./cancellableIntent";
|
|
2
|
+
export * from "./combineClasses";
|
|
3
|
+
export * from "./list";
|
|
4
|
+
export * from "./listCalculated";
|
|
5
|
+
export * from "./listFilter";
|
|
6
|
+
export * from "./listInstance";
|
|
7
|
+
export * from "./listRelated";
|
|
8
|
+
export * from "./listSort";
|
|
9
|
+
export * from "./listSubscription";
|
|
10
|
+
export * from "./object";
|
|
11
|
+
export * from "./objectCalculated";
|
|
12
|
+
export * from "./objectInstance";
|
|
13
|
+
export * from "./objectRelated";
|
|
14
|
+
export * from "./objectSubscription";
|
|
15
|
+
export * from "./paginatedListInstance";
|
|
16
|
+
export * from "./search";
|
|
17
|
+
export * from "./watchesRunning";
|