@devrev/airsync-sdk 2.0.0-beta.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 (180) hide show
  1. package/README.md +31 -0
  2. package/dist/attachments-streaming/attachments-streaming-pool.d.ts +16 -0
  3. package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -0
  4. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +9 -0
  5. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -0
  6. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.js +2 -0
  7. package/dist/attachments-streaming/attachments-streaming-pool.js +97 -0
  8. package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts +2 -0
  9. package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts.map +1 -0
  10. package/dist/attachments-streaming/attachments-streaming-pool.test.js +267 -0
  11. package/dist/common/constants.d.ts +25 -0
  12. package/dist/common/constants.d.ts.map +1 -0
  13. package/dist/common/constants.js +58 -0
  14. package/dist/common/control-protocol.d.ts +10 -0
  15. package/dist/common/control-protocol.d.ts.map +1 -0
  16. package/dist/common/control-protocol.js +31 -0
  17. package/dist/common/errors.d.ts +6 -0
  18. package/dist/common/errors.d.ts.map +1 -0
  19. package/dist/common/errors.js +4 -0
  20. package/dist/common/event-type-translation.d.ts +24 -0
  21. package/dist/common/event-type-translation.d.ts.map +1 -0
  22. package/dist/common/event-type-translation.js +117 -0
  23. package/dist/common/helpers.d.ts +41 -0
  24. package/dist/common/helpers.d.ts.map +1 -0
  25. package/dist/common/helpers.js +124 -0
  26. package/dist/common/install-initial-domain-mapping.d.ts +4 -0
  27. package/dist/common/install-initial-domain-mapping.d.ts.map +1 -0
  28. package/dist/common/install-initial-domain-mapping.js +58 -0
  29. package/dist/common/install-initial-domain-mapping.test.d.ts +2 -0
  30. package/dist/common/install-initial-domain-mapping.test.d.ts.map +1 -0
  31. package/dist/common/install-initial-domain-mapping.test.js +207 -0
  32. package/dist/deprecated/adapter/index.d.ts +62 -0
  33. package/dist/deprecated/adapter/index.d.ts.map +1 -0
  34. package/dist/deprecated/adapter/index.js +151 -0
  35. package/dist/deprecated/common/helpers.d.ts +7 -0
  36. package/dist/deprecated/common/helpers.d.ts.map +1 -0
  37. package/dist/deprecated/common/helpers.js +47 -0
  38. package/dist/deprecated/demo-extractor/external_domain_metadata.json +38 -0
  39. package/dist/deprecated/demo-extractor/index.d.ts +18 -0
  40. package/dist/deprecated/demo-extractor/index.d.ts.map +1 -0
  41. package/dist/deprecated/demo-extractor/index.js +161 -0
  42. package/dist/deprecated/http/client.d.ts +22 -0
  43. package/dist/deprecated/http/client.d.ts.map +1 -0
  44. package/dist/deprecated/http/client.js +161 -0
  45. package/dist/deprecated/uploader/index.d.ts +35 -0
  46. package/dist/deprecated/uploader/index.d.ts.map +1 -0
  47. package/dist/deprecated/uploader/index.js +161 -0
  48. package/dist/http/axios-client-internal.d.ts +3 -0
  49. package/dist/http/axios-client-internal.d.ts.map +1 -0
  50. package/dist/http/axios-client-internal.js +66 -0
  51. package/dist/http/axios-client-internal.test.d.ts +2 -0
  52. package/dist/http/axios-client-internal.test.d.ts.map +1 -0
  53. package/dist/http/axios-client-internal.test.js +154 -0
  54. package/dist/http/axios-client.d.ts +27 -0
  55. package/dist/http/axios-client.d.ts.map +1 -0
  56. package/dist/http/axios-client.js +57 -0
  57. package/dist/http/constants.d.ts +4 -0
  58. package/dist/http/constants.d.ts.map +1 -0
  59. package/dist/http/constants.js +6 -0
  60. package/dist/http/index.d.ts +3 -0
  61. package/dist/http/index.d.ts.map +1 -0
  62. package/dist/http/index.js +18 -0
  63. package/dist/http/types.d.ts +17 -0
  64. package/dist/http/types.d.ts.map +1 -0
  65. package/dist/http/types.js +2 -0
  66. package/dist/index.d.ts +14 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +34 -0
  69. package/dist/logger/logger.constants.d.ts +6 -0
  70. package/dist/logger/logger.constants.d.ts.map +1 -0
  71. package/dist/logger/logger.constants.js +13 -0
  72. package/dist/logger/logger.context.d.ts +58 -0
  73. package/dist/logger/logger.context.d.ts.map +1 -0
  74. package/dist/logger/logger.context.js +86 -0
  75. package/dist/logger/logger.d.ts +89 -0
  76. package/dist/logger/logger.d.ts.map +1 -0
  77. package/dist/logger/logger.interfaces.d.ts +43 -0
  78. package/dist/logger/logger.interfaces.d.ts.map +1 -0
  79. package/dist/logger/logger.interfaces.js +9 -0
  80. package/dist/logger/logger.js +196 -0
  81. package/dist/logger/logger.test.d.ts +2 -0
  82. package/dist/logger/logger.test.d.ts.map +1 -0
  83. package/dist/logger/logger.test.js +490 -0
  84. package/dist/mappers/mappers.d.ts +52 -0
  85. package/dist/mappers/mappers.d.ts.map +1 -0
  86. package/dist/mappers/mappers.interface.d.ts +294 -0
  87. package/dist/mappers/mappers.interface.d.ts.map +1 -0
  88. package/dist/mappers/mappers.interface.js +48 -0
  89. package/dist/mappers/mappers.js +83 -0
  90. package/dist/mappers/mappers.test.d.ts +2 -0
  91. package/dist/mappers/mappers.test.d.ts.map +1 -0
  92. package/dist/mappers/mappers.test.js +107 -0
  93. package/dist/multithreading/create-worker.d.ts +5 -0
  94. package/dist/multithreading/create-worker.d.ts.map +1 -0
  95. package/dist/multithreading/create-worker.js +28 -0
  96. package/dist/multithreading/create-worker.test.d.ts +2 -0
  97. package/dist/multithreading/create-worker.test.d.ts.map +1 -0
  98. package/dist/multithreading/create-worker.test.js +89 -0
  99. package/dist/multithreading/process-task.d.ts +3 -0
  100. package/dist/multithreading/process-task.d.ts.map +1 -0
  101. package/dist/multithreading/process-task.js +58 -0
  102. package/dist/multithreading/spawn/spawn.d.ts +30 -0
  103. package/dist/multithreading/spawn/spawn.d.ts.map +1 -0
  104. package/dist/multithreading/spawn/spawn.helpers.d.ts +21 -0
  105. package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -0
  106. package/dist/multithreading/spawn/spawn.helpers.js +114 -0
  107. package/dist/multithreading/spawn/spawn.helpers.test.d.ts +2 -0
  108. package/dist/multithreading/spawn/spawn.helpers.test.d.ts.map +1 -0
  109. package/dist/multithreading/spawn/spawn.helpers.test.js +293 -0
  110. package/dist/multithreading/spawn/spawn.js +249 -0
  111. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts +2 -0
  112. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts.map +1 -0
  113. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.js +127 -0
  114. package/dist/multithreading/worker-adapter/worker-adapter.d.ts +91 -0
  115. package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +1 -0
  116. package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts +22 -0
  117. package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts.map +1 -0
  118. package/dist/multithreading/worker-adapter/worker-adapter.helpers.js +64 -0
  119. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts +2 -0
  120. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts.map +1 -0
  121. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.js +514 -0
  122. package/dist/multithreading/worker-adapter/worker-adapter.js +747 -0
  123. package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts +2 -0
  124. package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts.map +1 -0
  125. package/dist/multithreading/worker-adapter/worker-adapter.test.js +483 -0
  126. package/dist/multithreading/worker.d.ts +2 -0
  127. package/dist/multithreading/worker.d.ts.map +1 -0
  128. package/dist/multithreading/worker.js +9 -0
  129. package/dist/repo/repo.d.ts +18 -0
  130. package/dist/repo/repo.d.ts.map +1 -0
  131. package/dist/repo/repo.interfaces.d.ts +46 -0
  132. package/dist/repo/repo.interfaces.d.ts.map +1 -0
  133. package/dist/repo/repo.interfaces.js +2 -0
  134. package/dist/repo/repo.js +75 -0
  135. package/dist/repo/repo.test.d.ts +2 -0
  136. package/dist/repo/repo.test.d.ts.map +1 -0
  137. package/dist/repo/repo.test.js +131 -0
  138. package/dist/state/state.d.ts +30 -0
  139. package/dist/state/state.d.ts.map +1 -0
  140. package/dist/state/state.interfaces.d.ts +51 -0
  141. package/dist/state/state.interfaces.d.ts.map +1 -0
  142. package/dist/state/state.interfaces.js +21 -0
  143. package/dist/state/state.js +166 -0
  144. package/dist/state/state.test.d.ts +2 -0
  145. package/dist/state/state.test.d.ts.map +1 -0
  146. package/dist/state/state.test.js +224 -0
  147. package/dist/types/common.d.ts +50 -0
  148. package/dist/types/common.d.ts.map +1 -0
  149. package/dist/types/common.js +25 -0
  150. package/dist/types/extraction.d.ts +417 -0
  151. package/dist/types/extraction.d.ts.map +1 -0
  152. package/dist/types/extraction.js +170 -0
  153. package/dist/types/extraction.test.d.ts +2 -0
  154. package/dist/types/extraction.test.d.ts.map +1 -0
  155. package/dist/types/extraction.test.js +70 -0
  156. package/dist/types/index.d.ts +9 -0
  157. package/dist/types/index.d.ts.map +1 -0
  158. package/dist/types/index.js +18 -0
  159. package/dist/types/loading.d.ts +147 -0
  160. package/dist/types/loading.d.ts.map +1 -0
  161. package/dist/types/loading.js +48 -0
  162. package/dist/types/workers.d.ts +161 -0
  163. package/dist/types/workers.d.ts.map +1 -0
  164. package/dist/types/workers.js +22 -0
  165. package/dist/uploader/uploader.d.ts +92 -0
  166. package/dist/uploader/uploader.d.ts.map +1 -0
  167. package/dist/uploader/uploader.helpers.d.ts +33 -0
  168. package/dist/uploader/uploader.helpers.d.ts.map +1 -0
  169. package/dist/uploader/uploader.helpers.js +139 -0
  170. package/dist/uploader/uploader.helpers.test.d.ts +2 -0
  171. package/dist/uploader/uploader.helpers.test.d.ts.map +1 -0
  172. package/dist/uploader/uploader.helpers.test.js +267 -0
  173. package/dist/uploader/uploader.interfaces.d.ts +95 -0
  174. package/dist/uploader/uploader.interfaces.d.ts.map +1 -0
  175. package/dist/uploader/uploader.interfaces.js +2 -0
  176. package/dist/uploader/uploader.js +305 -0
  177. package/dist/uploader/uploader.test.d.ts +2 -0
  178. package/dist/uploader/uploader.test.d.ts.map +1 -0
  179. package/dist/uploader/uploader.test.js +589 -0
  180. package/package.json +60 -0
