elevenlabs-voice-agent-mcp 1.0.15 → 1.1.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 (158) hide show
  1. package/README.md +202 -23
  2. package/dist/__tests__/mocks/fixtures.d.ts +136 -0
  3. package/dist/__tests__/mocks/fixtures.d.ts.map +1 -0
  4. package/dist/__tests__/mocks/fixtures.js +393 -0
  5. package/dist/__tests__/mocks/fixtures.js.map +1 -0
  6. package/dist/__tests__/schemas/schemas.test.d.ts +7 -0
  7. package/dist/__tests__/schemas/schemas.test.d.ts.map +1 -0
  8. package/dist/__tests__/schemas/schemas.test.js +537 -0
  9. package/dist/__tests__/schemas/schemas.test.js.map +1 -0
  10. package/dist/__tests__/services/elevenlabs-api.test.d.ts +7 -0
  11. package/dist/__tests__/services/elevenlabs-api.test.d.ts.map +1 -0
  12. package/dist/__tests__/services/elevenlabs-api.test.js +272 -0
  13. package/dist/__tests__/services/elevenlabs-api.test.js.map +1 -0
  14. package/dist/__tests__/services/formatters.test.d.ts +7 -0
  15. package/dist/__tests__/services/formatters.test.d.ts.map +1 -0
  16. package/dist/__tests__/services/formatters.test.js +387 -0
  17. package/dist/__tests__/services/formatters.test.js.map +1 -0
  18. package/dist/__tests__/setup.d.ts +7 -0
  19. package/dist/__tests__/setup.d.ts.map +1 -0
  20. package/dist/__tests__/setup.js +25 -0
  21. package/dist/__tests__/setup.js.map +1 -0
  22. package/dist/__tests__/tools/agent-tools.test.d.ts +7 -0
  23. package/dist/__tests__/tools/agent-tools.test.d.ts.map +1 -0
  24. package/dist/__tests__/tools/agent-tools.test.js +343 -0
  25. package/dist/__tests__/tools/agent-tools.test.js.map +1 -0
  26. package/dist/__tests__/tools/batch-calling-tools.test.d.ts +7 -0
  27. package/dist/__tests__/tools/batch-calling-tools.test.d.ts.map +1 -0
  28. package/dist/__tests__/tools/batch-calling-tools.test.js +236 -0
  29. package/dist/__tests__/tools/batch-calling-tools.test.js.map +1 -0
  30. package/dist/__tests__/tools/conversation-tools.test.d.ts +7 -0
  31. package/dist/__tests__/tools/conversation-tools.test.d.ts.map +1 -0
  32. package/dist/__tests__/tools/conversation-tools.test.js +212 -0
  33. package/dist/__tests__/tools/conversation-tools.test.js.map +1 -0
  34. package/dist/__tests__/tools/knowledge-tools.test.d.ts +7 -0
  35. package/dist/__tests__/tools/knowledge-tools.test.d.ts.map +1 -0
  36. package/dist/__tests__/tools/knowledge-tools.test.js +209 -0
  37. package/dist/__tests__/tools/knowledge-tools.test.js.map +1 -0
  38. package/dist/__tests__/tools/outbound-tools.test.d.ts +7 -0
  39. package/dist/__tests__/tools/outbound-tools.test.d.ts.map +1 -0
  40. package/dist/__tests__/tools/outbound-tools.test.js +194 -0
  41. package/dist/__tests__/tools/outbound-tools.test.js.map +1 -0
  42. package/dist/__tests__/tools/phone-number-tools.test.d.ts +7 -0
  43. package/dist/__tests__/tools/phone-number-tools.test.d.ts.map +1 -0
  44. package/dist/__tests__/tools/phone-number-tools.test.js +314 -0
  45. package/dist/__tests__/tools/phone-number-tools.test.js.map +1 -0
  46. package/dist/__tests__/tools/tool-tools.test.d.ts +7 -0
  47. package/dist/__tests__/tools/tool-tools.test.d.ts.map +1 -0
  48. package/dist/__tests__/tools/tool-tools.test.js +287 -0
  49. package/dist/__tests__/tools/tool-tools.test.js.map +1 -0
  50. package/dist/__tests__/tools/utility-tools.test.d.ts +7 -0
  51. package/dist/__tests__/tools/utility-tools.test.d.ts.map +1 -0
  52. package/dist/__tests__/tools/utility-tools.test.js +207 -0
  53. package/dist/__tests__/tools/utility-tools.test.js.map +1 -0
  54. package/dist/__tests__/utils/error-handlers.test.d.ts +7 -0
  55. package/dist/__tests__/utils/error-handlers.test.d.ts.map +1 -0
  56. package/dist/__tests__/utils/error-handlers.test.js +237 -0
  57. package/dist/__tests__/utils/error-handlers.test.js.map +1 -0
  58. package/dist/__tests__/utils/phone-normalizer.test.d.ts +7 -0
  59. package/dist/__tests__/utils/phone-normalizer.test.d.ts.map +1 -0
  60. package/dist/__tests__/utils/phone-normalizer.test.js +224 -0
  61. package/dist/__tests__/utils/phone-normalizer.test.js.map +1 -0
  62. package/dist/__tests__/utils/truncation.test.d.ts +7 -0
  63. package/dist/__tests__/utils/truncation.test.d.ts.map +1 -0
  64. package/dist/__tests__/utils/truncation.test.js +208 -0
  65. package/dist/__tests__/utils/truncation.test.js.map +1 -0
  66. package/dist/constants.d.ts +128 -4
  67. package/dist/constants.d.ts.map +1 -1
  68. package/dist/constants.js +150 -24
  69. package/dist/constants.js.map +1 -1
  70. package/dist/index.d.ts +13 -2
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +27 -3
  73. package/dist/index.js.map +1 -1
  74. package/dist/schemas/agent-schemas.d.ts +23 -8
  75. package/dist/schemas/agent-schemas.d.ts.map +1 -1
  76. package/dist/schemas/agent-schemas.js +23 -8
  77. package/dist/schemas/agent-schemas.js.map +1 -1
  78. package/dist/schemas/batch-calling-schemas.d.ts +24 -9
  79. package/dist/schemas/batch-calling-schemas.d.ts.map +1 -1
  80. package/dist/schemas/batch-calling-schemas.js +24 -9
  81. package/dist/schemas/batch-calling-schemas.js.map +1 -1
  82. package/dist/schemas/common-schemas.d.ts +45 -13
  83. package/dist/schemas/common-schemas.d.ts.map +1 -1
  84. package/dist/schemas/common-schemas.js +45 -13
  85. package/dist/schemas/common-schemas.js.map +1 -1
  86. package/dist/schemas/conversation-schemas.d.ts +12 -5
  87. package/dist/schemas/conversation-schemas.d.ts.map +1 -1
  88. package/dist/schemas/conversation-schemas.js +12 -5
  89. package/dist/schemas/conversation-schemas.js.map +1 -1
  90. package/dist/schemas/outbound-schemas.d.ts +23 -8
  91. package/dist/schemas/outbound-schemas.d.ts.map +1 -1
  92. package/dist/schemas/outbound-schemas.js +23 -8
  93. package/dist/schemas/outbound-schemas.js.map +1 -1
  94. package/dist/schemas/phone-number-schemas.d.ts +37 -14
  95. package/dist/schemas/phone-number-schemas.d.ts.map +1 -1
  96. package/dist/schemas/phone-number-schemas.js +37 -14
  97. package/dist/schemas/phone-number-schemas.js.map +1 -1
  98. package/dist/schemas/tool-schemas.d.ts +27 -9
  99. package/dist/schemas/tool-schemas.d.ts.map +1 -1
  100. package/dist/schemas/tool-schemas.js +34 -11
  101. package/dist/schemas/tool-schemas.js.map +1 -1
  102. package/dist/services/elevenlabs-api.d.ts +108 -14
  103. package/dist/services/elevenlabs-api.d.ts.map +1 -1
  104. package/dist/services/elevenlabs-api.js +108 -14
  105. package/dist/services/elevenlabs-api.js.map +1 -1
  106. package/dist/services/formatters.d.ts +147 -21
  107. package/dist/services/formatters.d.ts.map +1 -1
  108. package/dist/services/formatters.js +147 -21
  109. package/dist/services/formatters.js.map +1 -1
  110. package/dist/tools/agent-tools.d.ts +5 -3
  111. package/dist/tools/agent-tools.d.ts.map +1 -1
  112. package/dist/tools/agent-tools.js +5 -3
  113. package/dist/tools/agent-tools.js.map +1 -1
  114. package/dist/tools/batch-calling-tools.d.ts +5 -3
  115. package/dist/tools/batch-calling-tools.d.ts.map +1 -1
  116. package/dist/tools/batch-calling-tools.js +5 -3
  117. package/dist/tools/batch-calling-tools.js.map +1 -1
  118. package/dist/tools/conversation-tools.d.ts +5 -3
  119. package/dist/tools/conversation-tools.d.ts.map +1 -1
  120. package/dist/tools/conversation-tools.js +5 -3
  121. package/dist/tools/conversation-tools.js.map +1 -1
  122. package/dist/tools/knowledge-tools.d.ts +5 -3
  123. package/dist/tools/knowledge-tools.d.ts.map +1 -1
  124. package/dist/tools/knowledge-tools.js +5 -3
  125. package/dist/tools/knowledge-tools.js.map +1 -1
  126. package/dist/tools/outbound-tools.d.ts +5 -3
  127. package/dist/tools/outbound-tools.d.ts.map +1 -1
  128. package/dist/tools/outbound-tools.js +5 -3
  129. package/dist/tools/outbound-tools.js.map +1 -1
  130. package/dist/tools/phone-number-tools.d.ts +5 -4
  131. package/dist/tools/phone-number-tools.d.ts.map +1 -1
  132. package/dist/tools/phone-number-tools.js +5 -4
  133. package/dist/tools/phone-number-tools.js.map +1 -1
  134. package/dist/tools/tool-tools.d.ts +5 -3
  135. package/dist/tools/tool-tools.d.ts.map +1 -1
  136. package/dist/tools/tool-tools.js +5 -3
  137. package/dist/tools/tool-tools.js.map +1 -1
  138. package/dist/tools/utility-tools.d.ts +5 -3
  139. package/dist/tools/utility-tools.d.ts.map +1 -1
  140. package/dist/tools/utility-tools.js +5 -3
  141. package/dist/tools/utility-tools.js.map +1 -1
  142. package/dist/types.d.ts +457 -10
  143. package/dist/types.d.ts.map +1 -1
  144. package/dist/types.js +15 -3
  145. package/dist/types.js.map +1 -1
  146. package/dist/utils/error-handlers.d.ts +47 -14
  147. package/dist/utils/error-handlers.d.ts.map +1 -1
  148. package/dist/utils/error-handlers.js +47 -14
  149. package/dist/utils/error-handlers.js.map +1 -1
  150. package/dist/utils/phone-normalizer.d.ts +43 -22
  151. package/dist/utils/phone-normalizer.d.ts.map +1 -1
  152. package/dist/utils/phone-normalizer.js +43 -22
  153. package/dist/utils/phone-normalizer.js.map +1 -1
  154. package/dist/utils/truncation.d.ts +46 -22
  155. package/dist/utils/truncation.d.ts.map +1 -1
  156. package/dist/utils/truncation.js +46 -22
  157. package/dist/utils/truncation.js.map +1 -1
  158. package/package.json +10 -4
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Tests for error handling utilities
3
+ *
4
+ * Tests error parsing and user-friendly message generation.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
7
+ import axios from "axios";
8
+ import { handleElevenLabsError, validateApiKey, withErrorHandling } from "../../utils/error-handlers.js";
9
+ // Helper to create axios-like errors
10
+ function createAxiosError(status, detail) {
11
+ const error = new Error("Request failed");
12
+ error.response = { status, data: { detail } };
13
+ error.isAxiosError = true;
14
+ return error;
15
+ }
16
+ describe("Error Handlers", () => {
17
+ describe("handleElevenLabsError", () => {
18
+ // Mock axios.isAxiosError to check the isAxiosError property
19
+ let isAxiosErrorSpy;
20
+ beforeEach(() => {
21
+ isAxiosErrorSpy = vi
22
+ .spyOn(axios, "isAxiosError")
23
+ .mockImplementation((error) => {
24
+ return !!error?.isAxiosError;
25
+ });
26
+ });
27
+ afterEach(() => {
28
+ isAxiosErrorSpy.mockRestore();
29
+ });
30
+ describe("HTTP Status Code Errors", () => {
31
+ it("should handle 400 Bad Request", () => {
32
+ const error = createAxiosError(400, "Invalid field value");
33
+ const result = handleElevenLabsError(error);
34
+ expect(result).toContain("Invalid request");
35
+ expect(result).toContain("Invalid field value");
36
+ });
37
+ it("should handle 400 without detail", () => {
38
+ const error = createAxiosError(400, "");
39
+ error.response.data = {};
40
+ const result = handleElevenLabsError(error);
41
+ expect(result).toContain("Invalid request");
42
+ expect(result).toContain("Check your parameters");
43
+ });
44
+ it("should handle 401 Unauthorized", () => {
45
+ const error = createAxiosError(401, "Unauthorized");
46
+ const result = handleElevenLabsError(error);
47
+ expect(result).toContain("Invalid API key");
48
+ expect(result).toContain("ELEVENLABS_API_KEY");
49
+ });
50
+ it("should handle 403 Forbidden", () => {
51
+ const error = createAxiosError(403, "Access denied");
52
+ const result = handleElevenLabsError(error);
53
+ expect(result).toContain("Access forbidden");
54
+ expect(result).toContain("permission");
55
+ });
56
+ it("should handle 404 Not Found", () => {
57
+ const error = createAxiosError(404, "Agent not found");
58
+ const result = handleElevenLabsError(error);
59
+ expect(result).toContain("not found");
60
+ expect(result).toContain("verify the ID");
61
+ });
62
+ it("should handle 409 Conflict", () => {
63
+ const error = createAxiosError(409, "Resource already exists");
64
+ const result = handleElevenLabsError(error);
65
+ expect(result).toContain("Conflict");
66
+ expect(result).toContain("Resource already exists");
67
+ });
68
+ it("should handle 422 Validation Error", () => {
69
+ const error = createAxiosError(422, "Field validation failed");
70
+ const result = handleElevenLabsError(error);
71
+ expect(result).toContain("Validation error");
72
+ expect(result).toContain("Field validation failed");
73
+ });
74
+ it("should handle 429 Rate Limit", () => {
75
+ const error = createAxiosError(429, "Too many requests");
76
+ const result = handleElevenLabsError(error);
77
+ expect(result).toContain("Rate limit exceeded");
78
+ expect(result).toContain("60 seconds");
79
+ });
80
+ it("should handle 500 Server Error", () => {
81
+ const error = createAxiosError(500, "Internal error");
82
+ const result = handleElevenLabsError(error);
83
+ expect(result).toContain("server error");
84
+ expect(result).toContain("try again");
85
+ });
86
+ it("should handle 503 Service Unavailable", () => {
87
+ const error = createAxiosError(503, "Service down");
88
+ const result = handleElevenLabsError(error);
89
+ expect(result).toContain("temporarily unavailable");
90
+ expect(result).toContain("try again later");
91
+ });
92
+ it("should handle unknown status codes", () => {
93
+ const error = createAxiosError(418, "I'm a teapot");
94
+ const result = handleElevenLabsError(error);
95
+ expect(result).toContain("418");
96
+ expect(result).toContain("I'm a teapot");
97
+ });
98
+ });
99
+ describe("Network Errors", () => {
100
+ it("should handle timeout error", () => {
101
+ const error = new Error("timeout of 30000ms exceeded");
102
+ error.code = "ECONNABORTED";
103
+ error.isAxiosError = true;
104
+ const result = handleElevenLabsError(error);
105
+ expect(result).toContain("timed out");
106
+ expect(result).toContain("network connection");
107
+ });
108
+ it("should handle DNS resolution error", () => {
109
+ const error = new Error("getaddrinfo ENOTFOUND api.elevenlabs.io");
110
+ error.code = "ENOTFOUND";
111
+ error.isAxiosError = true;
112
+ const result = handleElevenLabsError(error);
113
+ expect(result).toContain("Cannot connect");
114
+ expect(result).toContain("internet connection");
115
+ });
116
+ it("should handle connection refused error", () => {
117
+ const error = new Error("connect ECONNREFUSED");
118
+ error.code = "ECONNREFUSED";
119
+ error.isAxiosError = true;
120
+ const result = handleElevenLabsError(error);
121
+ expect(result).toContain("Cannot connect");
122
+ });
123
+ it("should handle generic network error", () => {
124
+ const error = new Error("Network Error");
125
+ error.isAxiosError = true;
126
+ const result = handleElevenLabsError(error);
127
+ expect(result).toContain("Network error");
128
+ expect(result).toContain("Network Error");
129
+ });
130
+ });
131
+ describe("Error Detail Formats", () => {
132
+ it("should handle object detail", () => {
133
+ const error = createAxiosError(422, { field: "name", error: "required" });
134
+ const result = handleElevenLabsError(error);
135
+ expect(result).toContain("Validation error");
136
+ expect(result).toContain("field");
137
+ expect(result).toContain("name");
138
+ });
139
+ it("should handle message instead of detail", () => {
140
+ const error = createAxiosError(400, "");
141
+ error.response.data = { message: "Error message here" };
142
+ const result = handleElevenLabsError(error);
143
+ expect(result).toContain("Error message here");
144
+ });
145
+ });
146
+ describe("Non-Axios Errors", () => {
147
+ it("should handle standard Error", () => {
148
+ // Reset axios.isAxiosError to return false for non-axios errors
149
+ isAxiosErrorSpy.mockReturnValue(false);
150
+ const error = new Error("Something went wrong");
151
+ const result = handleElevenLabsError(error);
152
+ expect(result).toContain("Something went wrong");
153
+ });
154
+ it("should handle string error", () => {
155
+ isAxiosErrorSpy.mockReturnValue(false);
156
+ const result = handleElevenLabsError("String error message");
157
+ expect(result).toContain("String error message");
158
+ });
159
+ it("should handle unknown error type", () => {
160
+ isAxiosErrorSpy.mockReturnValue(false);
161
+ const result = handleElevenLabsError({ unknown: "object" });
162
+ expect(result).toContain("Unexpected error");
163
+ });
164
+ it("should handle null error", () => {
165
+ isAxiosErrorSpy.mockReturnValue(false);
166
+ const result = handleElevenLabsError(null);
167
+ expect(result).toContain("Unexpected error");
168
+ });
169
+ });
170
+ describe("Context Parameter", () => {
171
+ it("should include context in message", () => {
172
+ isAxiosErrorSpy.mockReturnValue(false);
173
+ const error = new Error("Test error");
174
+ const result = handleElevenLabsError(error, "creating agent");
175
+ expect(result).toContain("Error creating agent:");
176
+ expect(result).toContain("Test error");
177
+ });
178
+ it("should work without context", () => {
179
+ isAxiosErrorSpy.mockReturnValue(false);
180
+ const error = new Error("Test error");
181
+ const result = handleElevenLabsError(error);
182
+ expect(result).toContain("Error:");
183
+ expect(result).toContain("Test error");
184
+ });
185
+ });
186
+ });
187
+ describe("validateApiKey", () => {
188
+ const originalEnv = process.env.ELEVENLABS_API_KEY;
189
+ afterEach(() => {
190
+ if (originalEnv !== undefined) {
191
+ process.env.ELEVENLABS_API_KEY = originalEnv;
192
+ }
193
+ else {
194
+ delete process.env.ELEVENLABS_API_KEY;
195
+ }
196
+ });
197
+ it("should not throw when API key is set", () => {
198
+ process.env.ELEVENLABS_API_KEY = "test_key";
199
+ expect(() => validateApiKey()).not.toThrow();
200
+ });
201
+ it("should throw when API key is not set", () => {
202
+ delete process.env.ELEVENLABS_API_KEY;
203
+ expect(() => validateApiKey()).toThrow("ELEVENLABS_API_KEY");
204
+ });
205
+ it("should throw when API key is empty string", () => {
206
+ process.env.ELEVENLABS_API_KEY = "";
207
+ expect(() => validateApiKey()).toThrow("ELEVENLABS_API_KEY");
208
+ });
209
+ });
210
+ describe("withErrorHandling", () => {
211
+ it("should return result on success", async () => {
212
+ const fn = vi.fn().mockResolvedValue("success");
213
+ const wrapped = withErrorHandling(fn, "testing");
214
+ const result = await wrapped("arg1", "arg2");
215
+ expect(result).toBe("success");
216
+ expect(fn).toHaveBeenCalledWith("arg1", "arg2");
217
+ });
218
+ it("should wrap error with context", async () => {
219
+ const fn = vi.fn().mockRejectedValue(new Error("Original error"));
220
+ const wrapped = withErrorHandling(fn, "custom operation");
221
+ await expect(wrapped()).rejects.toThrow("Error custom operation:");
222
+ });
223
+ it("should handle function with no context", async () => {
224
+ const fn = vi.fn().mockRejectedValue(new Error("Test error"));
225
+ const wrapped = withErrorHandling(fn);
226
+ await expect(wrapped()).rejects.toThrow("Error:");
227
+ });
228
+ it("should preserve function arguments", async () => {
229
+ const fn = vi.fn(async (a, b) => `${a}-${b}`);
230
+ const wrapped = withErrorHandling(fn);
231
+ const result = await wrapped(42, "test");
232
+ expect(result).toBe("42-test");
233
+ expect(fn).toHaveBeenCalledWith(42, "test");
234
+ });
235
+ });
236
+ });
237
+ //# sourceMappingURL=error-handlers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handlers.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/error-handlers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for phone number normalization utilities
3
+ *
4
+ * Tests E.164 format conversion, validation, and batch processing.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=phone-normalizer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-normalizer.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/phone-normalizer.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Tests for phone number normalization utilities
3
+ *
4
+ * Tests E.164 format conversion, validation, and batch processing.
5
+ */
6
+ import { describe, it, expect } from "vitest";
7
+ import { normalizePhoneNumber, isValidE164, normalizePhoneNumbers } from "../../utils/phone-normalizer.js";
8
+ describe("Phone Normalizer", () => {
9
+ describe("normalizePhoneNumber", () => {
10
+ describe("Basic formatting", () => {
11
+ it("should normalize US number with spaces", () => {
12
+ const result = normalizePhoneNumber("+1 412 481 2210");
13
+ expect(result).toBe("+14124812210");
14
+ });
15
+ it("should normalize US number with parentheses", () => {
16
+ const result = normalizePhoneNumber("(623) 258-3673");
17
+ expect(result).toBe("+16232583673");
18
+ });
19
+ it("should normalize US number with dots", () => {
20
+ const result = normalizePhoneNumber("817.527.9708");
21
+ expect(result).toBe("+18175279708");
22
+ });
23
+ it("should normalize US number with dashes", () => {
24
+ const result = normalizePhoneNumber("415-555-1234");
25
+ expect(result).toBe("+14155551234");
26
+ });
27
+ it("should normalize number with mixed formats", () => {
28
+ const result = normalizePhoneNumber("(415) 555.1234");
29
+ expect(result).toBe("+14155551234");
30
+ });
31
+ });
32
+ describe("Extension handling", () => {
33
+ it("should remove extension with x", () => {
34
+ const result = normalizePhoneNumber("518-434-8128 x206");
35
+ expect(result).toBe("+15184348128");
36
+ });
37
+ it("should remove extension with ext", () => {
38
+ const result = normalizePhoneNumber("(415) 555-1234 ext 123");
39
+ expect(result).toBe("+14155551234");
40
+ });
41
+ it("should remove extension with extension", () => {
42
+ const result = normalizePhoneNumber("415-555-1234 extension 456");
43
+ expect(result).toBe("+14155551234");
44
+ });
45
+ it("should remove extension with colon", () => {
46
+ const result = normalizePhoneNumber("415-555-1234 x:789");
47
+ expect(result).toBe("+14155551234");
48
+ });
49
+ });
50
+ describe("Country code handling", () => {
51
+ it("should add +1 to 10-digit US number", () => {
52
+ const result = normalizePhoneNumber("4155551234");
53
+ expect(result).toBe("+14155551234");
54
+ });
55
+ it("should preserve existing +1 country code", () => {
56
+ const result = normalizePhoneNumber("+14155551234");
57
+ expect(result).toBe("+14155551234");
58
+ });
59
+ it("should handle 11-digit number starting with 1", () => {
60
+ const result = normalizePhoneNumber("14155551234");
61
+ expect(result).toBe("+14155551234");
62
+ });
63
+ it("should add +1 to number with + but only 10 digits", () => {
64
+ const result = normalizePhoneNumber("+4155551234");
65
+ expect(result).toBe("+14155551234");
66
+ });
67
+ it("should use custom country code", () => {
68
+ const result = normalizePhoneNumber("7911123456", "+44");
69
+ expect(result).toBe("+447911123456");
70
+ });
71
+ it("should handle non-US country code", () => {
72
+ const result = normalizePhoneNumber("+447911123456");
73
+ expect(result).toBe("+447911123456");
74
+ });
75
+ });
76
+ describe("Invalid inputs", () => {
77
+ it("should return null for empty string", () => {
78
+ const result = normalizePhoneNumber("");
79
+ expect(result).toBeNull();
80
+ });
81
+ it("should return null for null input", () => {
82
+ const result = normalizePhoneNumber(null);
83
+ expect(result).toBeNull();
84
+ });
85
+ it("should return null for undefined input", () => {
86
+ const result = normalizePhoneNumber(undefined);
87
+ expect(result).toBeNull();
88
+ });
89
+ it("should return null for whitespace only", () => {
90
+ const result = normalizePhoneNumber(" ");
91
+ expect(result).toBeNull();
92
+ });
93
+ it("should return null for non-digits only", () => {
94
+ const result = normalizePhoneNumber("abc-def-ghij");
95
+ expect(result).toBeNull();
96
+ });
97
+ it("should return null for number starting with 0", () => {
98
+ const result = normalizePhoneNumber("0000000000");
99
+ expect(result).toBeNull();
100
+ });
101
+ it("should return null for too long number", () => {
102
+ const result = normalizePhoneNumber("1234567890123456789");
103
+ expect(result).toBeNull();
104
+ });
105
+ });
106
+ describe("Edge cases", () => {
107
+ it("should handle number with leading zeros after extraction", () => {
108
+ // After stripping zeros, we have 1234567890 (10 digits)
109
+ // The normalizer adds +1 for 10-digit numbers with default country code
110
+ const result = normalizePhoneNumber("+0001234567890");
111
+ expect(result).toBe("+11234567890");
112
+ });
113
+ it("should handle number with parentheses and spaces", () => {
114
+ const result = normalizePhoneNumber("( 415 ) 555 - 1234");
115
+ expect(result).toBe("+14155551234");
116
+ });
117
+ it("should trim whitespace from input", () => {
118
+ const result = normalizePhoneNumber(" (415) 555-1234 ");
119
+ expect(result).toBe("+14155551234");
120
+ });
121
+ it("should handle international format with +", () => {
122
+ const result = normalizePhoneNumber("+1-415-555-1234");
123
+ expect(result).toBe("+14155551234");
124
+ });
125
+ });
126
+ });
127
+ describe("isValidE164", () => {
128
+ it("should return true for valid E.164 with +", () => {
129
+ expect(isValidE164("+14155551234")).toBe(true);
130
+ });
131
+ it("should return true for valid E.164 without +", () => {
132
+ expect(isValidE164("14155551234")).toBe(true);
133
+ });
134
+ it("should return true for international number", () => {
135
+ expect(isValidE164("+447911123456")).toBe(true);
136
+ });
137
+ it("should return true for short valid number", () => {
138
+ expect(isValidE164("+49")).toBe(true);
139
+ });
140
+ it("should return true for long valid number", () => {
141
+ expect(isValidE164("+123456789012345")).toBe(true);
142
+ });
143
+ it("should return false for number starting with 0", () => {
144
+ expect(isValidE164("+01234567890")).toBe(false);
145
+ });
146
+ it("should return false for formatted number", () => {
147
+ expect(isValidE164("(415) 555-1234")).toBe(false);
148
+ });
149
+ it("should return false for number with letters", () => {
150
+ expect(isValidE164("+1415555ABC")).toBe(false);
151
+ });
152
+ it("should return false for empty string", () => {
153
+ expect(isValidE164("")).toBe(false);
154
+ });
155
+ it("should return false for too long number", () => {
156
+ expect(isValidE164("+1234567890123456")).toBe(false);
157
+ });
158
+ });
159
+ describe("normalizePhoneNumbers", () => {
160
+ it("should normalize array of valid phone numbers", () => {
161
+ const input = ["(415) 555-1234", "+14155559999"];
162
+ const result = normalizePhoneNumbers(input);
163
+ expect(result.normalized).toHaveLength(2);
164
+ expect(result.normalized).toContain("+14155551234");
165
+ expect(result.normalized).toContain("+14155559999");
166
+ expect(result.invalid).toHaveLength(0);
167
+ });
168
+ it("should separate valid from invalid numbers", () => {
169
+ const input = ["(415) 555-1234", "invalid", null, "+1234567890"];
170
+ const result = normalizePhoneNumbers(input);
171
+ expect(result.normalized).toHaveLength(2);
172
+ expect(result.invalid).toHaveLength(2);
173
+ expect(result.invalid[0]).toEqual({ index: 1, original: "invalid" });
174
+ expect(result.invalid[1]).toEqual({ index: 2, original: null });
175
+ });
176
+ it("should handle empty array", () => {
177
+ const result = normalizePhoneNumbers([]);
178
+ expect(result.normalized).toHaveLength(0);
179
+ expect(result.invalid).toHaveLength(0);
180
+ });
181
+ it("should handle array with all invalid numbers", () => {
182
+ const input = ["invalid", "", null, undefined];
183
+ const result = normalizePhoneNumbers(input);
184
+ expect(result.normalized).toHaveLength(0);
185
+ expect(result.invalid).toHaveLength(4);
186
+ });
187
+ it("should use custom country code", () => {
188
+ const input = ["7911123456"];
189
+ const result = normalizePhoneNumbers(input, "+44");
190
+ expect(result.normalized).toEqual(["+447911123456"]);
191
+ expect(result.invalid).toHaveLength(0);
192
+ });
193
+ it("should preserve order in normalized array", () => {
194
+ const input = ["(415) 555-1234", "(310) 555-5678", "(650) 555-9012"];
195
+ const result = normalizePhoneNumbers(input);
196
+ expect(result.normalized[0]).toBe("+14155551234");
197
+ expect(result.normalized[1]).toBe("+13105555678");
198
+ expect(result.normalized[2]).toBe("+16505559012");
199
+ });
200
+ it("should track correct indices for invalid numbers", () => {
201
+ const input = ["valid", "invalid1", "valid2", "invalid2"];
202
+ const result = normalizePhoneNumbers(input);
203
+ // "valid" and "invalid1" don't produce 10-digit numbers, so they're invalid
204
+ // The indices should match the original array positions
205
+ result.invalid.forEach(inv => {
206
+ expect(typeof inv.index).toBe("number");
207
+ expect(inv.index >= 0 && inv.index < input.length).toBe(true);
208
+ });
209
+ });
210
+ it("should handle mixed null/undefined/string array", () => {
211
+ const input = [
212
+ "+14155551234",
213
+ null,
214
+ "(310) 555-5678",
215
+ undefined,
216
+ ""
217
+ ];
218
+ const result = normalizePhoneNumbers(input);
219
+ expect(result.normalized).toHaveLength(2);
220
+ expect(result.invalid).toHaveLength(3);
221
+ });
222
+ });
223
+ });
224
+ //# sourceMappingURL=phone-normalizer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-normalizer.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/phone-normalizer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for truncation utilities
3
+ *
4
+ * Tests content truncation and formatting functions.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=truncation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncation.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/truncation.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}