typetify 2.1.0 → 2.2.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 (199) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/README.md +108 -0
  3. package/dist/async/index.js +1 -49
  4. package/dist/async/index.mjs +1 -4
  5. package/dist/chunk-272Z3AXV.js +1 -0
  6. package/dist/chunk-4HQERWI6.mjs +1 -0
  7. package/dist/chunk-4JG7CFRK.js +1 -0
  8. package/dist/chunk-5FBZYPQM.mjs +1 -0
  9. package/dist/chunk-5LWNMYHB.js +1 -0
  10. package/dist/chunk-5XQRYI2Q.mjs +1 -0
  11. package/dist/chunk-6HA2SN23.js +1 -0
  12. package/dist/chunk-6NWIIOHH.js +1 -0
  13. package/dist/chunk-7LBL6CYT.js +1 -0
  14. package/dist/chunk-7V3EDYJD.mjs +1 -0
  15. package/dist/chunk-B3R73UK5.mjs +1 -0
  16. package/dist/chunk-EAHFED6V.mjs +1 -0
  17. package/dist/chunk-EKSHS4DL.mjs +1 -0
  18. package/dist/chunk-FYQNKDT3.mjs +1 -0
  19. package/dist/chunk-GKOA3XGQ.js +1 -0
  20. package/dist/chunk-I4YSQ4HB.js +1 -0
  21. package/dist/chunk-JZXLCA2E.mjs +1 -0
  22. package/dist/chunk-M5OMYDI7.mjs +1 -0
  23. package/dist/chunk-MPY3WRLG.mjs +1 -0
  24. package/dist/chunk-MSOFO6QN.js +1 -0
  25. package/dist/chunk-NENRAPOL.mjs +1 -0
  26. package/dist/chunk-NOW4Q26G.mjs +1 -0
  27. package/dist/chunk-P4UNM7SF.js +1 -0
  28. package/dist/chunk-P5E2JDCX.mjs +1 -0
  29. package/dist/chunk-Q7SUL7MD.js +1 -0
  30. package/dist/chunk-QKNZICUO.mjs +1 -0
  31. package/dist/chunk-RHMANSTA.mjs +1 -0
  32. package/dist/chunk-SF64HETW.js +1 -0
  33. package/dist/chunk-T66YO63J.js +1 -0
  34. package/dist/chunk-TNK6EVQK.mjs +1 -0
  35. package/dist/chunk-TSJFKV3R.js +1 -0
  36. package/dist/chunk-TVCWWECJ.mjs +1 -0
  37. package/dist/chunk-W5I352FJ.js +1 -0
  38. package/dist/chunk-WAT4QJB2.js +1 -0
  39. package/dist/chunk-WCG5ODRX.mjs +1 -0
  40. package/dist/chunk-WDFIRO2J.js +1 -0
  41. package/dist/chunk-WOT6VMZA.js +1 -0
  42. package/dist/chunk-WQPSXQT5.js +1 -0
  43. package/dist/chunk-WS743BFA.js +1 -0
  44. package/dist/chunk-XPY5CWKZ.mjs +1 -0
  45. package/dist/collection/index.js +1 -125
  46. package/dist/collection/index.mjs +1 -4
  47. package/dist/core/index.js +1 -41
  48. package/dist/core/index.mjs +1 -4
  49. package/dist/decorator/index.js +1 -57
  50. package/dist/decorator/index.mjs +1 -4
  51. package/dist/dx/index.js +1 -53
  52. package/dist/dx/index.mjs +1 -4
  53. package/dist/flow/index.js +1 -50
  54. package/dist/flow/index.mjs +1 -5
  55. package/dist/fn/index.js +1 -37
  56. package/dist/fn/index.mjs +1 -4
  57. package/dist/guards/index.js +1 -233
  58. package/dist/guards/index.mjs +1 -4
  59. package/dist/index.js +3 -2507
  60. package/dist/index.mjs +3 -1546
  61. package/dist/input/index.js +1 -74
  62. package/dist/input/index.mjs +1 -5
  63. package/dist/iterator/index.js +1 -85
  64. package/dist/iterator/index.mjs +1 -4
  65. package/dist/logic/index.js +1 -201
  66. package/dist/logic/index.mjs +1 -4
  67. package/dist/math/index.js +1 -45
  68. package/dist/math/index.mjs +1 -4
  69. package/dist/narrowing/index.js +1 -141
  70. package/dist/narrowing/index.mjs +1 -4
  71. package/dist/object/index.js +1 -113
  72. package/dist/object/index.mjs +1 -4
  73. package/dist/result/index.js +1 -86
  74. package/dist/result/index.mjs +1 -5
  75. package/dist/schema/index.js +1 -110
  76. package/dist/schema/index.mjs +1 -5
  77. package/dist/string/index.js +1 -49
  78. package/dist/string/index.mjs +1 -4
  79. package/dist/typed/index.js +1 -193
  80. package/dist/typed/index.mjs +1 -4
  81. package/package.json +8 -3
  82. package/dist/async/index.js.map +0 -1
  83. package/dist/async/index.mjs.map +0 -1
  84. package/dist/chunk-2LJ6NZ6K.js +0 -108
  85. package/dist/chunk-2LJ6NZ6K.js.map +0 -1
  86. package/dist/chunk-4NXETABV.mjs +0 -116
  87. package/dist/chunk-4NXETABV.mjs.map +0 -1
  88. package/dist/chunk-6ZBTL74K.js +0 -129
  89. package/dist/chunk-6ZBTL74K.js.map +0 -1
  90. package/dist/chunk-7G4ZSMQX.js +0 -470
  91. package/dist/chunk-7G4ZSMQX.js.map +0 -1
  92. package/dist/chunk-CN3GYRJN.mjs +0 -137
  93. package/dist/chunk-CN3GYRJN.mjs.map +0 -1
  94. package/dist/chunk-CNTE6ZVH.js +0 -359
  95. package/dist/chunk-CNTE6ZVH.js.map +0 -1
  96. package/dist/chunk-CWHYQWNU.mjs +0 -224
  97. package/dist/chunk-CWHYQWNU.mjs.map +0 -1
  98. package/dist/chunk-DBENOSTA.js +0 -156
  99. package/dist/chunk-DBENOSTA.js.map +0 -1
  100. package/dist/chunk-DWIG5GF2.js +0 -135
  101. package/dist/chunk-DWIG5GF2.js.map +0 -1
  102. package/dist/chunk-EAUTTWTQ.mjs +0 -231
  103. package/dist/chunk-EAUTTWTQ.mjs.map +0 -1
  104. package/dist/chunk-FEX5C4OH.mjs +0 -1007
  105. package/dist/chunk-FEX5C4OH.mjs.map +0 -1
  106. package/dist/chunk-FN553YPU.js +0 -441
  107. package/dist/chunk-FN553YPU.js.map +0 -1
  108. package/dist/chunk-FT2EK4AM.mjs +0 -420
  109. package/dist/chunk-FT2EK4AM.mjs.map +0 -1
  110. package/dist/chunk-FXWYPHA3.mjs +0 -13
  111. package/dist/chunk-FXWYPHA3.mjs.map +0 -1
  112. package/dist/chunk-GS3PP67B.js +0 -200
  113. package/dist/chunk-GS3PP67B.js.map +0 -1
  114. package/dist/chunk-IGA3VEZM.mjs +0 -503
  115. package/dist/chunk-IGA3VEZM.mjs.map +0 -1
  116. package/dist/chunk-J5LGTIGS.mjs +0 -9
  117. package/dist/chunk-J5LGTIGS.mjs.map +0 -1
  118. package/dist/chunk-JB6UXRKD.mjs +0 -97
  119. package/dist/chunk-JB6UXRKD.mjs.map +0 -1
  120. package/dist/chunk-JQAQV75V.js +0 -561
  121. package/dist/chunk-JQAQV75V.js.map +0 -1
  122. package/dist/chunk-JQHUBZ4M.js +0 -88
  123. package/dist/chunk-JQHUBZ4M.js.map +0 -1
  124. package/dist/chunk-LT7JK7RJ.js +0 -87
  125. package/dist/chunk-LT7JK7RJ.js.map +0 -1
  126. package/dist/chunk-N6IUADIP.mjs +0 -414
  127. package/dist/chunk-N6IUADIP.mjs.map +0 -1
  128. package/dist/chunk-OEJK37LO.mjs +0 -328
  129. package/dist/chunk-OEJK37LO.mjs.map +0 -1
  130. package/dist/chunk-OKB3MS5F.js +0 -547
  131. package/dist/chunk-OKB3MS5F.js.map +0 -1
  132. package/dist/chunk-OPVES6W2.js +0 -16
  133. package/dist/chunk-OPVES6W2.js.map +0 -1
  134. package/dist/chunk-OWNUKWXV.js +0 -291
  135. package/dist/chunk-OWNUKWXV.js.map +0 -1
  136. package/dist/chunk-POD52NJ3.mjs +0 -526
  137. package/dist/chunk-POD52NJ3.mjs.map +0 -1
  138. package/dist/chunk-PQTXSQ4P.js +0 -369
  139. package/dist/chunk-PQTXSQ4P.js.map +0 -1
  140. package/dist/chunk-PZ5AY32C.js +0 -11
  141. package/dist/chunk-PZ5AY32C.js.map +0 -1
  142. package/dist/chunk-QFR7DVAJ.mjs +0 -63
  143. package/dist/chunk-QFR7DVAJ.mjs.map +0 -1
  144. package/dist/chunk-S535LAXW.js +0 -1054
  145. package/dist/chunk-S535LAXW.js.map +0 -1
  146. package/dist/chunk-SGQNLTRK.js +0 -73
  147. package/dist/chunk-SGQNLTRK.js.map +0 -1
  148. package/dist/chunk-SRDWUHDY.mjs +0 -188
  149. package/dist/chunk-SRDWUHDY.mjs.map +0 -1
  150. package/dist/chunk-TXU7NTT4.js +0 -249
  151. package/dist/chunk-TXU7NTT4.js.map +0 -1
  152. package/dist/chunk-TZEWREAC.mjs +0 -277
  153. package/dist/chunk-TZEWREAC.mjs.map +0 -1
  154. package/dist/chunk-V6CWFDIJ.mjs +0 -123
  155. package/dist/chunk-V6CWFDIJ.mjs.map +0 -1
  156. package/dist/chunk-X55EORNF.js +0 -259
  157. package/dist/chunk-X55EORNF.js.map +0 -1
  158. package/dist/chunk-YBJC5WMX.mjs +0 -341
  159. package/dist/chunk-YBJC5WMX.mjs.map +0 -1
  160. package/dist/chunk-YOPAXITF.mjs +0 -75
  161. package/dist/chunk-YOPAXITF.mjs.map +0 -1
  162. package/dist/chunk-ZE4FDBRI.mjs +0 -79
  163. package/dist/chunk-ZE4FDBRI.mjs.map +0 -1
  164. package/dist/collection/index.js.map +0 -1
  165. package/dist/collection/index.mjs.map +0 -1
  166. package/dist/core/index.js.map +0 -1
  167. package/dist/core/index.mjs.map +0 -1
  168. package/dist/decorator/index.js.map +0 -1
  169. package/dist/decorator/index.mjs.map +0 -1
  170. package/dist/dx/index.js.map +0 -1
  171. package/dist/dx/index.mjs.map +0 -1
  172. package/dist/flow/index.js.map +0 -1
  173. package/dist/flow/index.mjs.map +0 -1
  174. package/dist/fn/index.js.map +0 -1
  175. package/dist/fn/index.mjs.map +0 -1
  176. package/dist/guards/index.js.map +0 -1
  177. package/dist/guards/index.mjs.map +0 -1
  178. package/dist/index.js.map +0 -1
  179. package/dist/index.mjs.map +0 -1
  180. package/dist/input/index.js.map +0 -1
  181. package/dist/input/index.mjs.map +0 -1
  182. package/dist/iterator/index.js.map +0 -1
  183. package/dist/iterator/index.mjs.map +0 -1
  184. package/dist/logic/index.js.map +0 -1
  185. package/dist/logic/index.mjs.map +0 -1
  186. package/dist/math/index.js.map +0 -1
  187. package/dist/math/index.mjs.map +0 -1
  188. package/dist/narrowing/index.js.map +0 -1
  189. package/dist/narrowing/index.mjs.map +0 -1
  190. package/dist/object/index.js.map +0 -1
  191. package/dist/object/index.mjs.map +0 -1
  192. package/dist/result/index.js.map +0 -1
  193. package/dist/result/index.mjs.map +0 -1
  194. package/dist/schema/index.js.map +0 -1
  195. package/dist/schema/index.mjs.map +0 -1
  196. package/dist/string/index.js.map +0 -1
  197. package/dist/string/index.mjs.map +0 -1
  198. package/dist/typed/index.js.map +0 -1
  199. package/dist/typed/index.mjs.map +0 -1
