@ruya.sa/plugin-import-export 3.71.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 (410) hide show
  1. package/README.md +7 -0
  2. package/dist/components/CollectionField/index.d.ts +3 -0
  3. package/dist/components/CollectionField/index.d.ts.map +1 -0
  4. package/dist/components/CollectionField/index.js +29 -0
  5. package/dist/components/CollectionField/index.js.map +1 -0
  6. package/dist/components/ExportListMenuItem/index.d.ts +6 -0
  7. package/dist/components/ExportListMenuItem/index.d.ts.map +1 -0
  8. package/dist/components/ExportListMenuItem/index.js +44 -0
  9. package/dist/components/ExportListMenuItem/index.js.map +1 -0
  10. package/dist/components/ExportPreview/index.d.ts +4 -0
  11. package/dist/components/ExportPreview/index.d.ts.map +1 -0
  12. package/dist/components/ExportPreview/index.js +252 -0
  13. package/dist/components/ExportPreview/index.js.map +1 -0
  14. package/dist/components/ExportPreview/index.scss +36 -0
  15. package/dist/components/ExportSaveButton/index.d.ts +3 -0
  16. package/dist/components/ExportSaveButton/index.d.ts.map +1 -0
  17. package/dist/components/ExportSaveButton/index.js +110 -0
  18. package/dist/components/ExportSaveButton/index.js.map +1 -0
  19. package/dist/components/FieldsToExport/index.d.ts +3 -0
  20. package/dist/components/FieldsToExport/index.d.ts.map +1 -0
  21. package/dist/components/FieldsToExport/index.js +87 -0
  22. package/dist/components/FieldsToExport/index.js.map +1 -0
  23. package/dist/components/FieldsToExport/index.scss +0 -0
  24. package/dist/components/FieldsToExport/reduceFields.d.ts +13 -0
  25. package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -0
  26. package/dist/components/FieldsToExport/reduceFields.js +109 -0
  27. package/dist/components/FieldsToExport/reduceFields.js.map +1 -0
  28. package/dist/components/ImportCollectionField/index.d.ts +3 -0
  29. package/dist/components/ImportCollectionField/index.d.ts.map +1 -0
  30. package/dist/components/ImportCollectionField/index.js +17 -0
  31. package/dist/components/ImportCollectionField/index.js.map +1 -0
  32. package/dist/components/ImportExportProvider/index.d.ts +12 -0
  33. package/dist/components/ImportExportProvider/index.d.ts.map +1 -0
  34. package/dist/components/ImportExportProvider/index.js +20 -0
  35. package/dist/components/ImportExportProvider/index.js.map +1 -0
  36. package/dist/components/ImportListMenuItem/index.d.ts +6 -0
  37. package/dist/components/ImportListMenuItem/index.d.ts.map +1 -0
  38. package/dist/components/ImportListMenuItem/index.js +48 -0
  39. package/dist/components/ImportListMenuItem/index.js.map +1 -0
  40. package/dist/components/ImportPreview/index.d.ts +4 -0
  41. package/dist/components/ImportPreview/index.d.ts.map +1 -0
  42. package/dist/components/ImportPreview/index.js +624 -0
  43. package/dist/components/ImportPreview/index.js.map +1 -0
  44. package/dist/components/ImportPreview/index.scss +41 -0
  45. package/dist/components/ImportSaveButton/index.d.ts +2 -0
  46. package/dist/components/ImportSaveButton/index.d.ts.map +1 -0
  47. package/dist/components/ImportSaveButton/index.js +18 -0
  48. package/dist/components/ImportSaveButton/index.js.map +1 -0
  49. package/dist/components/Page/index.d.ts +4 -0
  50. package/dist/components/Page/index.d.ts.map +1 -0
  51. package/dist/components/Page/index.js +40 -0
  52. package/dist/components/Page/index.js.map +1 -0
  53. package/dist/components/Page/index.scss +5 -0
  54. package/dist/components/SelectionToUseField/index.d.ts +3 -0
  55. package/dist/components/SelectionToUseField/index.d.ts.map +1 -0
  56. package/dist/components/SelectionToUseField/index.js +128 -0
  57. package/dist/components/SelectionToUseField/index.js.map +1 -0
  58. package/dist/components/SortBy/index.d.ts +4 -0
  59. package/dist/components/SortBy/index.d.ts.map +1 -0
  60. package/dist/components/SortBy/index.js +133 -0
  61. package/dist/components/SortBy/index.js.map +1 -0
  62. package/dist/components/SortBy/index.scss +3 -0
  63. package/dist/components/SortOrder/index.d.ts +4 -0
  64. package/dist/components/SortOrder/index.d.ts.map +1 -0
  65. package/dist/components/SortOrder/index.js +121 -0
  66. package/dist/components/SortOrder/index.js.map +1 -0
  67. package/dist/components/SortOrder/index.scss +3 -0
  68. package/dist/constants.d.ts +21 -0
  69. package/dist/constants.d.ts.map +1 -0
  70. package/dist/constants.js +21 -0
  71. package/dist/constants.js.map +1 -0
  72. package/dist/export/batchProcessor.d.ts +107 -0
  73. package/dist/export/batchProcessor.d.ts.map +1 -0
  74. package/dist/export/batchProcessor.js +187 -0
  75. package/dist/export/batchProcessor.js.map +1 -0
  76. package/dist/export/createExport.d.ts +37 -0
  77. package/dist/export/createExport.d.ts.map +1 -0
  78. package/dist/export/createExport.js +385 -0
  79. package/dist/export/createExport.js.map +1 -0
  80. package/dist/export/getCreateExportCollectionTask.d.ts +16 -0
  81. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -0
  82. package/dist/export/getCreateExportCollectionTask.js +35 -0
  83. package/dist/export/getCreateExportCollectionTask.js.map +1 -0
  84. package/dist/export/getExportCollection.d.ts +8 -0
  85. package/dist/export/getExportCollection.d.ts.map +1 -0
  86. package/dist/export/getExportCollection.js +100 -0
  87. package/dist/export/getExportCollection.js.map +1 -0
  88. package/dist/export/getFields.d.ts +10 -0
  89. package/dist/export/getFields.d.ts.map +1 -0
  90. package/dist/export/getFields.js +244 -0
  91. package/dist/export/getFields.js.map +1 -0
  92. package/dist/export/handleDownload.d.ts +3 -0
  93. package/dist/export/handleDownload.d.ts.map +1 -0
  94. package/dist/export/handleDownload.js +42 -0
  95. package/dist/export/handleDownload.js.map +1 -0
  96. package/dist/export/handlePreview.d.ts +3 -0
  97. package/dist/export/handlePreview.d.ts.map +1 -0
  98. package/dist/export/handlePreview.js +163 -0
  99. package/dist/export/handlePreview.js.map +1 -0
  100. package/dist/exports/rsc.d.ts +15 -0
  101. package/dist/exports/rsc.d.ts.map +1 -0
  102. package/dist/exports/rsc.js +16 -0
  103. package/dist/exports/rsc.js.map +1 -0
  104. package/dist/exports/types.d.ts +2 -0
  105. package/dist/exports/types.d.ts.map +1 -0
  106. package/dist/exports/types.js +3 -0
  107. package/dist/exports/types.js.map +1 -0
  108. package/dist/import/batchProcessor.d.ts +46 -0
  109. package/dist/import/batchProcessor.d.ts.map +1 -0
  110. package/dist/import/batchProcessor.js +529 -0
  111. package/dist/import/batchProcessor.js.map +1 -0
  112. package/dist/import/createImport.d.ts +45 -0
  113. package/dist/import/createImport.d.ts.map +1 -0
  114. package/dist/import/createImport.js +175 -0
  115. package/dist/import/createImport.js.map +1 -0
  116. package/dist/import/getCreateImportCollectionTask.d.ts +13 -0
  117. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -0
  118. package/dist/import/getCreateImportCollectionTask.js +81 -0
  119. package/dist/import/getCreateImportCollectionTask.js.map +1 -0
  120. package/dist/import/getFields.d.ts +7 -0
  121. package/dist/import/getFields.d.ts.map +1 -0
  122. package/dist/import/getFields.js +150 -0
  123. package/dist/import/getFields.js.map +1 -0
  124. package/dist/import/getImportCollection.d.ts +8 -0
  125. package/dist/import/getImportCollection.d.ts.map +1 -0
  126. package/dist/import/getImportCollection.js +258 -0
  127. package/dist/import/getImportCollection.js.map +1 -0
  128. package/dist/import/handlePreview.d.ts +3 -0
  129. package/dist/import/handlePreview.d.ts.map +1 -0
  130. package/dist/import/handlePreview.js +94 -0
  131. package/dist/import/handlePreview.js.map +1 -0
  132. package/dist/index.d.ts +32 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +120 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/translations/index.d.ts +6 -0
  137. package/dist/translations/index.d.ts.map +1 -0
  138. package/dist/translations/index.js +84 -0
  139. package/dist/translations/index.js.map +1 -0
  140. package/dist/translations/languages/ar.d.ts +4 -0
  141. package/dist/translations/languages/ar.d.ts.map +1 -0
  142. package/dist/translations/languages/ar.js +48 -0
  143. package/dist/translations/languages/ar.js.map +1 -0
  144. package/dist/translations/languages/az.d.ts +4 -0
  145. package/dist/translations/languages/az.d.ts.map +1 -0
  146. package/dist/translations/languages/az.js +48 -0
  147. package/dist/translations/languages/az.js.map +1 -0
  148. package/dist/translations/languages/bg.d.ts +4 -0
  149. package/dist/translations/languages/bg.d.ts.map +1 -0
  150. package/dist/translations/languages/bg.js +48 -0
  151. package/dist/translations/languages/bg.js.map +1 -0
  152. package/dist/translations/languages/bnBd.d.ts +4 -0
  153. package/dist/translations/languages/bnBd.d.ts.map +1 -0
  154. package/dist/translations/languages/bnBd.js +48 -0
  155. package/dist/translations/languages/bnBd.js.map +1 -0
  156. package/dist/translations/languages/bnIn.d.ts +4 -0
  157. package/dist/translations/languages/bnIn.d.ts.map +1 -0
  158. package/dist/translations/languages/bnIn.js +48 -0
  159. package/dist/translations/languages/bnIn.js.map +1 -0
  160. package/dist/translations/languages/ca.d.ts +4 -0
  161. package/dist/translations/languages/ca.d.ts.map +1 -0
  162. package/dist/translations/languages/ca.js +48 -0
  163. package/dist/translations/languages/ca.js.map +1 -0
  164. package/dist/translations/languages/cs.d.ts +4 -0
  165. package/dist/translations/languages/cs.d.ts.map +1 -0
  166. package/dist/translations/languages/cs.js +48 -0
  167. package/dist/translations/languages/cs.js.map +1 -0
  168. package/dist/translations/languages/da.d.ts +4 -0
  169. package/dist/translations/languages/da.d.ts.map +1 -0
  170. package/dist/translations/languages/da.js +48 -0
  171. package/dist/translations/languages/da.js.map +1 -0
  172. package/dist/translations/languages/de.d.ts +4 -0
  173. package/dist/translations/languages/de.d.ts.map +1 -0
  174. package/dist/translations/languages/de.js +48 -0
  175. package/dist/translations/languages/de.js.map +1 -0
  176. package/dist/translations/languages/en.d.ts +45 -0
  177. package/dist/translations/languages/en.d.ts.map +1 -0
  178. package/dist/translations/languages/en.js +48 -0
  179. package/dist/translations/languages/en.js.map +1 -0
  180. package/dist/translations/languages/es.d.ts +4 -0
  181. package/dist/translations/languages/es.d.ts.map +1 -0
  182. package/dist/translations/languages/es.js +48 -0
  183. package/dist/translations/languages/es.js.map +1 -0
  184. package/dist/translations/languages/et.d.ts +4 -0
  185. package/dist/translations/languages/et.d.ts.map +1 -0
  186. package/dist/translations/languages/et.js +48 -0
  187. package/dist/translations/languages/et.js.map +1 -0
  188. package/dist/translations/languages/fa.d.ts +4 -0
  189. package/dist/translations/languages/fa.d.ts.map +1 -0
  190. package/dist/translations/languages/fa.js +48 -0
  191. package/dist/translations/languages/fa.js.map +1 -0
  192. package/dist/translations/languages/fr.d.ts +4 -0
  193. package/dist/translations/languages/fr.d.ts.map +1 -0
  194. package/dist/translations/languages/fr.js +48 -0
  195. package/dist/translations/languages/fr.js.map +1 -0
  196. package/dist/translations/languages/he.d.ts +4 -0
  197. package/dist/translations/languages/he.d.ts.map +1 -0
  198. package/dist/translations/languages/he.js +48 -0
  199. package/dist/translations/languages/he.js.map +1 -0
  200. package/dist/translations/languages/hr.d.ts +4 -0
  201. package/dist/translations/languages/hr.d.ts.map +1 -0
  202. package/dist/translations/languages/hr.js +48 -0
  203. package/dist/translations/languages/hr.js.map +1 -0
  204. package/dist/translations/languages/hu.d.ts +4 -0
  205. package/dist/translations/languages/hu.d.ts.map +1 -0
  206. package/dist/translations/languages/hu.js +48 -0
  207. package/dist/translations/languages/hu.js.map +1 -0
  208. package/dist/translations/languages/hy.d.ts +4 -0
  209. package/dist/translations/languages/hy.d.ts.map +1 -0
  210. package/dist/translations/languages/hy.js +48 -0
  211. package/dist/translations/languages/hy.js.map +1 -0
  212. package/dist/translations/languages/id.d.ts +4 -0
  213. package/dist/translations/languages/id.d.ts.map +1 -0
  214. package/dist/translations/languages/id.js +48 -0
  215. package/dist/translations/languages/id.js.map +1 -0
  216. package/dist/translations/languages/is.d.ts +4 -0
  217. package/dist/translations/languages/is.d.ts.map +1 -0
  218. package/dist/translations/languages/is.js +48 -0
  219. package/dist/translations/languages/is.js.map +1 -0
  220. package/dist/translations/languages/it.d.ts +4 -0
  221. package/dist/translations/languages/it.d.ts.map +1 -0
  222. package/dist/translations/languages/it.js +48 -0
  223. package/dist/translations/languages/it.js.map +1 -0
  224. package/dist/translations/languages/ja.d.ts +4 -0
  225. package/dist/translations/languages/ja.d.ts.map +1 -0
  226. package/dist/translations/languages/ja.js +48 -0
  227. package/dist/translations/languages/ja.js.map +1 -0
  228. package/dist/translations/languages/ko.d.ts +4 -0
  229. package/dist/translations/languages/ko.d.ts.map +1 -0
  230. package/dist/translations/languages/ko.js +48 -0
  231. package/dist/translations/languages/ko.js.map +1 -0
  232. package/dist/translations/languages/lt.d.ts +4 -0
  233. package/dist/translations/languages/lt.d.ts.map +1 -0
  234. package/dist/translations/languages/lt.js +48 -0
  235. package/dist/translations/languages/lt.js.map +1 -0
  236. package/dist/translations/languages/lv.d.ts +4 -0
  237. package/dist/translations/languages/lv.d.ts.map +1 -0
  238. package/dist/translations/languages/lv.js +48 -0
  239. package/dist/translations/languages/lv.js.map +1 -0
  240. package/dist/translations/languages/my.d.ts +4 -0
  241. package/dist/translations/languages/my.d.ts.map +1 -0
  242. package/dist/translations/languages/my.js +48 -0
  243. package/dist/translations/languages/my.js.map +1 -0
  244. package/dist/translations/languages/nb.d.ts +4 -0
  245. package/dist/translations/languages/nb.d.ts.map +1 -0
  246. package/dist/translations/languages/nb.js +48 -0
  247. package/dist/translations/languages/nb.js.map +1 -0
  248. package/dist/translations/languages/nl.d.ts +4 -0
  249. package/dist/translations/languages/nl.d.ts.map +1 -0
  250. package/dist/translations/languages/nl.js +48 -0
  251. package/dist/translations/languages/nl.js.map +1 -0
  252. package/dist/translations/languages/pl.d.ts +4 -0
  253. package/dist/translations/languages/pl.d.ts.map +1 -0
  254. package/dist/translations/languages/pl.js +48 -0
  255. package/dist/translations/languages/pl.js.map +1 -0
  256. package/dist/translations/languages/pt.d.ts +4 -0
  257. package/dist/translations/languages/pt.d.ts.map +1 -0
  258. package/dist/translations/languages/pt.js +48 -0
  259. package/dist/translations/languages/pt.js.map +1 -0
  260. package/dist/translations/languages/ro.d.ts +4 -0
  261. package/dist/translations/languages/ro.d.ts.map +1 -0
  262. package/dist/translations/languages/ro.js +48 -0
  263. package/dist/translations/languages/ro.js.map +1 -0
  264. package/dist/translations/languages/rs.d.ts +4 -0
  265. package/dist/translations/languages/rs.d.ts.map +1 -0
  266. package/dist/translations/languages/rs.js +48 -0
  267. package/dist/translations/languages/rs.js.map +1 -0
  268. package/dist/translations/languages/rsLatin.d.ts +4 -0
  269. package/dist/translations/languages/rsLatin.d.ts.map +1 -0
  270. package/dist/translations/languages/rsLatin.js +48 -0
  271. package/dist/translations/languages/rsLatin.js.map +1 -0
  272. package/dist/translations/languages/ru.d.ts +4 -0
  273. package/dist/translations/languages/ru.d.ts.map +1 -0
  274. package/dist/translations/languages/ru.js +48 -0
  275. package/dist/translations/languages/ru.js.map +1 -0
  276. package/dist/translations/languages/sk.d.ts +4 -0
  277. package/dist/translations/languages/sk.d.ts.map +1 -0
  278. package/dist/translations/languages/sk.js +48 -0
  279. package/dist/translations/languages/sk.js.map +1 -0
  280. package/dist/translations/languages/sl.d.ts +4 -0
  281. package/dist/translations/languages/sl.d.ts.map +1 -0
  282. package/dist/translations/languages/sl.js +48 -0
  283. package/dist/translations/languages/sl.js.map +1 -0
  284. package/dist/translations/languages/sv.d.ts +4 -0
  285. package/dist/translations/languages/sv.d.ts.map +1 -0
  286. package/dist/translations/languages/sv.js +48 -0
  287. package/dist/translations/languages/sv.js.map +1 -0
  288. package/dist/translations/languages/ta.d.ts +4 -0
  289. package/dist/translations/languages/ta.d.ts.map +1 -0
  290. package/dist/translations/languages/ta.js +48 -0
  291. package/dist/translations/languages/ta.js.map +1 -0
  292. package/dist/translations/languages/th.d.ts +4 -0
  293. package/dist/translations/languages/th.d.ts.map +1 -0
  294. package/dist/translations/languages/th.js +48 -0
  295. package/dist/translations/languages/th.js.map +1 -0
  296. package/dist/translations/languages/tr.d.ts +4 -0
  297. package/dist/translations/languages/tr.d.ts.map +1 -0
  298. package/dist/translations/languages/tr.js +48 -0
  299. package/dist/translations/languages/tr.js.map +1 -0
  300. package/dist/translations/languages/translation-schema.json +114 -0
  301. package/dist/translations/languages/uk.d.ts +4 -0
  302. package/dist/translations/languages/uk.d.ts.map +1 -0
  303. package/dist/translations/languages/uk.js +48 -0
  304. package/dist/translations/languages/uk.js.map +1 -0
  305. package/dist/translations/languages/vi.d.ts +4 -0
  306. package/dist/translations/languages/vi.d.ts.map +1 -0
  307. package/dist/translations/languages/vi.js +48 -0
  308. package/dist/translations/languages/vi.js.map +1 -0
  309. package/dist/translations/languages/zh.d.ts +4 -0
  310. package/dist/translations/languages/zh.d.ts.map +1 -0
  311. package/dist/translations/languages/zh.js +48 -0
  312. package/dist/translations/languages/zh.js.map +1 -0
  313. package/dist/translations/languages/zhTw.d.ts +4 -0
  314. package/dist/translations/languages/zhTw.d.ts.map +1 -0
  315. package/dist/translations/languages/zhTw.js +48 -0
  316. package/dist/translations/languages/zhTw.js.map +1 -0
  317. package/dist/translations/types.d.ts +38 -0
  318. package/dist/translations/types.d.ts.map +1 -0
  319. package/dist/translations/types.js +3 -0
  320. package/dist/translations/types.js.map +1 -0
  321. package/dist/types.d.ts +221 -0
  322. package/dist/types.d.ts.map +1 -0
  323. package/dist/types.js +5 -0
  324. package/dist/types.js.map +1 -0
  325. package/dist/utilities/buildDisabledFieldRegex.d.ts +5 -0
  326. package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -0
  327. package/dist/utilities/buildDisabledFieldRegex.js +12 -0
  328. package/dist/utilities/buildDisabledFieldRegex.js.map +1 -0
  329. package/dist/utilities/collectDisabledFieldPaths.d.ts +15 -0
  330. package/dist/utilities/collectDisabledFieldPaths.d.ts.map +1 -0
  331. package/dist/utilities/collectDisabledFieldPaths.js +61 -0
  332. package/dist/utilities/collectDisabledFieldPaths.js.map +1 -0
  333. package/dist/utilities/flattenObject.d.ts +11 -0
  334. package/dist/utilities/flattenObject.d.ts.map +1 -0
  335. package/dist/utilities/flattenObject.js +129 -0
  336. package/dist/utilities/flattenObject.js.map +1 -0
  337. package/dist/utilities/getExportFieldFunctions.d.ts +12 -0
  338. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -0
  339. package/dist/utilities/getExportFieldFunctions.js +102 -0
  340. package/dist/utilities/getExportFieldFunctions.js.map +1 -0
  341. package/dist/utilities/getFilename.d.ts +6 -0
  342. package/dist/utilities/getFilename.d.ts.map +1 -0
  343. package/dist/utilities/getFilename.js +13 -0
  344. package/dist/utilities/getFilename.js.map +1 -0
  345. package/dist/utilities/getFlattenedFieldKeys.d.ts +24 -0
  346. package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -0
  347. package/dist/utilities/getFlattenedFieldKeys.js +95 -0
  348. package/dist/utilities/getFlattenedFieldKeys.js.map +1 -0
  349. package/dist/utilities/getImportFieldFunctions.d.ts +12 -0
  350. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -0
  351. package/dist/utilities/getImportFieldFunctions.js +130 -0
  352. package/dist/utilities/getImportFieldFunctions.js.map +1 -0
  353. package/dist/utilities/getPluginCollections.d.ts +39 -0
  354. package/dist/utilities/getPluginCollections.d.ts.map +1 -0
  355. package/dist/utilities/getPluginCollections.js +102 -0
  356. package/dist/utilities/getPluginCollections.js.map +1 -0
  357. package/dist/utilities/getSchemaColumns.d.ts +43 -0
  358. package/dist/utilities/getSchemaColumns.d.ts.map +1 -0
  359. package/dist/utilities/getSchemaColumns.js +163 -0
  360. package/dist/utilities/getSchemaColumns.js.map +1 -0
  361. package/dist/utilities/getSelect.d.ts +11 -0
  362. package/dist/utilities/getSelect.d.ts.map +1 -0
  363. package/dist/utilities/getSelect.js +27 -0
  364. package/dist/utilities/getSelect.js.map +1 -0
  365. package/dist/utilities/getvalueAtPath.d.ts +15 -0
  366. package/dist/utilities/getvalueAtPath.d.ts.map +1 -0
  367. package/dist/utilities/getvalueAtPath.js +49 -0
  368. package/dist/utilities/getvalueAtPath.js.map +1 -0
  369. package/dist/utilities/parseCSV.d.ts +11 -0
  370. package/dist/utilities/parseCSV.d.ts.map +1 -0
  371. package/dist/utilities/parseCSV.js +67 -0
  372. package/dist/utilities/parseCSV.js.map +1 -0
  373. package/dist/utilities/parseCSV.spec.js +169 -0
  374. package/dist/utilities/parseCSV.spec.js.map +1 -0
  375. package/dist/utilities/parseJSON.d.ts +11 -0
  376. package/dist/utilities/parseJSON.d.ts.map +1 -0
  377. package/dist/utilities/parseJSON.js +25 -0
  378. package/dist/utilities/parseJSON.js.map +1 -0
  379. package/dist/utilities/processRichTextField.d.ts +6 -0
  380. package/dist/utilities/processRichTextField.d.ts.map +1 -0
  381. package/dist/utilities/processRichTextField.js +45 -0
  382. package/dist/utilities/processRichTextField.js.map +1 -0
  383. package/dist/utilities/removeDisabledFields.d.ts +15 -0
  384. package/dist/utilities/removeDisabledFields.d.ts.map +1 -0
  385. package/dist/utilities/removeDisabledFields.js +66 -0
  386. package/dist/utilities/removeDisabledFields.js.map +1 -0
  387. package/dist/utilities/setNestedValue.d.ts +19 -0
  388. package/dist/utilities/setNestedValue.d.ts.map +1 -0
  389. package/dist/utilities/setNestedValue.js +55 -0
  390. package/dist/utilities/setNestedValue.js.map +1 -0
  391. package/dist/utilities/sortHelpers.d.ts +6 -0
  392. package/dist/utilities/sortHelpers.d.ts.map +1 -0
  393. package/dist/utilities/sortHelpers.js +14 -0
  394. package/dist/utilities/sortHelpers.js.map +1 -0
  395. package/dist/utilities/unflattenObject.d.ts +11 -0
  396. package/dist/utilities/unflattenObject.d.ts.map +1 -0
  397. package/dist/utilities/unflattenObject.js +431 -0
  398. package/dist/utilities/unflattenObject.js.map +1 -0
  399. package/dist/utilities/unflattenObject.spec.js +680 -0
  400. package/dist/utilities/unflattenObject.spec.js.map +1 -0
  401. package/dist/utilities/useBatchProcessor.d.ts +103 -0
  402. package/dist/utilities/useBatchProcessor.d.ts.map +1 -0
  403. package/dist/utilities/useBatchProcessor.js +88 -0
  404. package/dist/utilities/useBatchProcessor.js.map +1 -0
  405. package/dist/utilities/validateLimitValue.d.ts +3 -0
  406. package/dist/utilities/validateLimitValue.d.ts.map +1 -0
  407. package/dist/utilities/validateLimitValue.js +12 -0
  408. package/dist/utilities/validateLimitValue.js.map +1 -0
  409. package/license.md +22 -0
  410. package/package.json +90 -0
