@furystack/utils 7.0.1 → 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 (104) hide show
  1. package/CHANGELOG.md +2 -36
  2. package/README.md +9 -9
  3. package/esm/debounce.d.ts.map +1 -1
  4. package/esm/deep-merge.d.ts.map +1 -1
  5. package/esm/deep-merge.spec.js +1 -1
  6. package/esm/deep-merge.spec.js.map +1 -1
  7. package/esm/event-hub.d.ts +1 -2
  8. package/esm/event-hub.d.ts.map +1 -1
  9. package/esm/event-hub.js +2 -2
  10. package/esm/event-hub.js.map +1 -1
  11. package/esm/event-hub.spec.js +4 -4
  12. package/esm/event-hub.spec.js.map +1 -1
  13. package/esm/index.d.ts +6 -4
  14. package/esm/index.d.ts.map +1 -1
  15. package/esm/index.js +6 -4
  16. package/esm/index.js.map +1 -1
  17. package/esm/is-async-disposable.d.ts +7 -0
  18. package/esm/is-async-disposable.d.ts.map +1 -0
  19. package/esm/is-async-disposable.js +9 -0
  20. package/esm/is-async-disposable.js.map +1 -0
  21. package/esm/is-async-disposable.spec.d.ts +2 -0
  22. package/esm/is-async-disposable.spec.d.ts.map +1 -0
  23. package/esm/is-async-disposable.spec.js +21 -0
  24. package/esm/is-async-disposable.spec.js.map +1 -0
  25. package/esm/is-disposable.d.ts +7 -0
  26. package/esm/is-disposable.d.ts.map +1 -0
  27. package/esm/is-disposable.js +9 -0
  28. package/esm/is-disposable.js.map +1 -0
  29. package/esm/is-disposable.spec.d.ts +2 -0
  30. package/esm/is-disposable.spec.d.ts.map +1 -0
  31. package/esm/is-disposable.spec.js +21 -0
  32. package/esm/is-disposable.spec.js.map +1 -0
  33. package/esm/observable-value.d.ts +4 -5
  34. package/esm/observable-value.d.ts.map +1 -1
  35. package/esm/observable-value.js +3 -3
  36. package/esm/observable-value.js.map +1 -1
  37. package/esm/observable-value.spec.d.ts.map +1 -1
  38. package/esm/observable-value.spec.js +10 -9
  39. package/esm/observable-value.spec.js.map +1 -1
  40. package/esm/path-helper.js +1 -1
  41. package/esm/path-helper.js.map +1 -1
  42. package/esm/path-helper.spec.d.ts.map +1 -1
  43. package/esm/path-helper.spec.js +9 -1
  44. package/esm/path-helper.spec.js.map +1 -1
  45. package/esm/sort-by.d.ts +1 -1
  46. package/esm/sort-by.d.ts.map +1 -1
  47. package/esm/tuple.d.ts.map +1 -1
  48. package/esm/using-async.d.ts +8 -0
  49. package/esm/using-async.d.ts.map +1 -0
  50. package/esm/using-async.js +22 -0
  51. package/esm/using-async.js.map +1 -0
  52. package/esm/using-async.spec.d.ts +17 -0
  53. package/esm/using-async.spec.d.ts.map +1 -0
  54. package/esm/using-async.spec.js +84 -0
  55. package/esm/using-async.spec.js.map +1 -0
  56. package/esm/using.d.ts +8 -0
  57. package/esm/using.d.ts.map +1 -0
  58. package/esm/using.js +15 -0
  59. package/esm/using.js.map +1 -0
  60. package/esm/{disposable.spec.d.ts → using.spec.d.ts} +2 -7
  61. package/esm/using.spec.d.ts.map +1 -0
  62. package/esm/using.spec.js +62 -0
  63. package/esm/using.spec.js.map +1 -0
  64. package/esm/value-observer.d.ts +3 -4
  65. package/esm/value-observer.d.ts.map +1 -1
  66. package/esm/value-observer.js +3 -3
  67. package/esm/value-observer.js.map +1 -1
  68. package/package.json +3 -3
  69. package/src/deep-merge.spec.ts +2 -2
  70. package/src/event-hub.spec.ts +4 -4
  71. package/src/event-hub.ts +2 -4
  72. package/src/index.ts +6 -4
  73. package/src/is-async-disposable.spec.ts +23 -0
  74. package/src/is-async-disposable.ts +8 -0
  75. package/src/is-disposable.spec.ts +23 -0
  76. package/src/is-disposable.ts +8 -0
  77. package/src/observable-value.spec.ts +11 -9
  78. package/src/observable-value.ts +3 -4
  79. package/src/path-helper.spec.ts +10 -1
  80. package/src/path-helper.ts +1 -1
  81. package/src/using-async.spec.ts +93 -0
  82. package/src/using-async.ts +24 -0
  83. package/src/using.spec.ts +67 -0
  84. package/src/using.ts +13 -0
  85. package/src/value-observer.ts +3 -4
  86. package/esm/disposable.d.ts +0 -49
  87. package/esm/disposable.d.ts.map +0 -1
  88. package/esm/disposable.js +0 -56
  89. package/esm/disposable.js.map +0 -1
  90. package/esm/disposable.spec.d.ts.map +0 -1
  91. package/esm/disposable.spec.js +0 -118
  92. package/esm/disposable.spec.js.map +0 -1
  93. package/esm/trace.d.ts +0 -119
  94. package/esm/trace.d.ts.map +0 -1
  95. package/esm/trace.js +0 -139
  96. package/esm/trace.js.map +0 -1
  97. package/esm/trace.spec.d.ts +0 -2
  98. package/esm/trace.spec.d.ts.map +0 -1
  99. package/esm/trace.spec.js +0 -184
  100. package/esm/trace.spec.js.map +0 -1
  101. package/src/disposable.spec.ts +0 -130
  102. package/src/disposable.ts +0 -69
  103. package/src/trace.spec.ts +0 -200
  104. package/src/trace.ts +0 -265
