@squiz/optimization-utils 7.1.1 → 7.2.0-rc1

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 (183) hide show
  1. package/dist/cjs/array/__tests__/chunkify.test.d.ts +2 -0
  2. package/dist/cjs/array/__tests__/chunkify.test.d.ts.map +1 -0
  3. package/dist/{array → cjs/array}/chunkify.d.ts +1 -0
  4. package/dist/cjs/array/chunkify.d.ts.map +1 -0
  5. package/dist/cjs/array/chunkify.js.map +1 -0
  6. package/dist/cjs/array/index.d.ts +3 -0
  7. package/dist/cjs/array/index.d.ts.map +1 -0
  8. package/dist/cjs/array/index.js.map +1 -0
  9. package/dist/{array → cjs/array}/unique.d.ts +1 -0
  10. package/dist/cjs/array/unique.d.ts.map +1 -0
  11. package/dist/cjs/array/unique.js.map +1 -0
  12. package/dist/{change-tracker → cjs/change-tracker}/ChangeTracker.d.ts +1 -0
  13. package/dist/cjs/change-tracker/ChangeTracker.d.ts.map +1 -0
  14. package/dist/cjs/change-tracker/ChangeTracker.js.map +1 -0
  15. package/dist/{data-structures → cjs/data-structures}/Result.d.ts +1 -0
  16. package/dist/cjs/data-structures/Result.d.ts.map +1 -0
  17. package/dist/cjs/data-structures/Result.js.map +1 -0
  18. package/dist/cjs/data-structures/index.d.ts +2 -0
  19. package/dist/cjs/data-structures/index.d.ts.map +1 -0
  20. package/dist/cjs/data-structures/index.js.map +1 -0
  21. package/dist/cjs/index.d.ts +14 -0
  22. package/dist/cjs/index.d.ts.map +1 -0
  23. package/dist/cjs/index.js.map +1 -0
  24. package/dist/{logging → cjs/logging}/Log.d.ts +1 -0
  25. package/dist/cjs/logging/Log.d.ts.map +1 -0
  26. package/dist/cjs/logging/Log.js.map +1 -0
  27. package/dist/{measurement → cjs/measurement}/performance.d.ts +1 -0
  28. package/dist/cjs/measurement/performance.d.ts.map +1 -0
  29. package/dist/cjs/measurement/performance.js.map +1 -0
  30. package/dist/{metadata → cjs/metadata}/CopyReflection.d.ts +1 -0
  31. package/dist/cjs/metadata/CopyReflection.d.ts.map +1 -0
  32. package/dist/cjs/metadata/CopyReflection.js.map +1 -0
  33. package/dist/{object → cjs/object}/getProperty.d.ts +1 -0
  34. package/dist/cjs/object/getProperty.d.ts.map +1 -0
  35. package/dist/cjs/object/getProperty.js.map +1 -0
  36. package/dist/cjs/object/index.d.ts +2 -0
  37. package/dist/cjs/object/index.d.ts.map +1 -0
  38. package/dist/cjs/object/index.js.map +1 -0
  39. package/dist/cjs/package.json +3 -0
  40. package/dist/{promises → cjs/promises}/PromiseMaxConcurrency.d.ts +1 -0
  41. package/dist/cjs/promises/PromiseMaxConcurrency.d.ts.map +1 -0
  42. package/dist/cjs/promises/PromiseMaxConcurrency.js.map +1 -0
  43. package/dist/{queue → cjs/queue}/LRUQueue.d.ts +1 -0
  44. package/dist/cjs/queue/LRUQueue.d.ts.map +1 -0
  45. package/dist/cjs/queue/LRUQueue.js.map +1 -0
  46. package/dist/cjs/queue/LRUQueueFactory.d.ts +5 -0
  47. package/dist/cjs/queue/LRUQueueFactory.d.ts.map +1 -0
  48. package/dist/cjs/queue/LRUQueueFactory.js.map +1 -0
  49. package/dist/{retries → cjs/retries}/Retries.d.ts +1 -0
  50. package/dist/cjs/retries/Retries.d.ts.map +1 -0
  51. package/dist/cjs/retries/Retries.js.map +1 -0
  52. package/dist/{types → cjs/types}/class-utilities-types.d.ts +1 -0
  53. package/dist/cjs/types/class-utilities-types.d.ts.map +1 -0
  54. package/dist/cjs/types/class-utilities-types.js.map +1 -0
  55. package/dist/cjs/types/index.d.ts +2 -0
  56. package/dist/cjs/types/index.d.ts.map +1 -0
  57. package/dist/cjs/types/index.js.map +1 -0
  58. package/dist/mjs/array/__tests__/chunkify.test.d.ts +2 -0
  59. package/dist/mjs/array/__tests__/chunkify.test.d.ts.map +1 -0
  60. package/dist/mjs/array/__tests__/chunkify.test.js +50 -0
  61. package/dist/mjs/array/__tests__/chunkify.test.js.map +7 -0
  62. package/dist/mjs/array/chunkify.d.ts +3 -0
  63. package/dist/mjs/array/chunkify.d.ts.map +1 -0
  64. package/dist/mjs/array/chunkify.js +16 -0
  65. package/dist/mjs/array/chunkify.js.map +7 -0
  66. package/dist/mjs/array/index.d.ts +3 -0
  67. package/dist/mjs/array/index.d.ts.map +1 -0
  68. package/dist/mjs/array/index.js +3 -0
  69. package/dist/mjs/array/index.js.map +7 -0
  70. package/dist/mjs/array/unique.d.ts +3 -0
  71. package/dist/mjs/array/unique.d.ts.map +1 -0
  72. package/dist/mjs/array/unique.js +9 -0
  73. package/dist/mjs/array/unique.js.map +7 -0
  74. package/dist/mjs/change-tracker/ChangeTracker.d.ts +13 -0
  75. package/dist/mjs/change-tracker/ChangeTracker.d.ts.map +1 -0
  76. package/dist/mjs/change-tracker/ChangeTracker.js +44 -0
  77. package/dist/mjs/change-tracker/ChangeTracker.js.map +7 -0
  78. package/dist/mjs/data-structures/Result.d.ts +50 -0
  79. package/dist/mjs/data-structures/Result.d.ts.map +1 -0
  80. package/dist/mjs/data-structures/Result.js +84 -0
  81. package/dist/mjs/data-structures/Result.js.map +7 -0
  82. package/dist/mjs/data-structures/index.d.ts +2 -0
  83. package/dist/mjs/data-structures/index.d.ts.map +1 -0
  84. package/dist/mjs/data-structures/index.js +2 -0
  85. package/dist/mjs/data-structures/index.js.map +7 -0
  86. package/dist/mjs/index.d.ts +14 -0
  87. package/dist/mjs/index.d.ts.map +1 -0
  88. package/dist/mjs/index.js +14 -0
  89. package/dist/mjs/index.js.map +7 -0
  90. package/dist/mjs/logging/Log.d.ts +19 -0
  91. package/dist/mjs/logging/Log.d.ts.map +1 -0
  92. package/dist/mjs/logging/Log.js +103 -0
  93. package/dist/mjs/logging/Log.js.map +7 -0
  94. package/dist/mjs/measurement/performance.d.ts +6 -0
  95. package/dist/mjs/measurement/performance.d.ts.map +1 -0
  96. package/dist/mjs/measurement/performance.js +50 -0
  97. package/dist/mjs/measurement/performance.js.map +7 -0
  98. package/dist/mjs/metadata/CopyReflection.d.ts +6 -0
  99. package/dist/mjs/metadata/CopyReflection.d.ts.map +1 -0
  100. package/dist/mjs/metadata/CopyReflection.js +21 -0
  101. package/dist/mjs/metadata/CopyReflection.js.map +7 -0
  102. package/dist/mjs/object/getProperty.d.ts +2 -0
  103. package/dist/mjs/object/getProperty.d.ts.map +1 -0
  104. package/dist/mjs/object/getProperty.js +12 -0
  105. package/dist/mjs/object/getProperty.js.map +7 -0
  106. package/dist/mjs/object/index.d.ts +2 -0
  107. package/dist/mjs/object/index.d.ts.map +1 -0
  108. package/dist/mjs/object/index.js +2 -0
  109. package/dist/mjs/object/index.js.map +7 -0
  110. package/dist/mjs/promises/PromiseMaxConcurrency.d.ts +25 -0
  111. package/dist/mjs/promises/PromiseMaxConcurrency.d.ts.map +1 -0
  112. package/dist/mjs/promises/PromiseMaxConcurrency.js +63 -0
  113. package/dist/mjs/promises/PromiseMaxConcurrency.js.map +7 -0
  114. package/dist/mjs/queue/LRUQueue.d.ts +32 -0
  115. package/dist/mjs/queue/LRUQueue.d.ts.map +1 -0
  116. package/dist/mjs/queue/LRUQueue.js +154 -0
  117. package/dist/mjs/queue/LRUQueue.js.map +7 -0
  118. package/dist/mjs/queue/LRUQueueFactory.d.ts +5 -0
  119. package/dist/mjs/queue/LRUQueueFactory.d.ts.map +1 -0
  120. package/dist/mjs/queue/LRUQueueFactory.js +20 -0
  121. package/dist/mjs/queue/LRUQueueFactory.js.map +7 -0
  122. package/dist/mjs/retries/Retries.d.ts +6 -0
  123. package/dist/mjs/retries/Retries.d.ts.map +1 -0
  124. package/dist/mjs/retries/Retries.js +61 -0
  125. package/dist/mjs/retries/Retries.js.map +7 -0
  126. package/dist/mjs/types/class-utilities-types.d.ts +10 -0
  127. package/dist/mjs/types/class-utilities-types.d.ts.map +1 -0
  128. package/dist/mjs/types/class-utilities-types.js +1 -0
  129. package/dist/mjs/types/class-utilities-types.js.map +7 -0
  130. package/dist/mjs/types/index.d.ts +2 -0
  131. package/dist/mjs/types/index.d.ts.map +1 -0
  132. package/dist/mjs/types/index.js +2 -0
  133. package/dist/mjs/types/index.js.map +7 -0
  134. package/package.json +56 -21
  135. package/scripts/build.mjs +96 -0
  136. package/tsconfig-cjs.json +15 -0
  137. package/tsconfig-mjs.json +24 -0
  138. package/dist/array/__tests__/chunkify.test.d.ts +0 -1
  139. package/dist/array/__tests__/chunkify.test.js +0 -52
  140. package/dist/array/__tests__/chunkify.test.js.map +0 -1
  141. package/dist/array/chunkify.js.map +0 -1
  142. package/dist/array/index.d.ts +0 -2
  143. package/dist/array/index.js.map +0 -1
  144. package/dist/array/unique.js.map +0 -1
  145. package/dist/change-tracker/ChangeTracker.js.map +0 -1
  146. package/dist/data-structures/Result.js.map +0 -1
  147. package/dist/data-structures/index.d.ts +0 -1
  148. package/dist/data-structures/index.js.map +0 -1
  149. package/dist/index.d.ts +0 -13
  150. package/dist/index.js.map +0 -1
  151. package/dist/logging/Log.js.map +0 -1
  152. package/dist/measurement/performance.js.map +0 -1
  153. package/dist/metadata/CopyReflection.js.map +0 -1
  154. package/dist/object/getProperty.js.map +0 -1
  155. package/dist/object/index.d.ts +0 -1
  156. package/dist/object/index.js.map +0 -1
  157. package/dist/promises/PromiseMaxConcurrency.js.map +0 -1
  158. package/dist/queue/LRUQueue.js.map +0 -1
  159. package/dist/queue/LRUQueueFactory.d.ts +0 -4
  160. package/dist/queue/LRUQueueFactory.js.map +0 -1
  161. package/dist/retries/Retries.js.map +0 -1
  162. package/dist/types/class-utilities-types.js.map +0 -1
  163. package/dist/types/index.d.ts +0 -1
  164. package/dist/types/index.js.map +0 -1
  165. package/tsconfig-package.json +0 -4
  166. /package/dist/{array → cjs/array}/chunkify.js +0 -0
  167. /package/dist/{array → cjs/array}/index.js +0 -0
  168. /package/dist/{array → cjs/array}/unique.js +0 -0
  169. /package/dist/{change-tracker → cjs/change-tracker}/ChangeTracker.js +0 -0
  170. /package/dist/{data-structures → cjs/data-structures}/Result.js +0 -0
  171. /package/dist/{data-structures → cjs/data-structures}/index.js +0 -0
  172. /package/dist/{index.js → cjs/index.js} +0 -0
  173. /package/dist/{logging → cjs/logging}/Log.js +0 -0
  174. /package/dist/{measurement → cjs/measurement}/performance.js +0 -0
  175. /package/dist/{metadata → cjs/metadata}/CopyReflection.js +0 -0
  176. /package/dist/{object → cjs/object}/getProperty.js +0 -0
  177. /package/dist/{object → cjs/object}/index.js +0 -0
  178. /package/dist/{promises → cjs/promises}/PromiseMaxConcurrency.js +0 -0
  179. /package/dist/{queue → cjs/queue}/LRUQueue.js +0 -0
  180. /package/dist/{queue → cjs/queue}/LRUQueueFactory.js +0 -0
  181. /package/dist/{retries → cjs/retries}/Retries.js +0 -0
  182. /package/dist/{types → cjs/types}/class-utilities-types.js +0 -0
  183. /package/dist/{types → cjs/types}/index.js +0 -0
