@wix/bex-core 2.328.0 → 2.330.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 (254) hide show
  1. package/dist/cjs/assets/locale/messages_ar.json +12 -0
  2. package/dist/cjs/assets/locale/messages_bg.json +12 -0
  3. package/dist/cjs/assets/locale/messages_ca.json +12 -0
  4. package/dist/cjs/assets/locale/messages_cs.json +12 -0
  5. package/dist/cjs/assets/locale/messages_da.json +17 -5
  6. package/dist/cjs/assets/locale/messages_de.json +12 -0
  7. package/dist/cjs/assets/locale/messages_el.json +12 -0
  8. package/dist/cjs/assets/locale/messages_en.json +12 -0
  9. package/dist/cjs/assets/locale/messages_es.json +16 -4
  10. package/dist/cjs/assets/locale/messages_fi.json +12 -0
  11. package/dist/cjs/assets/locale/messages_fr.json +12 -0
  12. package/dist/cjs/assets/locale/messages_he.json +12 -0
  13. package/dist/cjs/assets/locale/messages_hi.json +17 -5
  14. package/dist/cjs/assets/locale/messages_hu.json +12 -0
  15. package/dist/cjs/assets/locale/messages_id.json +17 -5
  16. package/dist/cjs/assets/locale/messages_it.json +17 -5
  17. package/dist/cjs/assets/locale/messages_ja.json +12 -0
  18. package/dist/cjs/assets/locale/messages_ko.json +17 -5
  19. package/dist/cjs/assets/locale/messages_lt.json +12 -0
  20. package/dist/cjs/assets/locale/messages_ms.json +12 -0
  21. package/dist/cjs/assets/locale/messages_nl.json +16 -4
  22. package/dist/cjs/assets/locale/messages_no.json +12 -0
  23. package/dist/cjs/assets/locale/messages_pl.json +12 -0
  24. package/dist/cjs/assets/locale/messages_pt.json +16 -4
  25. package/dist/cjs/assets/locale/messages_ro.json +12 -0
  26. package/dist/cjs/assets/locale/messages_ru.json +12 -0
  27. package/dist/cjs/assets/locale/messages_sk.json +12 -0
  28. package/dist/cjs/assets/locale/messages_sl.json +12 -0
  29. package/dist/cjs/assets/locale/messages_sv.json +17 -5
  30. package/dist/cjs/assets/locale/messages_th.json +17 -5
  31. package/dist/cjs/assets/locale/messages_tl.json +12 -0
  32. package/dist/cjs/assets/locale/messages_tr.json +17 -5
  33. package/dist/cjs/assets/locale/messages_uk.json +12 -0
  34. package/dist/cjs/assets/locale/messages_vi.json +17 -5
  35. package/dist/cjs/assets/locale/messages_zh.json +12 -0
  36. package/dist/cjs/assets/locale/version_file +1 -1
  37. package/dist/cjs/assets/visual-e2e-locale/messages_visuale2e.json +5 -1
  38. package/dist/cjs/hooks/useImport.js +7 -5
  39. package/dist/cjs/hooks/useImport.js.map +1 -1
  40. package/dist/cjs/hooks/useImportConfig.js.map +1 -1
  41. package/dist/cjs/index.js +5 -2
  42. package/dist/cjs/index.js.map +1 -1
  43. package/dist/cjs/services/DataExtensionFieldOperationsService.js +3 -3
  44. package/dist/cjs/services/DataExtensionFieldOperationsService.js.map +1 -1
  45. package/dist/cjs/services/translations.js.map +1 -1
  46. package/dist/cjs/state/ArchiveFieldModalState.js +5 -8
  47. package/dist/cjs/state/ArchiveFieldModalState.js.map +1 -1
  48. package/dist/cjs/state/CustomFieldModalBiReporter.js +5 -9
  49. package/dist/cjs/state/CustomFieldModalBiReporter.js.map +1 -1
  50. package/dist/cjs/state/CustomFieldModalState.js +32 -71
  51. package/dist/cjs/state/CustomFieldModalState.js.map +1 -1
  52. package/dist/cjs/state/DataExtensionState.js +0 -12
  53. package/dist/cjs/state/DataExtensionState.js.map +1 -1
  54. package/dist/cjs/state/DeleteFieldModalState.js +9 -11
  55. package/dist/cjs/state/DeleteFieldModalState.js.map +1 -1
  56. package/dist/cjs/state/{DataExtensionStateBIReporter.js → FieldOperationsBIReporter.js} +7 -32
  57. package/dist/cjs/state/FieldOperationsBIReporter.js.map +1 -0
  58. package/dist/cjs/state/ImportState/ImportState.js +383 -109
  59. package/dist/cjs/state/ImportState/ImportState.js.map +1 -1
  60. package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js +610 -0
  61. package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -0
  62. package/dist/cjs/state/ImportState/__tests__/hubJobClient.spec.js +209 -0
  63. package/dist/cjs/state/ImportState/__tests__/hubJobClient.spec.js.map +1 -0
  64. package/dist/cjs/state/ImportState/__tests__/importJobPoller.spec.js +86 -0
  65. package/dist/cjs/state/ImportState/__tests__/importJobPoller.spec.js.map +1 -0
  66. package/dist/cjs/state/ImportState/__tests__/parseCsv.spec.js +52 -0
  67. package/dist/cjs/state/ImportState/__tests__/parseCsv.spec.js.map +1 -0
  68. package/dist/cjs/state/ImportState/__tests__/rewriteCsv.spec.js +81 -0
  69. package/dist/cjs/state/ImportState/__tests__/rewriteCsv.spec.js.map +1 -0
  70. package/dist/cjs/state/ImportState/fieldEdit.js +46 -0
  71. package/dist/cjs/state/ImportState/fieldEdit.js.map +1 -0
  72. package/dist/cjs/state/ImportState/hubJobClient.js +101 -0
  73. package/dist/cjs/state/ImportState/hubJobClient.js.map +1 -0
  74. package/dist/cjs/state/ImportState/importJobPoller.js +44 -0
  75. package/dist/cjs/state/ImportState/importJobPoller.js.map +1 -0
  76. package/dist/cjs/state/ImportState/index.js +12 -0
  77. package/dist/cjs/state/ImportState/index.js.map +1 -1
  78. package/dist/cjs/state/ImportState/parseCsv.js +39 -10
  79. package/dist/cjs/state/ImportState/parseCsv.js.map +1 -1
  80. package/dist/cjs/state/ImportState/rewriteCsv.js +46 -0
  81. package/dist/cjs/state/ImportState/rewriteCsv.js.map +1 -0
  82. package/dist/cjs/state/formatPermissionsForBi.js +36 -0
  83. package/dist/cjs/state/formatPermissionsForBi.js.map +1 -0
  84. package/dist/cjs/testkit/WixPatternsContainer.driver.js +4 -1
  85. package/dist/cjs/testkit/WixPatternsContainer.driver.js.map +1 -1
  86. package/dist/cjs/testkit/client.js +6 -0
  87. package/dist/cjs/testkit/client.js.map +1 -1
  88. package/dist/cjs/testkit/hubJobImportMocks.js +166 -0
  89. package/dist/cjs/testkit/hubJobImportMocks.js.map +1 -0
  90. package/dist/cjs/testkit/index.js +6 -0
  91. package/dist/cjs/testkit/index.js.map +1 -1
  92. package/dist/cjs/types/FieldsSource.js +4 -0
  93. package/dist/cjs/types/FieldsSource.js.map +1 -0
  94. package/dist/cjs/types/Schema.js.map +1 -1
  95. package/dist/cjs/types/SchemaSource.js +81 -0
  96. package/dist/cjs/types/SchemaSource.js.map +1 -0
  97. package/dist/esm/assets/locale/messages_ar.json +12 -0
  98. package/dist/esm/assets/locale/messages_bg.json +12 -0
  99. package/dist/esm/assets/locale/messages_ca.json +12 -0
  100. package/dist/esm/assets/locale/messages_cs.json +12 -0
  101. package/dist/esm/assets/locale/messages_da.json +17 -5
  102. package/dist/esm/assets/locale/messages_de.json +12 -0
  103. package/dist/esm/assets/locale/messages_el.json +12 -0
  104. package/dist/esm/assets/locale/messages_en.json +12 -0
  105. package/dist/esm/assets/locale/messages_es.json +16 -4
  106. package/dist/esm/assets/locale/messages_fi.json +12 -0
  107. package/dist/esm/assets/locale/messages_fr.json +12 -0
  108. package/dist/esm/assets/locale/messages_he.json +12 -0
  109. package/dist/esm/assets/locale/messages_hi.json +17 -5
  110. package/dist/esm/assets/locale/messages_hu.json +12 -0
  111. package/dist/esm/assets/locale/messages_id.json +17 -5
  112. package/dist/esm/assets/locale/messages_it.json +17 -5
  113. package/dist/esm/assets/locale/messages_ja.json +12 -0
  114. package/dist/esm/assets/locale/messages_ko.json +17 -5
  115. package/dist/esm/assets/locale/messages_lt.json +12 -0
  116. package/dist/esm/assets/locale/messages_ms.json +12 -0
  117. package/dist/esm/assets/locale/messages_nl.json +16 -4
  118. package/dist/esm/assets/locale/messages_no.json +12 -0
  119. package/dist/esm/assets/locale/messages_pl.json +12 -0
  120. package/dist/esm/assets/locale/messages_pt.json +16 -4
  121. package/dist/esm/assets/locale/messages_ro.json +12 -0
  122. package/dist/esm/assets/locale/messages_ru.json +12 -0
  123. package/dist/esm/assets/locale/messages_sk.json +12 -0
  124. package/dist/esm/assets/locale/messages_sl.json +12 -0
  125. package/dist/esm/assets/locale/messages_sv.json +17 -5
  126. package/dist/esm/assets/locale/messages_th.json +17 -5
  127. package/dist/esm/assets/locale/messages_tl.json +12 -0
  128. package/dist/esm/assets/locale/messages_tr.json +17 -5
  129. package/dist/esm/assets/locale/messages_uk.json +12 -0
  130. package/dist/esm/assets/locale/messages_vi.json +17 -5
  131. package/dist/esm/assets/locale/messages_zh.json +12 -0
  132. package/dist/esm/assets/locale/version_file +1 -1
  133. package/dist/esm/assets/visual-e2e-locale/messages_visuale2e.json +5 -1
  134. package/dist/esm/hooks/useImport.js +5 -4
  135. package/dist/esm/hooks/useImport.js.map +1 -1
  136. package/dist/esm/hooks/useImportConfig.js.map +1 -1
  137. package/dist/esm/index.js +1 -0
  138. package/dist/esm/index.js.map +1 -1
  139. package/dist/esm/services/DataExtensionFieldOperationsService.js +3 -3
  140. package/dist/esm/services/DataExtensionFieldOperationsService.js.map +1 -1
  141. package/dist/esm/state/ArchiveFieldModalState.js +4 -7
  142. package/dist/esm/state/ArchiveFieldModalState.js.map +1 -1
  143. package/dist/esm/state/CustomFieldModalBiReporter.js +5 -8
  144. package/dist/esm/state/CustomFieldModalBiReporter.js.map +1 -1
  145. package/dist/esm/state/CustomFieldModalState.js +28 -52
  146. package/dist/esm/state/CustomFieldModalState.js.map +1 -1
  147. package/dist/esm/state/DataExtensionState.js +0 -10
  148. package/dist/esm/state/DataExtensionState.js.map +1 -1
  149. package/dist/esm/state/DeleteFieldModalState.js +7 -10
  150. package/dist/esm/state/DeleteFieldModalState.js.map +1 -1
  151. package/dist/esm/state/{DataExtensionStateBIReporter.js → FieldOperationsBIReporter.js} +5 -25
  152. package/dist/esm/state/FieldOperationsBIReporter.js.map +1 -0
  153. package/dist/esm/state/ImportState/ImportState.js +314 -101
  154. package/dist/esm/state/ImportState/ImportState.js.map +1 -1
  155. package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js +434 -0
  156. package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -0
  157. package/dist/esm/state/ImportState/__tests__/hubJobClient.spec.js +139 -0
  158. package/dist/esm/state/ImportState/__tests__/hubJobClient.spec.js.map +1 -0
  159. package/dist/esm/state/ImportState/__tests__/importJobPoller.spec.js +62 -0
  160. package/dist/esm/state/ImportState/__tests__/importJobPoller.spec.js.map +1 -0
  161. package/dist/esm/state/ImportState/__tests__/parseCsv.spec.js +59 -0
  162. package/dist/esm/state/ImportState/__tests__/parseCsv.spec.js.map +1 -0
  163. package/dist/esm/state/ImportState/__tests__/rewriteCsv.spec.js +68 -0
  164. package/dist/esm/state/ImportState/__tests__/rewriteCsv.spec.js.map +1 -0
  165. package/dist/esm/state/ImportState/fieldEdit.js +33 -0
  166. package/dist/esm/state/ImportState/fieldEdit.js.map +1 -0
  167. package/dist/esm/state/ImportState/hubJobClient.js +43 -0
  168. package/dist/esm/state/ImportState/hubJobClient.js.map +1 -0
  169. package/dist/esm/state/ImportState/importJobPoller.js +34 -0
  170. package/dist/esm/state/ImportState/importJobPoller.js.map +1 -0
  171. package/dist/esm/state/ImportState/index.js +2 -0
  172. package/dist/esm/state/ImportState/index.js.map +1 -1
  173. package/dist/esm/state/ImportState/parseCsv.js +34 -10
  174. package/dist/esm/state/ImportState/parseCsv.js.map +1 -1
  175. package/dist/esm/state/ImportState/rewriteCsv.js +39 -0
  176. package/dist/esm/state/ImportState/rewriteCsv.js.map +1 -0
  177. package/dist/esm/state/formatPermissionsForBi.js +26 -0
  178. package/dist/esm/state/formatPermissionsForBi.js.map +1 -0
  179. package/dist/esm/testkit/WixPatternsContainer.driver.js +4 -1
  180. package/dist/esm/testkit/WixPatternsContainer.driver.js.map +1 -1
  181. package/dist/esm/testkit/client.js +1 -0
  182. package/dist/esm/testkit/client.js.map +1 -1
  183. package/dist/esm/testkit/hubJobImportMocks.js +173 -0
  184. package/dist/esm/testkit/hubJobImportMocks.js.map +1 -0
  185. package/dist/esm/testkit/index.js +1 -0
  186. package/dist/esm/testkit/index.js.map +1 -1
  187. package/dist/esm/types/FieldsSource.js +2 -0
  188. package/dist/esm/types/FieldsSource.js.map +1 -0
  189. package/dist/esm/types/SchemaSource.js +52 -0
  190. package/dist/esm/types/SchemaSource.js.map +1 -0
  191. package/dist/types/hooks/useImport.d.ts +5 -3
  192. package/dist/types/hooks/useImport.d.ts.map +1 -1
  193. package/dist/types/hooks/useImportConfig.d.ts +2 -3
  194. package/dist/types/hooks/useImportConfig.d.ts.map +1 -1
  195. package/dist/types/index.d.ts +4 -1
  196. package/dist/types/index.d.ts.map +1 -1
  197. package/dist/types/services/translations.d.ts +1 -1
  198. package/dist/types/services/translations.d.ts.map +1 -1
  199. package/dist/types/state/ArchiveFieldModalState.d.ts +7 -5
  200. package/dist/types/state/ArchiveFieldModalState.d.ts.map +1 -1
  201. package/dist/types/state/CustomFieldModalBiReporter.d.ts +4 -3
  202. package/dist/types/state/CustomFieldModalBiReporter.d.ts.map +1 -1
  203. package/dist/types/state/CustomFieldModalState.d.ts +12 -6
  204. package/dist/types/state/CustomFieldModalState.d.ts.map +1 -1
  205. package/dist/types/state/DataExtensionState.d.ts +0 -2
  206. package/dist/types/state/DataExtensionState.d.ts.map +1 -1
  207. package/dist/types/state/DeleteFieldModalState.d.ts +8 -5
  208. package/dist/types/state/DeleteFieldModalState.d.ts.map +1 -1
  209. package/dist/types/state/{DataExtensionStateBIReporter.d.ts → FieldOperationsBIReporter.d.ts} +4 -5
  210. package/dist/types/state/FieldOperationsBIReporter.d.ts.map +1 -0
  211. package/dist/types/state/ImportState/ImportState.d.ts +120 -20
  212. package/dist/types/state/ImportState/ImportState.d.ts.map +1 -1
  213. package/dist/types/state/ImportState/__tests__/ImportState.engine.spec.d.ts +2 -0
  214. package/dist/types/state/ImportState/__tests__/ImportState.engine.spec.d.ts.map +1 -0
  215. package/dist/types/state/ImportState/__tests__/hubJobClient.spec.d.ts +2 -0
  216. package/dist/types/state/ImportState/__tests__/hubJobClient.spec.d.ts.map +1 -0
  217. package/dist/types/state/ImportState/__tests__/importJobPoller.spec.d.ts +2 -0
  218. package/dist/types/state/ImportState/__tests__/importJobPoller.spec.d.ts.map +1 -0
  219. package/dist/types/state/ImportState/__tests__/parseCsv.spec.d.ts +2 -0
  220. package/dist/types/state/ImportState/__tests__/parseCsv.spec.d.ts.map +1 -0
  221. package/dist/types/state/ImportState/__tests__/rewriteCsv.spec.d.ts +2 -0
  222. package/dist/types/state/ImportState/__tests__/rewriteCsv.spec.d.ts.map +1 -0
  223. package/dist/types/state/ImportState/fieldEdit.d.ts +10 -0
  224. package/dist/types/state/ImportState/fieldEdit.d.ts.map +1 -0
  225. package/dist/types/state/ImportState/hubJobClient.d.ts +47 -0
  226. package/dist/types/state/ImportState/hubJobClient.d.ts.map +1 -0
  227. package/dist/types/state/ImportState/importJobPoller.d.ts +20 -0
  228. package/dist/types/state/ImportState/importJobPoller.d.ts.map +1 -0
  229. package/dist/types/state/ImportState/index.d.ts +2 -0
  230. package/dist/types/state/ImportState/index.d.ts.map +1 -1
  231. package/dist/types/state/ImportState/parseCsv.d.ts +7 -0
  232. package/dist/types/state/ImportState/parseCsv.d.ts.map +1 -1
  233. package/dist/types/state/ImportState/rewriteCsv.d.ts +25 -0
  234. package/dist/types/state/ImportState/rewriteCsv.d.ts.map +1 -0
  235. package/dist/types/state/formatPermissionsForBi.d.ts +7 -0
  236. package/dist/types/state/formatPermissionsForBi.d.ts.map +1 -0
  237. package/dist/types/testkit/WixPatternsContainer.driver.d.ts +22 -0
  238. package/dist/types/testkit/WixPatternsContainer.driver.d.ts.map +1 -1
  239. package/dist/types/testkit/client.d.ts +1 -0
  240. package/dist/types/testkit/client.d.ts.map +1 -1
  241. package/dist/types/testkit/hubJobImportMocks.d.ts +40 -0
  242. package/dist/types/testkit/hubJobImportMocks.d.ts.map +1 -0
  243. package/dist/types/testkit/index.d.ts +1 -0
  244. package/dist/types/testkit/index.d.ts.map +1 -1
  245. package/dist/types/types/FieldsSource.d.ts +116 -0
  246. package/dist/types/types/FieldsSource.d.ts.map +1 -0
  247. package/dist/types/types/Schema.d.ts +28 -11
  248. package/dist/types/types/Schema.d.ts.map +1 -1
  249. package/dist/types/types/SchemaSource.d.ts +60 -0
  250. package/dist/types/types/SchemaSource.d.ts.map +1 -0
  251. package/package.json +4 -4
  252. package/dist/cjs/state/DataExtensionStateBIReporter.js.map +0 -1
  253. package/dist/esm/state/DataExtensionStateBIReporter.js.map +0 -1
  254. package/dist/types/state/DataExtensionStateBIReporter.d.ts.map +0 -1
