@agentica/core 0.22.0 → 0.24.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 (67) hide show
  1. package/README.md +11 -12
  2. package/lib/Agentica.d.ts +6 -1
  3. package/lib/Agentica.js +8 -3
  4. package/lib/Agentica.js.map +1 -1
  5. package/lib/MicroAgentica.d.ts +10 -0
  6. package/lib/MicroAgentica.js +11 -0
  7. package/lib/MicroAgentica.js.map +1 -1
  8. package/lib/context/AgenticaContext.d.ts +4 -0
  9. package/lib/functional/assertHttpController.d.ts +75 -0
  10. package/lib/functional/assertHttpController.js +9622 -0
  11. package/lib/functional/assertHttpController.js.map +1 -0
  12. package/lib/functional/assertHttpLlmApplication.d.ts +1 -0
  13. package/lib/functional/assertHttpLlmApplication.js +1 -0
  14. package/lib/functional/assertHttpLlmApplication.js.map +1 -1
  15. package/lib/functional/assertMcpController.d.ts +1 -1
  16. package/lib/functional/assertMcpController.js +1 -1
  17. package/lib/functional/assertMcpController.js.map +1 -1
  18. package/lib/functional/validateHttpController.d.ts +75 -0
  19. package/lib/functional/validateHttpController.js +7952 -0
  20. package/lib/functional/validateHttpController.js.map +1 -0
  21. package/lib/functional/validateHttpLlmApplication.d.ts +1 -0
  22. package/lib/functional/validateHttpLlmApplication.js +1 -0
  23. package/lib/functional/validateHttpLlmApplication.js.map +1 -1
  24. package/lib/functional/validateMcpController.d.ts +24 -0
  25. package/lib/functional/validateMcpController.js +3034 -0
  26. package/lib/functional/validateMcpController.js.map +1 -0
  27. package/lib/histories/AgenticaUserInputHistory.d.ts +13 -7
  28. package/lib/index.d.ts +3 -0
  29. package/lib/index.js +3 -0
  30. package/lib/index.js.map +1 -1
  31. package/lib/index.mjs +25981 -5985
  32. package/lib/index.mjs.map +1 -1
  33. package/lib/utils/ChatGptCompletionMessageUtil.spec.d.ts +1 -0
  34. package/lib/utils/ChatGptCompletionMessageUtil.spec.js +288 -0
  35. package/lib/utils/ChatGptCompletionMessageUtil.spec.js.map +1 -0
  36. package/lib/utils/ChatGptTokenUsageAggregator.spec.d.ts +1 -0
  37. package/lib/utils/ChatGptTokenUsageAggregator.spec.js +199 -0
  38. package/lib/utils/ChatGptTokenUsageAggregator.spec.js.map +1 -0
  39. package/lib/utils/Singleton.js +18 -0
  40. package/lib/utils/Singleton.js.map +1 -1
  41. package/lib/utils/Singleton.spec.d.ts +1 -0
  42. package/lib/utils/Singleton.spec.js +106 -0
  43. package/lib/utils/Singleton.spec.js.map +1 -0
  44. package/lib/utils/__map_take.spec.d.ts +1 -0
  45. package/lib/utils/__map_take.spec.js +108 -0
  46. package/lib/utils/__map_take.spec.js.map +1 -0
  47. package/package.json +1 -1
  48. package/src/Agentica.ts +16 -2
  49. package/src/MicroAgentica.ts +13 -0
  50. package/src/context/AgenticaContext.ts +5 -0
  51. package/src/functional/assertHttpController.ts +112 -0
  52. package/src/functional/assertHttpLlmApplication.ts +1 -0
  53. package/src/functional/assertMcpController.ts +1 -2
  54. package/src/functional/validateHttpController.ts +118 -0
  55. package/src/functional/validateHttpLlmApplication.ts +1 -1
  56. package/src/functional/validateMcpController.ts +56 -0
  57. package/src/histories/AgenticaUserInputHistory.ts +14 -8
  58. package/src/index.ts +3 -0
  59. package/src/utils/ChatGptCompletionMessageUtil.spec.ts +320 -0
  60. package/src/utils/ChatGptTokenUsageAggregator.spec.ts +226 -0
  61. package/src/utils/Singleton.spec.ts +138 -0
  62. package/src/utils/Singleton.ts +18 -0
  63. package/src/utils/__map_take.spec.ts +140 -0
  64. package/lib/utils/MathUtil.d.ts +0 -3
  65. package/lib/utils/MathUtil.js +0 -8
  66. package/lib/utils/MathUtil.js.map +0 -1
  67. package/src/utils/MathUtil.ts +0 -3
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ChatGptCompletionMessageUtil_1 = require("./ChatGptCompletionMessageUtil");
4
+ describe("chatGptCompletionMessageUtil", () => {
5
+ describe("transformCompletionChunk", () => {
6
+ it("should transform string chunk to ChatCompletionChunk", () => {
7
+ const chunk = {
8
+ id: "test-id",
9
+ choices: [{
10
+ index: 0,
11
+ delta: { content: "Hello" },
12
+ }],
13
+ created: 1234567890,
14
+ model: "gpt-4",
15
+ object: "chat.completion.chunk",
16
+ };
17
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.transformCompletionChunk(JSON.stringify(chunk));
18
+ expect(result).toEqual(chunk);
19
+ });
20
+ it("should transform Uint8Array chunk to ChatCompletionChunk", () => {
21
+ const chunk = {
22
+ id: "test-id",
23
+ choices: [{
24
+ index: 0,
25
+ delta: { content: "Hello" },
26
+ }],
27
+ created: 1234567890,
28
+ model: "gpt-4",
29
+ object: "chat.completion.chunk",
30
+ };
31
+ const uint8Array = new TextEncoder().encode(JSON.stringify(chunk));
32
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.transformCompletionChunk(uint8Array);
33
+ expect(result).toEqual(chunk);
34
+ });
35
+ it("should handle invalid JSON", () => {
36
+ expect(() => {
37
+ ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.transformCompletionChunk("invalid json");
38
+ }).toThrow();
39
+ });
40
+ });
41
+ describe("accumulate", () => {
42
+ it("should accumulate content from chunks", () => {
43
+ var _a;
44
+ const origin = {
45
+ id: "test-id",
46
+ choices: [{
47
+ index: 0,
48
+ // @ts-expect-error - refusal is not required
49
+ message: { role: "assistant", content: "Hello" },
50
+ }],
51
+ created: 1234567890,
52
+ model: "gpt-4",
53
+ object: "chat.completion",
54
+ };
55
+ const chunk = {
56
+ id: "test-id",
57
+ // @ts-expect-error - finish_reason is not required
58
+ choices: [{
59
+ index: 0,
60
+ delta: { content: " World" },
61
+ }],
62
+ created: 1234567890,
63
+ model: "gpt-4",
64
+ object: "chat.completion.chunk",
65
+ };
66
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.accumulate(origin, chunk);
67
+ expect((_a = result.choices[0]) === null || _a === void 0 ? void 0 : _a.message.content).toBe("Hello World");
68
+ });
69
+ it("should accumulate tool calls", () => {
70
+ var _a, _b, _c, _d, _e, _f;
71
+ const origin = {
72
+ id: "test-id",
73
+ choices: [{
74
+ index: 0,
75
+ // @ts-expect-error - finish_reason is not required
76
+ message: {
77
+ role: "assistant",
78
+ content: null,
79
+ tool_calls: [{
80
+ id: "call_1",
81
+ type: "function",
82
+ function: {
83
+ name: "test",
84
+ arguments: "{\"arg\": \"value\"}",
85
+ },
86
+ }],
87
+ },
88
+ }],
89
+ created: 1234567890,
90
+ model: "gpt-4",
91
+ object: "chat.completion",
92
+ };
93
+ const chunk = {
94
+ id: "test-id",
95
+ // @ts-expect-error - finish_reason is not required
96
+ choices: [{
97
+ index: 0,
98
+ delta: {
99
+ tool_calls: [{
100
+ index: 0,
101
+ id: "call_1",
102
+ function: {
103
+ name: "_function",
104
+ arguments: "{\"arg2\": \"value2\"}",
105
+ },
106
+ }],
107
+ },
108
+ }],
109
+ created: 1234567890,
110
+ model: "gpt-4",
111
+ object: "chat.completion.chunk",
112
+ };
113
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.accumulate(origin, chunk);
114
+ expect((_c = (_b = (_a = result.choices[0]) === null || _a === void 0 ? void 0 : _a.message.tool_calls) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.function.name).toBe("test_function");
115
+ expect((_f = (_e = (_d = result.choices[0]) === null || _d === void 0 ? void 0 : _d.message.tool_calls) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.function.arguments).toBe("{\"arg\": \"value\"}{\"arg2\": \"value2\"}");
116
+ });
117
+ it("should handle usage aggregation", () => {
118
+ const origin = {
119
+ id: "test-id",
120
+ choices: [{
121
+ index: 0,
122
+ // @ts-expect-error - finish_reason is not required
123
+ message: { role: "assistant", content: "Hello" },
124
+ }],
125
+ created: 1234567890,
126
+ model: "gpt-4",
127
+ object: "chat.completion",
128
+ usage: {
129
+ prompt_tokens: 10,
130
+ completion_tokens: 5,
131
+ total_tokens: 15,
132
+ },
133
+ };
134
+ const chunk = {
135
+ id: "test-id",
136
+ // @ts-expect-error - finish_reason is not required
137
+ choices: [{
138
+ index: 0,
139
+ delta: { content: " World" },
140
+ }],
141
+ created: 1234567890,
142
+ model: "gpt-4",
143
+ object: "chat.completion.chunk",
144
+ usage: {
145
+ prompt_tokens: 0,
146
+ completion_tokens: 6,
147
+ total_tokens: 6,
148
+ },
149
+ };
150
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.accumulate(origin, chunk);
151
+ expect(result.usage).toEqual({
152
+ prompt_tokens: 10,
153
+ completion_tokens: 11,
154
+ total_tokens: 21,
155
+ completion_tokens_details: {
156
+ accepted_prediction_tokens: 0,
157
+ reasoning_tokens: 0,
158
+ rejected_prediction_tokens: 0,
159
+ },
160
+ prompt_tokens_details: {
161
+ audio_tokens: 0,
162
+ cached_tokens: 0,
163
+ },
164
+ });
165
+ });
166
+ });
167
+ describe("merge", () => {
168
+ it("should merge multiple chunks into completion", () => {
169
+ var _a;
170
+ const chunks = [
171
+ {
172
+ id: "test-id",
173
+ // @ts-expect-error - finish_reason is not required
174
+ choices: [{
175
+ index: 0,
176
+ delta: { content: "Hello" },
177
+ }],
178
+ created: 1234567890,
179
+ model: "gpt-4",
180
+ object: "chat.completion.chunk",
181
+ },
182
+ {
183
+ id: "test-id",
184
+ // @ts-expect-error - finish_reason is not required
185
+ choices: [{
186
+ index: 0,
187
+ delta: { content: " World" },
188
+ }],
189
+ created: 1234567890,
190
+ model: "gpt-4",
191
+ object: "chat.completion.chunk",
192
+ },
193
+ ];
194
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.merge(chunks);
195
+ expect((_a = result.choices[0]) === null || _a === void 0 ? void 0 : _a.message.content).toBe("Hello World");
196
+ });
197
+ it("should throw error for empty chunks array", () => {
198
+ expect(() => {
199
+ ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.merge([]);
200
+ }).toThrow("No chunks received");
201
+ });
202
+ });
203
+ describe("mergeChoice", () => {
204
+ it("should merge finish reason", () => {
205
+ const acc = {
206
+ index: 0,
207
+ // @ts-expect-error - finish_reason is not required
208
+ message: { role: "assistant", content: "Hello" },
209
+ };
210
+ const cur = {
211
+ index: 0,
212
+ delta: {},
213
+ finish_reason: "stop",
214
+ };
215
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.mergeChoice(acc, cur);
216
+ expect(result.finish_reason).toBe("stop");
217
+ });
218
+ it("should merge content", () => {
219
+ const acc = {
220
+ index: 0,
221
+ // @ts-expect-error - refusal is not required
222
+ message: { role: "assistant", content: "Hello" },
223
+ };
224
+ // @ts-expect-error - finish_reason is not required
225
+ const cur = {
226
+ index: 0,
227
+ delta: { content: " World" },
228
+ };
229
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.mergeChoice(acc, cur);
230
+ expect(result.message.content).toBe("Hello World");
231
+ });
232
+ it("should merge refusal", () => {
233
+ // @ts-expect-error - finish_reason is not required
234
+ const acc = {
235
+ index: 0,
236
+ message: { role: "assistant", content: null, refusal: "I cannot" },
237
+ };
238
+ // @ts-expect-error - finish_reason is not required
239
+ const cur = {
240
+ index: 0,
241
+ delta: { refusal: " do that" },
242
+ };
243
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.mergeChoice(acc, cur);
244
+ expect(result.message.refusal).toBe("I cannot do that");
245
+ });
246
+ });
247
+ describe("mergeToolCalls", () => {
248
+ it("should merge tool call function arguments", () => {
249
+ const acc = {
250
+ id: "call_1",
251
+ type: "function",
252
+ function: {
253
+ name: "test",
254
+ arguments: "{\"arg\": \"value\"}",
255
+ },
256
+ };
257
+ const cur = {
258
+ index: 0,
259
+ id: "call_1",
260
+ function: {
261
+ arguments: "{\"arg2\": \"value2\"}",
262
+ },
263
+ };
264
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.mergeToolCalls(acc, cur);
265
+ expect(result.function.arguments).toBe("{\"arg\": \"value\"}{\"arg2\": \"value2\"}");
266
+ });
267
+ it("should merge tool call function name", () => {
268
+ const acc = {
269
+ id: "call_1",
270
+ type: "function",
271
+ function: {
272
+ name: "test",
273
+ arguments: "",
274
+ },
275
+ };
276
+ const cur = {
277
+ index: 0,
278
+ id: "call_1",
279
+ function: {
280
+ name: "_function",
281
+ },
282
+ };
283
+ const result = ChatGptCompletionMessageUtil_1.ChatGptCompletionMessageUtil.mergeToolCalls(acc, cur);
284
+ expect(result.function.name).toBe("test_function");
285
+ });
286
+ });
287
+ });
288
+ //# sourceMappingURL=ChatGptCompletionMessageUtil.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatGptCompletionMessageUtil.spec.js","sourceRoot":"","sources":["../../src/utils/ChatGptCompletionMessageUtil.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ChatGptTokenUsageAggregator_1 = require("./ChatGptTokenUsageAggregator");
4
+ describe("chatGptTokenUsageAggregator", () => {
5
+ describe("sum", () => {
6
+ it("should sum basic token usage", () => {
7
+ const usage1 = {
8
+ prompt_tokens: 10,
9
+ completion_tokens: 5,
10
+ total_tokens: 15,
11
+ };
12
+ const usage2 = {
13
+ prompt_tokens: 20,
14
+ completion_tokens: 10,
15
+ total_tokens: 30,
16
+ };
17
+ const result = ChatGptTokenUsageAggregator_1.ChatGptTokenUsageAggregator.sum(usage1, usage2);
18
+ expect(result).toEqual({
19
+ prompt_tokens: 30,
20
+ completion_tokens: 15,
21
+ total_tokens: 45,
22
+ completion_tokens_details: {
23
+ accepted_prediction_tokens: 0,
24
+ reasoning_tokens: 0,
25
+ rejected_prediction_tokens: 0,
26
+ },
27
+ prompt_tokens_details: {
28
+ audio_tokens: 0,
29
+ cached_tokens: 0,
30
+ },
31
+ });
32
+ });
33
+ it("should handle undefined values", () => {
34
+ const usage1 = {
35
+ prompt_tokens: 10,
36
+ completion_tokens: 5,
37
+ total_tokens: 15,
38
+ };
39
+ const usage2 = {
40
+ // @ts-expect-error - intended to be undefined
41
+ prompt_tokens: undefined,
42
+ // @ts-expect-error - intended to be undefined
43
+ completion_tokens: undefined,
44
+ // @ts-expect-error - intended to be undefined
45
+ total_tokens: undefined,
46
+ };
47
+ const result = ChatGptTokenUsageAggregator_1.ChatGptTokenUsageAggregator.sum(usage1, usage2);
48
+ expect(result).toEqual({
49
+ prompt_tokens: 10,
50
+ completion_tokens: 5,
51
+ total_tokens: 15,
52
+ completion_tokens_details: {
53
+ accepted_prediction_tokens: 0,
54
+ reasoning_tokens: 0,
55
+ rejected_prediction_tokens: 0,
56
+ },
57
+ prompt_tokens_details: {
58
+ audio_tokens: 0,
59
+ cached_tokens: 0,
60
+ },
61
+ });
62
+ });
63
+ it("should sum completion token details", () => {
64
+ const usage1 = {
65
+ prompt_tokens: 10,
66
+ completion_tokens: 5,
67
+ total_tokens: 15,
68
+ completion_tokens_details: {
69
+ accepted_prediction_tokens: 3,
70
+ reasoning_tokens: 1,
71
+ rejected_prediction_tokens: 1,
72
+ },
73
+ };
74
+ const usage2 = {
75
+ prompt_tokens: 20,
76
+ completion_tokens: 10,
77
+ total_tokens: 30,
78
+ completion_tokens_details: {
79
+ accepted_prediction_tokens: 7,
80
+ reasoning_tokens: 2,
81
+ rejected_prediction_tokens: 1,
82
+ },
83
+ };
84
+ const result = ChatGptTokenUsageAggregator_1.ChatGptTokenUsageAggregator.sum(usage1, usage2);
85
+ expect(result.completion_tokens_details).toEqual({
86
+ accepted_prediction_tokens: 10,
87
+ reasoning_tokens: 3,
88
+ rejected_prediction_tokens: 2,
89
+ });
90
+ });
91
+ it("should handle undefined completion token details", () => {
92
+ const usage1 = {
93
+ prompt_tokens: 10,
94
+ completion_tokens: 5,
95
+ total_tokens: 15,
96
+ completion_tokens_details: {
97
+ accepted_prediction_tokens: 3,
98
+ reasoning_tokens: 1,
99
+ rejected_prediction_tokens: 1,
100
+ },
101
+ };
102
+ const usage2 = {
103
+ prompt_tokens: 20,
104
+ completion_tokens: 10,
105
+ total_tokens: 30,
106
+ };
107
+ const result = ChatGptTokenUsageAggregator_1.ChatGptTokenUsageAggregator.sum(usage1, usage2);
108
+ expect(result.completion_tokens_details).toEqual({
109
+ accepted_prediction_tokens: 3,
110
+ reasoning_tokens: 1,
111
+ rejected_prediction_tokens: 1,
112
+ });
113
+ });
114
+ it("should sum prompt token details", () => {
115
+ const usage1 = {
116
+ prompt_tokens: 10,
117
+ completion_tokens: 5,
118
+ total_tokens: 15,
119
+ prompt_tokens_details: {
120
+ audio_tokens: 3,
121
+ cached_tokens: 2,
122
+ },
123
+ };
124
+ const usage2 = {
125
+ prompt_tokens: 20,
126
+ completion_tokens: 10,
127
+ total_tokens: 30,
128
+ prompt_tokens_details: {
129
+ audio_tokens: 7,
130
+ cached_tokens: 3,
131
+ },
132
+ };
133
+ const result = ChatGptTokenUsageAggregator_1.ChatGptTokenUsageAggregator.sum(usage1, usage2);
134
+ expect(result.prompt_tokens_details).toEqual({
135
+ audio_tokens: 10,
136
+ cached_tokens: 5,
137
+ });
138
+ });
139
+ it("should handle undefined prompt token details", () => {
140
+ const usage1 = {
141
+ prompt_tokens: 10,
142
+ completion_tokens: 5,
143
+ total_tokens: 15,
144
+ prompt_tokens_details: {
145
+ audio_tokens: 3,
146
+ cached_tokens: 2,
147
+ },
148
+ };
149
+ const usage2 = {
150
+ prompt_tokens: 20,
151
+ completion_tokens: 10,
152
+ total_tokens: 30,
153
+ };
154
+ const result = ChatGptTokenUsageAggregator_1.ChatGptTokenUsageAggregator.sum(usage1, usage2);
155
+ expect(result.prompt_tokens_details).toEqual({
156
+ audio_tokens: 3,
157
+ cached_tokens: 2,
158
+ });
159
+ });
160
+ it("should handle all undefined values", () => {
161
+ const usage1 = {
162
+ // @ts-expect-error - intended to be undefined
163
+ prompt_tokens: undefined,
164
+ // @ts-expect-error - intended to be undefined
165
+ completion_tokens: undefined,
166
+ // @ts-expect-error - intended to be undefined
167
+ total_tokens: undefined,
168
+ completion_tokens_details: undefined,
169
+ prompt_tokens_details: undefined,
170
+ };
171
+ const usage2 = {
172
+ // @ts-expect-error - intended to be undefined
173
+ prompt_tokens: undefined,
174
+ // @ts-expect-error - intended to be undefined
175
+ completion_tokens: undefined,
176
+ // @ts-expect-error - intended to be undefined
177
+ total_tokens: undefined,
178
+ completion_tokens_details: undefined,
179
+ prompt_tokens_details: undefined,
180
+ };
181
+ const result = ChatGptTokenUsageAggregator_1.ChatGptTokenUsageAggregator.sum(usage1, usage2);
182
+ expect(result).toEqual({
183
+ prompt_tokens: 0,
184
+ completion_tokens: 0,
185
+ total_tokens: 0,
186
+ completion_tokens_details: {
187
+ accepted_prediction_tokens: 0,
188
+ reasoning_tokens: 0,
189
+ rejected_prediction_tokens: 0,
190
+ },
191
+ prompt_tokens_details: {
192
+ audio_tokens: 0,
193
+ cached_tokens: 0,
194
+ },
195
+ });
196
+ });
197
+ });
198
+ });
199
+ //# sourceMappingURL=ChatGptTokenUsageAggregator.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatGptTokenUsageAggregator.spec.js","sourceRoot":"","sources":["../../src/utils/ChatGptTokenUsageAggregator.spec.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,24 @@ exports.Singleton = void 0;
7
7
  const NOT_MOUNTED_YET = {};
8
8
  /**
9
9
  * @internal
10
+ *
11
+ * @description
12
+ * A singleton class that creates a single instance of a class.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const singleton = new Singleton((name: string) => new SomeClass(name));
17
+ * const instance = singleton.get("test");
18
+ * ```
19
+ *
20
+ * but next case is not work
21
+ * ```ts
22
+ * const singleton = new Singleton((name: string) => new SomeClass(name));
23
+ * const instance = singleton.get("test");
24
+ * const instance2 = singleton.get("test2");
25
+ *
26
+ * expect(instance).toBe(instance2); // true
27
+ * ```
10
28
  */
11
29
  class Singleton {
12
30
  constructor(closure) {
@@ -1 +1 @@
1
- {"version":3,"file":"Singleton.js","sourceRoot":"","sources":["../../src/utils/Singleton.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;GAEG;AACH,MAAa,SAAS;IAIpB,YAAmB,OAA6B;QAC9C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC;IAChC,CAAC;IAEM,GAAG,CAAC,GAAG,IAAU;QACtB,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,MAAW,CAAC;IAC1B,CAAC;CACF;AAfD,8BAeC"}
1
+ {"version":3,"file":"Singleton.js","sourceRoot":"","sources":["../../src/utils/Singleton.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAa,SAAS;IAIpB,YAAmB,OAA6B;QAC9C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC;IAChC,CAAC;IAEM,GAAG,CAAC,GAAG,IAAU;QACtB,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,MAAW,CAAC;IAC1B,CAAC;CACF;AAfD,8BAeC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const Singleton_1 = require("./Singleton");
4
+ describe("singleton", () => {
5
+ describe("basic functionality", () => {
6
+ it("should create instance only once", () => {
7
+ const factory = () => ({ value: 42 });
8
+ const singleton = new Singleton_1.Singleton(factory);
9
+ const instance1 = singleton.get();
10
+ const instance2 = singleton.get();
11
+ expect(instance1).toBe(instance2);
12
+ expect(instance1.value).toBe(42);
13
+ });
14
+ it("should create different instances for different singletons", () => {
15
+ const factory1 = () => ({ value: 42 });
16
+ const factory2 = () => ({ value: 24 });
17
+ const singleton1 = new Singleton_1.Singleton(factory1);
18
+ const singleton2 = new Singleton_1.Singleton(factory2);
19
+ const instance1 = singleton1.get();
20
+ const instance2 = singleton2.get();
21
+ expect(instance1).not.toBe(instance2);
22
+ expect(instance1.value).toBe(42);
23
+ expect(instance2.value).toBe(24);
24
+ });
25
+ });
26
+ describe("constructor arguments", () => {
27
+ it("should pass constructor arguments to factory", () => {
28
+ const factory = (value) => ({ value });
29
+ const singleton = new Singleton_1.Singleton(factory);
30
+ const instance = singleton.get(42);
31
+ expect(instance.value).toBe(42);
32
+ });
33
+ it("should use same instance with same constructor arguments", () => {
34
+ const factory = (value) => ({ value });
35
+ const singleton = new Singleton_1.Singleton(factory);
36
+ const instance1 = singleton.get(42);
37
+ const instance2 = singleton.get(42);
38
+ expect(instance1).toBe(instance2);
39
+ expect(instance1.value).toBe(42);
40
+ });
41
+ it("should return same instance even with different constructor arguments", () => {
42
+ const factory = (value) => ({ value });
43
+ const singleton = new Singleton_1.Singleton(factory);
44
+ const instance1 = singleton.get(42);
45
+ const instance2 = singleton.get(24);
46
+ expect(instance1).toBe(instance2);
47
+ expect(instance1.value).toBe(42);
48
+ expect(instance2.value).toBe(42);
49
+ });
50
+ });
51
+ describe("complex object types", () => {
52
+ it("should handle complex objects", () => {
53
+ const factory = (id, name, value) => ({
54
+ id,
55
+ data: { name, value },
56
+ timestamp: new Date(),
57
+ });
58
+ const singleton = new Singleton_1.Singleton(factory);
59
+ const instance = singleton.get(1, "test", 42);
60
+ expect(instance.id).toBe(1);
61
+ expect(instance.data.name).toBe("test");
62
+ expect(instance.data.value).toBe(42);
63
+ expect(instance.timestamp).toBeInstanceOf(Date);
64
+ });
65
+ it("should maintain same complex object instance", () => {
66
+ const factory = () => ({
67
+ data: new Map([["key", 42]]),
68
+ array: [1, 2, 3],
69
+ });
70
+ const singleton = new Singleton_1.Singleton(factory);
71
+ const instance1 = singleton.get();
72
+ const instance2 = singleton.get();
73
+ expect(instance1).toBe(instance2);
74
+ expect(instance1.data).toBe(instance2.data);
75
+ expect(instance1.array).toBe(instance2.array);
76
+ });
77
+ });
78
+ describe("edge cases", () => {
79
+ it("should handle null factory return", () => {
80
+ const factory = () => null;
81
+ const singleton = new Singleton_1.Singleton(factory);
82
+ const instance = singleton.get();
83
+ expect(instance).toBeNull();
84
+ });
85
+ it("should handle undefined factory return", () => {
86
+ const factory = () => undefined;
87
+ const singleton = new Singleton_1.Singleton(factory);
88
+ const instance = singleton.get();
89
+ expect(instance).toBeUndefined();
90
+ });
91
+ it("should handle primitive values", () => {
92
+ const factory = () => 42;
93
+ const singleton = new Singleton_1.Singleton(factory);
94
+ const instance = singleton.get();
95
+ expect(instance).toBe(42);
96
+ });
97
+ it("should handle factory throwing error", () => {
98
+ const factory = () => {
99
+ throw new Error("Factory error");
100
+ };
101
+ const singleton = new Singleton_1.Singleton(factory);
102
+ expect(() => singleton.get()).toThrow("Factory error");
103
+ });
104
+ });
105
+ });
106
+ //# sourceMappingURL=Singleton.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Singleton.spec.js","sourceRoot":"","sources":["../../src/utils/Singleton.spec.ts"],"names":[],"mappings":"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"}