@furystack/utils 4.0.8 → 4.0.10

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 (52) hide show
  1. package/esm/debounce.spec.d.ts +5 -0
  2. package/esm/debounce.spec.d.ts.map +1 -0
  3. package/esm/debounce.spec.js +38 -0
  4. package/esm/debounce.spec.js.map +1 -0
  5. package/esm/deep-merge.spec.d.ts +2 -0
  6. package/esm/deep-merge.spec.d.ts.map +1 -0
  7. package/esm/deep-merge.spec.js +30 -0
  8. package/esm/deep-merge.spec.js.map +1 -0
  9. package/esm/disposable.spec.d.ts +22 -0
  10. package/esm/disposable.spec.d.ts.map +1 -0
  11. package/esm/disposable.spec.js +118 -0
  12. package/esm/disposable.spec.js.map +1 -0
  13. package/esm/observable-value.js +3 -2
  14. package/esm/observable-value.js.map +1 -1
  15. package/esm/observable-value.spec.d.ts +5 -0
  16. package/esm/observable-value.spec.d.ts.map +1 -0
  17. package/esm/observable-value.spec.js +123 -0
  18. package/esm/observable-value.spec.js.map +1 -0
  19. package/esm/path-helper.spec.d.ts +5 -0
  20. package/esm/path-helper.spec.d.ts.map +1 -0
  21. package/esm/path-helper.spec.js +60 -0
  22. package/esm/path-helper.spec.js.map +1 -0
  23. package/esm/sleep-async.spec.d.ts +5 -0
  24. package/esm/sleep-async.spec.d.ts.map +1 -0
  25. package/esm/sleep-async.spec.js +14 -0
  26. package/esm/sleep-async.spec.js.map +1 -0
  27. package/esm/sort-by.d.ts +1 -1
  28. package/esm/sort-by.spec.d.ts +2 -0
  29. package/esm/sort-by.spec.d.ts.map +1 -0
  30. package/esm/sort-by.spec.js +21 -0
  31. package/esm/sort-by.spec.js.map +1 -0
  32. package/esm/trace.js +1 -1
  33. package/esm/trace.js.map +1 -1
  34. package/esm/trace.spec.d.ts +2 -0
  35. package/esm/trace.spec.d.ts.map +1 -0
  36. package/esm/trace.spec.js +184 -0
  37. package/esm/trace.spec.js.map +1 -0
  38. package/esm/tuple.spec.d.ts +2 -0
  39. package/esm/tuple.spec.d.ts.map +1 -0
  40. package/esm/tuple.spec.js +8 -0
  41. package/esm/tuple.spec.js.map +1 -0
  42. package/esm/value-observer.js +2 -0
  43. package/esm/value-observer.js.map +1 -1
  44. package/package.json +3 -3
  45. package/src/debounce.spec.ts +2 -2
  46. package/src/deep-merge.spec.ts +2 -2
  47. package/src/disposable.spec.ts +2 -2
  48. package/src/observable-value.spec.ts +1 -1
  49. package/src/path-helper.spec.ts +1 -1
  50. package/src/sleep-async.spec.ts +1 -1
  51. package/src/trace.spec.ts +1 -1
  52. package/src/tuple.spec.ts +1 -1
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for debounce
3
+ */
4
+ export declare const debounceTests: import("@vitest/runner/dist/tasks-e594cd24.js").f<{}>;
5
+ //# sourceMappingURL=debounce.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce.spec.d.ts","sourceRoot":"","sources":["../src/debounce.spec.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,eAAO,MAAM,aAAa,uDAkCxB,CAAA"}
@@ -0,0 +1,38 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { debounce } from './debounce.js';
3
+ import { sleepAsync } from './sleep-async.js';
4
+ /**
5
+ * Tests for debounce
6
+ */
7
+ export const debounceTests = describe('debounce', () => {
8
+ it('Simple method execution', async () => {
9
+ const method = vi.fn();
10
+ await new Promise((resolve) => {
11
+ const debouncedMethod = debounce(() => {
12
+ resolve();
13
+ method();
14
+ });
15
+ debouncedMethod();
16
+ });
17
+ expect(method).toBeCalledTimes(1);
18
+ });
19
+ it('Should be executed once when triggered multiple time in a given range', async () => {
20
+ const method = vi.fn();
21
+ const debouncedMethod = debounce(method, 10);
22
+ for (let index = 0; index < 10; index++) {
23
+ debouncedMethod();
24
+ }
25
+ await sleepAsync(300);
26
+ expect(method).toBeCalledTimes(1);
27
+ });
28
+ it('Should be executed multiple times when triggered multiple times out of a a given range', async () => {
29
+ const method = vi.fn();
30
+ const debouncedMethod = debounce(method, 10);
31
+ for (let index = 0; index < 10; index++) {
32
+ debouncedMethod();
33
+ await sleepAsync(15);
34
+ }
35
+ expect(method).toBeCalledTimes(10);
36
+ });
37
+ });
38
+ //# sourceMappingURL=debounce.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce.spec.js","sourceRoot":"","sources":["../src/debounce.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACtB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,EAAE;gBACpC,OAAO,EAAE,CAAA;gBACT,MAAM,EAAE,CAAA;YACV,CAAC,CAAC,CAAA;YACF,eAAe,EAAE,CAAA;QACnB,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAEtB,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE;YACvC,eAAe,EAAE,CAAA;SAClB;QACD,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;QACvG,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAEtB,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE;YACvC,eAAe,EAAE,CAAA;YACjB,MAAM,UAAU,CAAC,EAAE,CAAC,CAAA;SACrB;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deep-merge.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-merge.spec.d.ts","sourceRoot":"","sources":["../src/deep-merge.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { deepMerge } from './deep-merge.js';
3
+ describe('DeepMerge tests', () => {
4
+ it('Should return the target object if no merge sources are defined', () => {
5
+ const obj = { a: 1 };
6
+ expect(deepMerge(obj)).toBe(obj);
7
+ });
8
+ it('Should merge simple values in one level', () => {
9
+ expect(deepMerge({ a: 1, b: 0, c: 0 }, { b: 2 }, { c: 3 })).toEqual({ a: 1, b: 2, c: 3 });
10
+ });
11
+ it('Should skip falsy sources', () => {
12
+ expect(deepMerge({ a: 1, b: 0, c: 0 }, null, { b: 2 }, { c: 3 })).toEqual({ a: 1, b: 2, c: 3 });
13
+ });
14
+ it('Should override arrays', () => {
15
+ expect(deepMerge({ a: [0, 1, 2] }, { a: [1, 2, 3] })).toEqual({ a: [1, 2, 3] });
16
+ });
17
+ it('Should merge nested objects', () => {
18
+ expect(deepMerge({ a: 1, b: { a: 1, b: 2 } }, { b: { a: 3 } })).toEqual({ a: 1, b: { a: 3, b: 2 } });
19
+ });
20
+ it('Should respect falsy but defined values (false)', () => {
21
+ expect(deepMerge({ a: true }, { a: false })).toEqual({ a: false });
22
+ });
23
+ it('Should respect falsy but defined values (empty string)', () => {
24
+ expect(deepMerge({ a: 'asdasd' }, { a: '' })).toEqual({ a: '' });
25
+ });
26
+ it('Should respect falsy but defined values (zero)', () => {
27
+ expect(deepMerge({ a: 654 }, { a: 0 })).toEqual({ a: 0 });
28
+ });
29
+ });
30
+ //# sourceMappingURL=deep-merge.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-merge.spec.js","sourceRoot":"","sources":["../src/deep-merge.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Disposable } from './disposable.js';
2
+ export declare class MockDisposable implements Disposable {
3
+ private disposed;
4
+ isDisposed: () => boolean;
5
+ /**
6
+ * Disposes the MockDisposable instance, calls the dispose callback
7
+ */
8
+ dispose: () => void;
9
+ /**
10
+ * Mock to throw an error
11
+ */
12
+ whooops(): void;
13
+ /**
14
+ * Defines the callback that will be called on dispose
15
+ */
16
+ disposeCallback: () => void;
17
+ }
18
+ /**
19
+ * Unit tests for disposables
20
+ */
21
+ export declare const disposableTests: import("@vitest/runner/dist/tasks-e594cd24.js").f<{}>;
22
+ //# sourceMappingURL=disposable.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disposable.spec.d.ts","sourceRoot":"","sources":["../src/disposable.spec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGjD,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,QAAQ,CAAQ;IACjB,UAAU,gBAAsB;IACvC;;OAEG;IACI,OAAO,aAGb;IAED;;OAEG;IACI,OAAO;IAId;;OAEG;IACI,eAAe,EAAG,MAAM,IAAI,CAAA;CACpC;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,uDAkG1B,CAAA"}
@@ -0,0 +1,118 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { using, usingAsync } from './disposable.js';
3
+ export class MockDisposable {
4
+ disposed = false;
5
+ isDisposed = () => this.disposed;
6
+ /**
7
+ * Disposes the MockDisposable instance, calls the dispose callback
8
+ */
9
+ dispose = () => {
10
+ this.disposed = true;
11
+ this.disposeCallback && this.disposeCallback();
12
+ };
13
+ /**
14
+ * Mock to throw an error
15
+ */
16
+ whooops() {
17
+ throw Error('Whooops');
18
+ }
19
+ /**
20
+ * Defines the callback that will be called on dispose
21
+ */
22
+ disposeCallback;
23
+ }
24
+ /**
25
+ * Unit tests for disposables
26
+ */
27
+ export const disposableTests = describe('Disposable', () => {
28
+ it('Can be constructed', () => {
29
+ using(new MockDisposable(), (d) => {
30
+ expect(d).toBeInstanceOf(MockDisposable);
31
+ });
32
+ });
33
+ it('Should return a value from a callback', () => {
34
+ const returned = using(new MockDisposable(), () => {
35
+ return 1;
36
+ });
37
+ expect(returned).toBe(1);
38
+ });
39
+ it('Should return a value from an async callback', async () => {
40
+ const returned = await usingAsync(new MockDisposable(), async () => {
41
+ return 2;
42
+ });
43
+ expect(returned).toBe(2);
44
+ });
45
+ describe('isDisposed', () => {
46
+ it('should return a correct value before and after disposition', () => {
47
+ const d = new MockDisposable();
48
+ expect(d.isDisposed()).toBe(false);
49
+ d.dispose();
50
+ expect(d.isDisposed()).toBe(true);
51
+ });
52
+ });
53
+ describe('dispose()', () => {
54
+ it('should be called on error', () => {
55
+ const callbackMethod = vi.fn();
56
+ try {
57
+ using(new MockDisposable(), (d) => {
58
+ d.disposeCallback = () => {
59
+ callbackMethod();
60
+ };
61
+ d.whooops();
62
+ });
63
+ }
64
+ catch {
65
+ /** ignore */
66
+ }
67
+ expect(callbackMethod).toBeCalled();
68
+ });
69
+ it('should be called with usingAsync()', async () => {
70
+ const callbackMethod = vi.fn();
71
+ await usingAsync(new MockDisposable(), async (d) => {
72
+ d.disposeCallback = () => {
73
+ callbackMethod();
74
+ };
75
+ return new Promise((resolve) => {
76
+ setTimeout(resolve, 1);
77
+ });
78
+ });
79
+ expect(callbackMethod).toBeCalled();
80
+ });
81
+ it('should be called when async fails', async () => {
82
+ const callbackMethod = vi.fn();
83
+ try {
84
+ await usingAsync(new MockDisposable(), async (d) => {
85
+ d.disposeCallback = () => {
86
+ callbackMethod();
87
+ };
88
+ return new Promise((_resolve, reject) => {
89
+ setTimeout(reject, 1);
90
+ });
91
+ });
92
+ }
93
+ catch (error) {
94
+ /** ignore */
95
+ }
96
+ expect(callbackMethod).toBeCalled();
97
+ });
98
+ it('should await dispose for asyncs with usingAsync()', async () => {
99
+ class AsyncDispose {
100
+ /** flag */
101
+ isDisposed = false;
102
+ /** set isDisposed with a timeout */
103
+ async dispose() {
104
+ await new Promise((resolve) => setTimeout(() => {
105
+ this.isDisposed = true;
106
+ resolve();
107
+ }, 10));
108
+ }
109
+ }
110
+ const asyncDispose = new AsyncDispose();
111
+ await usingAsync(asyncDispose, async () => {
112
+ /** */
113
+ });
114
+ expect(asyncDispose.isDisposed).toBe(true);
115
+ });
116
+ });
117
+ });
118
+ //# sourceMappingURL=disposable.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disposable.spec.js","sourceRoot":"","sources":["../src/disposable.spec.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,7 @@ export class ObservableValue {
31
31
  get isDisposed() {
32
32
  return this._isDisposed;
33
33
  }