@@ -0,0 +1,490 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_util_1 = require("node:util");
4
+ const constants_1 = require("../common/constants");
5
+ const test_helpers_1 = require("../tests/test-helpers");
6
+ const extraction_1 = require("../types/extraction");
7
+ const logger_1 = require("./logger");
8
+ const logger_constants_1 = require("./logger.constants");
9
+ // Mock console methods
10
+ const mockConsoleInfo = jest.spyOn(console, 'info').mockImplementation();
11
+ const mockConsoleWarn = jest.spyOn(console, 'warn').mockImplementation();
12
+ const mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
13
+ // Mock worker_threads for main-thread specific behavior but keep actual Worker implementation
14
+ jest.mock('node:worker_threads', () => {
15
+ const actual = jest.requireActual('node:worker_threads');
16
+ return Object.assign(Object.assign({}, actual), { isMainThread: true, parentPort: null });
17
+ });
18
+ describe(logger_1.Logger.name, () => {
19
+ let mockEvent;
20
+ let mockOptions;
21
+ beforeEach(() => {
22
+ jest.clearAllMocks();
23
+ mockEvent = (0, test_helpers_1.createEvent)({
24
+ eventType: extraction_1.EventType.StartExtractingData,
25
+ eventContextOverrides: {
26
+ dev_org: 'DEV-test',
27
+ dev_org_id: 'DEV-test-id',
28
+ dev_user: 'DEVU-test',
29
+ dev_user_id: 'DEVU-test-id',
30
+ external_sync_unit: 'test-unit',
31
+ external_sync_unit_id: 'test-unit-id',
32
+ external_sync_unit_name: 'test-unit-name',
33
+ external_system: 'test-system',
34
+ external_system_type: 'test-type',
35
+ import_slug: 'test-import',
36
+ request_id: 'test-request-id',
37
+ snap_in_slug: 'test-snap-slug',
38
+ sync_run: 'test-sync-run',
39
+ sync_run_id: 'test-sync-run-id',
40
+ },
41
+ });
42
+ mockOptions = {
43
+ isLocalDevelopment: false,
44
+ };
45
+ });
46
+ afterAll(() => {
47
+ jest.restoreAllMocks();
48
+ });
49
+ it('should initialize with event context and SDK version in tags', () => {
50
+ // Arrange & Act
51
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
52
+ // Assert
53
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
+ const tags = logger.tags;
55
+ expect(tags).toEqual(Object.assign(Object.assign({}, mockEvent.payload.event_context), { sdk_version: constants_1.LIBRARY_VERSION, is_sdk_log: true }));
56
+ });
57
+ it('should log string message as JSON with event context tags in production mode', () => {
58
+ // Arrange
59
+ const message = 'Worker is online. Started processing the task.';
60
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
61
+ // Act
62
+ logger.info(message);
63
+ // Assert
64
+ expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message }, mockEvent.payload.event_context), { sdk_version: constants_1.LIBRARY_VERSION, is_sdk_log: true })));
65
+ });
66
+ it('should log object message using inspect with proper formatting in production mode', () => {
67
+ // Arrange
68
+ const data = { id: 123, name: 'test' };
69
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
70
+ const expectedMessage = (0, node_util_1.inspect)(data, logger_constants_1.INSPECT_OPTIONS);
71
+ // Act
72
+ logger.info(data);
73
+ // Assert
74
+ expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message: expectedMessage }, mockEvent.payload.event_context), { sdk_version: constants_1.LIBRARY_VERSION, is_sdk_log: true })));
75
+ });
76
+ it('should join multiple arguments with space when logging in production mode', () => {
77
+ // Arrange
78
+ const text = 'Successfully fetched';
79
+ const data = { count: 42 };
80
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
81
+ const expectedDataMessage = (0, node_util_1.inspect)(data, logger_constants_1.INSPECT_OPTIONS);
82
+ // Act
83
+ logger.info(text, data);
84
+ // Assert
85
+ expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message: `${text} ${expectedDataMessage}` }, mockEvent.payload.event_context), { sdk_version: constants_1.LIBRARY_VERSION, is_sdk_log: true })));
86
+ });
87
+ it('should log mixed string and object arguments joined with spaces in production mode', () => {
88
+ // Arrange
89
+ const text1 = 'Processing';
90
+ const data = { id: 123 };
91
+ const text2 = 'completed';
92
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
93
+ const expectedDataMessage = (0, node_util_1.inspect)(data, logger_constants_1.INSPECT_OPTIONS);
94
+ // Act
95
+ logger.info(text1, data, text2);
96
+ // Assert
97
+ expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message: `${text1} ${expectedDataMessage} ${text2}` }, mockEvent.payload.event_context), { sdk_version: constants_1.LIBRARY_VERSION, is_sdk_log: true })));
98
+ });
99
+ it('should log directly without JSON wrapping in local development mode', () => {
100
+ // Arrange
101
+ const message = 'Test message';
102
+ const data = { test: true };
103
+ mockOptions.isLocalDevelopment = true;
104
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
105
+ const expectedDataMessage = (0, node_util_1.inspect)(data, logger_constants_1.INSPECT_OPTIONS);
106
+ // Act
107
+ logger.info(message, data);
108
+ // Assert
109
+ expect(mockConsoleInfo).toHaveBeenCalledWith(`${message} ${expectedDataMessage}`);
110
+ });
111
+ it('should truncate long strings and show remaining character count', () => {
112
+ // Arrange
113
+ const longString = 'C'.repeat(20000);
114
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
115
+ const expectedTruncatedMessage = `${longString.substring(0, logger_constants_1.MAX_LOG_STRING_LENGTH)}... ${20000 - logger_constants_1.MAX_LOG_STRING_LENGTH} more characters`;
116
+ // Act
117
+ logger.info(longString);
118
+ // Assert
119
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
120
+ const logObject = JSON.parse(callArgs);
121
+ expect(logObject.message).toBe(expectedTruncatedMessage);
122
+ });
123
+ it('should not truncate strings shorter than maximum length', () => {
124
+ // Arrange
125
+ const shortString = 'Short message';
126
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
127
+ // Act
128
+ logger.info(shortString);
129
+ // Assert
130
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
131
+ const logObject = JSON.parse(callArgs);
132
+ expect(logObject.message).toBe(shortString);
133
+ });
134
+ it('[edge] should not truncate message exactly at maximum length', () => {
135
+ // Arrange
136
+ const messageAtLimit = 'A'.repeat(logger_constants_1.MAX_LOG_STRING_LENGTH);
137
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
138
+ // Act
139
+ logger.info(messageAtLimit);
140
+ // Assert
141
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
142
+ const logObject = JSON.parse(callArgs);
143
+ expect(logObject.message).toBe(messageAtLimit);
144
+ expect(logObject.message.length).toBe(logger_constants_1.MAX_LOG_STRING_LENGTH);
145
+ });
146
+ it('[edge] should truncate message one character over maximum length', () => {
147
+ // Arrange
148
+ const messageOverLimit = 'B'.repeat(logger_constants_1.MAX_LOG_STRING_LENGTH + 1);
149
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
150
+ const expectedMessage = `${messageOverLimit.substring(0, logger_constants_1.MAX_LOG_STRING_LENGTH)}... 1 more characters`;
151
+ // Act
152
+ logger.info(messageOverLimit);
153
+ // Assert
154
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
155
+ const logObject = JSON.parse(callArgs);
156
+ expect(logObject.message).toBe(expectedMessage);
157
+ });
158
+ it('[edge] should handle empty string without truncation', () => {
159
+ // Arrange
160
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
161
+ // Act
162
+ logger.info('');
163
+ // Assert
164
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
165
+ const logObject = JSON.parse(callArgs);
166
+ expect(logObject.message).toBe('');
167
+ });
168
+ it('[edge] should show correct character count for very long messages', () => {
169
+ // Arrange
170
+ const veryLongString = 'X'.repeat(50000);
171
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
172
+ const expectedCharactersRemaining = 50000 - logger_constants_1.MAX_LOG_STRING_LENGTH;
173
+ const expectedMessage = `${veryLongString.substring(0, logger_constants_1.MAX_LOG_STRING_LENGTH)}... ${expectedCharactersRemaining} more characters`;
174
+ // Act
175
+ logger.info(veryLongString);
176
+ // Assert
177
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
178
+ const logObject = JSON.parse(callArgs);
179
+ expect(logObject.message).toBe(expectedMessage);
180
+ expect(logObject.message).toContain('40000 more characters');
181
+ });
182
+ it('should stringify string arguments and join them with spaces', () => {
183
+ // Arrange
184
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
185
+ // Act
186
+ logger.info('Message 1', 'Message 2');
187
+ // Assert
188
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
189
+ const logObject = JSON.parse(callArgs);
190
+ expect(logObject.message).toBe('Message 1 Message 2');
191
+ });
192
+ it('should stringify object arguments using util.inspect', () => {
193
+ // Arrange
194
+ const data = { id: 123 };
195
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
196
+ const expectedMessage = (0, node_util_1.inspect)(data, logger_constants_1.INSPECT_OPTIONS);
197
+ // Act
198
+ logger.info(data);
199
+ // Assert
200
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
201
+ const logObject = JSON.parse(callArgs);
202
+ expect(logObject.message).toBe(expectedMessage);
203
+ });
204
+ it('should call info method for log level', () => {
205
+ // Arrange
206
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
207
+ // Act
208
+ logger.log('test log');
209
+ // Assert
210
+ expect(mockConsoleInfo).toHaveBeenCalledTimes(1);
211
+ });
212
+ it('should call info method for info level', () => {
213
+ // Arrange
214
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
215
+ // Act
216
+ logger.info('test info');
217
+ // Assert
218
+ expect(mockConsoleInfo).toHaveBeenCalledTimes(1);
219
+ });
220
+ it('should call warn method for warn level', () => {
221
+ // Arrange
222
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
223
+ // Act
224
+ logger.warn('test warning');
225
+ // Assert
226
+ expect(mockConsoleWarn).toHaveBeenCalledTimes(1);
227
+ });
228
+ it('should call error method for error level', () => {
229
+ // Arrange
230
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
231
+ // Act
232
+ logger.error('test error');
233
+ // Assert
234
+ expect(mockConsoleError).toHaveBeenCalledTimes(1);
235
+ });
236
+ it('[edge] should log empty string as valid message with tags', () => {
237
+ // Arrange
238
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
239
+ // Act
240
+ logger.info('');
241
+ // Assert
242
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
243
+ const logObject = JSON.parse(callArgs);
244
+ expect(logObject.message).toBe('');
245
+ expect(logObject.sdk_version).toBe(constants_1.LIBRARY_VERSION);
246
+ expect(logObject.is_sdk_log).toBe(true);
247
+ });
248
+ it('[edge] should handle null and undefined values in log arguments', () => {
249
+ // Arrange
250
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
251
+ // Act
252
+ logger.info('test', null, undefined);
253
+ // Assert
254
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
255
+ const logObject = JSON.parse(callArgs);
256
+ expect(logObject.message).toBe('test null undefined');
257
+ });
258
+ it('[edge] should handle deeply nested objects with inspect', () => {
259
+ // Arrange
260
+ const complexObject = {
261
+ level1: {
262
+ level2: {
263
+ array: [1, 2, 3],
264
+ string: 'nested',
265
+ },
266
+ },
267
+ };
268
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
269
+ const expectedMessage = (0, node_util_1.inspect)(complexObject, logger_constants_1.INSPECT_OPTIONS);
270
+ // Act
271
+ logger.info(complexObject);
272
+ // Assert
273
+ const callArgs = mockConsoleInfo.mock.calls[0][0];
274
+ const logObject = JSON.parse(callArgs);
275
+ expect(logObject.message).toBe(expectedMessage);
276
+ });
277
+ it('[edge] should handle circular references in objects', () => {
278
+ // Arrange
279
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
280
+ const circularObject = { name: 'test' };
281
+ circularObject.self = circularObject;
282
+ const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
283
+ // Act & Assert
284
+ expect(() => logger.info(circularObject)).not.toThrow();
285
+ expect(mockConsoleInfo).toHaveBeenCalledTimes(1);
286
+ });
287
+ });
288
+ describe(logger_1.getPrintableState.name, () => {
289
+ it('should convert arrays to summary objects with type, length, and boundary items', () => {
290
+ // Arrange
291
+ const state = {
292
+ test_key: 'test_value',
293
+ big_array: Array.from({ length: 1000 }, (_, index) => index),
294
+ };
295
+ // Act
296
+ const printableState = (0, logger_1.getPrintableState)(state);
297
+ // Assert
298
+ expect(printableState).toEqual({
299
+ test_key: 'test_value',
300
+ big_array: {
301
+ type: 'array',
302
+ length: 1000,
303
+ firstItem: 0,
304
+ lastItem: 999,
305
+ },
306
+ });
307
+ });
308
+ it('should recursively process nested objects and arrays', () => {
309
+ // Arrange
310
+ const state = {
311
+ test_key: 'test_value',
312
+ nested_object: {
313
+ nested_key: 'nested_value',
314
+ nested_array: Array.from({ length: 1000 }, (_, index) => index),
315
+ },
316
+ };
317
+ // Act
318
+ const printableState = (0, logger_1.getPrintableState)(state);
319
+ // Assert
320
+ expect(printableState).toEqual({
321
+ test_key: 'test_value',
322
+ nested_object: {
323
+ nested_key: 'nested_value',
324
+ nested_array: {
325
+ type: 'array',
326
+ length: 1000,
327
+ firstItem: 0,
328
+ lastItem: 999,
329
+ },
330
+ },
331
+ });
332
+ });
333
+ it('should preserve primitive values without modification', () => {
334
+ // Arrange
335
+ const state = {
336
+ string_key: 'string_value',
337
+ number_key: 42,
338
+ boolean_key: true,
339
+ null_key: null,
340
+ };
341
+ // Act
342
+ const printableState = (0, logger_1.getPrintableState)(state);
343
+ // Assert
344
+ expect(printableState).toEqual(state);
345
+ });
346
+ it('[edge] should handle empty arrays with no first or last items', () => {
347
+ // Arrange
348
+ const state = {
349
+ empty_array: [],
350
+ };
351
+ // Act
352
+ const printableState = (0, logger_1.getPrintableState)(state);
353
+ // Assert
354
+ expect(printableState).toEqual({
355
+ empty_array: {
356
+ type: 'array',
357
+ length: 0,
358
+ firstItem: undefined,
359
+ lastItem: undefined,
360
+ },
361
+ });
362
+ });
363
+ it('[edge] should handle single-item arrays with same first and last item', () => {
364
+ // Arrange
365
+ const state = {
366
+ single_item_array: [42],
367
+ };
368
+ // Act
369
+ const printableState = (0, logger_1.getPrintableState)(state);
370
+ // Assert
371
+ expect(printableState).toEqual({
372
+ single_item_array: {
373
+ type: 'array',
374
+ length: 1,
375
+ firstItem: 42,
376
+ lastItem: undefined,
377
+ },
378
+ });
379
+ });
380
+ });
381
+ describe(logger_1.serializeAxiosError.name, () => {
382
+ it('should serialize Axios error with response data', () => {
383
+ // Arrange
384
+ const error = {
385
+ response: {
386
+ status: 500,
387
+ statusText: 'Internal Server Error',
388
+ data: 'Internal server error',
389
+ headers: { 'content-type': 'application/json' },
390
+ },
391
+ config: {
392
+ method: 'GET',
393
+ url: '/api/test',
394
+ params: { id: 123 },
395
+ },
396
+ };
397
+ // Act
398
+ const formattedError = (0, logger_1.serializeAxiosError)(error);
399
+ // Assert
400
+ expect(formattedError).toEqual({
401
+ config: {
402
+ method: 'GET',
403
+ params: { id: 123 },
404
+ url: '/api/test',
405
+ },
406
+ isAxiosError: true,
407
+ isCorsOrNoNetworkError: false,
408
+ response: {
409
+ data: 'Internal server error',
410
+ headers: { 'content-type': 'application/json' },
411
+ status: 500,
412
+ statusText: 'Internal Server Error',
413
+ },
414
+ });
415
+ });
416
+ it('should serialize Axios error without response as CORS or network error', () => {
417
+ // Arrange
418
+ const error = {
419
+ code: 'ERR_NETWORK',
420
+ message: 'Network Error',
421
+ config: {
422
+ method: 'POST',
423
+ url: '/api/create',
424
+ },
425
+ };
426
+ // Act
427
+ const formattedError = (0, logger_1.serializeAxiosError)(error);
428
+ // Assert
429
+ expect(formattedError).toEqual({
430
+ config: {
431
+ method: 'POST',
432
+ params: undefined,
433
+ url: '/api/create',
434
+ },
435
+ isAxiosError: true,
436
+ isCorsOrNoNetworkError: true,
437
+ code: 'ERR_NETWORK',
438
+ message: 'Network Error',
439
+ });
440
+ });
441
+ it('[edge] should handle Axios error with minimal config information', () => {
442
+ // Arrange
443
+ const error = {
444
+ response: {
445
+ status: 404,
446
+ data: 'Not Found',
447
+ },
448
+ config: {},
449
+ };
450
+ // Act
451
+ const formattedError = (0, logger_1.serializeAxiosError)(error);
452
+ // Assert
453
+ expect(formattedError).toEqual({
454
+ config: {
455
+ method: undefined,
456
+ params: undefined,
457
+ url: undefined,
458
+ },
459
+ isAxiosError: true,
460
+ isCorsOrNoNetworkError: false,
461
+ response: {
462
+ data: 'Not Found',
463
+ headers: undefined,
464
+ status: 404,
465
+ statusText: undefined,
466
+ },
467
+ });
468
+ });
469
+ it('[edge] should handle Axios error with no config', () => {
470
+ // Arrange
471
+ const error = {
472
+ code: 'ERR_TIMEOUT',
473
+ message: 'Request timeout',
474
+ };
475
+ // Act
476
+ const formattedError = (0, logger_1.serializeAxiosError)(error);
477
+ // Assert
478
+ expect(formattedError).toEqual({
479
+ config: {
480
+ method: undefined,
481
+ params: undefined,
482
+ url: undefined,
483
+ },
484
+ isAxiosError: true,
485
+ isCorsOrNoNetworkError: true,
486
+ code: 'ERR_TIMEOUT',
487
+ message: 'Request timeout',
488
+ });
489
+ });
490
+ });
@@ -0,0 +1,52 @@
1
+ import { AxiosResponse } from 'axios';
2
+ import { MappersCreateParams, MappersCreateResponse, MappersFactoryInterface, MappersGetByExternalIdParams, MappersGetByExternalIdResponse, MappersGetByTargetIdParams, MappersGetByTargetIdResponse, MappersUpdateParams, MappersUpdateResponse } from './mappers.interface';
3
+ /**
4
+ * Manages sync mapper records that link external system items to DevRev items.
5
+ *
6
+ * Used for tracking relationships between external and DevRev entities during sync operations.
7
+ */
8
+ export declare class Mappers {
9
+ private devrevApiEndpoint;
10
+ private devrevApiToken;
11
+ constructor({ event }: MappersFactoryInterface);
12
+ /**
13
+ * Retrieves a sync mapper record by DevRev ID.
14
+ *
15
+ * Used to find the mapping when you know the DevRev ID and want to find the external system ID.
16
+ *
17
+ * @param params - Query parameters of type MappersGetByTargetIdParams
18
+ * @returns Promise with response data containing the sync mapper record
19
+ */
20
+ getByTargetId(params: MappersGetByTargetIdParams): Promise<AxiosResponse<MappersGetByTargetIdResponse>>;
21
+ /**
22
+ * Retrieves a sync mapper record by external system ID.
23
+ *
24
+ * Used to find the mapping when you know the external system ID and want to find the DevRev ID.
25
+ *
26
+ * @param params - Query parameters of type MappersGetByExternalIdParams
27
+ * @returns Promise with response data containing the sync mapper record
28
+ */
29
+ getByExternalId(params: MappersGetByExternalIdParams): Promise<AxiosResponse<MappersGetByExternalIdResponse>>;
30
+ /**
31
+ * Creates a new sync mapper record to establish a relationship between external system
32
+ * entities and DevRev entities.
33
+ *
34
+ * This is called after importing an item from external system to DevRev to record
35
+ * the mapping for future synchronization operations.
36
+ *
37
+ * @param params - Creation parameters of type MappersCreateParams
38
+ * @returns Promise with response data containing the created sync mapper record
39
+ */
40
+ create(params: MappersCreateParams): Promise<AxiosResponse<MappersCreateResponse>>;
41
+ /**
42
+ * Updates an existing sync mapper record.
43
+ *
44
+ * Used to modify existing mappings when external system entities change or when
45
+ * additional DevRev entities need to be associated.
46
+ *
47
+ * @param params - Update parameters of type MappersUpdateParams
48
+ * @returns Promise with response data containing the updated sync mapper record
49
+ */
50
+ update(params: MappersUpdateParams): Promise<AxiosResponse<MappersUpdateResponse>>;
51
+ }
52
+ //# sourceMappingURL=mappers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../src/mappers/mappers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAItC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,4BAA4B,EAC5B,8BAA8B,EAC9B,0BAA0B,EAC1B,4BAA4B,EAC5B,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAAS;gBAEnB,EAAE,KAAK,EAAE,EAAE,uBAAuB;IAK9C;;;;;;;OAOG;IACG,aAAa,CACjB,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC;IAavD;;;;;;;OAOG;IACG,eAAe,CACnB,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,aAAa,CAAC,8BAA8B,CAAC,CAAC;IAazD;;;;;;;;;OASG;IACG,MAAM,CACV,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAYhD;;;;;;;;OAQG;IACG,MAAM,CACV,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;CAWjD"}