@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.
- package/README.md +31 -0
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts +16 -0
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -0
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +9 -0
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -0
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.js +2 -0
- package/dist/attachments-streaming/attachments-streaming-pool.js +97 -0
- package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts +2 -0
- package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts.map +1 -0
- package/dist/attachments-streaming/attachments-streaming-pool.test.js +267 -0
- package/dist/common/constants.d.ts +25 -0
- package/dist/common/constants.d.ts.map +1 -0
- package/dist/common/constants.js +58 -0
- package/dist/common/control-protocol.d.ts +10 -0
- package/dist/common/control-protocol.d.ts.map +1 -0
- package/dist/common/control-protocol.js +31 -0
- package/dist/common/errors.d.ts +6 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +4 -0
- package/dist/common/event-type-translation.d.ts +24 -0
- package/dist/common/event-type-translation.d.ts.map +1 -0
- package/dist/common/event-type-translation.js +117 -0
- package/dist/common/helpers.d.ts +41 -0
- package/dist/common/helpers.d.ts.map +1 -0
- package/dist/common/helpers.js +124 -0
- package/dist/common/install-initial-domain-mapping.d.ts +4 -0
- package/dist/common/install-initial-domain-mapping.d.ts.map +1 -0
- package/dist/common/install-initial-domain-mapping.js +58 -0
- package/dist/common/install-initial-domain-mapping.test.d.ts +2 -0
- package/dist/common/install-initial-domain-mapping.test.d.ts.map +1 -0
- package/dist/common/install-initial-domain-mapping.test.js +207 -0
- package/dist/deprecated/adapter/index.d.ts +62 -0
- package/dist/deprecated/adapter/index.d.ts.map +1 -0
- package/dist/deprecated/adapter/index.js +151 -0
- package/dist/deprecated/common/helpers.d.ts +7 -0
- package/dist/deprecated/common/helpers.d.ts.map +1 -0
- package/dist/deprecated/common/helpers.js +47 -0
- package/dist/deprecated/demo-extractor/external_domain_metadata.json +38 -0
- package/dist/deprecated/demo-extractor/index.d.ts +18 -0
- package/dist/deprecated/demo-extractor/index.d.ts.map +1 -0
- package/dist/deprecated/demo-extractor/index.js +161 -0
- package/dist/deprecated/http/client.d.ts +22 -0
- package/dist/deprecated/http/client.d.ts.map +1 -0
- package/dist/deprecated/http/client.js +161 -0
- package/dist/deprecated/uploader/index.d.ts +35 -0
- package/dist/deprecated/uploader/index.d.ts.map +1 -0
- package/dist/deprecated/uploader/index.js +161 -0
- package/dist/http/axios-client-internal.d.ts +3 -0
- package/dist/http/axios-client-internal.d.ts.map +1 -0
- package/dist/http/axios-client-internal.js +66 -0
- package/dist/http/axios-client-internal.test.d.ts +2 -0
- package/dist/http/axios-client-internal.test.d.ts.map +1 -0
- package/dist/http/axios-client-internal.test.js +154 -0
- package/dist/http/axios-client.d.ts +27 -0
- package/dist/http/axios-client.d.ts.map +1 -0
- package/dist/http/axios-client.js +57 -0
- package/dist/http/constants.d.ts +4 -0
- package/dist/http/constants.d.ts.map +1 -0
- package/dist/http/constants.js +6 -0
- package/dist/http/index.d.ts +3 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +18 -0
- package/dist/http/types.d.ts +17 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +2 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/logger/logger.constants.d.ts +6 -0
- package/dist/logger/logger.constants.d.ts.map +1 -0
- package/dist/logger/logger.constants.js +13 -0
- package/dist/logger/logger.context.d.ts +58 -0
- package/dist/logger/logger.context.d.ts.map +1 -0
- package/dist/logger/logger.context.js +86 -0
- package/dist/logger/logger.d.ts +89 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.interfaces.d.ts +43 -0
- package/dist/logger/logger.interfaces.d.ts.map +1 -0
- package/dist/logger/logger.interfaces.js +9 -0
- package/dist/logger/logger.js +196 -0
- package/dist/logger/logger.test.d.ts +2 -0
- package/dist/logger/logger.test.d.ts.map +1 -0
- package/dist/logger/logger.test.js +490 -0
- package/dist/mappers/mappers.d.ts +52 -0
- package/dist/mappers/mappers.d.ts.map +1 -0
- package/dist/mappers/mappers.interface.d.ts +294 -0
- package/dist/mappers/mappers.interface.d.ts.map +1 -0
- package/dist/mappers/mappers.interface.js +48 -0
- package/dist/mappers/mappers.js +83 -0
- package/dist/mappers/mappers.test.d.ts +2 -0
- package/dist/mappers/mappers.test.d.ts.map +1 -0
- package/dist/mappers/mappers.test.js +107 -0
- package/dist/multithreading/create-worker.d.ts +5 -0
- package/dist/multithreading/create-worker.d.ts.map +1 -0
- package/dist/multithreading/create-worker.js +28 -0
- package/dist/multithreading/create-worker.test.d.ts +2 -0
- package/dist/multithreading/create-worker.test.d.ts.map +1 -0
- package/dist/multithreading/create-worker.test.js +89 -0
- package/dist/multithreading/process-task.d.ts +3 -0
- package/dist/multithreading/process-task.d.ts.map +1 -0
- package/dist/multithreading/process-task.js +58 -0
- package/dist/multithreading/spawn/spawn.d.ts +30 -0
- package/dist/multithreading/spawn/spawn.d.ts.map +1 -0
- package/dist/multithreading/spawn/spawn.helpers.d.ts +21 -0
- package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -0
- package/dist/multithreading/spawn/spawn.helpers.js +114 -0
- package/dist/multithreading/spawn/spawn.helpers.test.d.ts +2 -0
- package/dist/multithreading/spawn/spawn.helpers.test.d.ts.map +1 -0
- package/dist/multithreading/spawn/spawn.helpers.test.js +293 -0
- package/dist/multithreading/spawn/spawn.js +249 -0
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.js +127 -0
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts +91 -0
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts +22 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.js +64 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.js +514 -0
- package/dist/multithreading/worker-adapter/worker-adapter.js +747 -0
- package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.test.js +483 -0
- package/dist/multithreading/worker.d.ts +2 -0
- package/dist/multithreading/worker.d.ts.map +1 -0
- package/dist/multithreading/worker.js +9 -0
- package/dist/repo/repo.d.ts +18 -0
- package/dist/repo/repo.d.ts.map +1 -0
- package/dist/repo/repo.interfaces.d.ts +46 -0
- package/dist/repo/repo.interfaces.d.ts.map +1 -0
- package/dist/repo/repo.interfaces.js +2 -0
- package/dist/repo/repo.js +75 -0
- package/dist/repo/repo.test.d.ts +2 -0
- package/dist/repo/repo.test.d.ts.map +1 -0
- package/dist/repo/repo.test.js +131 -0
- package/dist/state/state.d.ts +30 -0
- package/dist/state/state.d.ts.map +1 -0
- package/dist/state/state.interfaces.d.ts +51 -0
- package/dist/state/state.interfaces.d.ts.map +1 -0
- package/dist/state/state.interfaces.js +21 -0
- package/dist/state/state.js +166 -0
- package/dist/state/state.test.d.ts +2 -0
- package/dist/state/state.test.d.ts.map +1 -0
- package/dist/state/state.test.js +224 -0
- package/dist/types/common.d.ts +50 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +25 -0
- package/dist/types/extraction.d.ts +417 -0
- package/dist/types/extraction.d.ts.map +1 -0
- package/dist/types/extraction.js +170 -0
- package/dist/types/extraction.test.d.ts +2 -0
- package/dist/types/extraction.test.d.ts.map +1 -0
- package/dist/types/extraction.test.js +70 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/loading.d.ts +147 -0
- package/dist/types/loading.d.ts.map +1 -0
- package/dist/types/loading.js +48 -0
- package/dist/types/workers.d.ts +161 -0
- package/dist/types/workers.d.ts.map +1 -0
- package/dist/types/workers.js +22 -0
- package/dist/uploader/uploader.d.ts +92 -0
- package/dist/uploader/uploader.d.ts.map +1 -0
- package/dist/uploader/uploader.helpers.d.ts +33 -0
- package/dist/uploader/uploader.helpers.d.ts.map +1 -0
- package/dist/uploader/uploader.helpers.js +139 -0
- package/dist/uploader/uploader.helpers.test.d.ts +2 -0
- package/dist/uploader/uploader.helpers.test.d.ts.map +1 -0
- package/dist/uploader/uploader.helpers.test.js +267 -0
- package/dist/uploader/uploader.interfaces.d.ts +95 -0
- package/dist/uploader/uploader.interfaces.d.ts.map +1 -0
- package/dist/uploader/uploader.interfaces.js +2 -0
- package/dist/uploader/uploader.js +305 -0
- package/dist/uploader/uploader.test.d.ts +2 -0
- package/dist/uploader/uploader.test.d.ts.map +1 -0
- package/dist/uploader/uploader.test.js +589 -0
- 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"}
|