@@ -1,291 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkPZ5AY32C_js = require('./chunk-PZ5AY32C.js');
4
-
5
- // src/decorator/index.ts
6
- var decorator_exports = {};
7
- chunkPZ5AY32C_js.__export(decorator_exports, {
8
- Bind: () => Bind,
9
- Debounce: () => Debounce,
10
- Deprecated: () => Deprecated,
11
- Frozen: () => Frozen,
12
- Lazy: () => Lazy,
13
- Log: () => Log,
14
- Measure: () => Measure,
15
- Memoize: () => Memoize,
16
- Retry: () => Retry,
17
- Sealed: () => Sealed,
18
- Throttle: () => Throttle,
19
- Validate: () => Validate
20
- });
21
-
22
- // src/decorator/Memoize.ts
23
- function Memoize(resolver) {
24
- return function(_target, _propertyKey, descriptor) {
25
- const originalMethod = descriptor.value;
26
- if (typeof originalMethod !== "function") {
27
- throw new Error("@Memoize can only be applied to methods");
28
- }
29
- const cache = /* @__PURE__ */ new Map();
30
- descriptor.value = function(...args) {
31
- const key = resolver ? resolver(...args) : args[0];
32
- if (cache.has(key)) {
33
- return cache.get(key);
34
- }
35
- const result = originalMethod.apply(this, args);
36
- cache.set(key, result);
37
- return result;
38
- };
39
- return descriptor;
40
- };
41
- }
42
-
43
- // src/decorator/Debounce.ts
44
- function Debounce(wait) {
45
- return function(_target, _propertyKey, descriptor) {
46
- const originalMethod = descriptor.value;
47
- if (typeof originalMethod !== "function") {
48
- throw new Error("@Debounce can only be applied to methods");
49
- }
50
- let timeoutId;
51
- descriptor.value = function(...args) {
52
- if (timeoutId !== void 0) {
53
- clearTimeout(timeoutId);
54
- }
55
- timeoutId = setTimeout(() => {
56
- originalMethod.apply(this, args);
57
- }, wait);
58
- };
59
- return descriptor;
60
- };
61
- }
62
-
63
- // src/decorator/Throttle.ts
64
- function Throttle(wait) {
65
- return function(_target, _propertyKey, descriptor) {
66
- const originalMethod = descriptor.value;
67
- if (typeof originalMethod !== "function") {
68
- throw new Error("@Throttle can only be applied to methods");
69
- }
70
- let lastCall = 0;
71
- let timeoutId;
72
- descriptor.value = function(...args) {
73
- const now = Date.now();
74
- const remaining = wait - (now - lastCall);
75
- if (remaining <= 0) {
76
- if (timeoutId !== void 0) {
77
- clearTimeout(timeoutId);
78
- timeoutId = void 0;
79
- }
80
- lastCall = now;
81
- originalMethod.apply(this, args);
82
- } else if (timeoutId === void 0) {
83
- timeoutId = setTimeout(() => {
84
- lastCall = Date.now();
85
- timeoutId = void 0;
86
- originalMethod.apply(this, args);
87
- }, remaining);
88
- }
89
- };
90
- return descriptor;
91
- };
92
- }
93
-
94
- // src/decorator/Bind.ts
95
- function Bind() {
96
- return function(_target, propertyKey, descriptor) {
97
- const originalMethod = descriptor.value;
98
- if (typeof originalMethod !== "function") {
99
- throw new Error("@Bind can only be applied to methods");
100
- }
101
- return {
102
- configurable: true,
103
- enumerable: false,
104
- get() {
105
- const bound = originalMethod.bind(this);
106
- Object.defineProperty(this, propertyKey, {
107
- value: bound,
108
- configurable: true,
109
- writable: true
110
- });
111
- return bound;
112
- }
113
- };
114
- };
115
- }
116
-
117
- // src/decorator/Log.ts
118
- function Log(options) {
119
- const prefix = options?.prefix ?? "";
120
- return function(_target, propertyKey, descriptor) {
121
- const originalMethod = descriptor.value;
122
- if (typeof originalMethod !== "function") {
123
- throw new Error("@Log can only be applied to methods");
124
- }
125
- descriptor.value = function(...args) {
126
- const methodName = String(propertyKey);
127
- const argsStr = args.map((a) => JSON.stringify(a)).join(", ");
128
- const result = originalMethod.apply(this, args);
129
- if (result instanceof Promise) {
130
- return result.then((res) => {
131
- console.log(`${prefix}${methodName}(${argsStr}) => ${JSON.stringify(res)}`);
132
- return res;
133
- });
134
- }
135
- console.log(`${prefix}${methodName}(${argsStr}) => ${JSON.stringify(result)}`);
136
- return result;
137
- };
138
- return descriptor;
139
- };
140
- }
141
-
142
- // src/decorator/Measure.ts
143
- function Measure(options) {
144
- return function(_target, propertyKey, descriptor) {
145
- const originalMethod = descriptor.value;
146
- if (typeof originalMethod !== "function") {
147
- throw new Error("@Measure can only be applied to methods");
148
- }
149
- const label = options?.label ?? String(propertyKey);
150
- descriptor.value = function(...args) {
151
- const start = performance.now();
152
- const result = originalMethod.apply(this, args);
153
- if (result instanceof Promise) {
154
- return result.finally(() => {
155
- const duration2 = performance.now() - start;
156
- console.log(`${label} took ${duration2.toFixed(2)}ms`);
157
- });
158
- }
159
- const duration = performance.now() - start;
160
- console.log(`${label} took ${duration.toFixed(2)}ms`);
161
- return result;
162
- };
163
- return descriptor;
164
- };
165
- }
166
-
167
- // src/decorator/Retry.ts
168
- function Retry(options) {
169
- const attempts = options?.attempts ?? 3;
170
- const delay = options?.delay ?? 0;
171
- const onRetry = options?.onRetry;
172
- return function(_target, _propertyKey, descriptor) {
173
- const originalMethod = descriptor.value;
174
- if (typeof originalMethod !== "function") {
175
- throw new Error("@Retry can only be applied to methods");
176
- }
177
- descriptor.value = async function(...args) {
178
- let lastError;
179
- for (let attempt = 1; attempt <= attempts; attempt++) {
180
- try {
181
- const result = originalMethod.apply(this, args);
182
- if (result instanceof Promise) {
183
- return await result;
184
- }
185
- return result;
186
- } catch (error) {
187
- lastError = error;
188
- if (attempt < attempts) {
189
- onRetry?.(error, attempt);
190
- if (delay > 0) {
191
- await new Promise((resolve) => setTimeout(resolve, delay));
192
- }
193
- }
194
- }
195
- }
196
- throw lastError;
197
- };
198
- return descriptor;
199
- };
200
- }
201
-
202
- // src/decorator/Deprecated.ts
203
- function Deprecated(message) {
204
- return function(_target, propertyKey, descriptor) {
205
- const originalMethod = descriptor.value;
206
- if (typeof originalMethod !== "function") {
207
- throw new Error("@Deprecated can only be applied to methods");
208
- }
209
- const methodName = String(propertyKey);
210
- const warning = message ? `${methodName} is deprecated: ${message}` : `${methodName} is deprecated`;
211
- descriptor.value = function(...args) {
212
- console.warn(warning);
213
- return originalMethod.apply(this, args);
214
- };
215
- return descriptor;
216
- };
217
- }
218
-
219
- // src/decorator/Sealed.ts
220
- function Sealed() {
221
- return function(constructor) {
222
- Object.seal(constructor);
223
- Object.seal(constructor.prototype);
224
- return constructor;
225
- };
226
- }
227
-
228
- // src/decorator/Frozen.ts
229
- function Frozen() {
230
- return function(constructor) {
231
- Object.freeze(constructor);
232
- Object.freeze(constructor.prototype);
233
- return constructor;
234
- };
235
- }
236
-
237
- // src/decorator/Validate.ts
238
- function Validate(predicate, errorMessage) {
239
- return function(_target, propertyKey, descriptor) {
240
- const originalMethod = descriptor.value;
241
- if (typeof originalMethod !== "function") {
242
- throw new Error("@Validate can only be applied to methods");
243
- }
244
- const methodName = String(propertyKey);
245
- descriptor.value = function(...args) {
246
- if (!predicate(...args)) {
247
- throw new Error(
248
- errorMessage ?? `Validation failed for ${methodName}`
249
- );
250
- }
251
- return originalMethod.apply(this, args);
252
- };
253
- return descriptor;
254
- };
255
- }
256
-
257
- // src/decorator/Lazy.ts
258
- function Lazy() {
259
- return function(_target, propertyKey, descriptor) {
260
- const getter = descriptor.get;
261
- if (typeof getter !== "function") {
262
- throw new Error("@Lazy can only be applied to getters");
263
- }
264
- descriptor.get = function() {
265
- const value = getter.call(this);
266
- Object.defineProperty(this, propertyKey, {
267
- value,
268
- configurable: false,
269
- writable: false
270
- });
271
- return value;
272
- };
273
- return descriptor;
274
- };
275
- }
276
-
277
- exports.Bind = Bind;
278
- exports.Debounce = Debounce;
279
- exports.Deprecated = Deprecated;
280
- exports.Frozen = Frozen;
281
- exports.Lazy = Lazy;
282
- exports.Log = Log;
283
- exports.Measure = Measure;
284
- exports.Memoize = Memoize;
285
- exports.Retry = Retry;
286
- exports.Sealed = Sealed;
287
- exports.Throttle = Throttle;
288
- exports.Validate = Validate;
289
- exports.decorator_exports = decorator_exports;
290
- //# sourceMappingURL=chunk-OWNUKWXV.js.map
291
- //# sourceMappingURL=chunk-OWNUKWXV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/decorator/index.ts","../src/decorator/Memoize.ts","../src/decorator/Debounce.ts","../src/decorator/Throttle.ts","../src/decorator/Bind.ts","../src/decorator/Log.ts","../src/decorator/Measure.ts","../src/decorator/Retry.ts","../src/decorator/Deprecated.ts","../src/decorator/Sealed.ts","../src/decorator/Frozen.ts","../src/decorator/Validate.ts","../src/decorator/Lazy.ts"],"names":["__export","duration"],"mappings":";;;;;AAAA,IAAA,iBAAA,GAAA;AAAAA,yBAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,IAAA,EAAA,MAAA,IAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,QAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACYO,SAAS,QACd,QAAA,EACiB;AACjB,EAAA,OAAO,SACL,OAAA,EACA,YAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AACxC,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AAExC,IAAA,UAAA,CAAW,KAAA,GAAQ,YAA4B,IAAA,EAA0B;AACvE,MAAA,MAAM,MAAM,QAAA,GAAW,QAAA,CAAS,GAAG,IAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AAEjD,MAAA,IAAI,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,QAAA,OAAO,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,MACtB;AAEA,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAC9C,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,MAAM,CAAA;AACrB,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;;;AC/BO,SAAS,SAAS,IAAA,EAA+B;AACtD,EAAA,OAAO,SACL,OAAA,EACA,YAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AACxC,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,SAAA;AAEJ,IAAA,UAAA,CAAW,KAAA,GAAQ,YAA4B,IAAA,EAAuB;AACpE,MAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,QAAA,YAAA,CAAa,SAAS,CAAA;AAAA,MACxB;AAEA,MAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,QAAA,cAAA,CAAe,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,MACjC,GAAG,IAAI,CAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;;;AC1BO,SAAS,SAAS,IAAA,EAA+B;AACtD,EAAA,OAAO,SACL,OAAA,EACA,YAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AACxC,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,SAAA;AAEJ,IAAA,UAAA,CAAW,KAAA,GAAQ,YAA4B,IAAA,EAAuB;AACpE,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,GAAM,QAAA,CAAA;AAEhC,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,UAAA,YAAA,CAAa,SAAS,CAAA;AACtB,UAAA,SAAA,GAAY,MAAA;AAAA,QACd;AACA,QAAA,QAAA,GAAW,GAAA;AACX,QAAA,cAAA,CAAe,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,MACjC,CAAA,MAAA,IAAW,cAAc,MAAA,EAAW;AAClC,QAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,UAAA,QAAA,GAAW,KAAK,GAAA,EAAI;AACpB,UAAA,SAAA,GAAY,MAAA;AACZ,UAAA,cAAA,CAAe,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,QACjC,GAAG,SAAS,CAAA;AAAA,MACd;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;;;ACpCO,SAAS,IAAA,GAAwB;AACtC,EAAA,OAAO,SACL,OAAA,EACA,WAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AACxC,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY,KAAA;AAAA,MACZ,GAAA,GAAqB;AACnB,QAAA,MAAM,KAAA,GAAS,cAAA,CAAmD,IAAA,CAAK,IAAI,CAAA;AAC3E,QAAA,MAAA,CAAO,cAAA,CAAe,MAAM,WAAA,EAAa;AAAA,UACvC,KAAA,EAAO,KAAA;AAAA,UACP,YAAA,EAAc,IAAA;AAAA,UACd,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF,CAAA;AACF;;;AC1BO,SAAS,IAAI,OAAA,EAAgD;AAClE,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,EAAA;AAElC,EAAA,OAAO,SACL,OAAA,EACA,WAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AACxC,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,UAAA,CAAW,KAAA,GAAQ,YAA4B,IAAA,EAA0B;AACvE,MAAA,MAAM,UAAA,GAAa,OAAO,WAAW,CAAA;AACrC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE5D,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAE9C,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,GAAA,KAAQ;AAC1B,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAE,CAAA;AAC1E,UAAA,OAAO,GAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAE,CAAA;AAC7E,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;;;ACjCO,SAAS,QAAQ,OAAA,EAA+C;AACrE,EAAA,OAAO,SACL,OAAA,EACA,WAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AACxC,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,MAAA,CAAO,WAAW,CAAA;AAElD,IAAA,UAAA,CAAW,KAAA,GAAQ,YAA4B,IAAA,EAA0B;AACvE,MAAA,MAAM,KAAA,GAAQ,YAAY,GAAA,EAAI;AAC9B,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAE9C,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,OAAO,MAAA,CAAO,QAAQ,MAAM;AAC1B,UAAA,MAAMC,SAAAA,GAAW,WAAA,CAAY,GAAA,EAAI,GAAI,KAAA;AACrC,UAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,CAAA,MAAA,EAASA,UAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,QACtD,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAI,GAAI,KAAA;AACrC,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,CAAA,MAAA,EAAS,SAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AACpD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;;;ACjCO,SAAS,MAAM,OAAA,EAIF;AAClB,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,CAAA;AAChC,EAAA,MAAM,UAAU,OAAA,EAAS,OAAA;AAEzB,EAAA,OAAO,SACL,OAAA,EACA,YAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AACxC,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,UAAA,CAAW,KAAA,GAAQ,kBAAkC,IAAA,EAAmC;AACtF,MAAA,IAAI,SAAA;AAEJ,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,QAAA,EAAU,OAAA,EAAA,EAAW;AACpD,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAC9C,UAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,YAAA,OAAO,MAAM,MAAA;AAAA,UACf;AACA,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,SAAA,GAAY,KAAA;AACZ,UAAA,IAAI,UAAU,QAAA,EAAU;AACtB,YAAA,OAAA,GAAU,OAAO,OAAO,CAAA;AACxB,YAAA,IAAI,QAAQ,CAAA,EAAG;AACb,cAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,SAAA;AAAA,IACR,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;;;AC9CO,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,OAAO,SACL,OAAA,EACA,WAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AACxC,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,WAAW,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,UACZ,CAAA,EAAG,UAAU,mBAAmB,OAAO,CAAA,CAAA,GACvC,GAAG,UAAU,CAAA,cAAA,CAAA;AAEjB,IAAA,UAAA,CAAW,KAAA,GAAQ,YAA4B,IAAA,EAA0B;AACvE,MAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AACpB,MAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACxC,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;;;AC1BO,SAAS,MAAA,GAA0E;AACxF,EAAA,OAAO,SACL,WAAA,EACG;AACH,IAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AACvB,IAAA,MAAA,CAAO,IAAA,CAAK,YAAY,SAAS,CAAA;AACjC,IAAA,OAAO,WAAA;AAAA,EACT,CAAA;AACF;;;ACRO,SAAS,MAAA,GAA0E;AACxF,EAAA,OAAO,SACL,WAAA,EACG;AACH,IAAA,MAAA,CAAO,OAAO,WAAW,CAAA;AACzB,IAAA,MAAA,CAAO,MAAA,CAAO,YAAY,SAAS,CAAA;AACnC,IAAA,OAAO,WAAA;AAAA,EACT,CAAA;AACF;;;ACNO,SAAS,QAAA,CACd,WACA,YAAA,EACiB;AACjB,EAAA,OAAO,SACL,OAAA,EACA,WAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AACxC,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,WAAW,CAAA;AAErC,IAAA,UAAA,CAAW,KAAA,GAAQ,YAA4B,IAAA,EAA0B;AACvE,MAAA,IAAI,CAAC,SAAA,CAAU,GAAG,IAAI,CAAA,EAAG;AACvB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,YAAA,IAAgB,yBAAyB,UAAU,CAAA;AAAA,SACrD;AAAA,MACF;AACA,MAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACxC,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;;;AC5BO,SAAS,IAAA,GAAwB;AACtC,EAAA,OAAO,SACL,OAAA,EACA,WAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,MAAM,SAAS,UAAA,CAAW,GAAA;AAE1B,IAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,UAAA,CAAW,MAAM,WAA2B;AAC1C,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC9B,MAAA,MAAA,CAAO,cAAA,CAAe,MAAM,WAAA,EAAa;AAAA,QACvC,KAAA;AAAA,QACA,YAAA,EAAc,KAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF","file":"chunk-OWNUKWXV.js","sourcesContent":["/**\n * TypeScript 5.0+ Decorators for common patterns.\n * These decorators work with the new TC39 decorator standard.\n */\n\nexport { Memoize } from './Memoize.js'\nexport { Debounce } from './Debounce.js'\nexport { Throttle } from './Throttle.js'\nexport { Bind } from './Bind.js'\nexport { Log } from './Log.js'\nexport { Measure } from './Measure.js'\nexport { Retry } from './Retry.js'\nexport { Deprecated } from './Deprecated.js'\nexport { Sealed } from './Sealed.js'\nexport { Frozen } from './Frozen.js'\nexport { Validate } from './Validate.js'\nexport { Lazy } from './Lazy.js'\n","/**\n * Memoizes a method, caching its results based on arguments.\n *\n * @example\n * class Calculator {\n * @Memoize()\n * fibonacci(n: number): number {\n * if (n <= 1) return n\n * return this.fibonacci(n - 1) + this.fibonacci(n - 2)\n * }\n * }\n */\nexport function Memoize(\n resolver?: (...args: unknown[]) => unknown\n): MethodDecorator {\n return function <T>(\n _target: object,\n _propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value as unknown as (...args: unknown[]) => unknown\n\n if (typeof originalMethod !== 'function') {\n throw new Error('@Memoize can only be applied to methods')\n }\n\n const cache = new Map<unknown, unknown>()\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n const key = resolver ? resolver(...args) : args[0]\n\n if (cache.has(key)) {\n return cache.get(key)\n }\n\n const result = originalMethod.apply(this, args)\n cache.set(key, result)\n return result\n } as unknown as T\n\n return descriptor\n }\n}\n","/**\n * Debounces a method, delaying execution until after wait milliseconds.\n *\n * @example\n * class SearchBox {\n * @Debounce(300)\n * search(query: string) {\n * console.log('Searching:', query)\n * }\n * }\n */\nexport function Debounce(wait: number): MethodDecorator {\n return function <T>(\n _target: object,\n _propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value as unknown as (...args: unknown[]) => unknown\n\n if (typeof originalMethod !== 'function') {\n throw new Error('@Debounce can only be applied to methods')\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n\n descriptor.value = function (this: unknown, ...args: unknown[]): void {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId)\n }\n\n timeoutId = setTimeout(() => {\n originalMethod.apply(this, args)\n }, wait)\n } as unknown as T\n\n return descriptor\n }\n}\n","/**\n * Throttles a method, limiting execution to once per wait milliseconds.\n *\n * @example\n * class ScrollHandler {\n * @Throttle(100)\n * onScroll(event: Event) {\n * console.log('Scroll event')\n * }\n * }\n */\nexport function Throttle(wait: number): MethodDecorator {\n return function <T>(\n _target: object,\n _propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value as unknown as (...args: unknown[]) => unknown\n\n if (typeof originalMethod !== 'function') {\n throw new Error('@Throttle can only be applied to methods')\n }\n\n let lastCall = 0\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n\n descriptor.value = function (this: unknown, ...args: unknown[]): void {\n const now = Date.now()\n const remaining = wait - (now - lastCall)\n\n if (remaining <= 0) {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId)\n timeoutId = undefined\n }\n lastCall = now\n originalMethod.apply(this, args)\n } else if (timeoutId === undefined) {\n timeoutId = setTimeout(() => {\n lastCall = Date.now()\n timeoutId = undefined\n originalMethod.apply(this, args)\n }, remaining)\n }\n } as unknown as T\n\n return descriptor\n }\n}\n","/**\n * Binds a method to its class instance.\n * Useful for event handlers and callbacks.\n *\n * @example\n * class Button {\n * @Bind()\n * onClick() {\n * console.log(this) // Always the Button instance\n * }\n * }\n */\nexport function Bind(): MethodDecorator {\n return function <T>(\n _target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value\n\n if (typeof originalMethod !== 'function') {\n throw new Error('@Bind can only be applied to methods')\n }\n\n return {\n configurable: true,\n enumerable: false,\n get(this: object): T {\n const bound = (originalMethod as (...args: unknown[]) => unknown).bind(this)\n Object.defineProperty(this, propertyKey, {\n value: bound,\n configurable: true,\n writable: true,\n })\n return bound as T\n },\n }\n }\n}\n","/**\n * Logs method calls with arguments and return values.\n *\n * @example\n * class Calculator {\n * @Log()\n * add(a: number, b: number): number {\n * return a + b\n * }\n * }\n * // Logs: \"add(1, 2) => 3\"\n */\nexport function Log(options?: { prefix?: string }): MethodDecorator {\n const prefix = options?.prefix ?? ''\n\n return function <T>(\n _target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value as unknown as (...args: unknown[]) => unknown\n\n if (typeof originalMethod !== 'function') {\n throw new Error('@Log can only be applied to methods')\n }\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n const methodName = String(propertyKey)\n const argsStr = args.map((a) => JSON.stringify(a)).join(', ')\n\n const result = originalMethod.apply(this, args)\n\n if (result instanceof Promise) {\n return result.then((res) => {\n console.log(`${prefix}${methodName}(${argsStr}) => ${JSON.stringify(res)}`)\n return res\n })\n }\n\n console.log(`${prefix}${methodName}(${argsStr}) => ${JSON.stringify(result)}`)\n return result\n } as unknown as T\n\n return descriptor\n }\n}\n","/**\n * Measures and logs the execution time of a method.\n *\n * @example\n * class DataProcessor {\n * @Measure()\n * processData(data: unknown[]) {\n * // Heavy processing\n * }\n * }\n * // Logs: \"processData took 123.45ms\"\n */\nexport function Measure(options?: { label?: string }): MethodDecorator {\n return function <T>(\n _target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value as unknown as (...args: unknown[]) => unknown\n\n if (typeof originalMethod !== 'function') {\n throw new Error('@Measure can only be applied to methods')\n }\n\n const label = options?.label ?? String(propertyKey)\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n const start = performance.now()\n const result = originalMethod.apply(this, args)\n\n if (result instanceof Promise) {\n return result.finally(() => {\n const duration = performance.now() - start\n console.log(`${label} took ${duration.toFixed(2)}ms`)\n })\n }\n\n const duration = performance.now() - start\n console.log(`${label} took ${duration.toFixed(2)}ms`)\n return result\n } as unknown as T\n\n return descriptor\n }\n}\n","/**\n * Retries a method on failure.\n *\n * @example\n * class ApiClient {\n * @Retry({ attempts: 3, delay: 1000 })\n * async fetchData(): Promise<Data> {\n * return fetch('/api/data').then(r => r.json())\n * }\n * }\n */\nexport function Retry(options?: {\n attempts?: number\n delay?: number\n onRetry?: (error: unknown, attempt: number) => void\n}): MethodDecorator {\n const attempts = options?.attempts ?? 3\n const delay = options?.delay ?? 0\n const onRetry = options?.onRetry\n\n return function <T>(\n _target: object,\n _propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value as unknown as (...args: unknown[]) => unknown\n\n if (typeof originalMethod !== 'function') {\n throw new Error('@Retry can only be applied to methods')\n }\n\n descriptor.value = async function (this: unknown, ...args: unknown[]): Promise<unknown> {\n let lastError: unknown\n\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n const result = originalMethod.apply(this, args)\n if (result instanceof Promise) {\n return await result\n }\n return result\n } catch (error) {\n lastError = error\n if (attempt < attempts) {\n onRetry?.(error, attempt)\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n }\n }\n }\n\n throw lastError\n } as unknown as T\n\n return descriptor\n }\n}\n","/**\n * Marks a method as deprecated and logs a warning when called.\n *\n * @example\n * class Api {\n * @Deprecated('Use newMethod() instead')\n * oldMethod() {\n * // ...\n * }\n * }\n */\nexport function Deprecated(message?: string): MethodDecorator {\n return function <T>(\n _target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value as unknown as (...args: unknown[]) => unknown\n\n if (typeof originalMethod !== 'function') {\n throw new Error('@Deprecated can only be applied to methods')\n }\n\n const methodName = String(propertyKey)\n const warning = message\n ? `${methodName} is deprecated: ${message}`\n : `${methodName} is deprecated`\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n console.warn(warning)\n return originalMethod.apply(this, args)\n } as unknown as T\n\n return descriptor\n }\n}\n","/**\n * Seals a class, preventing new properties from being added.\n *\n * @example\n * @Sealed()\n * class Config {\n * readonly apiUrl = 'https://api.example.com'\n * }\n */\nexport function Sealed(): <T extends new (...args: any[]) => object>(constructor: T) => T {\n return function <T extends new (...args: any[]) => object>(\n constructor: T\n ): T {\n Object.seal(constructor)\n Object.seal(constructor.prototype)\n return constructor\n }\n}\n","/**\n * Freezes a class, making it completely immutable.\n *\n * @example\n * @Frozen()\n * class Constants {\n * static readonly PI = 3.14159\n * }\n */\nexport function Frozen(): <T extends new (...args: any[]) => object>(constructor: T) => T {\n return function <T extends new (...args: any[]) => object>(\n constructor: T\n ): T {\n Object.freeze(constructor)\n Object.freeze(constructor.prototype)\n return constructor\n }\n}\n","/**\n * Validates method arguments using a predicate.\n *\n * @example\n * class User {\n * @Validate((age: number) => age >= 0 && age <= 150, 'Invalid age')\n * setAge(age: number) {\n * this.age = age\n * }\n * }\n */\nexport function Validate(\n predicate: (...args: unknown[]) => boolean,\n errorMessage?: string\n): MethodDecorator {\n return function <T>(\n _target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value as unknown as (...args: unknown[]) => unknown\n\n if (typeof originalMethod !== 'function') {\n throw new Error('@Validate can only be applied to methods')\n }\n\n const methodName = String(propertyKey)\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n if (!predicate(...args)) {\n throw new Error(\n errorMessage ?? `Validation failed for ${methodName}`\n )\n }\n return originalMethod.apply(this, args)\n } as unknown as T\n\n return descriptor\n }\n}\n","/**\n * Lazily initializes a property on first access.\n *\n * @example\n * class Service {\n * @Lazy()\n * get expensiveData(): Data {\n * return computeExpensiveData()\n * }\n * }\n */\nexport function Lazy(): MethodDecorator {\n return function <T>(\n _target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const getter = descriptor.get\n\n if (typeof getter !== 'function') {\n throw new Error('@Lazy can only be applied to getters')\n }\n\n descriptor.get = function (this: object): T {\n const value = getter.call(this)\n Object.defineProperty(this, propertyKey, {\n value,\n configurable: false,\n writable: false,\n })\n return value\n }\n\n return descriptor\n }\n}\n"]}