@payloadcms/plugin-import-export 3.71.0-internal.ef75fa0 → 3.71.1

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 (322) hide show
  1. package/dist/components/CollectionField/index.d.ts.map +1 -1
  2. package/dist/components/CollectionField/index.js +8 -3
  3. package/dist/components/CollectionField/index.js.map +1 -1
  4. package/dist/components/ExportListMenuItem/index.d.ts +0 -1
  5. package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
  6. package/dist/components/ExportListMenuItem/index.js +0 -1
  7. package/dist/components/ExportListMenuItem/index.js.map +1 -1
  8. package/dist/components/ExportPreview/index.d.ts +4 -0
  9. package/dist/components/ExportPreview/index.d.ts.map +1 -0
  10. package/dist/components/ExportPreview/index.js +252 -0
  11. package/dist/components/ExportPreview/index.js.map +1 -0
  12. package/dist/components/ExportPreview/index.scss +36 -0
  13. package/dist/components/ImportCollectionField/index.d.ts +3 -0
  14. package/dist/components/ImportCollectionField/index.d.ts.map +1 -0
  15. package/dist/components/ImportCollectionField/index.js +17 -0
  16. package/dist/components/ImportCollectionField/index.js.map +1 -0
  17. package/dist/components/ImportListMenuItem/index.d.ts +6 -0
  18. package/dist/components/ImportListMenuItem/index.d.ts.map +1 -0
  19. package/dist/components/ImportListMenuItem/index.js +48 -0
  20. package/dist/components/ImportListMenuItem/index.js.map +1 -0
  21. package/dist/components/ImportPreview/index.d.ts +4 -0
  22. package/dist/components/ImportPreview/index.d.ts.map +1 -0
  23. package/dist/components/ImportPreview/index.js +624 -0
  24. package/dist/components/ImportPreview/index.js.map +1 -0
  25. package/dist/components/ImportPreview/index.scss +41 -0
  26. package/dist/components/ImportSaveButton/index.d.ts +2 -0
  27. package/dist/components/ImportSaveButton/index.d.ts.map +1 -0
  28. package/dist/components/ImportSaveButton/index.js +18 -0
  29. package/dist/components/ImportSaveButton/index.js.map +1 -0
  30. package/dist/components/Page/index.scss +4 -2
  31. package/dist/constants.d.ts +21 -0
  32. package/dist/constants.d.ts.map +1 -0
  33. package/dist/constants.js +21 -0
  34. package/dist/constants.js.map +1 -0
  35. package/dist/export/batchProcessor.d.ts +107 -0
  36. package/dist/export/batchProcessor.d.ts.map +1 -0
  37. package/dist/export/batchProcessor.js +187 -0
  38. package/dist/export/batchProcessor.js.map +1 -0
  39. package/dist/export/createExport.d.ts +9 -4
  40. package/dist/export/createExport.d.ts.map +1 -1
  41. package/dist/export/createExport.js +163 -111
  42. package/dist/export/createExport.js.map +1 -1
  43. package/dist/export/getCreateExportCollectionTask.d.ts +1 -2
  44. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
  45. package/dist/export/getCreateExportCollectionTask.js +10 -18
  46. package/dist/export/getCreateExportCollectionTask.js.map +1 -1
  47. package/dist/export/getExportCollection.d.ts +8 -0
  48. package/dist/export/getExportCollection.d.ts.map +1 -0
  49. package/dist/export/getExportCollection.js +100 -0
  50. package/dist/export/getExportCollection.js.map +1 -0
  51. package/dist/export/getFields.d.ts +8 -2
  52. package/dist/export/getFields.d.ts.map +1 -1
  53. package/dist/export/getFields.js +7 -9
  54. package/dist/export/getFields.js.map +1 -1
  55. package/dist/export/handleDownload.d.ts +3 -0
  56. package/dist/export/handleDownload.d.ts.map +1 -0
  57. package/dist/export/{download.js → handleDownload.js} +7 -6
  58. package/dist/export/handleDownload.js.map +1 -0
  59. package/dist/export/handlePreview.d.ts +3 -0
  60. package/dist/export/handlePreview.d.ts.map +1 -0
  61. package/dist/export/handlePreview.js +163 -0
  62. package/dist/export/handlePreview.js.map +1 -0
  63. package/dist/exports/rsc.d.ts +5 -1
  64. package/dist/exports/rsc.d.ts.map +1 -1
  65. package/dist/exports/rsc.js +5 -1
  66. package/dist/exports/rsc.js.map +1 -1
  67. package/dist/import/batchProcessor.d.ts +46 -0
  68. package/dist/import/batchProcessor.d.ts.map +1 -0
  69. package/dist/import/batchProcessor.js +529 -0
  70. package/dist/import/batchProcessor.js.map +1 -0
  71. package/dist/import/createImport.d.ts +45 -0
  72. package/dist/import/createImport.d.ts.map +1 -0
  73. package/dist/import/createImport.js +175 -0
  74. package/dist/import/createImport.js.map +1 -0
  75. package/dist/import/getCreateImportCollectionTask.d.ts +13 -0
  76. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -0
  77. package/dist/import/getCreateImportCollectionTask.js +81 -0
  78. package/dist/import/getCreateImportCollectionTask.js.map +1 -0
  79. package/dist/import/getFields.d.ts +7 -0
  80. package/dist/import/getFields.d.ts.map +1 -0
  81. package/dist/import/getFields.js +150 -0
  82. package/dist/import/getFields.js.map +1 -0
  83. package/dist/import/getImportCollection.d.ts +8 -0
  84. package/dist/import/getImportCollection.d.ts.map +1 -0
  85. package/dist/import/getImportCollection.js +258 -0
  86. package/dist/import/getImportCollection.js.map +1 -0
  87. package/dist/import/handlePreview.d.ts +3 -0
  88. package/dist/import/handlePreview.d.ts.map +1 -0
  89. package/dist/import/handlePreview.js +94 -0
  90. package/dist/import/handlePreview.js.map +1 -0
  91. package/dist/index.d.ts +3 -2
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +68 -110
  94. package/dist/index.js.map +1 -1
  95. package/dist/translations/languages/ar.d.ts.map +1 -1
  96. package/dist/translations/languages/ar.js +21 -1
  97. package/dist/translations/languages/ar.js.map +1 -1
  98. package/dist/translations/languages/az.d.ts.map +1 -1
  99. package/dist/translations/languages/az.js +21 -1
  100. package/dist/translations/languages/az.js.map +1 -1
  101. package/dist/translations/languages/bg.d.ts.map +1 -1
  102. package/dist/translations/languages/bg.js +21 -1
  103. package/dist/translations/languages/bg.js.map +1 -1
  104. package/dist/translations/languages/bnBd.d.ts +4 -0
  105. package/dist/translations/languages/bnBd.d.ts.map +1 -0
  106. package/dist/translations/languages/bnBd.js +48 -0
  107. package/dist/translations/languages/bnBd.js.map +1 -0
  108. package/dist/translations/languages/bnIn.d.ts +4 -0
  109. package/dist/translations/languages/bnIn.d.ts.map +1 -0
  110. package/dist/translations/languages/bnIn.js +48 -0
  111. package/dist/translations/languages/bnIn.js.map +1 -0
  112. package/dist/translations/languages/ca.d.ts.map +1 -1
  113. package/dist/translations/languages/ca.js +21 -1
  114. package/dist/translations/languages/ca.js.map +1 -1
  115. package/dist/translations/languages/cs.d.ts.map +1 -1
  116. package/dist/translations/languages/cs.js +21 -1
  117. package/dist/translations/languages/cs.js.map +1 -1
  118. package/dist/translations/languages/da.d.ts.map +1 -1
  119. package/dist/translations/languages/da.js +21 -1
  120. package/dist/translations/languages/da.js.map +1 -1
  121. package/dist/translations/languages/de.d.ts.map +1 -1
  122. package/dist/translations/languages/de.js +21 -1
  123. package/dist/translations/languages/de.js.map +1 -1
  124. package/dist/translations/languages/en.d.ts +20 -0
  125. package/dist/translations/languages/en.d.ts.map +1 -1
  126. package/dist/translations/languages/en.js +21 -1
  127. package/dist/translations/languages/en.js.map +1 -1
  128. package/dist/translations/languages/es.d.ts.map +1 -1
  129. package/dist/translations/languages/es.js +21 -1
  130. package/dist/translations/languages/es.js.map +1 -1
  131. package/dist/translations/languages/et.d.ts.map +1 -1
  132. package/dist/translations/languages/et.js +21 -1
  133. package/dist/translations/languages/et.js.map +1 -1
  134. package/dist/translations/languages/fa.d.ts.map +1 -1
  135. package/dist/translations/languages/fa.js +21 -1
  136. package/dist/translations/languages/fa.js.map +1 -1
  137. package/dist/translations/languages/fr.d.ts.map +1 -1
  138. package/dist/translations/languages/fr.js +21 -1
  139. package/dist/translations/languages/fr.js.map +1 -1
  140. package/dist/translations/languages/he.d.ts.map +1 -1
  141. package/dist/translations/languages/he.js +21 -1
  142. package/dist/translations/languages/he.js.map +1 -1
  143. package/dist/translations/languages/hr.d.ts.map +1 -1
  144. package/dist/translations/languages/hr.js +21 -1
  145. package/dist/translations/languages/hr.js.map +1 -1
  146. package/dist/translations/languages/hu.d.ts.map +1 -1
  147. package/dist/translations/languages/hu.js +21 -1
  148. package/dist/translations/languages/hu.js.map +1 -1
  149. package/dist/translations/languages/hy.d.ts.map +1 -1
  150. package/dist/translations/languages/hy.js +21 -1
  151. package/dist/translations/languages/hy.js.map +1 -1
  152. package/dist/translations/languages/id.d.ts +4 -0
  153. package/dist/translations/languages/id.d.ts.map +1 -0
  154. package/dist/translations/languages/id.js +48 -0
  155. package/dist/translations/languages/id.js.map +1 -0
  156. package/dist/translations/languages/is.d.ts.map +1 -1
  157. package/dist/translations/languages/is.js +21 -1
  158. package/dist/translations/languages/is.js.map +1 -1
  159. package/dist/translations/languages/it.d.ts.map +1 -1
  160. package/dist/translations/languages/it.js +21 -1
  161. package/dist/translations/languages/it.js.map +1 -1
  162. package/dist/translations/languages/ja.d.ts.map +1 -1
  163. package/dist/translations/languages/ja.js +21 -1
  164. package/dist/translations/languages/ja.js.map +1 -1
  165. package/dist/translations/languages/ko.d.ts.map +1 -1
  166. package/dist/translations/languages/ko.js +21 -1
  167. package/dist/translations/languages/ko.js.map +1 -1
  168. package/dist/translations/languages/lt.d.ts.map +1 -1
  169. package/dist/translations/languages/lt.js +21 -1
  170. package/dist/translations/languages/lt.js.map +1 -1
  171. package/dist/translations/languages/lv.d.ts.map +1 -1
  172. package/dist/translations/languages/lv.js +26 -6
  173. package/dist/translations/languages/lv.js.map +1 -1
  174. package/dist/translations/languages/my.d.ts.map +1 -1
  175. package/dist/translations/languages/my.js +21 -1
  176. package/dist/translations/languages/my.js.map +1 -1
  177. package/dist/translations/languages/nb.d.ts.map +1 -1
  178. package/dist/translations/languages/nb.js +21 -1
  179. package/dist/translations/languages/nb.js.map +1 -1
  180. package/dist/translations/languages/nl.d.ts.map +1 -1
  181. package/dist/translations/languages/nl.js +21 -1
  182. package/dist/translations/languages/nl.js.map +1 -1
  183. package/dist/translations/languages/pl.d.ts.map +1 -1
  184. package/dist/translations/languages/pl.js +21 -1
  185. package/dist/translations/languages/pl.js.map +1 -1
  186. package/dist/translations/languages/pt.d.ts.map +1 -1
  187. package/dist/translations/languages/pt.js +21 -1
  188. package/dist/translations/languages/pt.js.map +1 -1
  189. package/dist/translations/languages/ro.d.ts.map +1 -1
  190. package/dist/translations/languages/ro.js +21 -1
  191. package/dist/translations/languages/ro.js.map +1 -1
  192. package/dist/translations/languages/rs.d.ts.map +1 -1
  193. package/dist/translations/languages/rs.js +21 -1
  194. package/dist/translations/languages/rs.js.map +1 -1
  195. package/dist/translations/languages/rsLatin.d.ts.map +1 -1
  196. package/dist/translations/languages/rsLatin.js +21 -1
  197. package/dist/translations/languages/rsLatin.js.map +1 -1
  198. package/dist/translations/languages/ru.d.ts.map +1 -1
  199. package/dist/translations/languages/ru.js +21 -1
  200. package/dist/translations/languages/ru.js.map +1 -1
  201. package/dist/translations/languages/sk.d.ts.map +1 -1
  202. package/dist/translations/languages/sk.js +21 -1
  203. package/dist/translations/languages/sk.js.map +1 -1
  204. package/dist/translations/languages/sl.d.ts.map +1 -1
  205. package/dist/translations/languages/sl.js +21 -1
  206. package/dist/translations/languages/sl.js.map +1 -1
  207. package/dist/translations/languages/sv.d.ts.map +1 -1
  208. package/dist/translations/languages/sv.js +21 -1
  209. package/dist/translations/languages/sv.js.map +1 -1
  210. package/dist/translations/languages/ta.d.ts.map +1 -1
  211. package/dist/translations/languages/ta.js +21 -1
  212. package/dist/translations/languages/ta.js.map +1 -1
  213. package/dist/translations/languages/th.d.ts.map +1 -1
  214. package/dist/translations/languages/th.js +21 -1
  215. package/dist/translations/languages/th.js.map +1 -1
  216. package/dist/translations/languages/tr.d.ts.map +1 -1
  217. package/dist/translations/languages/tr.js +21 -1
  218. package/dist/translations/languages/tr.js.map +1 -1
  219. package/dist/translations/languages/uk.d.ts.map +1 -1
  220. package/dist/translations/languages/uk.js +21 -1
  221. package/dist/translations/languages/uk.js.map +1 -1
  222. package/dist/translations/languages/vi.d.ts.map +1 -1
  223. package/dist/translations/languages/vi.js +21 -1
  224. package/dist/translations/languages/vi.js.map +1 -1
  225. package/dist/translations/languages/zh.d.ts.map +1 -1
  226. package/dist/translations/languages/zh.js +21 -1
  227. package/dist/translations/languages/zh.js.map +1 -1
  228. package/dist/translations/languages/zhTw.d.ts.map +1 -1
  229. package/dist/translations/languages/zhTw.js +21 -1
  230. package/dist/translations/languages/zhTw.js.map +1 -1
  231. package/dist/translations/types.d.ts +13 -0
  232. package/dist/translations/types.d.ts.map +1 -1
  233. package/dist/translations/types.js.map +1 -1
  234. package/dist/types.d.ts +166 -22
  235. package/dist/types.d.ts.map +1 -1
  236. package/dist/types.js +1 -1
  237. package/dist/types.js.map +1 -1
  238. package/dist/utilities/flattenObject.d.ts.map +1 -0
  239. package/dist/{export → utilities}/flattenObject.js +13 -6
  240. package/dist/utilities/flattenObject.js.map +1 -0
  241. package/dist/utilities/getExportFieldFunctions.d.ts +12 -0
  242. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -0
  243. package/dist/{export/getCustomFieldFunctions.js → utilities/getExportFieldFunctions.js} +18 -2
  244. package/dist/utilities/getExportFieldFunctions.js.map +1 -0
  245. package/dist/utilities/getFilename.d.ts +6 -0
  246. package/dist/utilities/getFilename.d.ts.map +1 -0
  247. package/dist/{export → utilities}/getFilename.js +4 -1
  248. package/dist/utilities/getFilename.js.map +1 -0
  249. package/dist/utilities/getFlattenedFieldKeys.d.ts +12 -1
  250. package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -1
  251. package/dist/utilities/getFlattenedFieldKeys.js +35 -10
  252. package/dist/utilities/getFlattenedFieldKeys.js.map +1 -1
  253. package/dist/utilities/getImportFieldFunctions.d.ts +12 -0
  254. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -0
  255. package/dist/utilities/getImportFieldFunctions.js +130 -0
  256. package/dist/utilities/getImportFieldFunctions.js.map +1 -0
  257. package/dist/utilities/getPluginCollections.d.ts +39 -0
  258. package/dist/utilities/getPluginCollections.d.ts.map +1 -0
  259. package/dist/utilities/getPluginCollections.js +102 -0
  260. package/dist/utilities/getPluginCollections.js.map +1 -0
  261. package/dist/utilities/getSchemaColumns.d.ts +43 -0
  262. package/dist/utilities/getSchemaColumns.d.ts.map +1 -0
  263. package/dist/utilities/getSchemaColumns.js +163 -0
  264. package/dist/utilities/getSchemaColumns.js.map +1 -0
  265. package/dist/utilities/getSelect.d.ts +11 -0
  266. package/dist/utilities/getSelect.d.ts.map +1 -0
  267. package/dist/{export → utilities}/getSelect.js +6 -2
  268. package/dist/utilities/getSelect.js.map +1 -0
  269. package/dist/utilities/parseCSV.d.ts +11 -0
  270. package/dist/utilities/parseCSV.d.ts.map +1 -0
  271. package/dist/utilities/parseCSV.js +67 -0
  272. package/dist/utilities/parseCSV.js.map +1 -0
  273. package/dist/utilities/parseCSV.spec.js +169 -0
  274. package/dist/utilities/parseCSV.spec.js.map +1 -0
  275. package/dist/utilities/parseJSON.d.ts +11 -0
  276. package/dist/utilities/parseJSON.d.ts.map +1 -0
  277. package/dist/utilities/parseJSON.js +25 -0
  278. package/dist/utilities/parseJSON.js.map +1 -0
  279. package/dist/utilities/processRichTextField.d.ts +6 -0
  280. package/dist/utilities/processRichTextField.d.ts.map +1 -0
  281. package/dist/utilities/processRichTextField.js +45 -0
  282. package/dist/utilities/processRichTextField.js.map +1 -0
  283. package/dist/utilities/unflattenObject.d.ts +11 -0
  284. package/dist/utilities/unflattenObject.d.ts.map +1 -0
  285. package/dist/utilities/unflattenObject.js +431 -0
  286. package/dist/utilities/unflattenObject.js.map +1 -0
  287. package/dist/utilities/unflattenObject.spec.js +680 -0
  288. package/dist/utilities/unflattenObject.spec.js.map +1 -0
  289. package/dist/utilities/useBatchProcessor.d.ts +103 -0
  290. package/dist/utilities/useBatchProcessor.d.ts.map +1 -0
  291. package/dist/utilities/useBatchProcessor.js +88 -0
  292. package/dist/utilities/useBatchProcessor.js.map +1 -0
  293. package/dist/utilities/validateLimitValue.d.ts +1 -1
  294. package/dist/utilities/validateLimitValue.d.ts.map +1 -1
  295. package/dist/utilities/validateLimitValue.js +1 -4
  296. package/dist/utilities/validateLimitValue.js.map +1 -1
  297. package/package.json +9 -9
  298. package/dist/components/ExportListMenuItem/index.scss +0 -52
  299. package/dist/components/Preview/index.d.ts +0 -4
  300. package/dist/components/Preview/index.d.ts.map +0 -1
  301. package/dist/components/Preview/index.js +0 -180
  302. package/dist/components/Preview/index.js.map +0 -1
  303. package/dist/components/Preview/index.scss +0 -8
  304. package/dist/export/download.d.ts +0 -3
  305. package/dist/export/download.d.ts.map +0 -1
  306. package/dist/export/download.js.map +0 -1
  307. package/dist/export/flattenObject.d.ts.map +0 -1
  308. package/dist/export/flattenObject.js.map +0 -1
  309. package/dist/export/getCustomFieldFunctions.d.ts +0 -8
  310. package/dist/export/getCustomFieldFunctions.d.ts.map +0 -1
  311. package/dist/export/getCustomFieldFunctions.js.map +0 -1
  312. package/dist/export/getFilename.d.ts +0 -2
  313. package/dist/export/getFilename.d.ts.map +0 -1
  314. package/dist/export/getFilename.js.map +0 -1
  315. package/dist/export/getSelect.d.ts +0 -7
  316. package/dist/export/getSelect.d.ts.map +0 -1
  317. package/dist/export/getSelect.js.map +0 -1
  318. package/dist/getExportCollection.d.ts +0 -7
  319. package/dist/getExportCollection.d.ts.map +0 -1
  320. package/dist/getExportCollection.js +0 -86
  321. package/dist/getExportCollection.js.map +0 -1
  322. /package/dist/{export → utilities}/flattenObject.d.ts +0 -0