@@ -0,0 +1,139 @@
1
+ import { createHubJobClient } from '../hubJobClient';
2
+ import { FileFormat } from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';
3
+ // Mock the SDK http factories so each returns an identifiable descriptor; the
4
+ // mocked httpClient then routes on `__fn` and we can assert the payloads.
5
+ jest.mock('@wix/bex-utils/@wix/ambassador-hub-v1-job/http', () => ({
6
+ createFileUploadUrl: jest.fn((payload) => ({
7
+ __fn: 'createFileUploadUrl',
8
+ payload,
9
+ })),
10
+ submitJob: jest.fn((payload) => ({ __fn: 'submitJob', payload })),
11
+ getJob: jest.fn((payload) => ({ __fn: 'getJob', payload })),
12
+ terminateJob: jest.fn((payload) => ({ __fn: 'terminateJob', payload })),
13
+ listMovementLogs: jest.fn((payload) => ({
14
+ __fn: 'listMovementLogs',
15
+ payload,
16
+ })),
17
+ }));
18
+ const RESPONSES = {
19
+ createFileUploadUrl: {
20
+ uploadUrl: 'https://upload.example/abc',
21
+ fileId: 'file-1',
22
+ },
23
+ submitJob: { job: { id: 'job-1' } },
24
+ getJob: { job: { id: 'job-1', status: 'IN_PROGRESS' } },
25
+ terminateJob: {},
26
+ listMovementLogs: { logs: [{ sourceItemId: '3' }] },
27
+ };
28
+ function makeDeps() {
29
+ // Routes RPC factories on `__fn`; the file upload comes in as a raw request
30
+ // config (no `__fn`) and just needs to resolve.
31
+ const request = jest.fn(async (req) => ({
32
+ data: '__fn' in req ? RESPONSES[req.__fn] : {},
33
+ status: 200,
34
+ statusText: 'OK',
35
+ headers: {},
36
+ }));
37
+ const httpClient = { request };
38
+ const withErrorHandler = jest.fn((fn) => fn());
39
+ const errorHandler = { withErrorHandler };
40
+ return { httpClient, errorHandler, request };
41
+ }
42
+ describe('hubJobClient', () => {
43
+ let client;
44
+ let request;
45
+ beforeEach(() => {
46
+ const deps = makeDeps();
47
+ request = deps.request;
48
+ client = createHubJobClient(deps);
49
+ });
50
+ describe('uploadFile', () => {
51
+ const file = new File(['a,b\n1,2'], 'data.csv', { type: 'text/csv' });
52
+ it('reserves an upload url, PUTs the file, and returns the fileId', async () => {
53
+ const fileId = await client.uploadFile(file);
54
+ expect(fileId).toBe('file-1');
55
+ // createFileUploadUrl called with the file name
56
+ expect(request).toHaveBeenCalledWith(expect.objectContaining({
57
+ __fn: 'createFileUploadUrl',
58
+ payload: { fileName: 'data.csv' },
59
+ }));
60
+ // PUT the file to the returned signed url via httpClient.request
61
+ expect(request).toHaveBeenCalledWith({
62
+ url: 'https://upload.example/abc',
63
+ method: 'PUT',
64
+ data: file,
65
+ });
66
+ });
67
+ it('rejects when the upload PUT fails (client throws on non-2xx)', async () => {
68
+ request.mockImplementation(async (req) => {
69
+ if (req.method === 'PUT') {
70
+ throw new Error('Request failed with status code 500');
71
+ }
72
+ return {
73
+ data: RESPONSES[req.__fn],
74
+ status: 200,
75
+ statusText: 'OK',
76
+ headers: {},
77
+ };
78
+ });
79
+ await expect(client.uploadFile(file)).rejects.toThrow('Request failed with status code 500');
80
+ });
81
+ });
82
+ describe('submitImportJob', () => {
83
+ const destination = { wixDataCollection: { collectionId: 'Movies' } };
84
+ it('returns the job id and sends a CSV file source with the destination', async () => {
85
+ const jobId = await client.submitImportJob({
86
+ fileId: 'file-1',
87
+ destination,
88
+ name: 'data.csv',
89
+ });
90
+ expect(jobId).toBe('job-1');
91
+ expect(request).toHaveBeenCalledWith(expect.objectContaining({
92
+ __fn: 'submitJob',
93
+ payload: expect.objectContaining({
94
+ name: 'data.csv',
95
+ source: { file: { fileId: 'file-1', format: FileFormat.CSV } },
96
+ destination,
97
+ }),
98
+ }));
99
+ });
100
+ it('throws when no job id is returned', async () => {
101
+ RESPONSES.submitJob = { job: {} };
102
+ await expect(client.submitImportJob({ fileId: 'file-1', destination })).rejects.toThrow('submitJob returned no job id');
103
+ RESPONSES.submitJob = { job: { id: 'job-1' } };
104
+ });
105
+ });
106
+ describe('getJob', () => {
107
+ it('returns the job', async () => {
108
+ const job = await client.getJob('job-1');
109
+ expect(job).toEqual({ id: 'job-1', status: 'IN_PROGRESS' });
110
+ expect(request).toHaveBeenCalledWith(expect.objectContaining({
111
+ __fn: 'getJob',
112
+ payload: { jobId: 'job-1' },
113
+ }));
114
+ });
115
+ });
116
+ describe('terminateJob', () => {
117
+ it('requests termination by job id', async () => {
118
+ await client.terminateJob('job-1');
119
+ expect(request).toHaveBeenCalledWith(expect.objectContaining({
120
+ __fn: 'terminateJob',
121
+ payload: { jobId: 'job-1' },
122
+ }));
123
+ });
124
+ });
125
+ describe('listMovementLogs', () => {
126
+ it('returns the logs response', async () => {
127
+ const res = await client.listMovementLogs('job-1');
128
+ expect(res.logs).toEqual([{ sourceItemId: '3' }]);
129
+ });
130
+ it('passes paging when provided', async () => {
131
+ await client.listMovementLogs('job-1', { limit: 50 });
132
+ expect(request).toHaveBeenCalledWith(expect.objectContaining({
133
+ __fn: 'listMovementLogs',
134
+ payload: { jobId: 'job-1', paging: { limit: 50 } },
135
+ }));
136
+ });
137
+ });
138
+ });
139
+ //# sourceMappingURL=hubJobClient.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubJobClient.spec.js","sourceRoot":"","sources":["../../../../../src/state/ImportState/__tests__/hubJobClient.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { pollImportJob, isTerminalJobStatus } from '../importJobPoller';
2
+ import { JobStatus, } from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';
3
+ const noWait = () => Promise.resolve();
4
+ describe('isTerminalJobStatus', () => {
5
+ it('is true for completed / partially successful / failed', () => {
6
+ expect(isTerminalJobStatus(JobStatus.COMPLETED)).toBe(true);
7
+ expect(isTerminalJobStatus(JobStatus.PARTIALLY_SUCCESSFUL)).toBe(true);
8
+ expect(isTerminalJobStatus(JobStatus.FAILED)).toBe(true);
9
+ });
10
+ it('is false for in-progress / initializing / undefined', () => {
11
+ expect(isTerminalJobStatus(JobStatus.IN_PROGRESS)).toBe(false);
12
+ expect(isTerminalJobStatus(JobStatus.INITIALIZING)).toBe(false);
13
+ expect(isTerminalJobStatus(undefined)).toBe(false);
14
+ });
15
+ });
16
+ describe('pollImportJob', () => {
17
+ it('polls until terminal and returns the terminal job', async () => {
18
+ const jobs = [
19
+ { id: 'j', status: JobStatus.INITIALIZING },
20
+ { id: 'j', status: JobStatus.IN_PROGRESS },
21
+ { id: 'j', status: JobStatus.COMPLETED },
22
+ ];
23
+ const getJob = jest.fn(async () => jobs.shift());
24
+ const result = await pollImportJob(getJob, 'j', { wait: noWait });
25
+ expect(getJob).toHaveBeenCalledTimes(3);
26
+ expect(result?.status).toBe(JobStatus.COMPLETED);
27
+ });
28
+ it('reports progress for every fetched job', async () => {
29
+ const jobs = [
30
+ { id: 'j', status: JobStatus.IN_PROGRESS, progress: { current: 1 } },
31
+ { id: 'j', status: JobStatus.COMPLETED, progress: { current: 2 } },
32
+ ];
33
+ const getJob = jest.fn(async () => jobs.shift());
34
+ const onProgress = jest.fn();
35
+ await pollImportJob(getJob, 'j', { wait: noWait, onProgress });
36
+ expect(onProgress).toHaveBeenCalledTimes(2);
37
+ expect(onProgress.mock.calls[1][0].progress.current).toBe(2);
38
+ });
39
+ it('stops and returns null when cancelled before the first poll', async () => {
40
+ const getJob = jest.fn();
41
+ const result = await pollImportJob(getJob, 'j', {
42
+ wait: noWait,
43
+ isCancelled: () => true,
44
+ });
45
+ expect(result).toBeNull();
46
+ expect(getJob).not.toHaveBeenCalled();
47
+ });
48
+ it('stops between polls when cancelled mid-run', async () => {
49
+ let cancelled = false;
50
+ const getJob = jest.fn(async () => {
51
+ cancelled = true; // cancel after the first fetch
52
+ return { id: 'j', status: JobStatus.IN_PROGRESS };
53
+ });
54
+ const result = await pollImportJob(getJob, 'j', {
55
+ wait: noWait,
56
+ isCancelled: () => cancelled,
57
+ });
58
+ expect(result).toBeNull();
59
+ expect(getJob).toHaveBeenCalledTimes(1);
60
+ });
61
+ });
62
+ //# sourceMappingURL=importJobPoller.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importJobPoller.spec.js","sourceRoot":"","sources":["../../../../../src/state/ImportState/__tests__/importJobPoller.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { parseCsv, parseCsvSample, unparseCsv } from '../parseCsv';
2
+ describe('parseCsv', () => {
3
+ it('splits headers from data rows', () => {
4
+ const result = parseCsv('a,b\n1,2\n3,4');
5
+ expect(result).toEqual({
6
+ headers: ['a', 'b'],
7
+ rows: [
8
+ ['1', '2'],
9
+ ['3', '4'],
10
+ ],
11
+ });
12
+ });
13
+ it('drops fully empty rows', () => {
14
+ const result = parseCsv('a,b\n1,2\n\n3,4');
15
+ expect(result).toEqual({
16
+ headers: ['a', 'b'],
17
+ rows: [
18
+ ['1', '2'],
19
+ ['3', '4'],
20
+ ],
21
+ });
22
+ });
23
+ it('returns empty headers/rows for empty content', () => {
24
+ expect(parseCsv('')).toEqual({ headers: [], rows: [] });
25
+ });
26
+ });
27
+ describe('parseCsvSample', () => {
28
+ it('returns the header plus at most maxRows data rows', () => {
29
+ const content = 'a,b\n1,1\n2,2\n3,3\n4,4\n5,5';
30
+ const result = parseCsvSample(content, 2);
31
+ expect(result).toEqual({
32
+ headers: ['a', 'b'],
33
+ rows: [
34
+ ['1', '1'],
35
+ ['2', '2'],
36
+ ],
37
+ });
38
+ });
39
+ it('returns all rows when fewer than maxRows exist', () => {
40
+ const result = parseCsvSample('a,b\n1,1', 10);
41
+ expect(result).toEqual({ headers: ['a', 'b'], rows: [['1', '1']] });
42
+ });
43
+ });
44
+ describe('unparseCsv', () => {
45
+ it('round-trips through parseCsv', () => {
46
+ const csv = unparseCsv(['title', 'price'], [
47
+ ['Apple', '1'],
48
+ ['Pear, Inc.', '2'],
49
+ ]);
50
+ expect(parseCsv(csv)).toEqual({
51
+ headers: ['title', 'price'],
52
+ rows: [
53
+ ['Apple', '1'],
54
+ ['Pear, Inc.', '2'],
55
+ ],
56
+ });
57
+ });
58
+ });
59
+ //# sourceMappingURL=parseCsv.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseCsv.spec.js","sourceRoot":"","sources":["../../../../../src/state/ImportState/__tests__/parseCsv.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnE,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;YACnB,IAAI,EAAE;gBACJ,CAAC,GAAG,EAAE,GAAG,CAAC;gBACV,CAAC,GAAG,EAAE,GAAG,CAAC;aACX;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;YACnB,IAAI,EAAE;gBACJ,CAAC,GAAG,EAAE,GAAG,CAAC;gBACV,CAAC,GAAG,EAAE,GAAG,CAAC;aACX;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,OAAO,GAAG,8BAA8B,CAAC;QAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;YACnB,IAAI,EAAE;gBACJ,CAAC,GAAG,EAAE,GAAG,CAAC;gBACV,CAAC,GAAG,EAAE,GAAG,CAAC;aACX;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,GAAG,GAAG,UAAU,CACpB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB;YACE,CAAC,OAAO,EAAE,GAAG,CAAC;YACd,CAAC,YAAY,EAAE,GAAG,CAAC;SACpB,CACF,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;YAC3B,IAAI,EAAE;gBACJ,CAAC,OAAO,EAAE,GAAG,CAAC;gBACd,CAAC,YAAY,EAAE,GAAG,CAAC;aACpB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { rewriteCsvForImport } from '../rewriteCsv';
2
+ import { parseCsv } from '../parseCsv';
3
+ // Parse the rewritten output back so assertions are on logical rows, not on
4
+ // exact serialization details.
5
+ function reparse(content) {
6
+ const result = parseCsv(content);
7
+ if ('code' in result) {
8
+ throw new Error('rewrite produced unparseable CSV');
9
+ }
10
+ return result;
11
+ }
12
+ describe('rewriteCsvForImport', () => {
13
+ it('renames headers to the destination field keys, keeping the data', () => {
14
+ const content = 'Name,Price\nApple,1\nPear,2';
15
+ const out = reparse(rewriteCsvForImport(content, { Name: 'title', Price: 'price' }));
16
+ expect(out.headers).toEqual(['title', 'price']);
17
+ expect(out.rows).toEqual([
18
+ ['Apple', '1'],
19
+ ['Pear', '2'],
20
+ ]);
21
+ });
22
+ it('drops columns mapped to null', () => {
23
+ const content = 'Name,Price,Internal\nApple,1,x\nPear,2,y';
24
+ const out = reparse(rewriteCsvForImport(content, {
25
+ Name: 'title',
26
+ Price: 'price',
27
+ Internal: null,
28
+ }));
29
+ expect(out.headers).toEqual(['title', 'price']);
30
+ expect(out.rows).toEqual([
31
+ ['Apple', '1'],
32
+ ['Pear', '2'],
33
+ ]);
34
+ });
35
+ it('drops columns absent from the mapping (treated as skip)', () => {
36
+ const content = 'Name,Extra\nApple,x';
37
+ const out = reparse(rewriteCsvForImport(content, { Name: 'title' }));
38
+ expect(out.headers).toEqual(['title']);
39
+ expect(out.rows).toEqual([['Apple']]);
40
+ });
41
+ it('keeps original column order', () => {
42
+ const content = 'A,B,C\n1,2,3';
43
+ const out = reparse(rewriteCsvForImport(content, { A: 'a', B: null, C: 'c' }));
44
+ expect(out.headers).toEqual(['a', 'c']);
45
+ expect(out.rows).toEqual([['1', '3']]);
46
+ });
47
+ it('fills missing trailing cells with empty strings', () => {
48
+ // second row is missing the Price cell
49
+ const content = 'Name,Price\nApple,1\nPear';
50
+ const out = reparse(rewriteCsvForImport(content, { Name: 'title', Price: 'price' }));
51
+ expect(out.rows).toEqual([
52
+ ['Apple', '1'],
53
+ ['Pear', ''],
54
+ ]);
55
+ });
56
+ it('returns an empty result when nothing is mapped', () => {
57
+ const content = 'Name,Price\nApple,1';
58
+ const out = rewriteCsvForImport(content, { Name: null, Price: null });
59
+ // no headers, no rows
60
+ expect(reparse(out)).toEqual({ headers: [], rows: [] });
61
+ });
62
+ it('quotes values containing commas so the round-trip is safe', () => {
63
+ const content = 'Name\n"Apple, Inc."';
64
+ const out = reparse(rewriteCsvForImport(content, { Name: 'title' }));
65
+ expect(out.rows).toEqual([['Apple, Inc.']]);
66
+ });
67
+ });
68
+ //# sourceMappingURL=rewriteCsv.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteCsv.spec.js","sourceRoot":"","sources":["../../../../../src/state/ImportState/__tests__/rewriteCsv.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ // Reverse of the import detector's vocabulary: maps a schema field type
2
+ // (`PatternsFieldType`, uppercase) back to the import flow's `NewFieldType`. Only
3
+ // the types the field editor can produce need entries; anything else falls back
4
+ // to `text`.
5
+ const PATTERNS_TO_NEW_FIELD_TYPE = {
6
+ SHORT_TEXT: 'text',
7
+ LONG_TEXT: 'text',
8
+ NUMBER: 'number',
9
+ DATE: 'date',
10
+ DATETIME: 'date',
11
+ BOOLEAN: 'boolean',
12
+ URL: 'url',
13
+ IMAGE: 'image',
14
+ VIDEO: 'video',
15
+ DOCUMENT: 'document',
16
+ AUDIO: 'audio',
17
+ };
18
+ export const toNewFieldType = (type) => PATTERNS_TO_NEW_FIELD_TYPE[type] ?? 'text';
19
+ // Converts an edited field spec (the field editor's output) into the per-column
20
+ // new-field type + config the import flow stores via `setNewFieldConfig`.
21
+ export function toFieldEdit(field) {
22
+ const config = {
23
+ ...(field.validation && { validation: field.validation }),
24
+ ...(field.isPii && { isPii: true }),
25
+ ...(field.helpText && { helpText: field.helpText }),
26
+ };
27
+ return {
28
+ fieldType: toNewFieldType(field.type),
29
+ displayName: field.displayName,
30
+ config: Object.keys(config).length > 0 ? config : undefined,
31
+ };
32
+ }
33
+ //# sourceMappingURL=fieldEdit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldEdit.js","sourceRoot":"","sources":["../../../../src/state/ImportState/fieldEdit.ts"],"names":[],"mappings":"AAIA,wEAAwE;AACxE,kFAAkF;AAClF,gFAAgF;AAChF,aAAa;AACb,MAAM,0BAA0B,GAE5B;IACF,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,SAAS;IAClB,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAuB,EAAgB,EAAE,CACtE,0BAA0B,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;AAE7C,gFAAgF;AAChF,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,KAAgB;IAK1C,MAAM,MAAM,GAAmB;QAC7B,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;QACzD,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;KACpD,CAAC;IACF,OAAO;QACL,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;QACrC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { submitJob as submitJobRequest, createFileUploadUrl as createFileUploadUrlRequest, getJob as getJobRequest, terminateJob as terminateJobRequest, listMovementLogs as listMovementLogsRequest, } from '@wix/bex-utils/@wix/ambassador-hub-v1-job/http';
2
+ import { FileFormat, } from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';
3
+ export function createHubJobClient({ httpClient, errorHandler, }) {
4
+ // Empty error-code map = default handling. Specific codes/messages need
5
+ // translation keys and are deferred to the translations task.
6
+ return {
7
+ async uploadFile(file) {
8
+ const { data: { uploadUrl, fileId }, } = await errorHandler.withErrorHandler(() => httpClient.request(createFileUploadUrlRequest({ fileName: file.name })), {});
9
+ if (!uploadUrl || !fileId) {
10
+ throw new Error('createFileUploadUrl returned no uploadUrl/fileId');
11
+ }
12
+ await errorHandler.withErrorHandler(() => httpClient.request({ url: uploadUrl, method: 'PUT', data: file }), {});
13
+ return fileId;
14
+ },
15
+ async submitImportJob({ fileId, destination, name, fileFormat = FileFormat.CSV, transformations, }) {
16
+ const { data: { job }, } = await errorHandler.withErrorHandler(() => httpClient.request(submitJobRequest({
17
+ name,
18
+ source: { file: { fileId, format: fileFormat } },
19
+ destination,
20
+ ...(transformations && { transformations }),
21
+ })), {});
22
+ if (!job?.id) {
23
+ throw new Error('submitJob returned no job id');
24
+ }
25
+ return job.id;
26
+ },
27
+ async getJob(jobId) {
28
+ const { data: { job }, } = await errorHandler.withErrorHandler(() => httpClient.request(getJobRequest({ jobId })), {});
29
+ if (!job) {
30
+ throw new Error(`getJob returned no job for "${jobId}"`);
31
+ }
32
+ return job;
33
+ },
34
+ async terminateJob(jobId) {
35
+ await errorHandler.withErrorHandler(() => httpClient.request(terminateJobRequest({ jobId })), {});
36
+ },
37
+ async listMovementLogs(jobId, paging) {
38
+ const { data } = await errorHandler.withErrorHandler(() => httpClient.request(listMovementLogsRequest({ jobId, ...(paging && { paging }) })), {});
39
+ return data;
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=hubJobClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubJobClient.js","sourceRoot":"","sources":["../../../../src/state/ImportState/hubJobClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { JobStatus, } from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';
2
+ export const JOB_POLL_INTERVAL_MS = 2000;
3
+ /** A job is terminal once it has succeeded, partially succeeded, or failed. */
4
+ export function isTerminalJobStatus(status) {
5
+ return (status === JobStatus.COMPLETED ||
6
+ status === JobStatus.PARTIALLY_SUCCESSFUL ||
7
+ status === JobStatus.FAILED);
8
+ }
9
+ /**
10
+ * Polls a data-movement job until it reaches a terminal status, then resolves
11
+ * with the terminal job. Resolves `null` if cancelled mid-poll. Pure async unit
12
+ * (no MobX) so `ImportState` stays thin and this is testable on its own.
13
+ */
14
+ export async function pollImportJob(getJob, jobId, options = {}) {
15
+ const { intervalMs = JOB_POLL_INTERVAL_MS, onProgress, isCancelled, wait = defaultWait, } = options;
16
+ for (;;) {
17
+ if (isCancelled?.()) {
18
+ return null;
19
+ }
20
+ const job = await getJob(jobId);
21
+ onProgress?.(job);
22
+ if (isTerminalJobStatus(job.status)) {
23
+ return job;
24
+ }
25
+ if (isCancelled?.()) {
26
+ return null;
27
+ }
28
+ await wait(intervalMs);
29
+ }
30
+ }
31
+ function defaultWait(ms) {
32
+ return new Promise((resolve) => setTimeout(resolve, ms));
33
+ }
34
+ //# sourceMappingURL=importJobPoller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importJobPoller.js","sourceRoot":"","sources":["../../../../src/state/ImportState/importJobPoller.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,GAEV,MAAM,iDAAiD,CAAC;AAEzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC,+EAA+E;AAC/E,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,OAAO,CACL,MAAM,KAAK,SAAS,CAAC,SAAS;QAC9B,MAAM,KAAK,SAAS,CAAC,oBAAoB;QACzC,MAAM,KAAK,SAAS,CAAC,MAAM,CAC5B,CAAC;AACJ,CAAC;AAYD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAmD,EACnD,KAAa,EACb,UAAgC,EAAE;IAElC,MAAM,EACJ,UAAU,GAAG,oBAAoB,EACjC,UAAU,EACV,WAAW,EACX,IAAI,GAAG,WAAW,GACnB,GAAG,OAAO,CAAC;IAEZ,SAAS;QACP,IAAI,WAAW,EAAE,EAAE,EAAE;YACnB,OAAO,IAAI,CAAC;SACb;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;QAElB,IAAI,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACnC,OAAO,GAAG,CAAC;SACZ;QAED,IAAI,WAAW,EAAE,EAAE,EAAE;YACnB,OAAO,IAAI,CAAC;SACb;QAED,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;KACxB;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -1,4 +1,6 @@
1
1
  export * from './ImportState';
2
2
  export * from './parseCsv';
3
+ export * from './rewriteCsv';
3
4
  export * from './detectFieldType';
5
+ export * from './hubJobClient';
4
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/state/ImportState/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/state/ImportState/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC"}
@@ -1,14 +1,5 @@
1
1
  import Papa from 'papaparse';
2
- export function parseCsv(content) {
3
- const result = Papa.parse(content, {
4
- skipEmptyLines: true,
5
- });
6
- if (result.errors.length > 0) {
7
- return {
8
- code: 'PARSE_ERROR',
9
- };
10
- }
11
- const data = result.data;
2
+ function toParseResult(data) {
12
3
  if (!data || data.length === 0) {
13
4
  return { headers: [], rows: [] };
14
5
  }
@@ -18,6 +9,39 @@ export function parseCsv(content) {
18
9
  .filter((row) => row.some((cell) => String(cell).trim() !== ''));
19
10
  return { headers, rows };
20
11
  }
12
+ function parseWith(content, extra) {
13
+ const result = Papa.parse(content, {
14
+ // Fix the delimiter to a comma rather than letting papaparse auto-detect:
15
+ // detection fails on single-column files (`UndetectableDelimiter`), and the
16
+ // import format is comma-separated anyway.
17
+ delimiter: ',',
18
+ skipEmptyLines: true,
19
+ ...extra,
20
+ });
21
+ // `FieldMismatch` (a row with too few/many cells) is recoverable — papaparse
22
+ // still returns the row's data, and the rewrite/consumer pads or ignores
23
+ // extras. Treat only other error types as fatal.
24
+ const fatalErrors = result.errors.filter((error) => error.type !== 'FieldMismatch');
25
+ if (fatalErrors.length > 0) {
26
+ return {
27
+ code: 'PARSE_ERROR',
28
+ };
29
+ }
30
+ return toParseResult(result.data);
31
+ }
32
+ export function parseCsv(content) {
33
+ return parseWith(content, {});
34
+ }
35
+ /**
36
+ * Parses only the header row plus up to `maxRows` data rows — enough to drive
37
+ * the mapping UI and column type detection without reading the whole file
38
+ * (plan D1). Uses papaparse `preview` so parsing stops early instead of
39
+ * parsing everything and slicing.
40
+ */
41
+ export function parseCsvSample(content, maxRows) {
42
+ // `preview` counts the header row, so add one to keep `maxRows` data rows.
43
+ return parseWith(content, { preview: maxRows + 1 });
44
+ }
21
45
  export function unparseCsv(headers, rows) {
22
46
  return Papa.unparse([headers, ...rows]);
23
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parseCsv.js","sourceRoot":"","sources":["../../../../src/state/ImportState/parseCsv.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAW7B,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAW,OAAO,EAAE;QAC3C,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QAC5B,OAAO;YACL,IAAI,EAAE,aAAa;SACpB,CAAC;KACH;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;KAClC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI;SACd,KAAK,CAAC,CAAC,CAAC;SACR,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEnE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAiB,EAAE,IAAgB;IAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"parseCsv.js","sourceRoot":"","sources":["../../../../src/state/ImportState/parseCsv.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAW7B,SAAS,aAAa,CAAC,IAA4B;IACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;KAClC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI;SACd,KAAK,CAAC,CAAC,CAAC;SACR,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEnE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,SAAS,CAChB,OAAe,EACf,KAAiC;IAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAW,OAAO,EAAE;QAC3C,0EAA0E;QAC1E,4EAA4E;QAC5E,2CAA2C;QAC3C,SAAS,EAAE,GAAG;QACd,cAAc,EAAE,IAAI;QACpB,GAAG,KAAK;KACT,CAAC,CAAC;IAEH,6EAA6E;IAC7E,yEAAyE;IACzE,iDAAiD;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CACtC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,CAC1C,CAAC;IACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAC1B,OAAO;YACL,IAAI,EAAE,aAAa;SACpB,CAAC;KACH;IAED,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,OAAe;IAEf,2EAA2E;IAC3E,OAAO,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAiB,EAAE,IAAgB;IAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { parseCsv, unparseCsv } from './parseCsv';
2
+ /**
3
+ * Rewrites a CSV so its header row matches the destination field keys and the
4
+ * columns the user chose to skip are dropped.
5
+ *
6
+ * The data-hub import maps columns to fields strictly by `header == field-key`
7
+ * (there is no server-side column mapping), so the chosen mapping has to be
8
+ * applied to the file itself before upload — see plan O1.
9
+ *
10
+ * `resolvedMapping` maps each *original* CSV header to its destination field
11
+ * key, or `null`/absent to skip that column — exactly what
12
+ * `ImportState._resolveFieldMapping` produces. Columns are kept in their
13
+ * original order (order is irrelevant to the server, which maps by header name,
14
+ * but it keeps the output readable).
15
+ *
16
+ * NOTE: this reads the whole file into memory. For very large files a streaming
17
+ * rewrite (papaparse `step`) would avoid that — deferred until it's a problem.
18
+ */
19
+ export function rewriteCsvForImport(content, resolvedMapping) {
20
+ const parsed = parseCsv(content);
21
+ if ('code' in parsed) {
22
+ throw new Error('Failed to parse CSV for import rewrite');
23
+ }
24
+ return rewriteParsedCsvForImport(parsed.headers, parsed.rows, resolvedMapping);
25
+ }
26
+ /**
27
+ * Same rewrite as {@link rewriteCsvForImport} but from already-parsed rows —
28
+ * used by `ImportState`, which holds the parsed CSV in memory and doesn't need
29
+ * to re-parse.
30
+ */
31
+ export function rewriteParsedCsvForImport(headers, rows, resolvedMapping) {
32
+ const kept = headers
33
+ .map((header, index) => ({ index, key: resolvedMapping[header] }))
34
+ .filter((col) => col.key != null);
35
+ const newHeaders = kept.map((col) => col.key);
36
+ const newRows = rows.map((row) => kept.map((col) => row[col.index] ?? ''));
37
+ return unparseCsv(newHeaders, newRows);
38
+ }
39
+ //# sourceMappingURL=rewriteCsv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteCsv.js","sourceRoot":"","sources":["../../../../src/state/ImportState/rewriteCsv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,eAA8C;IAE9C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,MAAM,IAAI,MAAM,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;KAC3D;IAED,OAAO,yBAAyB,CAC9B,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,IAAI,EACX,eAAe,CAChB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAiB,EACjB,IAAgB,EAChB,eAA8C;IAE9C,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACjE,MAAM,CAAC,CAAC,GAAG,EAAyC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IAE3E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAE3E,OAAO,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC"}