@devrev/airsync-sdk 2.0.0-beta.1 → 2.0.0-beta.3

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 (191) hide show
  1. package/README.md +0 -4
  2. package/dist/airsync-sdk.d.ts +2059 -0
  3. package/dist/attachments-streaming/attachments-streaming-pool.d.ts +2 -1
  4. package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
  5. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +8 -2
  6. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -1
  7. package/dist/attachments-streaming/attachments-streaming-pool.js +27 -16
  8. package/dist/attachments-streaming/attachments-streaming-pool.test.js +246 -27
  9. package/dist/common/constants.d.ts +16 -5
  10. package/dist/common/constants.d.ts.map +1 -1
  11. package/dist/common/constants.js +20 -6
  12. package/dist/common/control-protocol.d.ts +2 -2
  13. package/dist/common/control-protocol.d.ts.map +1 -1
  14. package/dist/common/control-protocol.js +1 -5
  15. package/dist/common/helpers.d.ts +8 -0
  16. package/dist/common/helpers.d.ts.map +1 -1
  17. package/dist/common/helpers.js +15 -0
  18. package/dist/common/install-initial-domain-mapping.d.ts +2 -2
  19. package/dist/common/install-initial-domain-mapping.test.js +5 -2
  20. package/dist/common/test-utils.d.ts +19 -0
  21. package/dist/common/test-utils.d.ts.map +1 -0
  22. package/dist/common/test-utils.js +101 -0
  23. package/dist/common/time-value-resolver.d.ts +47 -0
  24. package/dist/common/time-value-resolver.d.ts.map +1 -0
  25. package/dist/common/time-value-resolver.js +141 -0
  26. package/dist/common/time-value-resolver.test.d.ts +2 -0
  27. package/dist/common/time-value-resolver.test.d.ts.map +1 -0
  28. package/dist/common/time-value-resolver.test.js +268 -0
  29. package/dist/http/axios-client-internal.d.ts.map +1 -1
  30. package/dist/http/axios-client-internal.js +7 -0
  31. package/dist/http/axios-client-internal.test.js +21 -0
  32. package/dist/http/axios-client.d.ts.map +1 -1
  33. package/dist/http/axios-client.js +6 -3
  34. package/dist/http/index.d.ts +0 -1
  35. package/dist/http/index.d.ts.map +1 -1
  36. package/dist/http/index.js +0 -1
  37. package/dist/index.d.ts +12 -10
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +18 -13
  40. package/dist/logger/logger.d.ts +1 -17
  41. package/dist/logger/logger.d.ts.map +1 -1
  42. package/dist/logger/logger.interfaces.d.ts +2 -2
  43. package/dist/logger/logger.js +35 -27
  44. package/dist/logger/logger.test.js +66 -19
  45. package/dist/mappers/mappers.interface.d.ts +5 -5
  46. package/dist/mappers/mappers.interface.js +3 -3
  47. package/dist/mappers/mappers.test.js +8 -10
  48. package/dist/mock-server/mock-server.d.ts +47 -0
  49. package/dist/mock-server/mock-server.d.ts.map +1 -0
  50. package/dist/mock-server/mock-server.interfaces.d.ts +73 -0
  51. package/dist/mock-server/mock-server.interfaces.d.ts.map +1 -0
  52. package/dist/mock-server/mock-server.interfaces.js +4 -0
  53. package/dist/mock-server/mock-server.js +278 -0
  54. package/dist/multithreading/adapters/base-adapter.d.ts +56 -0
  55. package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -0
  56. package/dist/multithreading/adapters/base-adapter.emit.test.d.ts +2 -0
  57. package/dist/multithreading/adapters/base-adapter.emit.test.d.ts.map +1 -0
  58. package/dist/multithreading/adapters/base-adapter.emit.test.js +403 -0
  59. package/dist/multithreading/adapters/base-adapter.js +105 -0
  60. package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts +2 -0
  61. package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts.map +1 -0
  62. package/dist/multithreading/{worker-adapter/worker-adapter.artifacts.test.js → adapters/extraction-adapter.artifacts.test.js} +53 -5
  63. package/dist/multithreading/adapters/extraction-adapter.d.ts +58 -0
  64. package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -0
  65. package/dist/multithreading/adapters/extraction-adapter.js +325 -0
  66. package/dist/multithreading/adapters/extraction-adapter.test.d.ts +2 -0
  67. package/dist/multithreading/adapters/extraction-adapter.test.d.ts.map +1 -0
  68. package/dist/multithreading/adapters/extraction-adapter.test.js +789 -0
  69. package/dist/multithreading/adapters/loading-adapter.d.ts +44 -0
  70. package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -0
  71. package/dist/multithreading/{worker-adapter/worker-adapter.helpers.d.ts → adapters/loading-adapter.helpers.d.ts} +1 -1
  72. package/dist/multithreading/adapters/loading-adapter.helpers.d.ts.map +1 -0
  73. package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts +2 -0
  74. package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts.map +1 -0
  75. package/dist/multithreading/{worker-adapter/worker-adapter.helpers.test.js → adapters/loading-adapter.helpers.test.js} +26 -26
  76. package/dist/multithreading/adapters/loading-adapter.js +461 -0
  77. package/dist/multithreading/adapters/loading-adapter.test.d.ts +2 -0
  78. package/dist/multithreading/adapters/loading-adapter.test.d.ts.map +1 -0
  79. package/dist/multithreading/adapters/loading-adapter.test.js +589 -0
  80. package/dist/multithreading/adapters/serialization.test.d.ts +2 -0
  81. package/dist/multithreading/adapters/serialization.test.d.ts.map +1 -0
  82. package/dist/multithreading/adapters/serialization.test.js +71 -0
  83. package/dist/multithreading/create-worker.test.js +36 -17
  84. package/dist/multithreading/process-task.d.ts +16 -1
  85. package/dist/multithreading/process-task.d.ts.map +1 -1
  86. package/dist/multithreading/process-task.js +97 -82
  87. package/dist/multithreading/process-task.test.d.ts +2 -0
  88. package/dist/multithreading/process-task.test.d.ts.map +1 -0
  89. package/dist/multithreading/process-task.test.js +146 -0
  90. package/dist/multithreading/spawn/spawn.d.ts +3 -3
  91. package/dist/multithreading/spawn/spawn.d.ts.map +1 -1
  92. package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
  93. package/dist/multithreading/spawn/spawn.helpers.js +6 -14
  94. package/dist/multithreading/spawn/spawn.helpers.test.js +8 -8
  95. package/dist/multithreading/spawn/spawn.js +20 -25
  96. package/dist/multithreading/spawn/spawn.test.d.ts +2 -0
  97. package/dist/multithreading/spawn/spawn.test.d.ts.map +1 -0
  98. package/dist/multithreading/spawn/spawn.test.js +232 -0
  99. package/dist/repo/repo.d.ts.map +1 -1
  100. package/dist/repo/repo.interfaces.d.ts +4 -2
  101. package/dist/repo/repo.interfaces.d.ts.map +1 -1
  102. package/dist/repo/repo.js +4 -3
  103. package/dist/repo/repo.test.js +60 -7
  104. package/dist/state/base-state.d.ts +75 -0
  105. package/dist/state/base-state.d.ts.map +1 -0
  106. package/dist/state/base-state.js +261 -0
  107. package/dist/state/extraction-state.d.ts +29 -0
  108. package/dist/state/extraction-state.d.ts.map +1 -0
  109. package/dist/state/extraction-state.js +122 -0
  110. package/dist/state/loading-state.d.ts +19 -0
  111. package/dist/state/loading-state.d.ts.map +1 -0
  112. package/dist/state/loading-state.js +40 -0
  113. package/dist/state/state.extract-window.test.d.ts +2 -0
  114. package/dist/state/state.extract-window.test.d.ts.map +1 -0
  115. package/dist/state/state.extract-window.test.js +163 -0
  116. package/dist/state/state.interfaces.d.ts +44 -27
  117. package/dist/state/state.interfaces.d.ts.map +1 -1
  118. package/dist/state/state.interfaces.js +18 -5
  119. package/dist/state/state.pending-boundaries.test.d.ts +2 -0
  120. package/dist/state/state.pending-boundaries.test.d.ts.map +1 -0
  121. package/dist/state/state.pending-boundaries.test.js +189 -0
  122. package/dist/state/state.post-state.test.d.ts +2 -0
  123. package/dist/state/state.post-state.test.d.ts.map +1 -0
  124. package/dist/state/state.post-state.test.js +78 -0
  125. package/dist/state/state.test.js +135 -88
  126. package/dist/state/state.time-value-resolution.test.d.ts +2 -0
  127. package/dist/state/state.time-value-resolution.test.d.ts.map +1 -0
  128. package/dist/state/state.time-value-resolution.test.js +175 -0
  129. package/dist/tsdoc-metadata.json +11 -0
  130. package/dist/types/common.d.ts +0 -25
  131. package/dist/types/common.d.ts.map +1 -1
  132. package/dist/types/common.js +1 -11
  133. package/dist/types/external-domain-metadata.d.ts +20 -1
  134. package/dist/types/external-domain-metadata.d.ts.map +1 -1
  135. package/dist/types/extraction.d.ts +92 -221
  136. package/dist/types/extraction.d.ts.map +1 -1
  137. package/dist/types/extraction.js +56 -124
  138. package/dist/types/extraction.test.js +69 -43
  139. package/dist/types/index.d.ts +3 -3
  140. package/dist/types/index.d.ts.map +1 -1
  141. package/dist/types/index.js +6 -3
  142. package/dist/types/loading.d.ts +4 -24
  143. package/dist/types/loading.d.ts.map +1 -1
  144. package/dist/types/loading.js +1 -22
  145. package/dist/types/workers.d.ts +47 -29
  146. package/dist/types/workers.d.ts.map +1 -1
  147. package/dist/types/workers.js +1 -0
  148. package/dist/uploader/uploader.d.ts +1 -0
  149. package/dist/uploader/uploader.d.ts.map +1 -1
  150. package/dist/uploader/uploader.helpers.test.js +0 -11
  151. package/dist/uploader/uploader.interfaces.d.ts +3 -3
  152. package/dist/uploader/uploader.js +53 -20
  153. package/dist/uploader/uploader.test.js +22 -10
  154. package/package.json +10 -13
  155. package/dist/common/event-type-translation.d.ts +0 -24
  156. package/dist/common/event-type-translation.d.ts.map +0 -1
  157. package/dist/common/event-type-translation.js +0 -117
  158. package/dist/deprecated/adapter/index.d.ts +0 -62
  159. package/dist/deprecated/adapter/index.d.ts.map +0 -1
  160. package/dist/deprecated/adapter/index.js +0 -151
  161. package/dist/deprecated/common/helpers.d.ts +0 -7
  162. package/dist/deprecated/common/helpers.d.ts.map +0 -1
  163. package/dist/deprecated/common/helpers.js +0 -47
  164. package/dist/deprecated/demo-extractor/external_domain_metadata.json +0 -38
  165. package/dist/deprecated/demo-extractor/index.d.ts +0 -18
  166. package/dist/deprecated/demo-extractor/index.d.ts.map +0 -1
  167. package/dist/deprecated/demo-extractor/index.js +0 -161
  168. package/dist/deprecated/http/client.d.ts +0 -22
  169. package/dist/deprecated/http/client.d.ts.map +0 -1
  170. package/dist/deprecated/http/client.js +0 -161
  171. package/dist/deprecated/uploader/index.d.ts +0 -35
  172. package/dist/deprecated/uploader/index.d.ts.map +0 -1
  173. package/dist/deprecated/uploader/index.js +0 -161
  174. package/dist/http/types.d.ts +0 -17
  175. package/dist/http/types.d.ts.map +0 -1
  176. package/dist/http/types.js +0 -2
  177. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts +0 -2
  178. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts.map +0 -1
  179. package/dist/multithreading/worker-adapter/worker-adapter.d.ts +0 -91
  180. package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +0 -1
  181. package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts.map +0 -1
  182. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts +0 -2
  183. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts.map +0 -1
  184. package/dist/multithreading/worker-adapter/worker-adapter.js +0 -745
  185. package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts +0 -2
  186. package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts.map +0 -1
  187. package/dist/multithreading/worker-adapter/worker-adapter.test.js +0 -483
  188. package/dist/state/state.d.ts +0 -30
  189. package/dist/state/state.d.ts.map +0 -1
  190. package/dist/state/state.js +0 -166
  191. /package/dist/multithreading/{worker-adapter/worker-adapter.helpers.js → adapters/loading-adapter.helpers.js} +0 -0
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const constants_1 = require("../common/constants");
4
- const test_helpers_1 = require("../tests/test-helpers");
4
+ const jest_setup_1 = require("../tests/jest.setup");
5
+ const test_utils_1 = require("../common/test-utils");
5
6
  const extraction_1 = require("../types/extraction");
