@furystack/utils 7.0.2 → 8.0.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 (103) hide show
  1. package/README.md +3 -3
  2. package/esm/debounce.d.ts.map +1 -1
  3. package/esm/deep-merge.d.ts.map +1 -1
  4. package/esm/deep-merge.spec.js +1 -1
  5. package/esm/deep-merge.spec.js.map +1 -1
  6. package/esm/event-hub.d.ts +1 -2
  7. package/esm/event-hub.d.ts.map +1 -1
  8. package/esm/event-hub.js +2 -2
  9. package/esm/event-hub.js.map +1 -1
  10. package/esm/event-hub.spec.js +4 -4
  11. package/esm/event-hub.spec.js.map +1 -1
  12. package/esm/index.d.ts +6 -4
  13. package/esm/index.d.ts.map +1 -1
  14. package/esm/index.js +6 -4
  15. package/esm/index.js.map +1 -1
  16. package/esm/is-async-disposable.d.ts +7 -0
  17. package/esm/is-async-disposable.d.ts.map +1 -0
  18. package/esm/is-async-disposable.js +9 -0
  19. package/esm/is-async-disposable.js.map +1 -0
  20. package/esm/is-async-disposable.spec.d.ts +2 -0
  21. package/esm/is-async-disposable.spec.d.ts.map +1 -0
  22. package/esm/is-async-disposable.spec.js +21 -0
  23. package/esm/is-async-disposable.spec.js.map +1 -0
  24. package/esm/is-disposable.d.ts +7 -0
  25. package/esm/is-disposable.d.ts.map +1 -0
  26. package/esm/is-disposable.js +9 -0
  27. package/esm/is-disposable.js.map +1 -0
  28. package/esm/is-disposable.spec.d.ts +2 -0
  29. package/esm/is-disposable.spec.d.ts.map +1 -0
  30. package/esm/is-disposable.spec.js +21 -0
  31. package/esm/is-disposable.spec.js.map +1 -0
  32. package/esm/observable-value.d.ts +4 -5
  33. package/esm/observable-value.d.ts.map +1 -1
  34. package/esm/observable-value.js +3 -3
  35. package/esm/observable-value.js.map +1 -1
  36. package/esm/observable-value.spec.d.ts.map +1 -1
  37. package/esm/observable-value.spec.js +10 -9
  38. package/esm/observable-value.spec.js.map +1 -1
  39. package/esm/path-helper.js +1 -1
  40. package/esm/path-helper.js.map +1 -1
  41. package/esm/path-helper.spec.d.ts.map +1 -1
  42. package/esm/path-helper.spec.js +9 -1
  43. package/esm/path-helper.spec.js.map +1 -1
  44. package/esm/sort-by.d.ts +1 -1
  45. package/esm/sort-by.d.ts.map +1 -1
  46. package/esm/tuple.d.ts.map +1 -1
  47. package/esm/using-async.d.ts +8 -0
  48. package/esm/using-async.d.ts.map +1 -0
  49. package/esm/using-async.js +22 -0
  50. package/esm/using-async.js.map +1 -0
  51. package/esm/using-async.spec.d.ts +17 -0
  52. package/esm/using-async.spec.d.ts.map +1 -0
  53. package/esm/using-async.spec.js +84 -0
  54. package/esm/using-async.spec.js.map +1 -0
  55. package/esm/using.d.ts +8 -0
  56. package/esm/using.d.ts.map +1 -0
  57. package/esm/using.js +15 -0
  58. package/esm/using.js.map +1 -0
  59. package/esm/{disposable.spec.d.ts → using.spec.d.ts} +2 -7
  60. package/esm/using.spec.d.ts.map +1 -0
  61. package/esm/using.spec.js +62 -0
  62. package/esm/using.spec.js.map +1 -0
  63. package/esm/value-observer.d.ts +3 -4
  64. package/esm/value-observer.d.ts.map +1 -1
  65. package/esm/value-observer.js +3 -3
  66. package/esm/value-observer.js.map +1 -1
  67. package/package.json +3 -3
  68. package/src/deep-merge.spec.ts +2 -2
  69. package/src/event-hub.spec.ts +4 -4
  70. package/src/event-hub.ts +2 -4
  71. package/src/index.ts +6 -4
  72. package/src/is-async-disposable.spec.ts +23 -0
  73. package/src/is-async-disposable.ts +8 -0
  74. package/src/is-disposable.spec.ts +23 -0
  75. package/src/is-disposable.ts +8 -0
  76. package/src/observable-value.spec.ts +11 -9
  77. package/src/observable-value.ts +3 -4
  78. package/src/path-helper.spec.ts +10 -1
  79. package/src/path-helper.ts +1 -1
  80. package/src/using-async.spec.ts +93 -0
  81. package/src/using-async.ts +24 -0
  82. package/src/using.spec.ts +67 -0
  83. package/src/using.ts +13 -0
  84. package/src/value-observer.ts +3 -4
  85. package/esm/disposable.d.ts +0 -49
  86. package/esm/disposable.d.ts.map +0 -1
  87. package/esm/disposable.js +0 -56
  88. package/esm/disposable.js.map +0 -1
  89. package/esm/disposable.spec.d.ts.map +0 -1
  90. package/esm/disposable.spec.js +0 -118
  91. package/esm/disposable.spec.js.map +0 -1
  92. package/esm/trace.d.ts +0 -119
  93. package/esm/trace.d.ts.map +0 -1
  94. package/esm/trace.js +0 -139
  95. package/esm/trace.js.map +0 -1
  96. package/esm/trace.spec.d.ts +0 -2
  97. package/esm/trace.spec.d.ts.map +0 -1
  98. package/esm/trace.spec.js +0 -184
  99. package/esm/trace.spec.js.map +0 -1
  100. package/src/disposable.spec.ts +0 -130
  101. package/src/disposable.ts +0 -69
  102. package/src/trace.spec.ts +0 -200
  103. package/src/trace.ts +0 -265