@@ -0,0 +1,43 @@
1
+ import type { SanitizedCollectionConfig } from '@ruya.sa/payload';
2
+ export type GetSchemaColumnsArgs = {
3
+ /**
4
+ * The collection configuration to derive columns from
5
+ */
6
+ collectionConfig: SanitizedCollectionConfig;
7
+ /**
8
+ * Array of disabled field paths from plugin config
9
+ */
10
+ disabledFields?: string[];
11
+ /**
12
+ * User-selected fields to export. If provided, only these fields (and their nested fields) will be included.
13
+ */
14
+ fields?: string[];
15
+ /**
16
+ * The locale to export. When 'all', localized fields are expanded to include all locale suffixes.
17
+ */
18
+ locale?: null | string;
19
+ /**
20
+ * Available locale codes from config. Required when locale='all'.
21
+ */
22
+ localeCodes?: string[];
23
+ };
24
+ /**
25
+ * Derives CSV column names from the collection schema.
26
+ * This provides a base set of columns from field definitions.
27
+ *
28
+ * Note: For arrays/blocks with multiple items, the schema only generates index 0.
29
+ * Additional indices from actual data should be merged with these columns.
30
+ *
31
+ * Benefits:
32
+ * - Provides consistent base columns
33
+ * - Works for empty exports
34
+ * - Ensures proper column ordering
35
+ */
36
+ export declare const getSchemaColumns: ({ collectionConfig, disabledFields, fields: selectedFields, locale, localeCodes, }: GetSchemaColumnsArgs) => string[];
37
+ /**
38
+ * Merges schema-derived columns with data-discovered columns.
39
+ * Schema columns provide the base ordering, data columns add any additional
40
+ * columns (e.g., array indices beyond 0, dynamic fields).
41
+ */
42
+ export declare const mergeColumns: (schemaColumns: string[], dataColumns: string[]) => string[];
43
+ //# sourceMappingURL=getSchemaColumns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSchemaColumns.d.ts","sourceRoot":"","sources":["../../src/utilities/getSchemaColumns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAIjE,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,uFAM1B,oBAAoB,KAAG,MAAM,EA4E/B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,kBAAmB,MAAM,EAAE,eAAe,MAAM,EAAE,KAAG,MAAM,EAoCnF,CAAA"}
@@ -0,0 +1,163 @@
1
+ import { getFlattenedFieldKeys } from './getFlattenedFieldKeys.js';
2
+ /**
3
+ * Derives CSV column names from the collection schema.
4
+ * This provides a base set of columns from field definitions.
5
+ *
6
+ * Note: For arrays/blocks with multiple items, the schema only generates index 0.
7
+ * Additional indices from actual data should be merged with these columns.
8
+ *
9
+ * Benefits:
10
+ * - Provides consistent base columns
11
+ * - Works for empty exports
12
+ * - Ensures proper column ordering
13
+ */ export const getSchemaColumns = ({ collectionConfig, disabledFields = [], fields: selectedFields, locale, localeCodes })=>{
14
+ const hasVersions = Boolean(collectionConfig.versions);
15
+ // Determine if we need locale expansion
16
+ const expandLocales = locale === 'all' && localeCodes && localeCodes.length > 0;
17
+ // Get all possible columns from schema (excludes system fields like id, createdAt, updatedAt)
18
+ let schemaColumns = getFlattenedFieldKeys(collectionConfig.flattenedFields, '', expandLocales ? {
19
+ localeCodes
20
+ } : {});
21
+ // Add system fields that aren't in flattenedFields
22
+ const systemFields = [
23
+ 'id',
24
+ 'createdAt',
25
+ 'updatedAt'
26
+ ];
27
+ schemaColumns = [
28
+ ...systemFields,
29
+ ...schemaColumns
30
+ ];
31
+ // Filter to user-selected fields if specified
32
+ if (selectedFields && selectedFields.length > 0) {
33
+ schemaColumns = filterToSelectedFields(schemaColumns, selectedFields);
34
+ }
35
+ // Remove disabled fields
36
+ if (disabledFields.length > 0) {
37
+ const disabledSet = new Set();
38
+ for (const path of disabledFields){
39
+ // Convert dot notation to underscore and add to set
40
+ disabledSet.add(path.replace(/\./g, '_'));
41
+ }
42
+ schemaColumns = schemaColumns.filter((col)=>{
43
+ // Check if column matches any disabled path
44
+ for (const disabled of disabledSet){
45
+ if (col === disabled || col.startsWith(`${disabled}_`)) {
46
+ return false;
47
+ }
48
+ }
49
+ return true;
50
+ });
51
+ }
52
+ // When user has selected specific fields, preserve their ordering
53
+ // filterToSelectedFields() already returns columns in user's specified order
54
+ if (selectedFields && selectedFields.length > 0) {
55
+ return schemaColumns;
56
+ }
57
+ // No fields selected - apply default ordering (id first, timestamps last)
58
+ const orderedColumns = [];
59
+ // 1. ID always first
60
+ if (schemaColumns.includes('id')) {
61
+ orderedColumns.push('id');
62
+ }
63
+ // 2. Status field for versioned collections
64
+ if (hasVersions) {
65
+ orderedColumns.push('_status');
66
+ }
67
+ // 3. All other fields (excluding id, timestamps, status)
68
+ const excludeFromMiddle = new Set([
69
+ '_status',
70
+ 'createdAt',
71
+ 'id',
72
+ 'updatedAt'
73
+ ]);
74
+ for (const col of schemaColumns){
75
+ if (!excludeFromMiddle.has(col)) {
76
+ orderedColumns.push(col);
77
+ }
78
+ }
79
+ // 4. Timestamps at the end
80
+ if (schemaColumns.includes('createdAt')) {
81
+ orderedColumns.push('createdAt');
82
+ }
83
+ if (schemaColumns.includes('updatedAt')) {
84
+ orderedColumns.push('updatedAt');
85
+ }
86
+ return orderedColumns;
87
+ };
88
+ /**
89
+ * Merges schema-derived columns with data-discovered columns.
90
+ * Schema columns provide the base ordering, data columns add any additional
91
+ * columns (e.g., array indices beyond 0, dynamic fields).
92
+ */ export const mergeColumns = (schemaColumns, dataColumns)=>{
93
+ const result = [
94
+ ...schemaColumns
95
+ ];
96
+ const schemaSet = new Set(schemaColumns);
97
+ // Add any data columns not in schema (preserves schema ordering, appends new ones)
98
+ for (const col of dataColumns){
99
+ if (!schemaSet.has(col)) {
100
+ // Find the best position to insert this column
101
+ // For array indices (e.g., field_1_*), insert after field_0_*
102
+ const match = col.match(/^(.+?)_(\d+)(_.*)?$/);
103
+ if (match) {
104
+ const [, basePath, index, suffix] = match;
105
+ if (basePath && index) {
106
+ const prevIndex = parseInt(index, 10) - 1;
107
+ const prevCol = `${basePath}_${prevIndex}${suffix ?? ''}`;
108
+ const prevIdx = result.indexOf(prevCol);
109
+ if (prevIdx !== -1) {
110
+ // Insert after the previous index column
111
+ result.splice(prevIdx + 1, 0, col);
112
+ schemaSet.add(col);
113
+ continue;
114
+ }
115
+ }
116
+ }
117
+ // Otherwise append at the end (before timestamps)
118
+ const createdAtIdx = result.indexOf('createdAt');
119
+ if (createdAtIdx !== -1) {
120
+ result.splice(createdAtIdx, 0, col);
121
+ } else {
122
+ result.push(col);
123
+ }
124
+ schemaSet.add(col);
125
+ }
126
+ }
127
+ return result;
128
+ };
129
+ /**
130
+ * Filters schema columns to only include those matching user-selected fields.
131
+ * Preserves the order specified by the user in selectedFields.
132
+ * Handles nested field selection (e.g., 'group.value' includes 'group_value' and 'group_value_*')
133
+ */ function filterToSelectedFields(columns, selectedFields) {
134
+ const result = [];
135
+ const columnsSet = new Set(columns);
136
+ // Convert selected fields to underscore notation patterns
137
+ const patterns = selectedFields.map((field)=>{
138
+ const underscored = field.replace(/\./g, '_');
139
+ return {
140
+ exact: underscored,
141
+ original: field,
142
+ prefix: `${underscored}_`
143
+ };
144
+ });
145
+ // Iterate through user-specified fields in order to preserve their ordering
146
+ for (const pattern of patterns){
147
+ // First add the exact match if it exists
148
+ if (columnsSet.has(pattern.exact)) {
149
+ result.push(pattern.exact);
150
+ }
151
+ // Then add any columns with the prefix (nested fields)
152
+ for (const column of columns){
153
+ if (column !== pattern.exact && column.startsWith(pattern.prefix)) {
154
+ if (!result.includes(column)) {
155
+ result.push(column);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ return result;
161
+ }
162
+
163
+ //# sourceMappingURL=getSchemaColumns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/getSchemaColumns.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '@ruya.sa/payload'\n\nimport { getFlattenedFieldKeys } from './getFlattenedFieldKeys.js'\n\nexport type GetSchemaColumnsArgs = {\n /**\n * The collection configuration to derive columns from\n */\n collectionConfig: SanitizedCollectionConfig\n /**\n * Array of disabled field paths from plugin config\n */\n disabledFields?: string[]\n /**\n * User-selected fields to export. If provided, only these fields (and their nested fields) will be included.\n */\n fields?: string[]\n /**\n * The locale to export. When 'all', localized fields are expanded to include all locale suffixes.\n */\n locale?: null | string\n /**\n * Available locale codes from config. Required when locale='all'.\n */\n localeCodes?: string[]\n}\n\n/**\n * Derives CSV column names from the collection schema.\n * This provides a base set of columns from field definitions.\n *\n * Note: For arrays/blocks with multiple items, the schema only generates index 0.\n * Additional indices from actual data should be merged with these columns.\n *\n * Benefits:\n * - Provides consistent base columns\n * - Works for empty exports\n * - Ensures proper column ordering\n */\nexport const getSchemaColumns = ({\n collectionConfig,\n disabledFields = [],\n fields: selectedFields,\n locale,\n localeCodes,\n}: GetSchemaColumnsArgs): string[] => {\n const hasVersions = Boolean(collectionConfig.versions)\n\n // Determine if we need locale expansion\n const expandLocales = locale === 'all' && localeCodes && localeCodes.length > 0\n\n // Get all possible columns from schema (excludes system fields like id, createdAt, updatedAt)\n let schemaColumns = getFlattenedFieldKeys(\n collectionConfig.flattenedFields,\n '',\n expandLocales ? { localeCodes } : {},\n )\n\n // Add system fields that aren't in flattenedFields\n const systemFields = ['id', 'createdAt', 'updatedAt']\n schemaColumns = [...systemFields, ...schemaColumns]\n\n // Filter to user-selected fields if specified\n if (selectedFields && selectedFields.length > 0) {\n schemaColumns = filterToSelectedFields(schemaColumns, selectedFields)\n }\n\n // Remove disabled fields\n if (disabledFields.length > 0) {\n const disabledSet = new Set<string>()\n for (const path of disabledFields) {\n // Convert dot notation to underscore and add to set\n disabledSet.add(path.replace(/\\./g, '_'))\n }\n schemaColumns = schemaColumns.filter((col) => {\n // Check if column matches any disabled path\n for (const disabled of disabledSet) {\n if (col === disabled || col.startsWith(`${disabled}_`)) {\n return false\n }\n }\n return true\n })\n }\n\n // When user has selected specific fields, preserve their ordering\n // filterToSelectedFields() already returns columns in user's specified order\n if (selectedFields && selectedFields.length > 0) {\n return schemaColumns\n }\n\n // No fields selected - apply default ordering (id first, timestamps last)\n const orderedColumns: string[] = []\n\n // 1. ID always first\n if (schemaColumns.includes('id')) {\n orderedColumns.push('id')\n }\n\n // 2. Status field for versioned collections\n if (hasVersions) {\n orderedColumns.push('_status')\n }\n\n // 3. All other fields (excluding id, timestamps, status)\n const excludeFromMiddle = new Set(['_status', 'createdAt', 'id', 'updatedAt'])\n for (const col of schemaColumns) {\n if (!excludeFromMiddle.has(col)) {\n orderedColumns.push(col)\n }\n }\n\n // 4. Timestamps at the end\n if (schemaColumns.includes('createdAt')) {\n orderedColumns.push('createdAt')\n }\n if (schemaColumns.includes('updatedAt')) {\n orderedColumns.push('updatedAt')\n }\n\n return orderedColumns\n}\n\n/**\n * Merges schema-derived columns with data-discovered columns.\n * Schema columns provide the base ordering, data columns add any additional\n * columns (e.g., array indices beyond 0, dynamic fields).\n */\nexport const mergeColumns = (schemaColumns: string[], dataColumns: string[]): string[] => {\n const result = [...schemaColumns]\n const schemaSet = new Set(schemaColumns)\n\n // Add any data columns not in schema (preserves schema ordering, appends new ones)\n for (const col of dataColumns) {\n if (!schemaSet.has(col)) {\n // Find the best position to insert this column\n // For array indices (e.g., field_1_*), insert after field_0_*\n const match = col.match(/^(.+?)_(\\d+)(_.*)?$/)\n if (match) {\n const [, basePath, index, suffix] = match\n if (basePath && index) {\n const prevIndex = parseInt(index, 10) - 1\n const prevCol = `${basePath}_${prevIndex}${suffix ?? ''}`\n const prevIdx = result.indexOf(prevCol)\n if (prevIdx !== -1) {\n // Insert after the previous index column\n result.splice(prevIdx + 1, 0, col)\n schemaSet.add(col)\n continue\n }\n }\n }\n // Otherwise append at the end (before timestamps)\n const createdAtIdx = result.indexOf('createdAt')\n if (createdAtIdx !== -1) {\n result.splice(createdAtIdx, 0, col)\n } else {\n result.push(col)\n }\n schemaSet.add(col)\n }\n }\n\n return result\n}\n\n/**\n * Filters schema columns to only include those matching user-selected fields.\n * Preserves the order specified by the user in selectedFields.\n * Handles nested field selection (e.g., 'group.value' includes 'group_value' and 'group_value_*')\n */\nfunction filterToSelectedFields(columns: string[], selectedFields: string[]): string[] {\n const result: string[] = []\n const columnsSet = new Set(columns)\n\n // Convert selected fields to underscore notation patterns\n const patterns = selectedFields.map((field) => {\n const underscored = field.replace(/\\./g, '_')\n return {\n exact: underscored,\n original: field,\n prefix: `${underscored}_`,\n }\n })\n\n // Iterate through user-specified fields in order to preserve their ordering\n for (const pattern of patterns) {\n // First add the exact match if it exists\n if (columnsSet.has(pattern.exact)) {\n result.push(pattern.exact)\n }\n\n // Then add any columns with the prefix (nested fields)\n for (const column of columns) {\n if (column !== pattern.exact && column.startsWith(pattern.prefix)) {\n if (!result.includes(column)) {\n result.push(column)\n }\n }\n }\n }\n\n return result\n}\n"],"names":["getFlattenedFieldKeys","getSchemaColumns","collectionConfig","disabledFields","fields","selectedFields","locale","localeCodes","hasVersions","Boolean","versions","expandLocales","length","schemaColumns","flattenedFields","systemFields","filterToSelectedFields","disabledSet","Set","path","add","replace","filter","col","disabled","startsWith","orderedColumns","includes","push","excludeFromMiddle","has","mergeColumns","dataColumns","result","schemaSet","match","basePath","index","suffix","prevIndex","parseInt","prevCol","prevIdx","indexOf","splice","createdAtIdx","columns","columnsSet","patterns","map","field","underscored","exact","original","prefix","pattern","column"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { SelectIncludeType } from '@ruya.sa/payload';
2
+ /**
3
+ * Takes an input of array of string paths in dot notation and returns a select object.
4
+ * Used for both export and import to build Payload's select query format.
5
+ *
6
+ * @example
7
+ * getSelect(['id', 'title', 'group.value', 'createdAt', 'updatedAt'])
8
+ * // Returns: { id: true, title: true, group: { value: true }, createdAt: true, updatedAt: true }
9
+ */
10
+ export declare const getSelect: (fields: string[]) => SelectIncludeType;
11
+ //# sourceMappingURL=getSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/getSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,WAAY,MAAM,EAAE,KAAG,iBAoB5C,CAAA"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Takes an input of array of string paths in dot notation and returns a select object.
3
+ * Used for both export and import to build Payload's select query format.
4
+ *
5
+ * @example
6
+ * getSelect(['id', 'title', 'group.value', 'createdAt', 'updatedAt'])
7
+ * // Returns: { id: true, title: true, group: { value: true }, createdAt: true, updatedAt: true }
8
+ */ export const getSelect = (fields)=>{
9
+ const select = {};
10
+ fields.forEach((field)=>{
11
+ const segments = field.split('.');
12
+ let selectRef = select;
13
+ segments.forEach((segment, i)=>{
14
+ if (i === segments.length - 1) {
15
+ selectRef[segment] = true;
16
+ } else {
17
+ if (!selectRef[segment]) {
18
+ selectRef[segment] = {};
19
+ }
20
+ selectRef = selectRef[segment];
21
+ }
22
+ });
23
+ });
24
+ return select;
25
+ };
26
+
27
+ //# sourceMappingURL=getSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/getSelect.ts"],"sourcesContent":["import type { SelectIncludeType } from '@ruya.sa/payload'\n\n/**\n * Takes an input of array of string paths in dot notation and returns a select object.\n * Used for both export and import to build Payload's select query format.\n *\n * @example\n * getSelect(['id', 'title', 'group.value', 'createdAt', 'updatedAt'])\n * // Returns: { id: true, title: true, group: { value: true }, createdAt: true, updatedAt: true }\n */\nexport const getSelect = (fields: string[]): SelectIncludeType => {\n const select: SelectIncludeType = {}\n\n fields.forEach((field) => {\n const segments = field.split('.')\n let selectRef = select\n\n segments.forEach((segment, i) => {\n if (i === segments.length - 1) {\n selectRef[segment] = true\n } else {\n if (!selectRef[segment]) {\n selectRef[segment] = {}\n }\n selectRef = selectRef[segment] as SelectIncludeType\n }\n })\n })\n\n return select\n}\n"],"names":["getSelect","fields","select","forEach","field","segments","split","selectRef","segment","i","length"],"mappings":"AAEA;;;;;;;CAOC,GACD,OAAO,MAAMA,YAAY,CAACC;IACxB,MAAMC,SAA4B,CAAC;IAEnCD,OAAOE,OAAO,CAAC,CAACC;QACd,MAAMC,WAAWD,MAAME,KAAK,CAAC;QAC7B,IAAIC,YAAYL;QAEhBG,SAASF,OAAO,CAAC,CAACK,SAASC;YACzB,IAAIA,MAAMJ,SAASK,MAAM,GAAG,GAAG;gBAC7BH,SAAS,CAACC,QAAQ,GAAG;YACvB,OAAO;gBACL,IAAI,CAACD,SAAS,CAACC,QAAQ,EAAE;oBACvBD,SAAS,CAACC,QAAQ,GAAG,CAAC;gBACxB;gBACAD,YAAYA,SAAS,CAACC,QAAQ;YAChC;QACF;IACF;IAEA,OAAON;AACT,EAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Safely retrieves a deeply nested value from an object using a dot-notation path.
3
+ *
4
+ * Supports:
5
+ * - Indexed array access (e.g., "array.0.field1")
6
+ * - Polymorphic blocks or keyed unions (e.g., "blocks.0.hero.title"), where the block key
7
+ * (e.g., "hero") maps to a nested object inside the block item.
8
+ *
9
+ *
10
+ * @param obj - The input object to traverse.
11
+ * @param path - A dot-separated string representing the path to retrieve.
12
+ * @returns The value at the specified path, or undefined if not found.
13
+ */
14
+ export declare const getValueAtPath: (obj: unknown, path: string) => unknown;
15
+ //# sourceMappingURL=getvalueAtPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getvalueAtPath.d.ts","sourceRoot":"","sources":["../../src/utilities/getvalueAtPath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,QAAS,OAAO,QAAQ,MAAM,KAAG,OA6C3D,CAAA"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Safely retrieves a deeply nested value from an object using a dot-notation path.
3
+ *
4
+ * Supports:
5
+ * - Indexed array access (e.g., "array.0.field1")
6
+ * - Polymorphic blocks or keyed unions (e.g., "blocks.0.hero.title"), where the block key
7
+ * (e.g., "hero") maps to a nested object inside the block item.
8
+ *
9
+ *
10
+ * @param obj - The input object to traverse.
11
+ * @param path - A dot-separated string representing the path to retrieve.
12
+ * @returns The value at the specified path, or undefined if not found.
13
+ */ export const getValueAtPath = (obj, path)=>{
14
+ if (!obj || typeof obj !== 'object') {
15
+ return undefined;
16
+ }
17
+ const parts = path.split('.');
18
+ let current = obj;
19
+ for (const part of parts){
20
+ if (current == null) {
21
+ return undefined;
22
+ }
23
+ // If the path part is a number, treat it as an array index
24
+ if (!isNaN(Number(part))) {
25
+ current = current[Number(part)];
26
+ continue;
27
+ }
28
+ // Special case: if current is an array of blocks like [{ hero: { title: '...' } }]
29
+ // and the path is "blocks.0.hero.title", then `part` would be "hero"
30
+ if (Array.isArray(current)) {
31
+ const idx = Number(parts[parts.indexOf(part) - 1]);
32
+ const blockItem = current[idx];
33
+ if (typeof blockItem === 'object') {
34
+ const keys = Object.keys(blockItem);
35
+ // Find the key (e.g., "hero") that maps to an object
36
+ const matchingBlock = keys.find((key)=>blockItem[key] && typeof blockItem[key] === 'object');
37
+ if (matchingBlock && part === matchingBlock) {
38
+ current = blockItem[matchingBlock];
39
+ continue;
40
+ }
41
+ }
42
+ }
43
+ // Fallback to plain object key access
44
+ current = current[part];
45
+ }
46
+ return current;
47
+ };
48
+
49
+ //# sourceMappingURL=getvalueAtPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/getvalueAtPath.ts"],"sourcesContent":["/**\n * Safely retrieves a deeply nested value from an object using a dot-notation path.\n *\n * Supports:\n * - Indexed array access (e.g., \"array.0.field1\")\n * - Polymorphic blocks or keyed unions (e.g., \"blocks.0.hero.title\"), where the block key\n * (e.g., \"hero\") maps to a nested object inside the block item.\n *\n *\n * @param obj - The input object to traverse.\n * @param path - A dot-separated string representing the path to retrieve.\n * @returns The value at the specified path, or undefined if not found.\n */\nexport const getValueAtPath = (obj: unknown, path: string): unknown => {\n if (!obj || typeof obj !== 'object') {\n return undefined\n }\n\n const parts = path.split('.')\n let current: any = obj\n\n for (const part of parts) {\n if (current == null) {\n return undefined\n }\n\n // If the path part is a number, treat it as an array index\n if (!isNaN(Number(part))) {\n current = current[Number(part)]\n continue\n }\n\n // Special case: if current is an array of blocks like [{ hero: { title: '...' } }]\n // and the path is \"blocks.0.hero.title\", then `part` would be \"hero\"\n if (Array.isArray(current)) {\n const idx = Number(parts[parts.indexOf(part) - 1])\n const blockItem = current[idx]\n\n if (typeof blockItem === 'object') {\n const keys = Object.keys(blockItem)\n\n // Find the key (e.g., \"hero\") that maps to an object\n const matchingBlock = keys.find(\n (key) => blockItem[key] && typeof blockItem[key] === 'object',\n )\n\n if (matchingBlock && part === matchingBlock) {\n current = blockItem[matchingBlock]\n continue\n }\n }\n }\n\n // Fallback to plain object key access\n current = current[part]\n }\n\n return current\n}\n"],"names":["getValueAtPath","obj","path","undefined","parts","split","current","part","isNaN","Number","Array","isArray","idx","indexOf","blockItem","keys","Object","matchingBlock","find","key"],"mappings":"AAAA;;;;;;;;;;;;CAYC,GACD,OAAO,MAAMA,iBAAiB,CAACC,KAAcC;IAC3C,IAAI,CAACD,OAAO,OAAOA,QAAQ,UAAU;QACnC,OAAOE;IACT;IAEA,MAAMC,QAAQF,KAAKG,KAAK,CAAC;IACzB,IAAIC,UAAeL;IAEnB,KAAK,MAAMM,QAAQH,MAAO;QACxB,IAAIE,WAAW,MAAM;YACnB,OAAOH;QACT;QAEA,2DAA2D;QAC3D,IAAI,CAACK,MAAMC,OAAOF,QAAQ;YACxBD,UAAUA,OAAO,CAACG,OAAOF,MAAM;YAC/B;QACF;QAEA,mFAAmF;QACnF,qEAAqE;QACrE,IAAIG,MAAMC,OAAO,CAACL,UAAU;YAC1B,MAAMM,MAAMH,OAAOL,KAAK,CAACA,MAAMS,OAAO,CAACN,QAAQ,EAAE;YACjD,MAAMO,YAAYR,OAAO,CAACM,IAAI;YAE9B,IAAI,OAAOE,cAAc,UAAU;gBACjC,MAAMC,OAAOC,OAAOD,IAAI,CAACD;gBAEzB,qDAAqD;gBACrD,MAAMG,gBAAgBF,KAAKG,IAAI,CAC7B,CAACC,MAAQL,SAAS,CAACK,IAAI,IAAI,OAAOL,SAAS,CAACK,IAAI,KAAK;gBAGvD,IAAIF,iBAAiBV,SAASU,eAAe;oBAC3CX,UAAUQ,SAAS,CAACG,cAAc;oBAClC;gBACF;YACF;QACF;QAEA,sCAAsC;QACtCX,UAAUA,OAAO,CAACC,KAAK;IACzB;IAEA,OAAOD;AACT,EAAC"}
@@ -0,0 +1,11 @@
1
+ import type { PayloadRequest } from '@ruya.sa/payload';
2
+ export type ParseCSVArgs = {
3
+ data: Buffer | string;
4
+ req: PayloadRequest;
5
+ };
6
+ /**
7
+ * Parses CSV data into an array of record objects.
8
+ * Handles type coercion for booleans, numbers, and null values.
9
+ */
10
+ export declare const parseCSV: ({ data, req }: ParseCSVArgs) => Promise<Record<string, unknown>[]>;
11
+ //# sourceMappingURL=parseCSV.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseCSV.d.ts","sourceRoot":"","sources":["../../src/utilities/parseCSV.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAItD,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,kBAAyB,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAmE7F,CAAA"}
@@ -0,0 +1,67 @@
1
+ import { parse } from 'csv-parse';
2
+ /**
3
+ * Parses CSV data into an array of record objects.
4
+ * Handles type coercion for booleans, numbers, and null values.
5
+ */ export const parseCSV = async ({ data, req })=>{
6
+ return new Promise((resolve, reject)=>{
7
+ const records = [];
8
+ const parser = parse({
9
+ cast: (value, _context)=>{
10
+ // Empty strings should be undefined (field not present in update)
11
+ // This preserves existing data instead of overwriting with null
12
+ if (value === '') {
13
+ return undefined;
14
+ }
15
+ // Handle booleans
16
+ if (value === 'true') {
17
+ return true;
18
+ }
19
+ if (value === 'false') {
20
+ return false;
21
+ }
22
+ // Handle explicit null - user must type "null" to set field to null
23
+ if (value === 'null' || value === 'NULL') {
24
+ return null;
25
+ }
26
+ // Don't auto-convert to numbers if the value contains a comma
27
+ // This allows hasMany fields to use comma-separated values
28
+ if (value.includes(',')) {
29
+ return value // Keep as string for comma-separated values
30
+ ;
31
+ }
32
+ // Handle numbers (only after checking for commas)
33
+ if (!isNaN(Number(value)) && value !== '') {
34
+ const num = Number(value);
35
+ if (String(num) === value || value.includes('.')) {
36
+ return num;
37
+ }
38
+ }
39
+ // Return as string
40
+ return value;
41
+ },
42
+ columns: true,
43
+ skip_empty_lines: true,
44
+ trim: true
45
+ });
46
+ parser.on('readable', ()=>{
47
+ let record;
48
+ while((record = parser.read()) !== null){
49
+ records.push(record);
50
+ }
51
+ });
52
+ parser.on('error', (err)=>{
53
+ req.payload.logger.error({
54
+ err,
55
+ msg: 'Error parsing CSV'
56
+ });
57
+ reject(err);
58
+ });
59
+ parser.on('end', ()=>{
60
+ resolve(records);
61
+ });
62
+ parser.write(data);
63
+ parser.end();
64
+ });
65
+ };
66
+
67
+ //# sourceMappingURL=parseCSV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/parseCSV.ts"],"sourcesContent":["import type { PayloadRequest } from '@ruya.sa/payload'\n\nimport { parse } from 'csv-parse'\n\nexport type ParseCSVArgs = {\n data: Buffer | string\n req: PayloadRequest\n}\n\n/**\n * Parses CSV data into an array of record objects.\n * Handles type coercion for booleans, numbers, and null values.\n */\nexport const parseCSV = async ({ data, req }: ParseCSVArgs): Promise<Record<string, unknown>[]> => {\n return new Promise((resolve, reject) => {\n const records: Record<string, unknown>[] = []\n\n const parser = parse({\n cast: (value, _context) => {\n // Empty strings should be undefined (field not present in update)\n // This preserves existing data instead of overwriting with null\n if (value === '') {\n return undefined\n }\n\n // Handle booleans\n if (value === 'true') {\n return true\n }\n if (value === 'false') {\n return false\n }\n\n // Handle explicit null - user must type \"null\" to set field to null\n if (value === 'null' || value === 'NULL') {\n return null\n }\n\n // Don't auto-convert to numbers if the value contains a comma\n // This allows hasMany fields to use comma-separated values\n if (value.includes(',')) {\n return value // Keep as string for comma-separated values\n }\n\n // Handle numbers (only after checking for commas)\n if (!isNaN(Number(value)) && value !== '') {\n const num = Number(value)\n\n if (String(num) === value || value.includes('.')) {\n return num\n }\n }\n\n // Return as string\n return value\n },\n columns: true,\n skip_empty_lines: true,\n trim: true,\n })\n\n parser.on('readable', () => {\n let record\n while ((record = parser.read()) !== null) {\n records.push(record)\n }\n })\n\n parser.on('error', (err) => {\n req.payload.logger.error({ err, msg: 'Error parsing CSV' })\n reject(err)\n })\n\n parser.on('end', () => {\n resolve(records)\n })\n\n parser.write(data)\n parser.end()\n })\n}\n"],"names":["parse","parseCSV","data","req","Promise","resolve","reject","records","parser","cast","value","_context","undefined","includes","isNaN","Number","num","String","columns","skip_empty_lines","trim","on","record","read","push","err","payload","logger","error","msg","write","end"],"mappings":"AAEA,SAASA,KAAK,QAAQ,YAAW;AAOjC;;;CAGC,GACD,OAAO,MAAMC,WAAW,OAAO,EAAEC,IAAI,EAAEC,GAAG,EAAgB;IACxD,OAAO,IAAIC,QAAQ,CAACC,SAASC;QAC3B,MAAMC,UAAqC,EAAE;QAE7C,MAAMC,SAASR,MAAM;YACnBS,MAAM,CAACC,OAAOC;gBACZ,kEAAkE;gBAClE,gEAAgE;gBAChE,IAAID,UAAU,IAAI;oBAChB,OAAOE;gBACT;gBAEA,kBAAkB;gBAClB,IAAIF,UAAU,QAAQ;oBACpB,OAAO;gBACT;gBACA,IAAIA,UAAU,SAAS;oBACrB,OAAO;gBACT;gBAEA,oEAAoE;gBACpE,IAAIA,UAAU,UAAUA,UAAU,QAAQ;oBACxC,OAAO;gBACT;gBAEA,8DAA8D;gBAC9D,2DAA2D;gBAC3D,IAAIA,MAAMG,QAAQ,CAAC,MAAM;oBACvB,OAAOH,MAAM,4CAA4C;;gBAC3D;gBAEA,kDAAkD;gBAClD,IAAI,CAACI,MAAMC,OAAOL,WAAWA,UAAU,IAAI;oBACzC,MAAMM,MAAMD,OAAOL;oBAEnB,IAAIO,OAAOD,SAASN,SAASA,MAAMG,QAAQ,CAAC,MAAM;wBAChD,OAAOG;oBACT;gBACF;gBAEA,mBAAmB;gBACnB,OAAON;YACT;YACAQ,SAAS;YACTC,kBAAkB;YAClBC,MAAM;QACR;QAEAZ,OAAOa,EAAE,CAAC,YAAY;YACpB,IAAIC;YACJ,MAAO,AAACA,CAAAA,SAASd,OAAOe,IAAI,EAAC,MAAO,KAAM;gBACxChB,QAAQiB,IAAI,CAACF;YACf;QACF;QAEAd,OAAOa,EAAE,CAAC,SAAS,CAACI;YAClBtB,IAAIuB,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;gBAAEH;gBAAKI,KAAK;YAAoB;YACzDvB,OAAOmB;QACT;QAEAjB,OAAOa,EAAE,CAAC,OAAO;YACfhB,QAAQE;QACV;QAEAC,OAAOsB,KAAK,CAAC5B;QACbM,OAAOuB,GAAG;IACZ;AACF,EAAC"}
@@ -0,0 +1,169 @@
1
+ import { parseCSV } from './parseCSV.js';
2
+ import { describe, it, expect, vi } from 'vitest';
3
+ describe('parseCSV', ()=>{
4
+ const mockReq = {
5
+ payload: {
6
+ logger: {
7
+ error: vi.fn()
8
+ }
9
+ }
10
+ };
11
+ describe('cast function behavior', ()=>{
12
+ it('should preserve comma-separated values as strings', async ()=>{
13
+ const csvData = Buffer.from('numbers,ids\n"1,2,3,5,8","id1,id2,id3"');
14
+ const result = await parseCSV({
15
+ data: csvData,
16
+ req: mockReq
17
+ });
18
+ expect(result).toEqual([
19
+ {
20
+ numbers: '1,2,3,5,8',
21
+ ids: 'id1,id2,id3'
22
+ }
23
+ ]);
24
+ });
25
+ it('should convert single numbers to numbers', async ()=>{
26
+ const csvData = Buffer.from('single,decimal\n"42","3.14"');
27
+ const result = await parseCSV({
28
+ data: csvData,
29
+ req: mockReq
30
+ });
31
+ expect(result).toEqual([
32
+ {
33
+ single: 42,
34
+ decimal: 3.14
35
+ }
36
+ ]);
37
+ });
38
+ it('should handle booleans correctly', async ()=>{
39
+ const csvData = Buffer.from('bool1,bool2,notBool\n"true","false","True"');
40
+ const result = await parseCSV({
41
+ data: csvData,
42
+ req: mockReq
43
+ });
44
+ expect(result).toEqual([
45
+ {
46
+ bool1: true,
47
+ bool2: false,
48
+ notBool: 'True'
49
+ }
50
+ ]);
51
+ });
52
+ it('should convert empty strings to undefined', async ()=>{
53
+ const csvData = Buffer.from('field1,field2\n"","value"');
54
+ const result = await parseCSV({
55
+ data: csvData,
56
+ req: mockReq
57
+ });
58
+ expect(result).toEqual([
59
+ {
60
+ // field1 is undefined (not present) - empty cells don't update fields
61
+ field2: 'value'
62
+ }
63
+ ]);
64
+ });
65
+ it('should handle null strings', async ()=>{
66
+ const csvData = Buffer.from('field1,field2,field3\n"null","NULL","Null"');
67
+ const result = await parseCSV({
68
+ data: csvData,
69
+ req: mockReq
70
+ });
71
+ expect(result).toEqual([
72
+ {
73
+ field1: null,
74
+ field2: null,
75
+ field3: 'Null'
76
+ }
77
+ ]);
78
+ });
79
+ it('should preserve spaces in comma-separated values', async ()=>{
80
+ const csvData = Buffer.from('numbers\n" 10 , 20 , 30 "');
81
+ const result = await parseCSV({
82
+ data: csvData,
83
+ req: mockReq
84
+ });
85
+ expect(result).toEqual([
86
+ {
87
+ numbers: ' 10 , 20 , 30 '
88
+ }
89
+ ]);
90
+ });
91
+ it('should handle mixed comma-separated values with empty entries', async ()=>{
92
+ const csvData = Buffer.from('mixed\n"1,,3,,5"');
93
+ const result = await parseCSV({
94
+ data: csvData,
95
+ req: mockReq
96
+ });
97
+ expect(result).toEqual([
98
+ {
99
+ mixed: '1,,3,,5'
100
+ }
101
+ ]);
102
+ });
103
+ it('should handle MongoDB ObjectIds as strings', async ()=>{
104
+ const csvData = Buffer.from('id\n"507f1f77bcf86cd799439011"');
105
+ const result = await parseCSV({
106
+ data: csvData,
107
+ req: mockReq
108
+ });
109
+ expect(result).toEqual([
110
+ {
111
+ id: '507f1f77bcf86cd799439011'
112
+ }
113
+ ]);
114
+ });
115
+ it('should handle multiple rows with various data types', async ()=>{
116
+ const csvData = Buffer.from('title,count,tags,active\n' + '"Item 1","5","tag1,tag2,tag3","true"\n' + '"Item 2","","","false"\n' + '"Item 3","10","single",""\n');
117
+ const result = await parseCSV({
118
+ data: csvData,
119
+ req: mockReq
120
+ });
121
+ expect(result).toEqual([
122
+ {
123
+ title: 'Item 1',
124
+ count: 5,
125
+ tags: 'tag1,tag2,tag3',
126
+ active: true
127
+ },
128
+ {
129
+ title: 'Item 2',
130
+ // count is undefined (empty cell - field not updated)
131
+ // tags is undefined (empty cell - field not updated)
132
+ active: false
133
+ },
134
+ {
135
+ title: 'Item 3',
136
+ count: 10,
137
+ tags: 'single'
138
+ }
139
+ ]);
140
+ });
141
+ it('should skip empty lines', async ()=>{
142
+ const csvData = Buffer.from('field\n"value1"\n\n"value2"\n\n');
143
+ const result = await parseCSV({
144
+ data: csvData,
145
+ req: mockReq
146
+ });
147
+ expect(result).toEqual([
148
+ {
149
+ field: 'value1'
150
+ },
151
+ {
152
+ field: 'value2'
153
+ }
154
+ ]);
155
+ });
156
+ });
157
+ describe('error handling', ()=>{
158
+ it('should handle parsing errors', async ()=>{
159
+ const invalidCsv = Buffer.from('field1,field2\n"value1');
160
+ await expect(parseCSV({
161
+ data: invalidCsv,
162
+ req: mockReq
163
+ })).rejects.toThrow();
164
+ expect(mockReq.payload.logger.error).toHaveBeenCalled();
165
+ });
166
+ });
167
+ });
168
+
169
+ //# sourceMappingURL=parseCSV.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/parseCSV.spec.ts"],"sourcesContent":["import { PayloadRequest } from '@ruya.sa/payload'\n\nimport { parseCSV } from './parseCSV.js'\nimport { describe, it, expect, vi } from 'vitest'\n\ndescribe('parseCSV', () => {\n const mockReq = {\n payload: {\n logger: {\n error: vi.fn(),\n },\n },\n } as unknown as PayloadRequest\n\n describe('cast function behavior', () => {\n it('should preserve comma-separated values as strings', async () => {\n const csvData = Buffer.from('numbers,ids\\n\"1,2,3,5,8\",\"id1,id2,id3\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n numbers: '1,2,3,5,8',\n ids: 'id1,id2,id3',\n },\n ])\n })\n\n it('should convert single numbers to numbers', async () => {\n const csvData = Buffer.from('single,decimal\\n\"42\",\"3.14\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n single: 42,\n decimal: 3.14,\n },\n ])\n })\n\n it('should handle booleans correctly', async () => {\n const csvData = Buffer.from('bool1,bool2,notBool\\n\"true\",\"false\",\"True\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n bool1: true,\n bool2: false,\n notBool: 'True', // Case-sensitive\n },\n ])\n })\n\n it('should convert empty strings to undefined', async () => {\n const csvData = Buffer.from('field1,field2\\n\"\",\"value\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n // field1 is undefined (not present) - empty cells don't update fields\n field2: 'value',\n },\n ])\n })\n\n it('should handle null strings', async () => {\n const csvData = Buffer.from('field1,field2,field3\\n\"null\",\"NULL\",\"Null\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n field1: null,\n field2: null,\n field3: 'Null', // Case-sensitive for mixed case\n },\n ])\n })\n\n it('should preserve spaces in comma-separated values', async () => {\n const csvData = Buffer.from('numbers\\n\" 10 , 20 , 30 \"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n numbers: ' 10 , 20 , 30 ', // CSV parser trims outer quotes but preserves the content\n },\n ])\n })\n\n it('should handle mixed comma-separated values with empty entries', async () => {\n const csvData = Buffer.from('mixed\\n\"1,,3,,5\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n mixed: '1,,3,,5',\n },\n ])\n })\n\n it('should handle MongoDB ObjectIds as strings', async () => {\n const csvData = Buffer.from('id\\n\"507f1f77bcf86cd799439011\"')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n id: '507f1f77bcf86cd799439011',\n },\n ])\n })\n\n it('should handle multiple rows with various data types', async () => {\n const csvData = Buffer.from(\n 'title,count,tags,active\\n' +\n '\"Item 1\",\"5\",\"tag1,tag2,tag3\",\"true\"\\n' +\n '\"Item 2\",\"\",\"\",\"false\"\\n' +\n '\"Item 3\",\"10\",\"single\",\"\"\\n',\n )\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([\n {\n title: 'Item 1',\n count: 5,\n tags: 'tag1,tag2,tag3',\n active: true,\n },\n {\n title: 'Item 2',\n // count is undefined (empty cell - field not updated)\n // tags is undefined (empty cell - field not updated)\n active: false,\n },\n {\n title: 'Item 3',\n count: 10,\n tags: 'single',\n // active is undefined (empty cell - field not updated)\n },\n ])\n })\n\n it('should skip empty lines', async () => {\n const csvData = Buffer.from('field\\n\"value1\"\\n\\n\"value2\"\\n\\n')\n const result = await parseCSV({ data: csvData, req: mockReq })\n\n expect(result).toEqual([{ field: 'value1' }, { field: 'value2' }])\n })\n })\n\n describe('error handling', () => {\n it('should handle parsing errors', async () => {\n const invalidCsv = Buffer.from('field1,field2\\n\"value1')\n\n await expect(parseCSV({ data: invalidCsv, req: mockReq })).rejects.toThrow()\n expect(mockReq.payload.logger.error).toHaveBeenCalled()\n })\n })\n})\n"],"names":["parseCSV","describe","it","expect","vi","mockReq","payload","logger","error","fn","csvData","Buffer","from","result","data","req","toEqual","numbers","ids","single","decimal","bool1","bool2","notBool","field2","field1","field3","mixed","id","title","count","tags","active","field","invalidCsv","rejects","toThrow","toHaveBeenCalled"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,gBAAe;AACxC,SAASC,QAAQ,EAAEC,EAAE,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAEjDH,SAAS,YAAY;IACnB,MAAMI,UAAU;QACdC,SAAS;YACPC,QAAQ;gBACNC,OAAOJ,GAAGK,EAAE;YACd;QACF;IACF;IAEAR,SAAS,0BAA0B;QACjCC,GAAG,qDAAqD;YACtD,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEC,SAAS;oBACTC,KAAK;gBACP;aACD;QACH;QAEAhB,GAAG,4CAA4C;YAC7C,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEG,QAAQ;oBACRC,SAAS;gBACX;aACD;QACH;QAEAlB,GAAG,oCAAoC;YACrC,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEK,OAAO;oBACPC,OAAO;oBACPC,SAAS;gBACX;aACD;QACH;QAEArB,GAAG,6CAA6C;YAC9C,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACE,sEAAsE;oBACtEQ,QAAQ;gBACV;aACD;QACH;QAEAtB,GAAG,8BAA8B;YAC/B,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACES,QAAQ;oBACRD,QAAQ;oBACRE,QAAQ;gBACV;aACD;QACH;QAEAxB,GAAG,oDAAoD;YACrD,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEC,SAAS;gBACX;aACD;QACH;QAEAf,GAAG,iEAAiE;YAClE,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEW,OAAO;gBACT;aACD;QACH;QAEAzB,GAAG,8CAA8C;YAC/C,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEY,IAAI;gBACN;aACD;QACH;QAEA1B,GAAG,uDAAuD;YACxD,MAAMQ,UAAUC,OAAOC,IAAI,CACzB,8BACE,2CACA,6BACA;YAEJ,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBACrB;oBACEa,OAAO;oBACPC,OAAO;oBACPC,MAAM;oBACNC,QAAQ;gBACV;gBACA;oBACEH,OAAO;oBACP,sDAAsD;oBACtD,qDAAqD;oBACrDG,QAAQ;gBACV;gBACA;oBACEH,OAAO;oBACPC,OAAO;oBACPC,MAAM;gBAER;aACD;QACH;QAEA7B,GAAG,2BAA2B;YAC5B,MAAMQ,UAAUC,OAAOC,IAAI,CAAC;YAC5B,MAAMC,SAAS,MAAMb,SAAS;gBAAEc,MAAMJ;gBAASK,KAAKV;YAAQ;YAE5DF,OAAOU,QAAQG,OAAO,CAAC;gBAAC;oBAAEiB,OAAO;gBAAS;gBAAG;oBAAEA,OAAO;gBAAS;aAAE;QACnE;IACF;IAEAhC,SAAS,kBAAkB;QACzBC,GAAG,gCAAgC;YACjC,MAAMgC,aAAavB,OAAOC,IAAI,CAAC;YAE/B,MAAMT,OAAOH,SAAS;gBAAEc,MAAMoB;gBAAYnB,KAAKV;YAAQ,IAAI8B,OAAO,CAACC,OAAO;YAC1EjC,OAAOE,QAAQC,OAAO,CAACC,MAAM,CAACC,KAAK,EAAE6B,gBAAgB;QACvD;IACF;AACF"}