6
- const state_1 = require("./state");
7
+ const extraction_state_1 = require("./extraction-state");
7
8
  const state_interfaces_1 = require("./state.interfaces");
8
9
  /* eslint-disable @typescript-eslint/no-require-imports */
9
- describe(state_1.State.name, () => {
10
+ describe(extraction_state_1.ExtractionState.name, () => {
10
11
  let initSpy;
11
12
  let postStateSpy;
12
13
  let fetchStateSpy;
@@ -15,9 +16,9 @@ describe(state_1.State.name, () => {
15
16
  beforeEach(() => {
16
17
  jest.clearAllMocks();
17
18
  jest.restoreAllMocks();
18
- initSpy = jest.spyOn(state_1.State.prototype, 'init');
19
- postStateSpy = jest.spyOn(state_1.State.prototype, 'postState');
20
- fetchStateSpy = jest.spyOn(state_1.State.prototype, 'fetchState');
19
+ initSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'init');
20
+ postStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'postState');
21
+ fetchStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'fetchState');
21
22
  installInitialDomainMappingSpy = jest.spyOn(require('../common/install-initial-domain-mapping'), 'installInitialDomainMapping');
22
23
  processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
23
24
  throw new Error('process.exit called');
@@ -25,11 +26,11 @@ describe(state_1.State.name, () => {
25
26
  });
26
27
  it.each(constants_1.STATELESS_EVENT_TYPES)('should not init, fetch, post or install IDM for stateless event type %s', async (eventType) => {
27
28
  // Arrange
28
- const event = (0, test_helpers_1.createEvent)({
29
- eventType: eventType,
29
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
30
+ payload: { event_type: eventType },
30
31
  });
31
32
  // Act
32
- await (0, state_1.createAdapterState)({
33
+ await (0, extraction_state_1.createExtractionState)({
33
34
  event,
34
35
  initialState: {},
35
36
  initialDomainMapping: {},
@@ -40,48 +41,45 @@ describe(state_1.State.name, () => {
40
41
  expect(postStateSpy).not.toHaveBeenCalled();
41
42
  expect(installInitialDomainMappingSpy).not.toHaveBeenCalled();
42
43
  });
43
- it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching the state fails', async (eventType) => {
44
+ it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching the state fails for event type %s', async (eventType) => {
44
45
  // Arrange
45
- const event = (0, test_helpers_1.createEvent)({
46
- eventType: eventType,
46
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
47
+ payload: { event_type: eventType },
47
48
  });
48
49
  fetchStateSpy.mockRejectedValue({
49
50
  isAxiosError: true,
50
51
  response: { status: 500 },
51
52
  });
52
- jest.spyOn(console, 'error').mockImplementation(() => { });
53
53
  // Act & Assert
54
- await expect((0, state_1.createAdapterState)({
54
+ await expect((0, extraction_state_1.createExtractionState)({
55
55
  event,
56
56
  initialState: {},
57
57
  initialDomainMapping: {},
58
58
  })).rejects.toThrow('process.exit called');
59
59
  expect(processExitSpy).toHaveBeenCalledWith(1);
60
60
  });
61
- it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if parsing the state fails', async (eventType) => {
61
+ it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if parsing the state fails for event type %s', async (eventType) => {
62
62
  // Arrange
63
- const event = (0, test_helpers_1.createEvent)({
64
- eventType: eventType,
63
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
64
+ payload: { event_type: eventType },
65
65
  });
66
- fetchStateSpy.mockResolvedValue('invalid-json');
67
- jest.spyOn(console, 'error').mockImplementation(() => { });
66
+ fetchStateSpy.mockResolvedValue({ state: 'invalid-json' });
68
67
  // Act & Assert
69
- await expect((0, state_1.createAdapterState)({
68
+ await expect((0, extraction_state_1.createExtractionState)({
70
69
  event,
71
70
  initialState: {},
72
71
  initialDomainMapping: {},
73
72
  })).rejects.toThrow('process.exit called');
74
73
  expect(processExitSpy).toHaveBeenCalledWith(1);
75
74
  });
76
- it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching is successful but there is no state in the response', async (eventType) => {
75
+ it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching is successful but there is no state in the response for event type %s', async (eventType) => {
77
76
  // Arrange
78
- const event = (0, test_helpers_1.createEvent)({
79
- eventType: eventType,
77
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
78
+ payload: { event_type: eventType },
80
79
  });
81
- fetchStateSpy.mockResolvedValue(null);
82
- jest.spyOn(console, 'error').mockImplementation(() => { });
80
+ fetchStateSpy.mockResolvedValue({ state: null });
83
81
  // Act & Assert
84
- await expect((0, state_1.createAdapterState)({
82
+ await expect((0, extraction_state_1.createExtractionState)({
85
83
  event,
86
84
  initialState: {},
87
85
  initialDomainMapping: {},
@@ -93,11 +91,11 @@ describe(state_1.State.name, () => {
93
91
  const initialState = {
94
92
  test: 'test',
95
93
  };
96
- const event = (0, test_helpers_1.createEvent)({
97
- eventType: eventType,
98
- contextOverrides: {
94
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
95
+ context: {
99
96
  snap_in_version_id: '',
100
97
  },
98
+ payload: { event_type: eventType },
101
99
  });
102
100
  fetchStateSpy.mockRejectedValue({
103
101
  isAxiosError: true,
@@ -109,63 +107,30 @@ describe(state_1.State.name, () => {
109
107
  postStateSpy.mockResolvedValue({
110
108
  success: true,
111
109
  });
112
- jest.spyOn(console, 'log').mockImplementation(() => { });
113
110
  // Act
114
- await (0, state_1.createAdapterState)({
111
+ const adapterState = await (0, extraction_state_1.createExtractionState)({
115
112
  event,
116
113
  initialState,
117
114
  initialDomainMapping: {},
118
115
  });
119
- const expectedState = Object.assign(Object.assign({}, initialState), state_interfaces_1.extractionSdkState);
120
- expect(postStateSpy).toHaveBeenCalledWith(expectedState);
121
- });
122
- it(extraction_1.EventType.StartExtractingData, async () => {
123
- // Arrange
124
- const initialState = {
125
- test: 'test',
126
- };
127
- const event = (0, test_helpers_1.createEvent)({
128
- eventType: extraction_1.EventType.StartExtractingData,
129
- contextOverrides: {
130
- snap_in_version_id: '',
131
- },
132
- });
133
- fetchStateSpy.mockRejectedValue({
134
- isAxiosError: true,
135
- response: { status: 404 },
136
- });
137
- installInitialDomainMappingSpy.mockResolvedValue({
138
- success: true,
139
- });
140
- postStateSpy.mockResolvedValue({
141
- success: true,
142
- });
143
- jest.spyOn(console, 'log').mockImplementation(() => { });
144
- // Act
145
- await (0, state_1.createAdapterState)({
146
- event,
147
- initialState,
148
- initialDomainMapping: {},
149
- });
150
- // Assert
151
- // Verify that post state is called with object that contains
152
- // lastSyncStarted which is not empty string
153
- expect(postStateSpy).toHaveBeenCalledWith(expect.objectContaining({
154
- lastSyncStarted: expect.not.stringMatching(/^$/),
155
- }));
116
+ // On 404, init() persists the v2 envelope: connector state untouched,
117
+ // SDK bookkeeping seeded from defaults.
118
+ expect(postStateSpy).toHaveBeenCalled();
119
+ expect(adapterState.state).toEqual(initialState);
120
+ expect(adapterState.sdkState).toEqual(state_interfaces_1.initialExtractionSdkState);
156
121
  });
157
122
  it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if initialDomainMapping is not provided for event type %s', async (eventType) => {
158
123
  // Arrange
159
- const event = (0, test_helpers_1.createEvent)({
160
- eventType: eventType,
124
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
125
+ payload: { event_type: eventType },
126
+ });
127
+ fetchStateSpy.mockResolvedValue({
128
+ state: JSON.stringify({
129
+ test: 'test',
130
+ }),
161
131
  });
162
- fetchStateSpy.mockResolvedValue(JSON.stringify({
163
- test: 'test',
164
- }));
165
- jest.spyOn(console, 'log').mockImplementation(() => { });
166
- jest.spyOn(console, 'error').mockImplementation(() => { });
167
132
  // Act & Assert
168
- await expect((0, state_1.createAdapterState)({
133
+ await expect((0, extraction_state_1.createExtractionState)({
169
134
  event,
170
135
  initialState: {},
171
136
  initialDomainMapping: undefined,
@@ -174,20 +139,19 @@ describe(state_1.State.name, () => {
174
139
  });
175
140
  it.each(constants_1.STATEFUL_EVENT_TYPES)('should not install IDM if version matches for event type %s', async (eventType) => {
176
141
  // Arrange
177
- const event = (0, test_helpers_1.createEvent)({
178
- eventType: eventType,
179
- contextOverrides: {
142
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
143
+ context: {
180
144
  snap_in_version_id: '1.0.0',
181
145
  },
146
+ payload: { event_type: eventType },
182
147
  });
183
148
  const stringifiedState = JSON.stringify({
184
149
  test: 'test',
185
150
  snapInVersionId: '1.0.0',
186
151
  });
187
- fetchStateSpy.mockResolvedValue(stringifiedState);
188
- jest.spyOn(console, 'log').mockImplementation(() => { });
152
+ fetchStateSpy.mockResolvedValue({ state: stringifiedState });
189
153
  // Act & Assert
190
- await (0, state_1.createAdapterState)({
154
+ await (0, extraction_state_1.createExtractionState)({
191
155
  event,
192
156
  initialState: {},
193
157
  initialDomainMapping: {},
@@ -197,23 +161,22 @@ describe(state_1.State.name, () => {
197
161
  });
198
162
  it.each(constants_1.STATEFUL_EVENT_TYPES)('should install IDM if version does not match for event type %s', async (eventType) => {
199
163
  // Arrange
200
- const event = (0, test_helpers_1.createEvent)({
201
- eventType: eventType,
202
- contextOverrides: {
164
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
165
+ context: {
203
166
  snap_in_version_id: '2.0.0',
204
167
  },
168
+ payload: { event_type: eventType },
205
169
  });
206
170
  const stringifiedState = JSON.stringify({
207
171
  test: 'test',
208
172
  snapInVersionId: '1.0.0',
209
173
  });
210
- fetchStateSpy.mockResolvedValue(stringifiedState);
174
+ fetchStateSpy.mockResolvedValue({ state: stringifiedState });
211
175
  installInitialDomainMappingSpy.mockResolvedValue({
212
176
  success: true,
213
177
  });
214
- jest.spyOn(console, 'log').mockImplementation(() => { });
215
178
  // Act
216
- await (0, state_1.createAdapterState)({
179
+ await (0, extraction_state_1.createExtractionState)({
217
180
  event,
218
181
  initialState: {},
219
182
  initialDomainMapping: {},
@@ -221,4 +184,88 @@ describe(state_1.State.name, () => {
221
184
  // Assert
222
185
  expect(installInitialDomainMappingSpy).toHaveBeenCalled();
223
186
  });
187
+ it('should populate extractionScope from API response', async () => {
188
+ // Arrange
189
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
190
+ context: {
191
+ snap_in_version_id: '1.0.0',
192
+ },
193
+ payload: { event_type: extraction_1.EventType.StartExtractingData },
194
+ });
195
+ fetchStateSpy.mockResolvedValue({
196
+ state: JSON.stringify({ snapInVersionId: '1.0.0' }),
197
+ objects: JSON.stringify({
198
+ tasks: { extract: true },
199
+ users: { extract: true },
200
+ }),
201
+ });
202
+ // Act
203
+ const result = await (0, extraction_state_1.createExtractionState)({
204
+ event,
205
+ initialState: {},
206
+ initialDomainMapping: {},
207
+ });
208
+ // Assert
209
+ expect(result.extractionScope).toEqual({
210
+ tasks: { extract: true },
211
+ users: { extract: true },
212
+ });
213
+ });
214
+ it('should have empty extractionScope on 404', async () => {
215
+ // Arrange
216
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
217
+ context: {
218
+ snap_in_version_id: '',
219
+ },
220
+ payload: { event_type: extraction_1.EventType.StartExtractingMetadata },
221
+ });
222
+ fetchStateSpy.mockRejectedValue({
223
+ isAxiosError: true,
224
+ response: { status: 404 },
225
+ });
226
+ installInitialDomainMappingSpy.mockResolvedValue({ success: true });
227
+ postStateSpy.mockResolvedValue({ success: true });
228
+ // Act
229
+ const result = await (0, extraction_state_1.createExtractionState)({
230
+ event,
231
+ initialState: {},
232
+ initialDomainMapping: {},
233
+ });
234
+ // Assert
235
+ expect(result.extractionScope).toEqual({});
236
+ });
237
+ it('should have empty extractionScope for stateless events', async () => {
238
+ // Arrange
239
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
240
+ payload: { event_type: extraction_1.EventType.StartExtractingExternalSyncUnits },
241
+ });
242
+ // Act
243
+ const result = await (0, extraction_state_1.createExtractionState)({
244
+ event,
245
+ initialState: {},
246
+ initialDomainMapping: {},
247
+ });
248
+ // Assert
249
+ expect(result.extractionScope).toEqual({});
250
+ });
251
+ it('should continue with empty extractionScope when objects field contains invalid JSON', async () => {
252
+ // Arrange
253
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
254
+ context: { snap_in_version_id: '1.0.0' },
255
+ payload: { event_type: extraction_1.EventType.StartExtractingData },
256
+ });
257
+ fetchStateSpy.mockResolvedValue({
258
+ state: JSON.stringify({ snapInVersionId: '1.0.0' }),
259
+ objects: 'NOT_VALID_JSON',
260
+ });
261
+ // Act
262
+ const result = await (0, extraction_state_1.createExtractionState)({
263
+ event,
264
+ initialState: {},
265
+ initialDomainMapping: {},
266
+ });
267
+ // Assert: should not crash, extractionScope is empty (default)
268
+ expect(result.extractionScope).toEqual({});
269
+ expect(processExitSpy).not.toHaveBeenCalled();
270
+ });
224
271
  });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=state.time-value-resolution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.time-value-resolution.test.d.ts","sourceRoot":"","sources":["../../src/state/state.time-value-resolution.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jest_setup_1 = require("../tests/jest.setup");
4
+ const test_utils_1 = require("../common/test-utils");
5
+ const extraction_1 = require("../types/extraction");
6
+ const extraction_state_1 = require("./extraction-state");
7
+ describe('State — TimeValue resolution', () => {
8
+ let fetchStateSpy;
9
+ let processExitSpy;
10
+ beforeEach(() => {
11
+ jest.clearAllMocks();
12
+ jest.restoreAllMocks();
13
+ fetchStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'fetchState');
14
+ processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
15
+ throw new Error('process.exit called');
16
+ });
17
+ });
18
+ describe('Enhanced Control Protocol - TimeValue resolution failures', () => {
19
+ it('should exit the process if extraction_start_time resolution fails', async () => {
20
+ // Arrange: WORKERS_NEWEST type but state has no workersNewest
21
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
22
+ payload: {
23
+ event_type: extraction_1.EventType.StartExtractingMetadata,
24
+ event_context: {
25
+ extraction_start_time: {
26
+ type: extraction_1.TimeValueType.WORKERS_NEWEST,
27
+ },
28
+ },
29
+ },
30
+ });
31
+ const stringifiedState = JSON.stringify({
32
+ snapInVersionId: 'test_snap_in_version_id',
33
+ workers_oldest: '',
34
+ workers_newest: '',
35
+ });
36
+ fetchStateSpy.mockResolvedValue({ state: stringifiedState });
37
+ // Act & Assert
38
+ await expect((0, extraction_state_1.createExtractionState)({
39
+ event,
40
+ initialState: {},
41
+ initialDomainMapping: {},
42
+ })).rejects.toThrow('process.exit called');
43
+ expect(processExitSpy).toHaveBeenCalledWith(1);
44
+ });
45
+ it('should exit the process if extraction_end_time resolution fails', async () => {
46
+ // Arrange: WORKERS_NEWEST type but state has no workersNewest
47
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
48
+ payload: {
49
+ event_type: extraction_1.EventType.StartExtractingMetadata,
50
+ event_context: {
51
+ extraction_start_time: {
52
+ type: extraction_1.TimeValueType.UNBOUNDED,
53
+ },
54
+ extraction_end_time: {
55
+ type: extraction_1.TimeValueType.WORKERS_NEWEST,
56
+ },
57
+ },
58
+ },
59
+ });
60
+ const stringifiedState = JSON.stringify({
61
+ snapInVersionId: 'test_snap_in_version_id',
62
+ workers_oldest: '',
63
+ workers_newest: '',
64
+ });
65
+ fetchStateSpy.mockResolvedValue({ state: stringifiedState });
66
+ // Act & Assert
67
+ await expect((0, extraction_state_1.createExtractionState)({
68
+ event,
69
+ initialState: {},
70
+ initialDomainMapping: {},
71
+ })).rejects.toThrow('process.exit called');
72
+ expect(processExitSpy).toHaveBeenCalledWith(1);
73
+ });
74
+ });
75
+ describe('Backwards compatibility - missing TimeValue type', () => {
76
+ it('should skip resolution when extraction_start_time has no type', async () => {
77
+ // Arrange: platform sends extraction_start_time without a type field (old platform version)
78
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
79
+ context: {
80
+ snap_in_version_id: 'test_snap_in_version_id',
81
+ },
82
+ payload: {
83
+ event_type: extraction_1.EventType.StartExtractingMetadata,
84
+ event_context: {
85
+ extraction_start_time: {},
86
+ extraction_end_time: {
87
+ type: extraction_1.TimeValueType.ABSOLUTE_TIME,
88
+ value: '2025-06-01T00:00:00Z',
89
+ },
90
+ },
91
+ },
92
+ });
93
+ const stringifiedState = JSON.stringify({
94
+ snapInVersionId: 'test_snap_in_version_id',
95
+ });
96
+ fetchStateSpy.mockResolvedValue({ state: stringifiedState });
97
+ // Act
98
+ const state = await (0, extraction_state_1.createExtractionState)({
99
+ event,
100
+ initialState: {},
101
+ initialDomainMapping: {},
102
+ });
103
+ // Assert: should not crash, extract_from is not set, extract_to is resolved
104
+ expect(processExitSpy).not.toHaveBeenCalled();
105
+ expect(event.payload.event_context.extract_from).toBeUndefined();
106
+ expect(event.payload.event_context.extract_to).toBe('2025-06-01T00:00:00.000Z');
107
+ expect(state.sdkState.pendingWorkersNewest).toBe('2025-06-01T00:00:00.000Z');
108
+ });
109
+ it('should skip resolution when extraction_end_time has no type', async () => {
110
+ // Arrange: platform sends extraction_end_time without a type field
111
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
112
+ context: {
113
+ snap_in_version_id: 'test_snap_in_version_id',
114
+ },
115
+ payload: {
116
+ event_type: extraction_1.EventType.StartExtractingMetadata,
117
+ event_context: {
118
+ extraction_start_time: {
119
+ type: extraction_1.TimeValueType.ABSOLUTE_TIME,
120
+ value: '2024-01-01T00:00:00Z',
121
+ },
122
+ extraction_end_time: {},
123
+ },
124
+ },
125
+ });
126
+ const stringifiedState = JSON.stringify({
127
+ snapInVersionId: 'test_snap_in_version_id',
128
+ });
129
+ fetchStateSpy.mockResolvedValue({ state: stringifiedState });
130
+ // Act
131
+ await (0, extraction_state_1.createExtractionState)({
132
+ event,
133
+ initialState: {},
134
+ initialDomainMapping: {},
135
+ });
136
+ // Assert: should not crash, extract_to is not set, extract_from is resolved
137
+ expect(processExitSpy).not.toHaveBeenCalled();
138
+ expect(event.payload.event_context.extract_from).toBe('2024-01-01T00:00:00.000Z');
139
+ expect(event.payload.event_context.extract_to).toBeUndefined();
140
+ });
141
+ it('should skip resolution when both extraction times have no type', async () => {
142
+ // Arrange: platform sends both time values without type fields
143
+ const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
144
+ context: {
145
+ snap_in_version_id: 'test_snap_in_version_id',
146
+ },
147
+ payload: {
148
+ event_type: extraction_1.EventType.StartExtractingMetadata,
149
+ event_context: {
150
+ extraction_start_time: {
151
+ value: 'some-value',
152
+ },
153
+ extraction_end_time: {
154
+ value: 'some-value',
155
+ },
156
+ },
157
+ },
158
+ });
159
+ const stringifiedState = JSON.stringify({
160
+ snapInVersionId: 'test_snap_in_version_id',
161
+ });
162
+ fetchStateSpy.mockResolvedValue({ state: stringifiedState });
163
+ // Act
164
+ await (0, extraction_state_1.createExtractionState)({
165
+ event,
166
+ initialState: {},
167
+ initialDomainMapping: {},
168
+ });
169
+ // Assert: should not crash, neither extraction time is resolved
170
+ expect(processExitSpy).not.toHaveBeenCalled();
171
+ expect(event.payload.event_context.extract_from).toBeUndefined();
172
+ expect(event.payload.event_context.extract_to).toBeUndefined();
173
+ });
174
+ });
175
+ });
@@ -0,0 +1,11 @@
1
+ // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
+ // It should be published with your NPM package. It should not be tracked by Git.
3
+ {
4
+ "tsdocVersion": "0.12",
5
+ "toolPackages": [
6
+ {
7
+ "packageName": "@microsoft/api-extractor",
8
+ "packageVersion": "7.58.7"
9
+ }
10
+ ]
11
+ }
@@ -1,34 +1,9 @@
1
- import { Artifact } from '../uploader/uploader.interfaces';
2
- /**
3
- * ErrorLevel is an enum that represents the level of an error.
4
- * @deprecated
5
- */
6
- export declare enum ErrorLevel {
7
- Warning = "WARNING",
8
- Error = "ERROR",
9
- Info = "INFO"
10
- }
11
1
  /**
12
2
  * ErrorRecord is an interface that defines the structure of an error record.
13
3
  */
14
4
  export interface ErrorRecord {
15
5
  message: string;
16
6
  }
17
- /**
18
- * LogRecord is an interface that defines the structure of a log record.
19
- * @deprecated
20
- */
21
- export interface LogRecord {
22
- level: ErrorLevel;
23
- message: string;
24
- }
25
- /**
26
- * AdapterUpdateParams is an interface that defines the structure of the parameters that can be passed to the update adapter.
27
- * @deprecated
28
- */
29
- export interface AdapterUpdateParams {
30
- artifact?: Artifact;
31
- }
32
7
  /**
33
8
  * InitialDomainMapping is an interface that defines the structure of the initial domain mapping.
34
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAE3D;;;GAGG;AACH,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,IAAI,SAAS;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,oBAAY,QAAQ;IAClB,OAAO,YAAY;IACnB,WAAW,gBAAgB;IAC3B,OAAO,YAAY;CACpB"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,oBAAY,QAAQ;IAClB,OAAO,YAAY;IACnB,WAAW,gBAAgB;IAC3B,OAAO,YAAY;CACpB"}
@@ -1,16 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SyncMode = exports.ErrorLevel = void 0;
4
- /**
5
- * ErrorLevel is an enum that represents the level of an error.
6
- * @deprecated
7
- */
8
- var ErrorLevel;
9
- (function (ErrorLevel) {
10
- ErrorLevel["Warning"] = "WARNING";
11
- ErrorLevel["Error"] = "ERROR";
12
- ErrorLevel["Info"] = "INFO";
13
- })(ErrorLevel || (exports.ErrorLevel = ErrorLevel = {}));
3
+ exports.SyncMode = void 0;
14
4
  /**
15
5
  * SyncMode is an enum that defines the different modes of sync that can be used by the external extractor.
16
6
  * It can be either INITIAL, INCREMENTAL or LOADING. INITIAL mode is used for
@@ -19,7 +19,7 @@ export type StageKey = string;
19
19
  /**
20
20
  * Field type discriminator.
21
21
  */
22
- export type FieldType = 'bool' | 'int' | 'float' | 'text' | 'rich_text' | 'reference' | 'typed_reference' | 'enum' | 'date' | 'timestamp' | 'struct' | 'permission' | 'record_type_privilege' | 'field_privilege' | 'conditional_privilege';
22
+ export type FieldType = 'bool' | 'int' | 'float' | 'text' | 'rich_text' | 'reference' | 'typed_reference' | 'enum' | 'date' | 'timestamp' | 'struct' | 'permission' | 'record_type_privilege' | 'field_privilege' | 'conditional_privilege' | 'participation';
23
23
  /**
24
24
  * Reference type indicating parent-child relationship.
25
25
  */
@@ -113,6 +113,13 @@ export interface TypedReferenceData {
113
113
  export interface StructData {
114
114
  key?: StructTypeKey;
115
115
  }
116
+ /**
117
+ * Participation field data specifying target record types.
118
+ */
119
+ export interface ParticipationData {
120
+ /** The record types that this participation reference can refer to */
121
+ refers_to: Record<RecordTypeKey, ReferenceDetail>;
122
+ }
116
123
  /**
117
124
  * Permission data associating a reference with a role.
118
125
  */
@@ -190,6 +197,7 @@ export interface Field {
190
197
  record_type_privilege?: RecordTypePrivilegeData;
191
198
  field_privilege?: FieldPrivilegeData;
192
199
  conditional_privilege?: ConditionalPrivilegeData;
200
+ participation?: ParticipationData;
193
201
  }
194
202
  /**
195
203
  * Field condition definition.
@@ -269,6 +277,15 @@ export interface RecordTypeCategory {
269
277
  /** Indicates whether a record can move between the record types of this category while preserving its identity */
270
278
  are_record_type_conversions_possible?: boolean;
271
279
  }
280
+ /**
281
+ * Attachments configuration for a record type.
282
+ */
283
+ export interface Attachments {
284
+ /** Whether attachments can be extracted */
285
+ is_extractable?: boolean;
286
+ /** Whether attachments can be loaded: that is, whether the connector supports creating it in the system */
287
+ is_loadable?: boolean;
288
+ }
272
289
  /**
273
290
  * Record type definition.
274
291
  */
@@ -293,6 +310,8 @@ export interface RecordType {
293
310
  stage_diagram?: StageDiagram;
294
311
  /** Link naming data for custom links */
295
312
  link_naming_data?: CustomLinkData;
313
+ /** Attachments configuration */
314
+ attachments?: Attachments;
296
315
  }
297
316
  /**
298
317
  * Struct type definition for reusable field structures.