@@ -0,0 +1,50 @@
1
+ export type ResultType = 'success' | 'failure';
2
+ export type ResultFailure<ThisType extends Result<unknown, unknown>, TError> = Omit<ThisType, 'data' | 'error' | 'type'> & {
3
+ error: TError;
4
+ data: never;
5
+ type: 'failure';
6
+ };
7
+ export type ResultSuccess<ThisType extends Result<unknown, unknown>, TData> = Omit<ThisType, 'data' | 'error' | 'type'> & {
8
+ data: TData;
9
+ error: never;
10
+ type: 'success';
11
+ };
12
+ export declare class Result<const TData, const TError = Error> {
13
+ readonly type: ResultType;
14
+ readonly data?: TData;
15
+ readonly error?: TError;
16
+ private constructor();
17
+ static success<const U>(data?: U): Result<U, never>;
18
+ static failure<const TError>(error: TError): Result<never, TError>;
19
+ isSuccess<ThisType extends Result<TData, TError>>(this: ThisType): this is ResultSuccess<ThisType, TData>;
20
+ isFailure<ThisType extends Result<TData, TError>>(this: ThisType): this is ResultFailure<ThisType, TError>;
21
+ /**
22
+ * Type guard: checks if the error in this Result is an instance of the provided
23
+ * error constructors or equals any of the provided error values. When it returns true,
24
+ * the result is narrowed to `Result<never, TErrorGuard>`.
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const result = Result.failure(new TypeError('Invalid type'));
29
+ * if (result.isErrorInstanceOf(TypeError)) {
30
+ * result.error; // narrowed to TypeError
31
+ * }
32
+ * result.isErrorInstanceOf(TypeError, RangeError); // true -> error is TypeError | RangeError
33
+ *
34
+ * const strResult = Result.failure('MISSING_QUERY_EXECUTION_ID');
35
+ * if (strResult.isErrorInstanceOf('MISSING_QUERY_EXECUTION_ID')) {
36
+ * strResult.error; // narrowed to 'MISSING_QUERY_EXECUTION_ID'
37
+ * }
38
+ * ```
39
+ */
40
+ isErrorInstanceOf<ThisType extends Result<TData, TError>, TErrorGuard extends TError>(this: ThisType, ...errorTypes: Array<(new (...args: Array<any>) => TErrorGuard) | TErrorGuard>): this is ResultFailure<ThisType, TErrorGuard>;
41
+ throw(): never | void;
42
+ unwrap(): TData;
43
+ match<TResult, TErrorResult>(handlers: {
44
+ success: (data: TData, resultThis: Result<TData, TError>) => TResult;
45
+ failure: (error: TError, resultThis: Result<TData, TError>) => TErrorResult;
46
+ }): TResult | TErrorResult;
47
+ toFailure(): Result<never, TError>;
48
+ toSuccess(): Result<TData, never>;
49
+ }
50
+ //# sourceMappingURL=Result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Result.d.ts","sourceRoot":"","sources":["../../../src/data-structures/Result.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/C,MAAM,MAAM,aAAa,CACvB,QAAQ,SAAS,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EACzC,MAAM,IACJ,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,CACvB,QAAQ,SAAS,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EACzC,KAAK,IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG;IAC9C,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC;AAEF,qBAAa,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK;IACnD,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,IAAI,CAAC,EAAE,KAAK,CAAC;IAC7B,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO;IAMP,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC;IAInD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;IAIlE,SAAS,CAAC,QAAQ,SAAS,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAC9C,IAAI,EAAE,QAAQ,GACb,IAAI,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;IAIzC,SAAS,CAAC,QAAQ,SAAS,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAC9C,IAAI,EAAE,QAAQ,GACb,IAAI,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC;IAI1C;;;;;;;;;;;;;;;;;;OAkBG;IACH,iBAAiB,CACf,QAAQ,SAAS,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EACtC,WAAW,SAAS,MAAM,EAE1B,IAAI,EAAE,QAAQ,EACd,GAAG,UAAU,EAAE,KAAK,CAElB,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,WAAW,CAAC,GAAG,WAAW,CACzD,GACA,IAAI,IAAI,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC;IAa/C,KAAK,IAAI,KAAK,GAAG,IAAI;IAMrB,MAAM,IAAI,KAAK;IAQf,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE;QACrC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC;QACrE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,YAAY,CAAC;KAC7E,GAAG,OAAO,GAAG,YAAY;IAQ1B,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;IAQlC,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;CAOlC"}
@@ -0,0 +1,84 @@
1
+ class Result {
2
+ type;
3
+ data;
4
+ error;
5
+ constructor(type, data, error) {
6
+ this.type = type;
7
+ this.data = data;
8
+ this.error = error;
9
+ }
10
+ static success(data) {
11
+ return new Result("success", data, void 0);
12
+ }
13
+ static failure(error) {
14
+ return new Result("failure", void 0, error);
15
+ }
16
+ isSuccess() {
17
+ return this.type === "success";
18
+ }
19
+ isFailure() {
20
+ return this.type === "failure";
21
+ }
22
+ /**
23
+ * Type guard: checks if the error in this Result is an instance of the provided
24
+ * error constructors or equals any of the provided error values. When it returns true,
25
+ * the result is narrowed to `Result<never, TErrorGuard>`.
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const result = Result.failure(new TypeError('Invalid type'));
30
+ * if (result.isErrorInstanceOf(TypeError)) {
31
+ * result.error; // narrowed to TypeError
32
+ * }
33
+ * result.isErrorInstanceOf(TypeError, RangeError); // true -> error is TypeError | RangeError
34
+ *
35
+ * const strResult = Result.failure('MISSING_QUERY_EXECUTION_ID');
36
+ * if (strResult.isErrorInstanceOf('MISSING_QUERY_EXECUTION_ID')) {
37
+ * strResult.error; // narrowed to 'MISSING_QUERY_EXECUTION_ID'
38
+ * }
39
+ * ```
40
+ */
41
+ isErrorInstanceOf(...errorTypes) {
42
+ return errorTypes.some((errorType) => {
43
+ if (typeof errorType === "function") {
44
+ return this.error instanceof errorType;
45
+ }
46
+ return this.error === errorType;
47
+ });
48
+ }
49
+ throw() {
50
+ if (this.error) {
51
+ throw this.error;
52
+ }
53
+ }
54
+ unwrap() {
55
+ if (this.isFailure()) {
56
+ throw this.error;
57
+ } else {
58
+ return this.data;
59
+ }
60
+ }
61
+ match(handlers) {
62
+ if (this.isSuccess()) {
63
+ return handlers.success(this.data, this);
64
+ } else {
65
+ return handlers.failure(this.error, this);
66
+ }
67
+ }
68
+ toFailure() {
69
+ if (this.isSuccess()) {
70
+ throw new Error("Cannot convert a successful result to a failure result");
71
+ }
72
+ return Result.failure(this.error);
73
+ }
74
+ toSuccess() {
75
+ if (this.isFailure()) {
76
+ throw new Error("Cannot convert a failed result to a success result");
77
+ }
78
+ return Result.success(this.data);
79
+ }
80
+ }
81
+ export {
82
+ Result
83
+ };
84
+ //# sourceMappingURL=Result.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/data-structures/Result.ts"],
4
+ "sourcesContent": ["export type ResultType = 'success' | 'failure';\n\nexport type ResultFailure<\n ThisType extends Result<unknown, unknown>,\n TError,\n> = Omit<ThisType, 'data' | 'error' | 'type'> & {\n error: TError;\n data: never;\n type: 'failure';\n};\n\nexport type ResultSuccess<\n ThisType extends Result<unknown, unknown>,\n TData,\n> = Omit<ThisType, 'data' | 'error' | 'type'> & {\n data: TData;\n error: never;\n type: 'success';\n};\n\nexport class Result<const TData, const TError = Error> {\n public readonly type: ResultType;\n public readonly data?: TData;\n public readonly error?: TError;\n\n private constructor(type: ResultType, data?: TData, error?: TError) {\n this.type = type;\n this.data = data;\n this.error = error;\n }\n\n static success<const U>(data?: U): Result<U, never> {\n return new Result<U, never>('success', data, undefined);\n }\n\n static failure<const TError>(error: TError): Result<never, TError> {\n return new Result<never, TError>('failure', undefined, error);\n }\n\n isSuccess<ThisType extends Result<TData, TError>>(\n this: ThisType,\n ): this is ResultSuccess<ThisType, TData> {\n return this.type === 'success';\n }\n\n isFailure<ThisType extends Result<TData, TError>>(\n this: ThisType,\n ): this is ResultFailure<ThisType, TError> {\n return this.type === 'failure';\n }\n\n /**\n * Type guard: checks if the error in this Result is an instance of the provided\n * error constructors or equals any of the provided error values. When it returns true,\n * the result is narrowed to `Result<never, TErrorGuard>`.\n *\n * @example\n * ```typescript\n * const result = Result.failure(new TypeError('Invalid type'));\n * if (result.isErrorInstanceOf(TypeError)) {\n * result.error; // narrowed to TypeError\n * }\n * result.isErrorInstanceOf(TypeError, RangeError); // true -> error is TypeError | RangeError\n *\n * const strResult = Result.failure('MISSING_QUERY_EXECUTION_ID');\n * if (strResult.isErrorInstanceOf('MISSING_QUERY_EXECUTION_ID')) {\n * strResult.error; // narrowed to 'MISSING_QUERY_EXECUTION_ID'\n * }\n * ```\n */\n isErrorInstanceOf<\n ThisType extends Result<TData, TError>,\n TErrorGuard extends TError,\n >(\n this: ThisType,\n ...errorTypes: Array<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (new (...args: Array<any>) => TErrorGuard) | TErrorGuard\n >\n ): this is ResultFailure<ThisType, TErrorGuard> {\n return errorTypes.some((errorType) => {\n if (typeof errorType === 'function') {\n return (\n this.error instanceof\n (errorType as new (...args: Array<unknown>) => TErrorGuard)\n );\n }\n\n return this.error === errorType;\n });\n }\n\n throw(): never | void {\n if (this.error) {\n throw this.error;\n }\n }\n\n unwrap(): TData {\n if (this.isFailure()) {\n throw this.error;\n } else {\n return this.data!;\n }\n }\n\n match<TResult, TErrorResult>(handlers: {\n success: (data: TData, resultThis: Result<TData, TError>) => TResult;\n failure: (error: TError, resultThis: Result<TData, TError>) => TErrorResult;\n }): TResult | TErrorResult {\n if (this.isSuccess()) {\n return handlers.success(this.data!, this);\n } else {\n return handlers.failure(this.error!, this);\n }\n }\n\n toFailure(): Result<never, TError> {\n if (this.isSuccess()) {\n throw new Error('Cannot convert a successful result to a failure result');\n }\n\n return Result.failure(this.error!);\n }\n\n toSuccess(): Result<TData, never> {\n if (this.isFailure()) {\n throw new Error('Cannot convert a failed result to a success result');\n }\n\n return Result.success(this.data!);\n }\n}\n"],
5
+ "mappings": "AAoBO,MAAM,OAA0C;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAkB,MAAc,OAAgB;AAClE,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAO,QAAiB,MAA4B;AAClD,WAAO,IAAI,OAAiB,WAAW,MAAM,MAAS;AAAA,EACxD;AAAA,EAEA,OAAO,QAAsB,OAAsC;AACjE,WAAO,IAAI,OAAsB,WAAW,QAAW,KAAK;AAAA,EAC9D;AAAA,EAEA,YAE0C;AACxC,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,YAE2C;AACzC,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,qBAKK,YAI2C;AAC9C,WAAO,WAAW,KAAK,CAAC,cAAc;AACpC,UAAI,OAAO,cAAc,YAAY;AACnC,eACE,KAAK,iBACJ;AAAA,MAEL;AAEA,aAAO,KAAK,UAAU;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,QAAsB;AACpB,QAAI,KAAK,OAAO;AACd,YAAM,KAAK;AAAA,IACb;AAAA,EACF;AAAA,EAEA,SAAgB;AACd,QAAI,KAAK,UAAU,GAAG;AACpB,YAAM,KAAK;AAAA,IACb,OAAO;AACL,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAA6B,UAGF;AACzB,QAAI,KAAK,UAAU,GAAG;AACpB,aAAO,SAAS,QAAQ,KAAK,MAAO,IAAI;AAAA,IAC1C,OAAO;AACL,aAAO,SAAS,QAAQ,KAAK,OAAQ,IAAI;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,YAAmC;AACjC,QAAI,KAAK,UAAU,GAAG;AACpB,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAEA,WAAO,OAAO,QAAQ,KAAK,KAAM;AAAA,EACnC;AAAA,EAEA,YAAkC;AAChC,QAAI,KAAK,UAAU,GAAG;AACpB,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,WAAO,OAAO,QAAQ,KAAK,IAAK;AAAA,EAClC;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ export * from './Result.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data-structures/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./Result.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/data-structures/index.ts"],
4
+ "sourcesContent": ["export * from './Result';\n"],
5
+ "mappings": "AAAA,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ export * from './types/class-utilities-types.js';
2
+ export * from './retries/Retries.js';
3
+ export * from './queue/LRUQueue.js';
4
+ export * from './queue/LRUQueueFactory.js';
5
+ export * from './promises/PromiseMaxConcurrency.js';
6
+ export * from './object/getProperty.js';
7
+ export * from './metadata/CopyReflection.js';
8
+ export * from './measurement/performance.js';
9
+ export * from './logging/Log.js';
10
+ export * from './data-structures/Result.js';
11
+ export * from './change-tracker/ChangeTracker.js';
12
+ export * from './array/chunkify.js';
13
+ export * from './array/unique.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC;AACjD,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export * from "./types/class-utilities-types.js";
2
+ export * from "./retries/Retries.js";
3
+ export * from "./queue/LRUQueue.js";
4
+ export * from "./queue/LRUQueueFactory.js";
5
+ export * from "./promises/PromiseMaxConcurrency.js";
6
+ export * from "./object/getProperty.js";
7
+ export * from "./metadata/CopyReflection.js";
8
+ export * from "./measurement/performance.js";
9
+ export * from "./logging/Log.js";
10
+ export * from "./data-structures/Result.js";
11
+ export * from "./change-tracker/ChangeTracker.js";
12
+ export * from "./array/chunkify.js";
13
+ export * from "./array/unique.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts"],
4
+ "sourcesContent": ["export * from './types/class-utilities-types';\nexport * from './retries/Retries';\nexport * from './queue/LRUQueue';\nexport * from './queue/LRUQueueFactory';\nexport * from './promises/PromiseMaxConcurrency';\nexport * from './object/getProperty';\nexport * from './metadata/CopyReflection';\nexport * from './measurement/performance';\nexport * from './logging/Log';\nexport * from './data-structures/Result';\nexport * from './change-tracker/ChangeTracker';\nexport * from './array/chunkify';\nexport * from './array/unique';\n"],
5
+ "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,19 @@
1
+ import { Logger } from '@squiz/optimization-logger';
2
+ type MetadataCallback = (...args: Array<any>) => Record<string, unknown>;
3
+ type ErrorCallback = (error: unknown) => Record<string, unknown>;
4
+ type SuccessCallback = (result: any, ...args: Array<any>) => Record<string, unknown>;
5
+ export type LogOptions = {
6
+ before?: string;
7
+ success?: string;
8
+ error?: string;
9
+ metadata?: MetadataCallback;
10
+ errorMetadata?: ErrorCallback;
11
+ successMetadata?: SuccessCallback;
12
+ loggingLevel?: keyof Logger;
13
+ loggingSuccessLevel?: keyof Logger;
14
+ loggingErrorLevel?: keyof Logger;
15
+ loggingResultFailureAsError?: boolean;
16
+ };
17
+ export declare function Log(options: LogOptions): MethodDecorator;
18
+ export {};
19
+ //# sourceMappingURL=Log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Log.d.ts","sourceRoot":"","sources":["../../../src/logging/Log.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAKlE,KAAK,gBAAgB,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACzE,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACjE,KAAK,eAAe,GAAG,CAErB,MAAM,EAAE,GAAG,EAEX,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA+F7B,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,MAAM,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC,CAAC;AAEF,wBAAgB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,eAAe,CAkCxD"}
@@ -0,0 +1,103 @@
1
+ import util from "node:util";
2
+ import { inject } from "inversify";
3
+ import { createLogger, Logger } from "@squiz/optimization-logger";
4
+ import { Result } from "../data-structures/index.js";
5
+ import { CopyReflection } from "../metadata/CopyReflection.js";
6
+ function _log(callback, {
7
+ args,
8
+ logOptions,
9
+ propertyKey
10
+ }, logger) {
11
+ const defaultError = "Error while executing the method";
12
+ const metadata = logOptions.metadata?.(...args);
13
+ const loggingLevel = logOptions.loggingLevel ?? "debug";
14
+ const successLoggingLevel = logOptions.loggingSuccessLevel ?? "debug";
15
+ const errorLoggingLevel = logOptions.loggingErrorLevel ?? "error";
16
+ const method = propertyKey;
17
+ const logError = (resultOrError) => {
18
+ const isResultFailure = resultOrError instanceof Result && resultOrError.isFailure();
19
+ if (isResultFailure && !logOptions.loggingResultFailureAsError) {
20
+ return;
21
+ }
22
+ const error = isResultFailure ? resultOrError.error : resultOrError;
23
+ const errorMetadata = logOptions.errorMetadata?.(error);
24
+ logger[errorLoggingLevel]({
25
+ message: logOptions.error ?? defaultError,
26
+ error,
27
+ method,
28
+ ...metadata,
29
+ ...errorMetadata
30
+ });
31
+ };
32
+ const logAfter = (v) => {
33
+ if (v instanceof Result && v.isFailure()) {
34
+ logError(v);
35
+ } else if (logOptions.success) {
36
+ const successMetadata = logOptions.successMetadata?.(v, ...args);
37
+ logger[successLoggingLevel]({
38
+ message: logOptions.success,
39
+ method,
40
+ ...metadata,
41
+ ...successMetadata
42
+ });
43
+ }
44
+ };
45
+ if (logOptions.before) {
46
+ logger[loggingLevel]({
47
+ message: logOptions.before,
48
+ method,
49
+ ...metadata
50
+ });
51
+ }
52
+ let result;
53
+ try {
54
+ result = callback();
55
+ if (!util.types.isPromise(result)) {
56
+ logAfter(result);
57
+ return result;
58
+ }
59
+ } catch (e) {
60
+ logError(e);
61
+ throw e;
62
+ }
63
+ return result.catch((e) => {
64
+ logError(e);
65
+ throw e;
66
+ }).then((v) => {
67
+ logAfter(v);
68
+ return v;
69
+ });
70
+ }
71
+ function Log(options) {
72
+ return function(target, propertyKey, descriptor) {
73
+ const originalMethod = descriptor.value;
74
+ const injection = inject(Logger);
75
+ const loggerSymbol = /* @__PURE__ */ Symbol("logger");
76
+ if (!Reflect.has(target, loggerSymbol)) {
77
+ injection(target, loggerSymbol);
78
+ }
79
+ descriptor.value = function(...args) {
80
+ const logger = this[loggerSymbol] || createLogger();
81
+ return _log(
82
+ () => {
83
+ return originalMethod.apply(this, args);
84
+ },
85
+ {
86
+ logOptions: options,
87
+ propertyKey,
88
+ args
89
+ },
90
+ logger
91
+ );
92
+ };
93
+ CopyReflection.copyPropertyMetadata(
94
+ originalMethod,
95
+ descriptor.value,
96
+ propertyKey
97
+ );
98
+ };
99
+ }
100
+ export {
101
+ Log
102
+ };
103
+ //# sourceMappingURL=Log.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/logging/Log.ts"],
4
+ "sourcesContent": ["import util from 'node:util';\nimport { inject } from 'inversify';\nimport { createLogger, Logger } from '@squiz/optimization-logger';\nimport { Result } from '../data-structures';\nimport { CopyReflection } from '../metadata/CopyReflection';\n\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\ntype MetadataCallback = (...args: Array<any>) => Record<string, unknown>;\ntype ErrorCallback = (error: unknown) => Record<string, unknown>;\ntype SuccessCallback = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n result: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: Array<any>\n) => Record<string, unknown>;\n\nfunction _log<T>(\n callback: () => T | Promise<T>,\n {\n args,\n logOptions,\n propertyKey,\n }: {\n logOptions: LogOptions;\n args: Array<unknown>;\n propertyKey: string | symbol;\n },\n logger: Logger,\n): T | Promise<T> {\n const defaultError = 'Error while executing the method';\n const metadata = logOptions.metadata?.(...args);\n const loggingLevel = logOptions.loggingLevel ?? 'debug';\n const successLoggingLevel = logOptions.loggingSuccessLevel ?? 'debug';\n const errorLoggingLevel = logOptions.loggingErrorLevel ?? 'error';\n\n const method = propertyKey;\n\n const logError = (resultOrError?: unknown): void => {\n const isResultFailure =\n resultOrError instanceof Result && resultOrError.isFailure();\n\n if (isResultFailure && !logOptions.loggingResultFailureAsError) {\n return;\n }\n\n const error = isResultFailure ? resultOrError.error : resultOrError;\n\n const errorMetadata = logOptions.errorMetadata?.(error);\n\n logger[errorLoggingLevel]({\n message: logOptions.error ?? defaultError,\n error,\n method,\n ...metadata,\n ...errorMetadata,\n });\n };\n\n const logAfter = (v: unknown): void => {\n if (v instanceof Result && v.isFailure()) {\n logError(v);\n } else if (logOptions.success) {\n const successMetadata = logOptions.successMetadata?.(v, ...args);\n\n logger[successLoggingLevel]({\n message: logOptions.success,\n method,\n ...metadata,\n ...successMetadata,\n });\n }\n };\n\n if (logOptions.before) {\n logger[loggingLevel]({\n message: logOptions.before,\n method,\n ...metadata,\n });\n }\n\n let result: T | Promise<T>;\n\n try {\n result = callback();\n\n if (!util.types.isPromise(result)) {\n logAfter(result);\n\n return result;\n }\n } catch (e) {\n logError(e);\n\n throw e;\n }\n\n return result\n .catch((e) => {\n logError(e);\n\n throw e;\n })\n .then((v) => {\n logAfter(v);\n return v;\n });\n}\n\nexport type LogOptions = {\n before?: string;\n success?: string;\n error?: string;\n metadata?: MetadataCallback;\n errorMetadata?: ErrorCallback;\n successMetadata?: SuccessCallback;\n loggingLevel?: keyof Logger;\n loggingSuccessLevel?: keyof Logger;\n loggingErrorLevel?: keyof Logger;\n loggingResultFailureAsError?: boolean;\n};\n\nexport function Log(options: LogOptions): MethodDecorator {\n return function (target, propertyKey, descriptor: PropertyDescriptor): void {\n const originalMethod = descriptor.value;\n\n const injection = inject(Logger);\n const loggerSymbol = Symbol('logger');\n\n if (!Reflect.has(target, loggerSymbol)) {\n injection(target, loggerSymbol);\n }\n\n descriptor.value = function (...args: Array<unknown>): unknown {\n const logger =\n (this as { [loggerSymbol]: Logger })[loggerSymbol] || createLogger();\n\n return _log(\n () => {\n return originalMethod.apply(this, args);\n },\n {\n logOptions: options,\n propertyKey,\n args,\n },\n logger,\n );\n };\n\n CopyReflection.copyPropertyMetadata(\n originalMethod,\n descriptor.value,\n propertyKey,\n );\n };\n}\n"],
5
+ "mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,cAAc;AACvB,SAAS,cAAc,cAAc;AACrC,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAY/B,SAAS,KACP,UACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GAKA,QACgB;AAChB,QAAM,eAAe;AACrB,QAAM,WAAW,WAAW,WAAW,GAAG,IAAI;AAC9C,QAAM,eAAe,WAAW,gBAAgB;AAChD,QAAM,sBAAsB,WAAW,uBAAuB;AAC9D,QAAM,oBAAoB,WAAW,qBAAqB;AAE1D,QAAM,SAAS;AAEf,QAAM,WAAW,CAAC,kBAAkC;AAClD,UAAM,kBACJ,yBAAyB,UAAU,cAAc,UAAU;AAE7D,QAAI,mBAAmB,CAAC,WAAW,6BAA6B;AAC9D;AAAA,IACF;AAEA,UAAM,QAAQ,kBAAkB,cAAc,QAAQ;AAEtD,UAAM,gBAAgB,WAAW,gBAAgB,KAAK;AAEtD,WAAO,iBAAiB,EAAE;AAAA,MACxB,SAAS,WAAW,SAAS;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,MAAqB;AACrC,QAAI,aAAa,UAAU,EAAE,UAAU,GAAG;AACxC,eAAS,CAAC;AAAA,IACZ,WAAW,WAAW,SAAS;AAC7B,YAAM,kBAAkB,WAAW,kBAAkB,GAAG,GAAG,IAAI;AAE/D,aAAO,mBAAmB,EAAE;AAAA,QAC1B,SAAS,WAAW;AAAA,QACpB;AAAA,QACA,GAAG;AAAA,QACH,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ;AACrB,WAAO,YAAY,EAAE;AAAA,MACnB,SAAS,WAAW;AAAA,MACpB;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAEA,MAAI;AAEJ,MAAI;AACF,aAAS,SAAS;AAElB,QAAI,CAAC,KAAK,MAAM,UAAU,MAAM,GAAG;AACjC,eAAS,MAAM;AAEf,aAAO;AAAA,IACT;AAAA,EACF,SAAS,GAAG;AACV,aAAS,CAAC;AAEV,UAAM;AAAA,EACR;AAEA,SAAO,OACJ,MAAM,CAAC,MAAM;AACZ,aAAS,CAAC;AAEV,UAAM;AAAA,EACR,CAAC,EACA,KAAK,CAAC,MAAM;AACX,aAAS,CAAC;AACV,WAAO;AAAA,EACT,CAAC;AACL;AAeO,SAAS,IAAI,SAAsC;AACxD,SAAO,SAAU,QAAQ,aAAa,YAAsC;AAC1E,UAAM,iBAAiB,WAAW;AAElC,UAAM,YAAY,OAAO,MAAM;AAC/B,UAAM,eAAe,uBAAO,QAAQ;AAEpC,QAAI,CAAC,QAAQ,IAAI,QAAQ,YAAY,GAAG;AACtC,gBAAU,QAAQ,YAAY;AAAA,IAChC;AAEA,eAAW,QAAQ,YAAa,MAA+B;AAC7D,YAAM,SACH,KAAoC,YAAY,KAAK,aAAa;AAErE,aAAO;AAAA,QACL,MAAM;AACJ,iBAAO,eAAe,MAAM,MAAM,IAAI;AAAA,QACxC;AAAA,QACA;AAAA,UACE,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,mBAAe;AAAA,MACb;AAAA,MACA,WAAW;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,6 @@
1
+ import { Logger } from '@squiz/optimization-logger';
2
+ export declare const createPerf: (logger?: Logger) => <T>(callback: () => T | Promise<T>, label: string) => T | Promise<T>;
3
+ export declare function perf<T>(callback: () => T, label: string, logger?: Logger): T;
4
+ export declare function perf<T>(callback: () => Promise<T>, label: string, logger?: Logger): Promise<T>;
5
+ export declare function LogPerf(customLabel?: string): MethodDecorator;
6
+ //# sourceMappingURL=performance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../../src/measurement/performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAIlE,eAAO,MAAM,UAAU,GACpB,SAAS,MAAM,MACf,CAAC,EAAE,UAAU,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,MAAM,KAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAClC,CAAC;AAElC,wBAAgB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AAC9E,wBAAgB,IAAI,CAAC,CAAC,EACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC,CAAC;AAmCd,wBAAgB,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,CA2B7D"}
@@ -0,0 +1,50 @@
1
+ import { createLogger, Logger } from "@squiz/optimization-logger";
2
+ import * as util from "node:util";
3
+ import { inject } from "inversify";
4
+ const createPerf = (logger) => (callback, label) => perf(callback, label, logger);
5
+ function perf(callback, label, logger) {
6
+ const start = performance.now();
7
+ logger = logger ? logger : createLogger();
8
+ const result = callback();
9
+ const logPerformance = () => {
10
+ const end = performance.now();
11
+ const duration = (end - start).toFixed(2);
12
+ logger.debug({
13
+ message: `Execution of ${label} took ${duration} ms`,
14
+ duration,
15
+ label
16
+ });
17
+ };
18
+ if (util.types.isPromise(result)) {
19
+ return result.finally(() => {
20
+ logPerformance();
21
+ });
22
+ }
23
+ logPerformance();
24
+ return result;
25
+ }
26
+ function LogPerf(customLabel) {
27
+ return function(target, propertyKey, descriptor) {
28
+ const originalMethod = descriptor.value;
29
+ const label = customLabel ? customLabel : `${target.constructor.name}.${propertyKey}`;
30
+ const injection = inject(Logger);
31
+ const loggerSymbol = /* @__PURE__ */ Symbol("logger");
32
+ injection(target, loggerSymbol);
33
+ descriptor.value = function(...args) {
34
+ const logger = this[loggerSymbol];
35
+ return perf(
36
+ () => {
37
+ return originalMethod.apply(this, args);
38
+ },
39
+ label,
40
+ logger
41
+ );
42
+ };
43
+ };
44
+ }
45
+ export {
46
+ LogPerf,
47
+ createPerf,
48
+ perf
49
+ };
50
+ //# sourceMappingURL=performance.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/measurement/performance.ts"],
4
+ "sourcesContent": ["import { createLogger, Logger } from '@squiz/optimization-logger';\nimport * as util from 'node:util';\nimport { inject } from 'inversify';\n\nexport const createPerf =\n (logger?: Logger) =>\n <T>(callback: () => T | Promise<T>, label: string): T | Promise<T> =>\n perf(callback, label, logger);\n\nexport function perf<T>(callback: () => T, label: string, logger?: Logger): T;\nexport function perf<T>(\n callback: () => Promise<T>,\n label: string,\n logger?: Logger,\n): Promise<T>;\n\nexport function perf<T>(\n callback: () => T | Promise<T>,\n label: string,\n logger?: Logger,\n): T | Promise<T> {\n const start = performance.now();\n\n logger = logger ? logger : createLogger();\n\n const result = callback();\n\n const logPerformance = () => {\n const end = performance.now();\n const duration = (end - start).toFixed(2);\n\n logger.debug({\n message: `Execution of ${label} took ${duration} ms`,\n duration,\n label,\n });\n };\n\n if (util.types.isPromise(result)) {\n return result.finally(() => {\n logPerformance();\n });\n }\n\n logPerformance();\n\n return result;\n}\n\nexport function LogPerf(customLabel?: string): MethodDecorator {\n return function (target, propertyKey, descriptor: PropertyDescriptor): void {\n const originalMethod = descriptor.value;\n\n const label = customLabel\n ? customLabel\n : `${target.constructor.name}.${propertyKey as string}`;\n\n const injection = inject(Logger);\n const loggerSymbol = Symbol('logger');\n\n injection(target, loggerSymbol);\n\n descriptor.value = function (...args: Array<unknown>): unknown {\n const logger = (this as { [loggerSymbol]: Logger | undefined })[\n loggerSymbol\n ];\n\n return perf(\n () => {\n return originalMethod.apply(this, args);\n },\n label,\n logger,\n );\n };\n };\n}\n"],
5
+ "mappings": "AAAA,SAAS,cAAc,cAAc;AACrC,YAAY,UAAU;AACtB,SAAS,cAAc;AAEhB,MAAM,aACX,CAAC,WACD,CAAI,UAAgC,UAClC,KAAK,UAAU,OAAO,MAAM;AASzB,SAAS,KACd,UACA,OACA,QACgB;AAChB,QAAM,QAAQ,YAAY,IAAI;AAE9B,WAAS,SAAS,SAAS,aAAa;AAExC,QAAM,SAAS,SAAS;AAExB,QAAM,iBAAiB,MAAM;AAC3B,UAAM,MAAM,YAAY,IAAI;AAC5B,UAAM,YAAY,MAAM,OAAO,QAAQ,CAAC;AAExC,WAAO,MAAM;AAAA,MACX,SAAS,gBAAgB,KAAK,SAAS,QAAQ;AAAA,MAC/C;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,KAAK,MAAM,UAAU,MAAM,GAAG;AAChC,WAAO,OAAO,QAAQ,MAAM;AAC1B,qBAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,iBAAe;AAEf,SAAO;AACT;AAEO,SAAS,QAAQ,aAAuC;AAC7D,SAAO,SAAU,QAAQ,aAAa,YAAsC;AAC1E,UAAM,iBAAiB,WAAW;AAElC,UAAM,QAAQ,cACV,cACA,GAAG,OAAO,YAAY,IAAI,IAAI,WAAqB;AAEvD,UAAM,YAAY,OAAO,MAAM;AAC/B,UAAM,eAAe,uBAAO,QAAQ;AAEpC,cAAU,QAAQ,YAAY;AAE9B,eAAW,QAAQ,YAAa,MAA+B;AAC7D,YAAM,SAAU,KACd,YACF;AAEA,aAAO;AAAA,QACL,MAAM;AACJ,iBAAO,eAAe,MAAM,MAAM,IAAI;AAAA,QACxC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,6 @@
1
+ import 'reflect-metadata';
2
+ export declare class CopyReflection {
3
+ static copyMetadata(source: object, target: object): void;
4
+ static copyPropertyMetadata(source: object, target: object, propertyKey: string | symbol): void;
5
+ }
6
+ //# sourceMappingURL=CopyReflection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyReflection.d.ts","sourceRoot":"","sources":["../../../src/metadata/CopyReflection.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,qBAAa,cAAc;WACX,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;WAUlD,oBAAoB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,MAAM,GAC3B,IAAI;CASR"}
@@ -0,0 +1,21 @@
1
+ import "reflect-metadata";
2
+ class CopyReflection {
3
+ static copyMetadata(source, target) {
4
+ const metadataKeys = Reflect.getMetadataKeys(source);
5
+ metadataKeys.forEach((key) => {
6
+ const metadata = Reflect.getMetadata(key, source);
7
+ Reflect.defineMetadata(key, metadata, target);
8
+ });
9
+ }
10
+ static copyPropertyMetadata(source, target, propertyKey) {
11
+ const metadataKeys = Reflect.getMetadataKeys(source, propertyKey);
12
+ metadataKeys.forEach((key) => {
13
+ const metadata = Reflect.getMetadata(key, source, propertyKey);
14
+ Reflect.defineMetadata(key, metadata, target, propertyKey);
15
+ });
16
+ }
17
+ }
18
+ export {
19
+ CopyReflection
20
+ };
21
+ //# sourceMappingURL=CopyReflection.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/metadata/CopyReflection.ts"],
4
+ "sourcesContent": ["import 'reflect-metadata';\n\nexport class CopyReflection {\n public static copyMetadata(source: object, target: object): void {\n const metadataKeys = Reflect.getMetadataKeys(source);\n\n metadataKeys.forEach((key) => {\n const metadata = Reflect.getMetadata(key, source);\n\n Reflect.defineMetadata(key, metadata, target);\n });\n }\n\n public static copyPropertyMetadata(\n source: object,\n target: object,\n propertyKey: string | symbol,\n ): void {\n const metadataKeys = Reflect.getMetadataKeys(source, propertyKey);\n\n metadataKeys.forEach((key) => {\n const metadata = Reflect.getMetadata(key, source, propertyKey);\n\n Reflect.defineMetadata(key, metadata, target, propertyKey);\n });\n }\n}\n"],
5
+ "mappings": "AAAA,OAAO;AAEA,MAAM,eAAe;AAAA,EAC1B,OAAc,aAAa,QAAgB,QAAsB;AAC/D,UAAM,eAAe,QAAQ,gBAAgB,MAAM;AAEnD,iBAAa,QAAQ,CAAC,QAAQ;AAC5B,YAAM,WAAW,QAAQ,YAAY,KAAK,MAAM;AAEhD,cAAQ,eAAe,KAAK,UAAU,MAAM;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,OAAc,qBACZ,QACA,QACA,aACM;AACN,UAAM,eAAe,QAAQ,gBAAgB,QAAQ,WAAW;AAEhE,iBAAa,QAAQ,CAAC,QAAQ;AAC5B,YAAM,WAAW,QAAQ,YAAY,KAAK,QAAQ,WAAW;AAE7D,cAAQ,eAAe,KAAK,UAAU,QAAQ,WAAW;AAAA,IAC3D,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ export declare const getProperty: (obj: Record<string | symbol | number, unknown>, path: string, defaultValue?: unknown) => unknown;
2
+ //# sourceMappingURL=getProperty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProperty.d.ts","sourceRoot":"","sources":["../../../src/object/getProperty.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,GACtB,KAAK,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAC9C,MAAM,MAAM,EACZ,eAAc,OAAmB,KAChC,OAgBF,CAAC"}
@@ -0,0 +1,12 @@
1
+ const getProperty = (obj, path, defaultValue = void 0) => {
2
+ const travel = (regexp) => path.split(regexp).filter(Boolean).reduce(
3
+ (res, key) => res !== null && res !== void 0 ? res[key] : res,
4
+ obj
5
+ );
6
+ const result = travel(/[,[\]]+?/) || travel(/[,[\].]+?/);
7
+ return result === void 0 || result === obj ? defaultValue : result;
8
+ };
9
+ export {
10
+ getProperty
11
+ };
12
+ //# sourceMappingURL=getProperty.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/object/getProperty.ts"],
4
+ "sourcesContent": ["export const getProperty = (\n obj: Record<string | symbol | number, unknown>,\n path: string,\n defaultValue: unknown = undefined,\n): unknown => {\n const travel = (regexp: RegExp) =>\n path\n .split(regexp)\n .filter(Boolean)\n .reduce<unknown>(\n (res, key) =>\n res !== null && res !== undefined\n ? (res as Record<string, unknown>)[key]\n : res,\n obj,\n );\n\n const result = travel(/[,[\\]]+?/) || travel(/[,[\\].]+?/);\n\n return result === undefined || result === obj ? defaultValue : result;\n};\n"],
5
+ "mappings": "AAAO,MAAM,cAAc,CACzB,KACA,MACA,eAAwB,WACZ;AACZ,QAAM,SAAS,CAAC,WACd,KACG,MAAM,MAAM,EACZ,OAAO,OAAO,EACd;AAAA,IACC,CAAC,KAAK,QACJ,QAAQ,QAAQ,QAAQ,SACnB,IAAgC,GAAG,IACpC;AAAA,IACN;AAAA,EACF;AAEJ,QAAM,SAAS,OAAO,UAAU,KAAK,OAAO,WAAW;AAEvD,SAAO,WAAW,UAAa,WAAW,MAAM,eAAe;AACjE;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ export * from './getProperty.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./getProperty.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/object/index.ts"],
4
+ "sourcesContent": ["export * from './getProperty';\n"],
5
+ "mappings": "AAAA,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,25 @@
1
+ export type MaxConcurrencyOptions = {
2
+ maxConcurrency: number;
3
+ };
4
+ /**
5
+ * A utility class that executes promises with controlled concurrency.
6
+ * This class helps to limit the number of promises running simultaneously,
7
+ * preventing potential memory or performance issues when dealing with large arrays.
8
+ */
9
+ export declare class PromiseMaxConcurrency<T> {
10
+ private readonly items;
11
+ private options;
12
+ /**
13
+ * Creates a new instance of PromiseMaxConcurrency.
14
+ * @param items - Array of items to process
15
+ * @param options - Configuration options for controlling concurrency
16
+ * @param options.maxConcurrency - Maximum number of promises to run simultaneously (defaults to 3)
17
+ */
18
+ constructor(items: Array<T>, options?: MaxConcurrencyOptions);
19
+ handle<R>(handler: (value: T, index: number, array: Array<T>) => Promise<R>): Promise<Array<R>>;
20
+ }
21
+ export declare class PromiseMaxConcurrencyFactory {
22
+ constructor();
23
+ create<T>(items: Array<T>, options?: MaxConcurrencyOptions): PromiseMaxConcurrency<T>;
24
+ }
25
+ //# sourceMappingURL=PromiseMaxConcurrency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromiseMaxConcurrency.d.ts","sourceRoot":"","sources":["../../../src/promises/PromiseMaxConcurrency.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;;GAIG;AACH,qBACa,qBAAqB,CAAC,CAAC;IAUhC,OAAO,CAAC,QAAQ,CAAC,KAAK;IATxB,OAAO,CAAC,OAAO,CAAwB;IAEvC;;;;;OAKG;gBAEgB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAChC,OAAO,CAAC,EAAE,qBAAqB;IAO3B,MAAM,CAAC,CAAC,EACZ,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAChE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;CAsBrB;AAED,qBACa,4BAA4B;;IAGvC,MAAM,CAAC,CAAC,EACN,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,OAAO,CAAC,EAAE,qBAAqB,GAC9B,qBAAqB,CAAC,CAAC,CAAC;CAG5B"}
@@ -0,0 +1,63 @@
1
+ var __decorate = function(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = function(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var _a;
11
+ import { injectable } from "inversify";
12
+ let PromiseMaxConcurrency = class PromiseMaxConcurrency2 {
13
+ items;
14
+ options;
15
+ /**
16
+ * Creates a new instance of PromiseMaxConcurrency.
17
+ * @param items - Array of items to process
18
+ * @param options - Configuration options for controlling concurrency
19
+ * @param options.maxConcurrency - Maximum number of promises to run simultaneously (defaults to 3)
20
+ */
21
+ constructor(items, options) {
22
+ this.items = items;
23
+ this.options = options ?? {
24
+ maxConcurrency: 3
25
+ };
26
+ }
27
+ async handle(handler) {
28
+ let promises = [];
29
+ const results = [];
30
+ const maxConcurrency = this.options.maxConcurrency;
31
+ for (let i = 0; i < this.items.length; i++) {
32
+ promises.push(handler(this.items[i], i, this.items));
33
+ if (promises.length === maxConcurrency) {
34
+ const result2 = await Promise.all(promises);
35
+ results.push(...result2);
36
+ promises = [];
37
+ }
38
+ }
39
+ const result = await Promise.all(promises);
40
+ results.push(...result);
41
+ return results;
42
+ }
43
+ };
44
+ PromiseMaxConcurrency = __decorate([
45
+ injectable(),
46
+ __metadata("design:paramtypes", [typeof (_a = typeof Array !== "undefined" && Array) === "function" ? _a : Object, Object])
47
+ ], PromiseMaxConcurrency);
48
+ let PromiseMaxConcurrencyFactory = class PromiseMaxConcurrencyFactory2 {
49
+ constructor() {
50
+ }
51
+ create(items, options) {
52
+ return new PromiseMaxConcurrency(items, options);
53
+ }
54
+ };
55
+ PromiseMaxConcurrencyFactory = __decorate([
56
+ injectable(),
57
+ __metadata("design:paramtypes", [])
58
+ ], PromiseMaxConcurrencyFactory);
59
+ export {
60
+ PromiseMaxConcurrency,
61
+ PromiseMaxConcurrencyFactory
62
+ };
63
+ //# sourceMappingURL=PromiseMaxConcurrency.js.map