@@ -0,0 +1,680 @@
1
+ import { unflattenObject } from './unflattenObject.js';
2
+ import { describe, it, expect, vi } from 'vitest';
3
+ describe('unflattenObject', ()=>{
4
+ const mockReq = {
5
+ payload: {
6
+ logger: {
7
+ error: vi.fn()
8
+ }
9
+ }
10
+ };
11
+ describe('hasMany number fields', ()=>{
12
+ const fields = [
13
+ {
14
+ name: 'hasManyNumber',
15
+ type: 'number',
16
+ hasMany: true
17
+ }
18
+ ];
19
+ it('should handle comma-separated number strings', ()=>{
20
+ const data = {
21
+ hasManyNumber: '1,2,3,5,8'
22
+ };
23
+ const result = unflattenObject({
24
+ data,
25
+ fields,
26
+ req: mockReq
27
+ });
28
+ expect(result).toEqual({
29
+ hasManyNumber: [
30
+ 1,
31
+ 2,
32
+ 3,
33
+ 5,
34
+ 8
35
+ ]
36
+ });
37
+ });
38
+ it('should handle comma-separated numbers with spaces', ()=>{
39
+ const data = {
40
+ hasManyNumber: ' 10 , 20 , 30 '
41
+ };
42
+ const result = unflattenObject({
43
+ data,
44
+ fields,
45
+ req: mockReq
46
+ });
47
+ expect(result).toEqual({
48
+ hasManyNumber: [
49
+ 10,
50
+ 20,
51
+ 30
52
+ ]
53
+ });
54
+ });
55
+ it('should filter out empty values in comma-separated strings', ()=>{
56
+ const data = {
57
+ hasManyNumber: '1,,3,,5'
58
+ };
59
+ const result = unflattenObject({
60
+ data,
61
+ fields,
62
+ req: mockReq
63
+ });
64
+ expect(result).toEqual({
65
+ hasManyNumber: [
66
+ 1,
67
+ 3,
68
+ 5
69
+ ]
70
+ });
71
+ });
72
+ it('should handle single number values', ()=>{
73
+ const data = {
74
+ hasManyNumber: 42
75
+ };
76
+ const result = unflattenObject({
77
+ data,
78
+ fields,
79
+ req: mockReq
80
+ });
81
+ expect(result).toEqual({
82
+ hasManyNumber: [
83
+ 42
84
+ ]
85
+ });
86
+ });
87
+ it('should handle single string number values', ()=>{
88
+ const data = {
89
+ hasManyNumber: '42'
90
+ };
91
+ const result = unflattenObject({
92
+ data,
93
+ fields,
94
+ req: mockReq
95
+ });
96
+ expect(result).toEqual({
97
+ hasManyNumber: [
98
+ 42
99
+ ]
100
+ });
101
+ });
102
+ it('should handle indexed array format', ()=>{
103
+ const data = {
104
+ hasManyNumber_0: 1,
105
+ hasManyNumber_1: 2,
106
+ hasManyNumber_2: 3
107
+ };
108
+ const result = unflattenObject({
109
+ data,
110
+ fields,
111
+ req: mockReq
112
+ });
113
+ expect(result).toEqual({
114
+ hasManyNumber: [
115
+ 1,
116
+ 2,
117
+ 3
118
+ ]
119
+ });
120
+ });
121
+ it('should filter out null and empty values from indexed arrays', ()=>{
122
+ const data = {
123
+ hasManyNumber_0: 1,
124
+ hasManyNumber_1: null,
125
+ hasManyNumber_2: '',
126
+ hasManyNumber_3: 3
127
+ };
128
+ const result = unflattenObject({
129
+ data,
130
+ fields,
131
+ req: mockReq
132
+ });
133
+ expect(result).toEqual({
134
+ hasManyNumber: [
135
+ 1,
136
+ 3
137
+ ]
138
+ });
139
+ });
140
+ it('should handle empty, null, and undefined values', ()=>{
141
+ // explicit null gets converted to empty array in postProcess for hasMany
142
+ expect(unflattenObject({
143
+ data: {
144
+ hasManyNumber: null
145
+ },
146
+ fields,
147
+ req: mockReq
148
+ })).toEqual({
149
+ hasManyNumber: []
150
+ });
151
+ // undefined is skipped entirely (preserves existing data)
152
+ expect(unflattenObject({
153
+ data: {
154
+ hasManyNumber: undefined
155
+ },
156
+ fields,
157
+ req: mockReq
158
+ })).toEqual({});
159
+ });
160
+ });
161
+ describe('hasMany relationship fields', ()=>{
162
+ const fields = [
163
+ {
164
+ name: 'hasManyRelationship',
165
+ type: 'relationship',
166
+ hasMany: true,
167
+ relationTo: 'posts'
168
+ }
169
+ ];
170
+ it('should handle comma-separated ID strings', ()=>{
171
+ const data = {
172
+ hasManyRelationship: 'id1,id2,id3'
173
+ };
174
+ const result = unflattenObject({
175
+ data,
176
+ fields,
177
+ req: mockReq
178
+ });
179
+ expect(result).toEqual({
180
+ hasManyRelationship: [
181
+ 'id1',
182
+ 'id2',
183
+ 'id3'
184
+ ]
185
+ });
186
+ });
187
+ it('should handle comma-separated IDs with spaces', ()=>{
188
+ const data = {
189
+ hasManyRelationship: ' id1 , id2 , id3 '
190
+ };
191
+ const result = unflattenObject({
192
+ data,
193
+ fields,
194
+ req: mockReq
195
+ });
196
+ expect(result).toEqual({
197
+ hasManyRelationship: [
198
+ 'id1',
199
+ 'id2',
200
+ 'id3'
201
+ ]
202
+ });
203
+ });
204
+ it('should filter out empty values in comma-separated IDs', ()=>{
205
+ const data = {
206
+ hasManyRelationship: 'id1,,id3,,id5'
207
+ };
208
+ const result = unflattenObject({
209
+ data,
210
+ fields,
211
+ req: mockReq
212
+ });
213
+ expect(result).toEqual({
214
+ hasManyRelationship: [
215
+ 'id1',
216
+ 'id3',
217
+ 'id5'
218
+ ]
219
+ });
220
+ });
221
+ it('should handle single ID values', ()=>{
222
+ const data = {
223
+ hasManyRelationship: 'singleId'
224
+ };
225
+ const result = unflattenObject({
226
+ data,
227
+ fields,
228
+ req: mockReq
229
+ });
230
+ expect(result).toEqual({
231
+ hasManyRelationship: [
232
+ 'singleId'
233
+ ]
234
+ });
235
+ });
236
+ it('should handle indexed array format', ()=>{
237
+ const data = {
238
+ hasManyRelationship_0: 'id1',
239
+ hasManyRelationship_1: 'id2',
240
+ hasManyRelationship_2: 'id3'
241
+ };
242
+ const result = unflattenObject({
243
+ data,
244
+ fields,
245
+ req: mockReq
246
+ });
247
+ expect(result).toEqual({
248
+ hasManyRelationship: [
249
+ 'id1',
250
+ 'id2',
251
+ 'id3'
252
+ ]
253
+ });
254
+ });
255
+ it('should handle MongoDB ObjectIDs', ()=>{
256
+ const data = {
257
+ hasManyRelationship: '507f1f77bcf86cd799439011,507f191e810c19729de860ea'
258
+ };
259
+ const result = unflattenObject({
260
+ data,
261
+ fields,
262
+ req: mockReq
263
+ });
264
+ expect(result).toEqual({
265
+ hasManyRelationship: [
266
+ '507f1f77bcf86cd799439011',
267
+ '507f191e810c19729de860ea'
268
+ ]
269
+ });
270
+ });
271
+ });
272
+ describe('localized fields', ()=>{
273
+ const fields = [
274
+ {
275
+ name: 'title',
276
+ type: 'text',
277
+ localized: true
278
+ }
279
+ ];
280
+ it('should transform locale-specific keys to nested structure', ()=>{
281
+ const data = {
282
+ title_en: 'English Title',
283
+ title_es: 'Título en Español'
284
+ };
285
+ const result = unflattenObject({
286
+ data,
287
+ fields,
288
+ req: mockReq
289
+ });
290
+ expect(result).toEqual({
291
+ title: {
292
+ en: 'English Title',
293
+ es: 'Título en Español'
294
+ }
295
+ });
296
+ });
297
+ it('should handle missing locales', ()=>{
298
+ const data = {
299
+ title_en: 'English Title'
300
+ };
301
+ const result = unflattenObject({
302
+ data,
303
+ fields,
304
+ req: mockReq
305
+ });
306
+ expect(result).toEqual({
307
+ title: {
308
+ en: 'English Title'
309
+ }
310
+ });
311
+ });
312
+ });
313
+ describe('blocks fields', ()=>{
314
+ const fields = [
315
+ {
316
+ name: 'blocks',
317
+ type: 'blocks'
318
+ }
319
+ ];
320
+ it('should handle block fields with blockType', ()=>{
321
+ const data = {
322
+ blocks_0_hero_title: 'Hero Title',
323
+ blocks_0_hero_subtitle: 'Hero Subtitle',
324
+ blocks_0_hero_blockType: 'hero'
325
+ };
326
+ const result = unflattenObject({
327
+ data,
328
+ fields,
329
+ req: mockReq
330
+ });
331
+ expect(result).toEqual({
332
+ blocks: [
333
+ {
334
+ blockType: 'hero',
335
+ title: 'Hero Title',
336
+ subtitle: 'Hero Subtitle'
337
+ }
338
+ ]
339
+ });
340
+ });
341
+ it('should handle multiple blocks', ()=>{
342
+ const data = {
343
+ blocks_0_hero_title: 'Hero Title',
344
+ blocks_0_hero_blockType: 'hero',
345
+ blocks_1_text_content: 'Text Content',
346
+ blocks_1_text_blockType: 'text'
347
+ };
348
+ const result = unflattenObject({
349
+ data,
350
+ fields,
351
+ req: mockReq
352
+ });
353
+ expect(result).toEqual({
354
+ blocks: [
355
+ {
356
+ blockType: 'hero',
357
+ title: 'Hero Title'
358
+ },
359
+ {
360
+ blockType: 'text',
361
+ content: 'Text Content'
362
+ }
363
+ ]
364
+ });
365
+ });
366
+ });
367
+ describe('array fields', ()=>{
368
+ const fields = [
369
+ {
370
+ name: 'items',
371
+ type: 'array'
372
+ }
373
+ ];
374
+ it('should handle indexed array objects', ()=>{
375
+ const data = {
376
+ items_0_name: 'Item 1',
377
+ items_0_value: 10,
378
+ items_1_name: 'Item 2',
379
+ items_1_value: 20
380
+ };
381
+ const result = unflattenObject({
382
+ data,
383
+ fields,
384
+ req: mockReq
385
+ });
386
+ expect(result).toEqual({
387
+ items: [
388
+ {
389
+ name: 'Item 1',
390
+ value: 10
391
+ },
392
+ {
393
+ name: 'Item 2',
394
+ value: 20
395
+ }
396
+ ]
397
+ });
398
+ });
399
+ it('should handle sparse arrays', ()=>{
400
+ const data = {
401
+ items_0_name: 'Item 1',
402
+ items_2_name: 'Item 3'
403
+ };
404
+ const result = unflattenObject({
405
+ data,
406
+ fields,
407
+ req: mockReq
408
+ });
409
+ expect(result).toEqual({
410
+ items: [
411
+ {
412
+ name: 'Item 1'
413
+ },
414
+ null,
415
+ {
416
+ name: 'Item 3'
417
+ }
418
+ ]
419
+ });
420
+ });
421
+ });
422
+ describe('group fields', ()=>{
423
+ const fields = [
424
+ {
425
+ name: 'group',
426
+ type: 'group'
427
+ }
428
+ ];
429
+ it('should handle nested group fields', ()=>{
430
+ const data = {
431
+ group_field1: 'Value 1',
432
+ group_field2: 'Value 2'
433
+ };
434
+ const result = unflattenObject({
435
+ data,
436
+ fields,
437
+ req: mockReq
438
+ });
439
+ expect(result).toEqual({
440
+ group: {
441
+ field1: 'Value 1',
442
+ field2: 'Value 2'
443
+ }
444
+ });
445
+ });
446
+ });
447
+ describe('polymorphic relationships', ()=>{
448
+ const fields = [
449
+ {
450
+ name: 'polymorphic',
451
+ type: 'relationship',
452
+ relationTo: [
453
+ 'posts',
454
+ 'pages'
455
+ ]
456
+ }
457
+ ];
458
+ it('should handle polymorphic relationship with id and relationTo', ()=>{
459
+ const data = {
460
+ polymorphic_id: '123',
461
+ polymorphic_relationTo: 'posts'
462
+ };
463
+ const result = unflattenObject({
464
+ data,
465
+ fields,
466
+ req: mockReq
467
+ });
468
+ expect(result).toEqual({
469
+ polymorphic: {
470
+ relationTo: 'posts',
471
+ value: '123'
472
+ }
473
+ });
474
+ });
475
+ it('should handle explicitly null polymorphic relationships', ()=>{
476
+ const data = {
477
+ polymorphic_id: null,
478
+ polymorphic_relationTo: null
479
+ };
480
+ const result = unflattenObject({
481
+ data,
482
+ fields,
483
+ req: mockReq
484
+ });
485
+ expect(result).toEqual({
486
+ polymorphic: null
487
+ });
488
+ });
489
+ it('should skip polymorphic relationships with undefined values', ()=>{
490
+ const data = {
491
+ polymorphic_id: undefined,
492
+ polymorphic_relationTo: undefined
493
+ };
494
+ const result = unflattenObject({
495
+ data,
496
+ fields,
497
+ req: mockReq
498
+ });
499
+ // Both undefined means field is not set (preserves existing data)
500
+ expect(result).toEqual({});
501
+ });
502
+ it('should skip polymorphic relationship with undefined id', ()=>{
503
+ const data = {
504
+ polymorphic_id: undefined,
505
+ polymorphic_relationTo: 'posts'
506
+ };
507
+ const result = unflattenObject({
508
+ data,
509
+ fields,
510
+ req: mockReq
511
+ });
512
+ // Undefined ID means don't update this field
513
+ expect(result).toEqual({});
514
+ });
515
+ it('should skip polymorphic relationship with undefined relationTo', ()=>{
516
+ const data = {
517
+ polymorphic_id: '123',
518
+ polymorphic_relationTo: undefined
519
+ };
520
+ const result = unflattenObject({
521
+ data,
522
+ fields,
523
+ req: mockReq
524
+ });
525
+ // Undefined relationTo means don't update this field
526
+ expect(result).toEqual({});
527
+ });
528
+ it('should handle polymorphic hasMany relationships', ()=>{
529
+ const fields = [
530
+ {
531
+ name: 'polymorphicMany',
532
+ type: 'relationship',
533
+ hasMany: true,
534
+ relationTo: [
535
+ 'posts',
536
+ 'pages'
537
+ ]
538
+ }
539
+ ];
540
+ const data = {
541
+ polymorphicMany_0_id: '123',
542
+ polymorphicMany_0_relationTo: 'posts',
543
+ polymorphicMany_1_id: '456',
544
+ polymorphicMany_1_relationTo: 'pages'
545
+ };
546
+ const result = unflattenObject({
547
+ data,
548
+ fields,
549
+ req: mockReq
550
+ });
551
+ expect(result).toEqual({
552
+ polymorphicMany: [
553
+ {
554
+ relationTo: 'posts',
555
+ value: '123'
556
+ },
557
+ {
558
+ relationTo: 'pages',
559
+ value: '456'
560
+ }
561
+ ]
562
+ });
563
+ });
564
+ it('should filter out empty polymorphic hasMany items', ()=>{
565
+ const fields = [
566
+ {
567
+ name: 'polymorphicMany',
568
+ type: 'relationship',
569
+ hasMany: true,
570
+ relationTo: [
571
+ 'posts',
572
+ 'pages'
573
+ ]
574
+ }
575
+ ];
576
+ const data = {
577
+ polymorphicMany_0_id: '123',
578
+ polymorphicMany_0_relationTo: 'posts',
579
+ polymorphicMany_1_id: null,
580
+ polymorphicMany_1_relationTo: null,
581
+ polymorphicMany_2_id: '456',
582
+ polymorphicMany_2_relationTo: 'pages'
583
+ };
584
+ const result = unflattenObject({
585
+ data,
586
+ fields,
587
+ req: mockReq
588
+ });
589
+ expect(result).toEqual({
590
+ polymorphicMany: [
591
+ {
592
+ relationTo: 'posts',
593
+ value: '123'
594
+ },
595
+ {
596
+ relationTo: 'pages',
597
+ value: '456'
598
+ }
599
+ ]
600
+ });
601
+ });
602
+ it('should handle all empty polymorphic hasMany items', ()=>{
603
+ const fields = [
604
+ {
605
+ name: 'polymorphicMany',
606
+ type: 'relationship',
607
+ hasMany: true,
608
+ relationTo: [
609
+ 'posts',
610
+ 'pages'
611
+ ]
612
+ }
613
+ ];
614
+ const data = {
615
+ polymorphicMany_0_id: null,
616
+ polymorphicMany_0_relationTo: null,
617
+ polymorphicMany_1_id: '',
618
+ polymorphicMany_1_relationTo: ''
619
+ };
620
+ const result = unflattenObject({
621
+ data,
622
+ fields,
623
+ req: mockReq
624
+ });
625
+ expect(result).toEqual({
626
+ polymorphicMany: []
627
+ });
628
+ });
629
+ });
630
+ describe('edge cases', ()=>{
631
+ it('should handle empty data', ()=>{
632
+ const result = unflattenObject({
633
+ data: {},
634
+ fields: [],
635
+ req: mockReq
636
+ });
637
+ expect(result).toEqual({});
638
+ });
639
+ it('should handle null data', ()=>{
640
+ const result = unflattenObject({
641
+ data: null,
642
+ fields: [],
643
+ req: mockReq
644
+ });
645
+ expect(result).toEqual({});
646
+ });
647
+ it('should handle undefined values', ()=>{
648
+ const data = {
649
+ field1: undefined,
650
+ field2: 'value'
651
+ };
652
+ const result = unflattenObject({
653
+ data,
654
+ fields: [],
655
+ req: mockReq
656
+ });
657
+ expect(result).toEqual({
658
+ field2: 'value'
659
+ });
660
+ });
661
+ it('should preserve null values for validation', ()=>{
662
+ const data = {
663
+ field1: null,
664
+ field2: 'value'
665
+ };
666
+ const result = unflattenObject({
667
+ data,
668
+ fields: [],
669
+ req: mockReq
670
+ });
671
+ // null values are preserved for validation
672
+ expect(result).toEqual({
673
+ field1: null,
674
+ field2: 'value'
675
+ });
676
+ });
677
+ });
678
+ });
679
+
680
+ //# sourceMappingURL=unflattenObject.spec.js.map