34
+ _isDisposed = false;
34
35
  /**
35
36
  * Disposes the ObservableValue object, removes all observers
36
37
  */
@@ -38,6 +39,8 @@ export class ObservableValue {
38
39
  this.observers.clear();
39
40
  this._isDisposed = true;
40
41
  }
42
+ observers = new Set();
43
+ currentValue;
41
44
  /**
42
45
  * Subscribes to a value changes
43
46
  * @param callback The callback method that will be called on each change
@@ -99,8 +102,6 @@ export class ObservableValue {
99
102
  * @param initialValue Optional initial value
100
103
  */
101
104
  constructor(initialValue) {
102
- this._isDisposed = false;
103
- this.observers = new Set();
104
105
  if (initialValue !== undefined) {
105
106
  this.currentValue = initialValue;
106
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"observable-value.js","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD;QACE,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACtC,CAAC;CACF;AAOD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,eAAe;IAC1B,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAID;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IAID;;;;;OAKG;IACI,SAAS,CAAC,QAAgC,EAAE,OAAO,GAAG,KAAK;QAChE,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,IAAI,8BAA8B,EAAE,CAAA;SAC3C;QACD,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAI,IAAI,EAAE,QAAQ,CAAC,CAAA;QACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,IAAI,OAAO,EAAE;YACX,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;SAC5B;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAA0B;QAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,IAAI,8BAA8B,EAAE,CAAA;SAC3C;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,QAAW;QACzB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,IAAI,8BAA8B,EAAE,CAAA;SAC3C;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE;YAClC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAA;YAC5B,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE;gBACzC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;aAChC;SACF;IACH,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAoC,CAAA;IAC/D,CAAC;IAED;;OAEG;IACH,YAAY,YAAgB;QA7EpB,gBAAW,GAAG,KAAK,CAAA;QASnB,cAAS,GAA0B,IAAI,GAAG,EAAE,CAAA;QAqElD,IAAI,YAAY,KAAK,SAAS,EAAE;YAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;SACjC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"observable-value.js","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD;QACE,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACtC,CAAC;CACF;AAOD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,eAAe;IAC1B,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAEO,WAAW,GAAG,KAAK,CAAA;IAE3B;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IACO,SAAS,GAA0B,IAAI,GAAG,EAAE,CAAA;IAC5C,YAAY,CAAI;IAExB;;;;;OAKG;IACI,SAAS,CAAC,QAAgC,EAAE,OAAO,GAAG,KAAK;QAChE,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,IAAI,8BAA8B,EAAE,CAAA;SAC3C;QACD,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAI,IAAI,EAAE,QAAQ,CAAC,CAAA;QACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,IAAI,OAAO,EAAE;YACX,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;SAC5B;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAA0B;QAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,IAAI,8BAA8B,EAAE,CAAA;SAC3C;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,QAAW;QACzB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,IAAI,8BAA8B,EAAE,CAAA;SAC3C;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE;YAClC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAA;YAC5B,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE;gBACzC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;aAChC;SACF;IACH,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAoC,CAAA;IAC/D,CAAC;IAED;;OAEG;IACH,YAAY,YAAgB;QAC1B,IAAI,YAAY,KAAK,SAAS,EAAE;YAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;SACjC;IACH,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Observable Value tests
3
+ */
4
+ export declare const observableTests: import("@vitest/runner/dist/tasks-e594cd24.js").f<{}>;
5
+ //# sourceMappingURL=observable-value.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observable-value.spec.d.ts","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,eAAe,uDAyI1B,CAAA"}
@@ -0,0 +1,123 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { ObservableValue } from './observable-value.js';
3
+ /**
4
+ * Observable Value tests
5
+ */
6
+ export const observableTests = describe('Observable', () => {
7
+ it('should be constructed without initial value', () => {
8
+ const v = new ObservableValue();
9
+ const doneCallback = vi.fn();
10
+ v.subscribe(() => {
11
+ expect(v.getValue()).toBe(undefined);
12
+ doneCallback();
13
+ }, true);
14
+ expect(v).toBeInstanceOf(ObservableValue);
15
+ expect(doneCallback).toBeCalled();
16
+ });
17
+ it('should be constructed with initial value', () => {
18
+ const v = new ObservableValue(1);
19
+ const doneCallback = vi.fn();
20
+ v.subscribe(() => {
21
+ expect(v.getValue()).toBe(1);
22
+ doneCallback();
23
+ }, true);
24
+ expect(doneCallback).toBeCalled();
25
+ });
26
+ describe('Subscription callback', () => {
27
+ it('should be triggered only when a value is changed', () => {
28
+ const v = new ObservableValue(1);
29
+ const doneCallback = vi.fn();
30
+ v.subscribe(() => {
31
+ expect(v.getValue()).toBe(2);
32
+ doneCallback();
33
+ }, false);
34
+ v.setValue(1);
35
+ v.setValue(1);
36
+ v.setValue(2);
37
+ expect(doneCallback).toBeCalledTimes(1);
38
+ });
39
+ it('should be triggered only on change when getLast is false', () => {
40
+ const v = new ObservableValue(1);
41
+ const doneCallback = vi.fn();
42
+ v.subscribe((value) => {
43
+ expect(value).toBe(2);
44
+ doneCallback();
45
+ }, false);
46
+ v.setValue(2);
47
+ expect(doneCallback).toBeCalledTimes(1);
48
+ });
49
+ });
50
+ describe('Unsubscribe', () => {
51
+ it('should remove the subscription on unsubscribe()', () => {
52
+ const shouldNotCall = vi.fn();
53
+ const doneCallback = vi.fn((value) => {
54
+ expect(value).toBe(2);
55
+ });
56
+ const v = new ObservableValue(1);
57
+ const observer1 = v.subscribe(shouldNotCall);
58
+ v.subscribe(doneCallback);
59
+ v.unsubscribe(observer1);
60
+ v.setValue(2);
61
+ expect(doneCallback).toBeCalledTimes(1);
62
+ expect(shouldNotCall).not.toBeCalled();
63
+ });
64
+ it('should remove the subscription on Observable dispose', () => {
65
+ const callback1 = () => {
66
+ /** */
67
+ };
68
+ const callback2 = () => {
69
+ /** */
70
+ };
71
+ const v = new ObservableValue(1);
72
+ v.subscribe(callback1);
73
+ v.subscribe(callback2);
74
+ expect(v.getObservers().length).toBe(2);
75
+ v.dispose();
76
+ expect(v.getObservers().length).toBe(0);
77
+ });
78
+ it('should remove the subscription on Observer dispose', () => {
79
+ const callback1 = () => {
80
+ /** */
81
+ };
82
+ const v = new ObservableValue(1);
83
+ const observer = v.subscribe(callback1);
84
+ expect(v.getObservers().length).toBe(1);
85
+ observer.dispose();
86
+ expect(v.getObservers().length).toBe(0);
87
+ });
88
+ it('should throw an error for setValue() when the observer has been disposed', () => {
89
+ const v = new ObservableValue(1);
90
+ v.dispose();
91
+ expect(() => v.setValue(3)).toThrowError('Observable already disposed');
92
+ });
93
+ it('should throw an error for getValue() when the observer has been disposed', () => {
94
+ const v = new ObservableValue(1);
95
+ v.dispose();
96
+ expect(() => v.getValue()).toThrowError('Observable already disposed');
97
+ });
98
+ it('should throw an error for subscribe() when the observer has been disposed', () => {
99
+ const v = new ObservableValue(1);
100
+ v.dispose();
101
+ expect(() => v.subscribe(() => {
102
+ /** */
103
+ })).toThrowError('Observable already disposed');
104
+ });
105
+ it('should remove the subscription only from the disposed Observer', () => {
106
+ const doneCallback = vi.fn();
107
+ class Alma {
108
+ Callback() {
109
+ doneCallback();
110
+ }
111
+ }
112
+ const v = new ObservableValue(1);
113
+ const observer = v.subscribe(new Alma().Callback);
114
+ v.subscribe(new Alma().Callback);
115
+ expect(v.getObservers().length).toBe(2);
116
+ observer.dispose();
117
+ expect(v.getObservers().length).toBe(1);
118
+ v.setValue(3);
119
+ expect(doneCallback).toBeCalledTimes(1);
120
+ });
121
+ });
122
+ });
123
+ //# sourceMappingURL=observable-value.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observable-value.spec.js","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Path Helper tests
3
+ */
4
+ export declare const pathHelperTests: import("@vitest/runner/dist/tasks-e594cd24.js").f<{}>;
5
+ //# sourceMappingURL=path-helper.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-helper.spec.d.ts","sourceRoot":"","sources":["../src/path-helper.spec.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,eAAe,uDAiE1B,CAAA"}
@@ -0,0 +1,60 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { PathHelper } from './path-helper.js';
3
+ /**
4
+ * Path Helper tests
5
+ */
6
+ export const pathHelperTests = describe('PathHelper', () => {
7
+ describe('#trimSlashes()', () => {
8
+ it('should trim from the beginning of the segment', () => {
9
+ expect(PathHelper.trimSlashes('/segment')).toBe('segment');
10
+ });
11
+ it('should trim multiple slashes from the beginning of the segment', () => {
12
+ expect(PathHelper.trimSlashes('//////segment')).toBe('segment');
13
+ });
14
+ it('should trim from the end of the segment', () => {
15
+ expect(PathHelper.trimSlashes('segment/')).toBe('segment');
16
+ });
17
+ it('should trim multiple slashes from the end of the segment', () => {
18
+ expect(PathHelper.trimSlashes('segment///')).toBe('segment');
19
+ });
20
+ });
21
+ describe('#joinPaths()', () => {
22
+ it('should join with slashes', () => {
23
+ const joined = PathHelper.joinPaths('path1', 'path2', 'path3');
24
+ expect(joined).toBe('path1/path2/path3');
25
+ });
26
+ it('should remove slashes from the beginning of the segments', () => {
27
+ const joined = PathHelper.joinPaths('path1', 'path2/', 'path3/');
28
+ expect(joined).toBe('path1/path2/path3');
29
+ });
30
+ it('should remove slashes from the end of the segments', () => {
31
+ const joined = PathHelper.joinPaths('/path1', '/path2', 'path3/');
32
+ expect(joined).toBe('path1/path2/path3');
33
+ });
34
+ });
35
+ describe('#isAncestorOf()', () => {
36
+ it('should return true if content is ancestor', () => {
37
+ expect(PathHelper.isAncestorOf('Root/Example', 'Root/Example/Content1')).toBe(true);
38
+ });
39
+ it('should return true if content is ancestor and ends with a slash', () => {
40
+ expect(PathHelper.isAncestorOf('Root/Example/', 'Root/Example/Content1')).toBe(true);
41
+ });
42
+ it('should return false if content is not an ancestor', () => {
43
+ expect(PathHelper.isAncestorOf('Root/Example/', 'Root/Example2/Content1')).toBe(false);
44
+ });
45
+ });
46
+ describe('#getSegments()', () => {
47
+ it('Should split the path to segments', () => {
48
+ expect(PathHelper.getSegments("Root/Example/('Content1')")).toEqual(['Root', 'Example', "('Content1')"]);
49
+ });
50
+ });
51
+ describe('#getParentPath()', () => {
52
+ it('Should return the parent path', () => {
53
+ expect(PathHelper.getParentPath('Root/Example/Content')).toBe('Root/Example');
54
+ });
55
+ it('Should return the path in case of 1 segments', () => {
56
+ expect(PathHelper.getParentPath('Root')).toBe('Root');
57
+ });
58
+ });
59
+ });
60
+ //# sourceMappingURL=path-helper.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-helper.spec.js","sourceRoot":"","sources":["../src/path-helper.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for async sleep
3
+ */
4
+ export declare const sleepAsyncTests: import("@vitest/runner/dist/tasks-e594cd24.js").f<{}>;
5
+ //# sourceMappingURL=sleep-async.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep-async.spec.d.ts","sourceRoot":"","sources":["../src/sleep-async.spec.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,eAAe,uDAQ1B,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { sleepAsync } from './sleep-async.js';
3
+ /**
4
+ * Tests for async sleep
5
+ */
6
+ export const sleepAsyncTests = describe('sleepAsync', () => {
7
+ it('Should return a Promise', () => {
8
+ expect(sleepAsync()).toBeInstanceOf(Promise);
9
+ });
10
+ it('Should be resolved in time', async () => {
11
+ await sleepAsync(15);
12
+ });
13
+ });
14
+ //# sourceMappingURL=sleep-async.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep-async.spec.js","sourceRoot":"","sources":["../src/sleep-async.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,UAAU,CAAC,EAAE,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/esm/sort-by.d.ts CHANGED
@@ -9,5 +9,5 @@ declare global {
9
9
  sortBy: (field: keyof T, direction?: 'asc' | 'desc') => T[];
10
10
  }
11
11
  }
12
- export declare const compareBy: <T, K extends keyof T>(entity1: T, entity2: T, field: K, direction: 'asc' | 'desc') => 0 | 1 | -1;
12
+ export declare const compareBy: <T, K extends keyof T>(entity1: T, entity2: T, field: K, direction: 'asc' | 'desc') => 1 | 0 | -1;
13
13
  //# sourceMappingURL=sort-by.d.ts.map
@@ -0,0 +1,2 @@
1
+ import './sort-by';
2
+ //# sourceMappingURL=sort-by.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort-by.spec.d.ts","sourceRoot":"","sources":["../src/sort-by.spec.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import './sort-by';
3
+ describe('sortBy', () => {
4
+ it('Should sort by ascending by default', () => {
5
+ const arr = [{ v: 5 }, { v: 3 }, { v: 4 }];
6
+ expect(arr.sortBy('v')).toEqual([{ v: 3 }, { v: 4 }, { v: 5 }]);
7
+ });
8
+ it('Should sort by ascending', () => {
9
+ const arr = [{ v: 5 }, { v: 4 }, { v: 3 }];
10
+ expect(arr.sortBy('v', 'asc')).toEqual([{ v: 3 }, { v: 4 }, { v: 5 }]);
11
+ });
12
+ it('Should sort by descending', () => {
13
+ const arr = [{ v: 3 }, { v: 4 }, { v: 5 }];
14
+ expect(arr.sortBy('v', 'desc')).toEqual([{ v: 5 }, { v: 4 }, { v: 3 }]);
15
+ });
16
+ it('Should handle equalities', () => {
17
+ const arr = [{ v: 3 }, { v: 4 }, { v: 4 }];
18
+ expect(arr.sortBy('v', 'desc')).toEqual([{ v: 4 }, { v: 4 }, { v: 3 }]);
19
+ });
20
+ });
21
+ //# sourceMappingURL=sort-by.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort-by.spec.js","sourceRoot":"","sources":["../src/sort-by.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,WAAW,CAAA;AAClB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/esm/trace.js CHANGED
@@ -21,6 +21,7 @@ import { ObservableValue } from './observable-value.js';
21
21
  * ```
22
22
  */
23
23
  export class Trace {
24
+ static objectTraces = new Map();
24
25
  static getMethodTrace(object, method) {
25
26
  const objectTrace = this.objectTraces.get(object);
26
27
  return objectTrace.methodMappings.get(method.name);
@@ -122,5 +123,4 @@ export class Trace {
122
123
  };
123
124
  }
124
125
  }
125
- Trace.objectTraces = new Map();
126
126
  //# sourceMappingURL=trace.js.map
package/esm/trace.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const traceTests: import("@vitest/runner/dist/tasks-e594cd24.js").f<{}>;
2
+ //# sourceMappingURL=trace.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.spec.d.ts","sourceRoot":"","sources":["../src/trace.spec.ts"],"names":[],"mappings":"AA+BA,eAAO,MAAM,UAAU,uDAwKrB,CAAA"}
@@ -0,0 +1,184 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { Trace } from './trace.js';
3
+ class MockClass {
4
+ testValue;
5
+ constructor(testValue) {
6
+ this.testValue = testValue;
7
+ }
8
+ testError(msg) {
9
+ throw Error(msg);
10
+ }
11
+ testScope() {
12
+ return this.testValue;
13
+ }
14
+ static addStatic(...args) {
15
+ return args.reduce((a, b) => a + b, 0);
16
+ }
17
+ addInstance(...args) {
18
+ return args.reduce((a, b) => a + b, 0);
19
+ }
20
+ async addInstanceAsync(...args) {
21
+ return args.reduce((a, b) => a + b, 0);
22
+ }
23
+ async testErrorAsync(msg) {
24
+ throw Error(msg);
25
+ }
26
+ }
27
+ export const traceTests = describe('Trace tests', () => {
28
+ describe('Static method traces', () => {
29
+ it('Static Methods call should be traced with args', () => {
30
+ const args = [1, 2, 3];
31
+ const doneCallback = vi.fn();
32
+ const observer = Trace.method({
33
+ object: MockClass,
34
+ method: MockClass.addStatic,
35
+ onCalled: (traceData) => {
36
+ expect(args).toEqual(traceData.methodArguments);
37
+ observer.dispose();
38
+ doneCallback();
39
+ },
40
+ });
41
+ MockClass.addStatic(...args);
42
+ expect(doneCallback).toBeCalled();
43
+ });
44
+ it('Static Methods call should be traced with args and return value', () => {
45
+ const args = [1, 2, 3];
46
+ const doneCallback = vi.fn();
47
+ const observer = Trace.method({
48
+ object: MockClass,
49
+ method: MockClass.addStatic,
50
+ onFinished: (traceData) => {
51
+ expect(args).toEqual(traceData.methodArguments);
52
+ expect(traceData.returned).toBe(1 + 2 + 3);
53
+ observer.dispose();
54
+ doneCallback();
55
+ },
56
+ });
57
+ MockClass.addStatic(...args);
58
+ expect(doneCallback).toBeCalled();
59
+ });
60
+ it("shouldn't be triggered after observer is disposed", () => {
61
+ const args = [1, 2, 3];
62
+ const shouldNotCall = vi.fn();
63
+ const doneCallback = vi.fn();
64
+ const observer = Trace.method({
65
+ object: MockClass,
66
+ method: MockClass.addStatic,
67
+ onCalled: () => {
68
+ shouldNotCall("Shouldn't be triggered here");
69
+ },
70
+ });
71
+ const observer2 = Trace.method({
72
+ object: MockClass,
73
+ method: MockClass.addStatic,
74
+ onCalled: () => {
75
+ observer2.dispose();
76
+ doneCallback();
77
+ },
78
+ });
79
+ observer.dispose();
80
+ const returned = MockClass.addStatic(...args);
81
+ expect(returned).toEqual(1 + 2 + 3);
82
+ expect(doneCallback).toBeCalled();
83
+ expect(shouldNotCall).not.toBeCalled();
84
+ });
85
+ });
86
+ describe('Instance method traces', () => {
87
+ it('should be traced with arguments', () => {
88
+ const instance = new MockClass();
89
+ const args = [1, 2, 3];
90
+ const doneCallback = vi.fn();
91
+ const observer = Trace.method({
92
+ object: instance,
93
+ method: instance.addInstance,
94
+ onFinished: (traceData) => {
95
+ expect(args).toEqual(traceData.methodArguments);
96
+ expect(traceData.returned).toBe(1 + 2 + 3);
97
+ observer.dispose();
98
+ doneCallback();
99
+ },
100
+ });
101
+ instance.addInstance(...args);
102
+ expect(doneCallback).toBeCalled();
103
+ });
104
+ it('should be traced asynchronously', async () => {
105
+ const instance = new MockClass();
106
+ const args = [1, 2, 3];
107
+ const doneCallback = vi.fn();
108
+ const observer = Trace.method({
109
+ object: instance,
110
+ method: instance.addInstanceAsync,
111
+ isAsync: true,
112
+ onFinished: (traceData) => {
113
+ expect(args).toEqual(traceData.methodArguments);
114
+ const { returned } = traceData;
115
+ expect(returned).toBe(1 + 2 + 3);
116
+ observer.dispose();
117
+ doneCallback();
118
+ },
119
+ });
120
+ await instance.addInstanceAsync(...args);
121
+ expect(doneCallback).toBeCalled();
122
+ });
123
+ it("should have a valid 'this' scope", () => {
124
+ const instance = new MockClass('testValue');
125
+ const doneCallback = vi.fn();
126
+ const observer = Trace.method({
127
+ object: instance,
128
+ method: instance.testScope,
129
+ onFinished: (traceData) => {
130
+ if (traceData.returned) {
131
+ expect(traceData.returned).toBe('testValue');
132
+ observer.dispose();
133
+ doneCallback();
134
+ }
135
+ },
136
+ });
137
+ expect(instance.testScope()).toBe('testValue');
138
+ expect(doneCallback).toBeCalled();
139
+ });
140
+ it('should handle throwing errors', () => {
141
+ const instance = new MockClass('testValue');
142
+ const doneCallback = vi.fn();
143
+ const observer = Trace.method({
144
+ object: instance,
145
+ method: instance.testError,
146
+ onError: (traceData) => {
147
+ if (traceData.error) {
148
+ expect(traceData.error.message).toBe('message');
149
+ observer.dispose();
150
+ doneCallback();
151
+ }
152
+ },
153
+ });
154
+ expect(() => {
155
+ instance.testError('message');
156
+ }).toThrow();
157
+ expect(doneCallback).toBeCalled();
158
+ });
159
+ it('should handle throwing errors with asyncs', async () => {
160
+ const instance = new MockClass('testValue');
161
+ const doneCallback = vi.fn();
162
+ const observer = Trace.method({
163
+ object: instance,
164
+ method: instance.testErrorAsync,
165
+ isAsync: true,
166
+ onError: (traceData) => {
167
+ if (traceData.error) {
168
+ expect(traceData.error.message).toBe('message');
169
+ observer.dispose();
170
+ doneCallback();
171
+ }
172
+ },
173
+ });
174
+ try {
175
+ await instance.testErrorAsync('message');
176
+ }
177
+ catch (error) {
178
+ // ignore
179
+ }
180
+ expect(doneCallback).toBeCalled();
181
+ });
182
+ });
183
+ });
184
+ //# sourceMappingURL=trace.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.spec.js","sourceRoot":"","sources":["../src/trace.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tuple.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuple.spec.d.ts","sourceRoot":"","sources":["../src/tuple.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { tuple } from './tuple.js';
2
+ import { describe, it, expect } from 'vitest';
3
+ describe('Tuple', () => {
4
+ it('Should return a Tuple object', () => {
5
+ expect(tuple('a', 'b', 'c')).toEqual(['a', 'b', 'c']);
6
+ });
7
+ });
8
+ //# sourceMappingURL=tuple.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuple.spec.js","sourceRoot":"","sources":["../src/tuple.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -21,6 +21,8 @@
21
21
  * @param T This type parameter is the value type to observe
22
22
  */
23
23
  export class ValueObserver {
24
+ observable;
25
+ callback;
24
26
  /**
25
27
  * Disposes the ValueObserver instance. Unsubscribes from the observable
26
28
  */
@@ -1 +1 @@
1
- {"version":3,"file":"value-observer.js","sourceRoot":"","sources":["../src/value-observer.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,aAAa;IACxB;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IAED;;;;OAIG;IACH,YACkB,UAA8B,EACvC,QAAgC;QADvB,eAAU,GAAV,UAAU,CAAoB;QACvC,aAAQ,GAAR,QAAQ,CAAwB;IACtC,CAAC;CACL"}
1
+ {"version":3,"file":"value-observer.js","sourceRoot":"","sources":["../src/value-observer.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,aAAa;IAcN;IACT;IAdT;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IAED;;;;OAIG;IACH,YACkB,UAA8B,EACvC,QAAgC;QADvB,eAAU,GAAV,UAAU,CAAoB;QACvC,aAAQ,GAAR,QAAQ,CAAwB;IACtC,CAAC;CACL"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@furystack/utils",
3
- "version": "4.0.8",
3
+ "version": "4.0.10",
4
4
  "description": "General utilities",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "homepage": "https://github.com/furystack/furystack",
36
36
  "devDependencies": {
37
- "typescript": "^5.1.6",
38
- "vitest": "^0.34.2"
37
+ "typescript": "^5.2.2",
38
+ "vitest": "^0.34.6"
39
39
  }
40
40
  }
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, vi } from 'vitest'
2
- import { debounce } from './debounce'
3
- import { sleepAsync } from './sleep-async'
2
+ import { debounce } from './debounce.js'
3
+ import { sleepAsync } from './sleep-async.js'
4
4
 
5
5
  /**
6
6
  * Tests for debounce
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest'
2
- import { deepMerge } from './deep-merge'
2
+ import { deepMerge } from './deep-merge.js'
3
3
 
4
4
  describe('DeepMerge tests', () => {
5
5
  it('Should return the target object if no merge sources are defined', () => {
@@ -24,7 +24,7 @@ describe('DeepMerge tests', () => {
24
24
  })
25
25
 
26
26
  it('Should respect falsy but defined values (false)', () => {
27
- expect(deepMerge({ a: true }, { a: false })).toEqual({ a: false })
27
+ expect(deepMerge<{ a: boolean }>({ a: true }, { a: false })).toEqual({ a: false })
28
28
  })
29
29
 
30
30
  it('Should respect falsy but defined values (empty string)', () => {
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, vi } from 'vitest'
2
- import type { Disposable } from './disposable'
3
- import { using, usingAsync } from './disposable'
2
+ import type { Disposable } from './disposable.js'
3
+ import { using, usingAsync } from './disposable.js'
4
4
 
5
5
  export class MockDisposable implements Disposable {
6
6
  private disposed = false
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, vi } from 'vitest'
2
- import { ObservableValue } from './observable-value'
2
+ import { ObservableValue } from './observable-value.js'
3
3
 
4
4
  /**
5
5
  * Observable Value tests
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest'
2
- import { PathHelper } from './path-helper'
2
+ import { PathHelper } from './path-helper.js'
3
3
 
4
4
  /**
5
5
  * Path Helper tests
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest'
2
- import { sleepAsync } from './sleep-async'
2
+ import { sleepAsync } from './sleep-async.js'
3
3
 
4
4
  /**
5
5
  * Tests for async sleep
package/src/trace.spec.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, vi } from 'vitest'
2
- import { Trace } from './trace'
2
+ import { Trace } from './trace.js'
3
3
 
4
4
  class MockClass {
5
5
  constructor(private testValue?: string) {}
package/src/tuple.spec.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { tuple } from './tuple'
1
+ import { tuple } from './tuple.js'
2
2
  import { describe, it, expect } from 'vitest'
3
3
 
4
4
  describe('Tuple', () => {