package/esm/trace.js DELETED
@@ -1,139 +0,0 @@
1
- import { ObservableValue } from './observable-value.js';
2
- /**
3
- * Helper class that can be used to trace method calls programmatically
4
- *
5
- * Usage example:
6
- * ```ts
7
- * const methodTracer: IDisposable = Trace.method({
8
- * object: myObjectInstance, // You can define an object constructor for static methods as well
9
- * method: myObjectInstance.method, // The method to be tracked
10
- * isAsync: true, // if you set to async, method finished will be *await*-ed
11
- * onCalled: (traceData) => {
12
- * console.log("Method called:", traceData)
13
- * },
14
- * onFinished: (traceData) => {
15
- * console.log("Method call finished:", traceData)
16
- * },
17
- * onError: (traceData) => {
18
- * console.log("Method throwed an error:", traceData)
19
- * }
20
- * });
21
- * ```
22
- */
23
- export class Trace {
24
- static objectTraces = new Map();
25
- static getMethodTrace(object, method) {
26
- const objectTrace = this.objectTraces.get(object);
27
- return objectTrace.methodMappings.get(method.name);
28
- }
29
- static traceStart(methodTrace, args) {
30
- const startDateTime = new Date();
31
- const traceValue = {
32
- methodArguments: args,
33
- startDateTime,
34
- };
35
- methodTrace.callObservable.setValue(traceValue);
36
- return traceValue;
37
- }
38
- static traceFinished(methodTrace, args, callTrace, returned) {
39
- const finishedTrace = {
40
- methodArguments: args,
41
- startDateTime: callTrace.startDateTime,
42
- finishedDateTime: new Date(),
43
- returned,
44
- };
45
- methodTrace.finishedObservable.setValue(finishedTrace);
46
- }
47
- static traceError(methodTrace, args, callTrace, error) {
48
- const errorTrace = {
49
- methodArguments: args,
50
- startDateTime: callTrace.startDateTime,
51
- errorDateTime: new Date(),
52
- error,
53
- };
54
- methodTrace.errorObservable.setValue(errorTrace);
55
- return errorTrace;
56
- }
57
- static callMethod(object, method, args) {
58
- const methodTrace = this.getMethodTrace(object, method);
59
- const start = this.traceStart(methodTrace, args);
60
- try {
61
- const returned = methodTrace.originalMethod.call(object, ...args);
62
- this.traceFinished(methodTrace, args, start, returned);
63
- return returned;
64
- }
65
- catch (error) {
66
- this.traceError(methodTrace, args, start, error);
67
- throw error;
68
- }
69
- }
70
- static async callMethodAsync(object, method, args) {
71
- const methodTrace = this.getMethodTrace(object, method);
72
- const start = this.traceStart(methodTrace, args);
73
- try {
74
- const returned = await methodTrace.originalMethod.call(object, ...args);
75
- this.traceFinished(methodTrace, args, start, returned);
76
- return returned;
77
- }
78
- catch (error) {
79
- this.traceError(methodTrace, args, start, error);
80
- throw error;
81
- }
82
- }
83
- /**
84
- * Creates an observer that will be observe method calls, finishes and errors
85
- * @param options The options object for the trace
86
- * @returns the trace object that can be disposed after usage
87
- */
88
- static method(options) {
89
- // add object mapping
90
- if (!this.objectTraces.has(options.object)) {
91
- this.objectTraces.set(options.object, {
92
- methodMappings: new Map(),
93
- });
94
- }
95
- // setup override if needed
96
- if (!options.method.isTraced) {
97
- const overriddenMethod = options.isAsync
98
- ? (...args) => this.callMethodAsync(options.object, options.method, args)
99
- : (...args) => this.callMethod(options.object, options.method, args);
100
- Object.defineProperty(overriddenMethod, 'name', { value: options.method.name });
101
- Object.defineProperty(overriddenMethod, 'isTraced', { value: options.method.name });
102
- options.object[options.method.name] = overriddenMethod;
103
- }
104
- const objectTrace = this.objectTraces.get(options.object);
105
- // add method mapping if needed
106
- if (!objectTrace.methodMappings.has(options.method.name)) {
107
- objectTrace.methodMappings.set(options.method.name, {
108
- originalMethod: options.method,
109
- callObservable: new ObservableValue({
110
- methodArguments: [],
111
- startDateTime: new Date(''),
112
- }),
113
- finishedObservable: new ObservableValue({
114
- methodArguments: [],
115
- startDateTime: new Date(''),
116
- finishedDateTime: new Date(''),
117
- returned: undefined,
118
- }),
119
- errorObservable: new ObservableValue({
120
- methodArguments: [],
121
- startDateTime: new Date(''),
122
- errorDateTime: new Date(''),
123
- error: undefined,
124
- }),
125
- });
126
- }
127
- const methodTrace = objectTrace.methodMappings.get(options.method.name);
128
- const callbacks = [
129
- options.onCalled && methodTrace.callObservable.subscribe(options.onCalled),
130
- options.onFinished && methodTrace.finishedObservable.subscribe(options.onFinished),
131
- options.onError && methodTrace.errorObservable.subscribe(options.onError),
132
- ];
133
- // Subscribe and return the observer
134
- return {
135
- dispose: () => callbacks.forEach((c) => c && c.dispose()),
136
- };
137
- }
138
- }
139
- //# sourceMappingURL=trace.js.map
package/esm/trace.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare const traceTests: import("vitest").SuiteCollector<{}>;
2
- //# sourceMappingURL=trace.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace.spec.d.ts","sourceRoot":"","sources":["../src/trace.spec.ts"],"names":[],"mappings":"AA+BA,eAAO,MAAM,UAAU,qCAwKrB,CAAA"}
package/esm/trace.spec.js DELETED
@@ -1,184 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace.spec.js","sourceRoot":"","sources":["../src/trace.spec.ts"],"names":[],"mappings":"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"}
@@ -1,130 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest'
2
- import type { Disposable } from './disposable.js'
3
- import { using, usingAsync } from './disposable.js'
4
-
5
- export class MockDisposable implements Disposable {
6
- private disposed = false
7
- public isDisposed = () => this.disposed
8
- /**
9
- * Disposes the MockDisposable instance, calls the dispose callback
10
- */
11
- public dispose = () => {
12
- this.disposed = true
13
- this.disposeCallback && this.disposeCallback()
14
- }
15
-
16
- /**
17
- * Mock to throw an error
18
- */
19
- public whooops() {
20
- throw Error('Whooops')
21
- }
22
-
23
- /**
24
- * Defines the callback that will be called on dispose
25
- */
26
- public disposeCallback!: () => void
27
- }
28
-
29
- /**
30
- * Unit tests for disposables
31
- */
32
- export const disposableTests = describe('Disposable', () => {
33
- it('Can be constructed', () => {
34
- using(new MockDisposable(), (d) => {
35
- expect(d).toBeInstanceOf(MockDisposable)
36
- })
37
- })
38
-
39
- it('Should return a value from a callback', () => {
40
- const returned = using(new MockDisposable(), () => {
41
- return 1
42
- })
43
- expect(returned).toBe(1)
44
- })
45
-
46
- it('Should return a value from an async callback', async () => {
47
- const returned = await usingAsync(new MockDisposable(), async () => {
48
- return 2
49
- })
50
- expect(returned).toBe(2)
51
- })
52
-
53
- describe('isDisposed', () => {
54
- it('should return a correct value before and after disposition', () => {
55
- const d = new MockDisposable()
56
- expect(d.isDisposed()).toBe(false)
57
- d.dispose()
58
- expect(d.isDisposed()).toBe(true)
59
- })
60
- })
61
-
62
- describe('dispose()', () => {
63
- it('should be called on error', () => {
64
- const callbackMethod = vi.fn()
65
- try {
66
- using(new MockDisposable(), (d) => {
67
- d.disposeCallback = () => {
68
- callbackMethod()
69
- }
70
- d.whooops()
71
- })
72
- } catch {
73
- /** ignore */
74
- }
75
- expect(callbackMethod).toBeCalled()
76
- })
77
-
78
- it('should be called with usingAsync()', async () => {
79
- const callbackMethod = vi.fn()
80
- await usingAsync(new MockDisposable(), async (d) => {
81
- d.disposeCallback = () => {
82
- callbackMethod()
83
- }
84
- return new Promise((resolve) => {
85
- setTimeout(resolve, 1)
86
- })
87
- })
88
- expect(callbackMethod).toBeCalled()
89
- })
90
-
91
- it('should be called when async fails', async () => {
92
- const callbackMethod = vi.fn()
93
- try {
94
- await usingAsync(new MockDisposable(), async (d) => {
95
- d.disposeCallback = () => {
96
- callbackMethod()
97
- }
98
- return new Promise((_resolve, reject) => {
99
- setTimeout(reject, 1)
100
- })
101
- })
102
- } catch (error) {
103
- /** ignore */
104
- }
105
- expect(callbackMethod).toBeCalled()
106
- })
107
-
108
- it('should await dispose for asyncs with usingAsync()', async () => {
109
- class AsyncDispose {
110
- /** flag */
111
- public isDisposed = false
112
- /** set isDisposed with a timeout */
113
- public async dispose() {
114
- await new Promise<void>((resolve) =>
115
- setTimeout(() => {
116
- this.isDisposed = true
117
- resolve()
118
- }, 10),
119
- )
120
- }
121
- }
122
-
123
- const asyncDispose = new AsyncDispose()
124
- await usingAsync(asyncDispose, async () => {
125
- /** */
126
- })
127
- expect(asyncDispose.isDisposed).toBe(true)
128
- })
129
- })
130
- })
package/src/disposable.ts DELETED
@@ -1,69 +0,0 @@
1
- /**
2
- *
3
- * You can implement *IDisposable* resources and use them with a *using()* or *usingAsync()* syntax.
4
- *
5
- * Usage example:
6
- *
7
- * ```ts
8
- * class Resource implements IDisposable{
9
- * dispose(){
10
- * // cleanup logics
11
- * }
12
- * }
13
- *
14
- *
15
- * using(new Resource(), (resource)=>{
16
- * // do something with the resource
17
- * })
18
- *
19
- * usingAsync(new Resource(), async (resource)=>{
20
- * // do something with the resource, allows awaiting promises
21
- * })
22
- * ```
23
- */
24
- /** */
25
-
26
- /**
27
- * Resources in using an usingAsync should implement this interface
28
- *
29
- */
30
- export interface Disposable {
31
- /**
32
- * Method called when the IDisposable is disposed.
33
- */
34
- dispose: () => void | Promise<void>
35
- }
36
-
37
- /**
38
- * Method that accepts an IDisposable resource that will be disposed after the callback
39
- * @param resource The resource that is used in the callback and will be disposed afterwards
40
- * @param callback The callback that will be executed synchrounously before the resource will be disposed
41
- * @returns the value that will be returned by the callback method
42
- */
43
- export const using = <T extends Disposable, TReturns>(resource: T, callback: (r: T) => TReturns) => {
44
- try {
45
- return callback(resource)
46
- } finally {
47
- resource.dispose()
48
- }
49
- }
50
-
51
- /**
52
- * Method that accepts an IDisposable resource that will be disposed after the callback
53
- * @param resource The resource that is used in the callback and will be disposed afterwards
54
- * @param callback The callback that will be executed asynchrounously before the resource will be disposed
55
- * @returns A promise that will be resolved with a return value after the resource is disposed
56
- */
57
- export const usingAsync = async <T extends Disposable, TReturns>(
58
- resource: T,
59
- callback: (r: T) => Promise<TReturns>,
60
- ) => {
61
- try {
62
- return await callback(resource)
63
- } finally {
64
- const disposeResult = resource.dispose()
65
- if (disposeResult instanceof Promise) {
66
- await disposeResult
67
- }
68
- }
69
- }