package/esm/trace.d.ts DELETED
@@ -1,119 +0,0 @@
1
- import type { Disposable } from './disposable.js';
2
- import { ObservableValue } from './observable-value.js';
3
- /**
4
- * Options object for tracing method calls
5
- */
6
- export interface TraceMethodOptions<T, TMethod extends (...args: TArgs) => unknown, TArgs extends unknown[]> {
7
- /**
8
- * The context object. Can be an instance or a constructor for static methods
9
- */
10
- object: T;
11
- /**
12
- * The method reference that needs to be traced
13
- */
14
- method: TMethod;
15
- /**
16
- * Callback that will be called right before executing the method
17
- */
18
- onCalled?: (newValue: TraceMethodCall<TArgs>) => void;
19
- /**
20
- * Callback that will be called right after the method returns
21
- */
22
- onFinished?: (newValue: TraceMethodFinished<ReturnType<TMethod>, TArgs>) => void;
23
- /**
24
- * Callback that will be called when a method throws an error
25
- */
26
- onError?: (newValue: TraceMethodError<TArgs>) => void;
27
- /**
28
- * The method execution will be awaited if set
29
- */
30
- isAsync?: boolean;
31
- }
32
- /**
33
- * Defines a trace method call object
34
- */
35
- export interface TraceMethodCall<TArgs extends any[]> {
36
- /**
37
- * The timestamp when the event occured
38
- */
39
- startDateTime: Date;
40
- /**
41
- * The provided arguments for the call
42
- */
43
- methodArguments: TArgs;
44
- }
45
- /**
46
- * Defines a trace event when a method call has been finished
47
- */
48
- export interface TraceMethodFinished<TReturns, TArgs extends any[]> extends TraceMethodCall<TArgs> {
49
- returned: TReturns;
50
- finishedDateTime: Date;
51
- }
52
- /**
53
- * Defines a trace event when an error was thrown during a method call
54
- */
55
- export interface TraceMethodError<TArgs extends any[]> extends TraceMethodCall<TArgs> {
56
- error: any;
57
- errorDateTime: Date;
58
- }
59
- /**
60
- * Defines a method mapping object
61
- */
62
- export interface MethodMapping<TReturns, TArgs extends any[]> {
63
- /**
64
- * The original method instance
65
- */
66
- originalMethod: (...args: TArgs) => TReturns;
67
- /**
68
- * An observable for distributing the events
69
- */
70
- callObservable: ObservableValue<TraceMethodCall<TArgs>>;
71
- finishedObservable: ObservableValue<TraceMethodFinished<any, TArgs>>;
72
- errorObservable: ObservableValue<TraceMethodError<TArgs>>;
73
- }
74
- /**
75
- * Defines an Object Trace mapping
76
- */
77
- export interface ObjectTrace {
78
- /**
79
- * Map about the already wrapped methods
80
- */
81
- methodMappings: Map<string, MethodMapping<any, any[]>>;
82
- }
83
- /**
84
- * Helper class that can be used to trace method calls programmatically
85
- *
86
- * Usage example:
87
- * ```ts
88
- * const methodTracer: IDisposable = Trace.method({
89
- * object: myObjectInstance, // You can define an object constructor for static methods as well
90
- * method: myObjectInstance.method, // The method to be tracked
91
- * isAsync: true, // if you set to async, method finished will be *await*-ed
92
- * onCalled: (traceData) => {
93
- * console.log("Method called:", traceData)
94
- * },
95
- * onFinished: (traceData) => {
96
- * console.log("Method call finished:", traceData)
97
- * },
98
- * onError: (traceData) => {
99
- * console.log("Method throwed an error:", traceData)
100
- * }
101
- * });
102
- * ```
103
- */
104
- export declare class Trace {
105
- private static objectTraces;
106
- private static getMethodTrace;
107
- private static traceStart;
108
- private static traceFinished;
109
- private static traceError;
110
- private static callMethod;
111
- private static callMethodAsync;
112
- /**
113
- * Creates an observer that will be observe method calls, finishes and errors
114
- * @param options The options object for the trace
115
- * @returns the trace object that can be disposed after usage
116
- */
117
- static method<T extends object, TMethod extends (...args: TArgs) => any, TArgs extends any[]>(options: TraceMethodOptions<T, TMethod, TArgs>): Disposable;
118
- }
119
- //# sourceMappingURL=trace.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,OAAO,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,EAAE,KAAK,SAAS,OAAO,EAAE;IACzG;;OAEG;IACH,MAAM,EAAE,CAAC,CAAA;IACT;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IACrD;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,CAAA;IAChF;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IAErD;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,SAAS,GAAG,EAAE;IAClD;;OAEG;IACH,aAAa,EAAE,IAAI,CAAA;IAEnB;;OAEG;IACH,eAAe,EAAE,KAAK,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,QAAQ,EAAE,KAAK,SAAS,GAAG,EAAE,CAAE,SAAQ,eAAe,CAAC,KAAK,CAAC;IAChG,QAAQ,EAAE,QAAQ,CAAA;IAClB,gBAAgB,EAAE,IAAI,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,GAAG,EAAE,CAAE,SAAQ,eAAe,CAAC,KAAK,CAAC;IACnF,KAAK,EAAE,GAAG,CAAA;IACV,aAAa,EAAE,IAAI,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,QAAQ,EAAE,KAAK,SAAS,GAAG,EAAE;IAC1D;;OAEG;IACH,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAA;IAC5C;;OAEG;IACH,cAAc,EAAE,eAAe,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;IAEvD,kBAAkB,EAAE,eAAe,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IACpE,eAAe,EAAE,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;CACvD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAsC;IAEjE,OAAO,CAAC,MAAM,CAAC,cAAc;IAQ7B,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB,OAAO,CAAC,MAAM,CAAC,aAAa;IAe5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAgBzB,OAAO,CAAC,MAAM,CAAC,UAAU;mBAiBJ,eAAe;IAiBpC;;;;OAIG;WACW,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,EACjG,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAC7C,UAAU;CAuDd"}
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
- }