@payloadcms/plugin-import-export 3.75.0 → 3.76.0-canary.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 (244) hide show
  1. package/dist/components/CollectionField/index.d.ts.map +1 -1
  2. package/dist/components/CollectionField/index.js +6 -2
  3. package/dist/components/CollectionField/index.js.map +1 -1
  4. package/dist/components/ExportPreview/index.d.ts.map +1 -1
  5. package/dist/components/ExportPreview/index.js +30 -12
  6. package/dist/components/ExportPreview/index.js.map +1 -1
  7. package/dist/components/ExportPreview/index.scss +12 -0
  8. package/dist/components/ImportPreview/index.js +3 -15
  9. package/dist/components/ImportPreview/index.js.map +1 -1
  10. package/dist/export/createExport.d.ts +6 -1
  11. package/dist/export/createExport.d.ts.map +1 -1
  12. package/dist/export/createExport.js +37 -13
  13. package/dist/export/createExport.js.map +1 -1
  14. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
  15. package/dist/export/getCreateExportCollectionTask.js +4 -1
  16. package/dist/export/getCreateExportCollectionTask.js.map +1 -1
  17. package/dist/export/getExportCollection.d.ts.map +1 -1
  18. package/dist/export/getExportCollection.js +23 -3
  19. package/dist/export/getExportCollection.js.map +1 -1
  20. package/dist/export/getFields.d.ts.map +1 -1
  21. package/dist/export/getFields.js +7 -3
  22. package/dist/export/getFields.js.map +1 -1
  23. package/dist/export/handleDownload.d.ts.map +1 -1
  24. package/dist/export/handleDownload.js +18 -1
  25. package/dist/export/handleDownload.js.map +1 -1
  26. package/dist/export/handlePreview.d.ts.map +1 -1
  27. package/dist/export/handlePreview.js +32 -10
  28. package/dist/export/handlePreview.js.map +1 -1
  29. package/dist/exports/types.d.ts +1 -1
  30. package/dist/exports/types.d.ts.map +1 -1
  31. package/dist/exports/types.js.map +1 -1
  32. package/dist/import/batchProcessor.d.ts.map +1 -1
  33. package/dist/import/batchProcessor.js +54 -55
  34. package/dist/import/batchProcessor.js.map +1 -1
  35. package/dist/import/createImport.d.ts +6 -1
  36. package/dist/import/createImport.d.ts.map +1 -1
  37. package/dist/import/createImport.js +5 -1
  38. package/dist/import/createImport.js.map +1 -1
  39. package/dist/import/getCreateImportCollectionTask.d.ts +9 -6
  40. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
  41. package/dist/import/getCreateImportCollectionTask.js +105 -65
  42. package/dist/import/getCreateImportCollectionTask.js.map +1 -1
  43. package/dist/import/getImportCollection.d.ts.map +1 -1
  44. package/dist/import/getImportCollection.js +39 -45
  45. package/dist/import/getImportCollection.js.map +1 -1
  46. package/dist/import/handlePreview.d.ts.map +1 -1
  47. package/dist/import/handlePreview.js +11 -0
  48. package/dist/import/handlePreview.js.map +1 -1
  49. package/dist/index.d.ts +22 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +26 -2
  52. package/dist/index.js.map +1 -1
  53. package/dist/translations/languages/ar.d.ts.map +1 -1
  54. package/dist/translations/languages/ar.js +3 -0
  55. package/dist/translations/languages/ar.js.map +1 -1
  56. package/dist/translations/languages/az.d.ts.map +1 -1
  57. package/dist/translations/languages/az.js +3 -0
  58. package/dist/translations/languages/az.js.map +1 -1
  59. package/dist/translations/languages/bg.d.ts.map +1 -1
  60. package/dist/translations/languages/bg.js +3 -0
  61. package/dist/translations/languages/bg.js.map +1 -1
  62. package/dist/translations/languages/bnBd.d.ts.map +1 -1
  63. package/dist/translations/languages/bnBd.js +22 -19
  64. package/dist/translations/languages/bnBd.js.map +1 -1
  65. package/dist/translations/languages/bnIn.d.ts.map +1 -1
  66. package/dist/translations/languages/bnIn.js +22 -19
  67. package/dist/translations/languages/bnIn.js.map +1 -1
  68. package/dist/translations/languages/ca.d.ts.map +1 -1
  69. package/dist/translations/languages/ca.js +3 -0
  70. package/dist/translations/languages/ca.js.map +1 -1
  71. package/dist/translations/languages/cs.d.ts.map +1 -1
  72. package/dist/translations/languages/cs.js +3 -0
  73. package/dist/translations/languages/cs.js.map +1 -1
  74. package/dist/translations/languages/da.d.ts.map +1 -1
  75. package/dist/translations/languages/da.js +3 -0
  76. package/dist/translations/languages/da.js.map +1 -1
  77. package/dist/translations/languages/de.d.ts.map +1 -1
  78. package/dist/translations/languages/de.js +3 -0
  79. package/dist/translations/languages/de.js.map +1 -1
  80. package/dist/translations/languages/en.d.ts +3 -0
  81. package/dist/translations/languages/en.d.ts.map +1 -1
  82. package/dist/translations/languages/en.js +3 -0
  83. package/dist/translations/languages/en.js.map +1 -1
  84. package/dist/translations/languages/es.d.ts.map +1 -1
  85. package/dist/translations/languages/es.js +3 -0
  86. package/dist/translations/languages/es.js.map +1 -1
  87. package/dist/translations/languages/et.d.ts.map +1 -1
  88. package/dist/translations/languages/et.js +3 -0
  89. package/dist/translations/languages/et.js.map +1 -1
  90. package/dist/translations/languages/fa.d.ts.map +1 -1
  91. package/dist/translations/languages/fa.js +3 -0
  92. package/dist/translations/languages/fa.js.map +1 -1
  93. package/dist/translations/languages/fr.d.ts.map +1 -1
  94. package/dist/translations/languages/fr.js +3 -0
  95. package/dist/translations/languages/fr.js.map +1 -1
  96. package/dist/translations/languages/he.d.ts.map +1 -1
  97. package/dist/translations/languages/he.js +3 -0
  98. package/dist/translations/languages/he.js.map +1 -1
  99. package/dist/translations/languages/hr.d.ts.map +1 -1
  100. package/dist/translations/languages/hr.js +3 -0
  101. package/dist/translations/languages/hr.js.map +1 -1
  102. package/dist/translations/languages/hu.d.ts.map +1 -1
  103. package/dist/translations/languages/hu.js +3 -0
  104. package/dist/translations/languages/hu.js.map +1 -1
  105. package/dist/translations/languages/hy.d.ts.map +1 -1
  106. package/dist/translations/languages/hy.js +3 -0
  107. package/dist/translations/languages/hy.js.map +1 -1
  108. package/dist/translations/languages/id.d.ts.map +1 -1
  109. package/dist/translations/languages/id.js +13 -10
  110. package/dist/translations/languages/id.js.map +1 -1
  111. package/dist/translations/languages/is.d.ts.map +1 -1
  112. package/dist/translations/languages/is.js +3 -0
  113. package/dist/translations/languages/is.js.map +1 -1
  114. package/dist/translations/languages/it.d.ts.map +1 -1
  115. package/dist/translations/languages/it.js +3 -0
  116. package/dist/translations/languages/it.js.map +1 -1
  117. package/dist/translations/languages/ja.d.ts.map +1 -1
  118. package/dist/translations/languages/ja.js +3 -0
  119. package/dist/translations/languages/ja.js.map +1 -1
  120. package/dist/translations/languages/ko.d.ts.map +1 -1
  121. package/dist/translations/languages/ko.js +3 -0
  122. package/dist/translations/languages/ko.js.map +1 -1
  123. package/dist/translations/languages/lt.d.ts.map +1 -1
  124. package/dist/translations/languages/lt.js +3 -0
  125. package/dist/translations/languages/lt.js.map +1 -1
  126. package/dist/translations/languages/lv.d.ts.map +1 -1
  127. package/dist/translations/languages/lv.js +16 -13
  128. package/dist/translations/languages/lv.js.map +1 -1
  129. package/dist/translations/languages/my.d.ts.map +1 -1
  130. package/dist/translations/languages/my.js +3 -0
  131. package/dist/translations/languages/my.js.map +1 -1
  132. package/dist/translations/languages/nb.d.ts.map +1 -1
  133. package/dist/translations/languages/nb.js +3 -0
  134. package/dist/translations/languages/nb.js.map +1 -1
  135. package/dist/translations/languages/nl.d.ts.map +1 -1
  136. package/dist/translations/languages/nl.js +3 -0
  137. package/dist/translations/languages/nl.js.map +1 -1
  138. package/dist/translations/languages/pl.d.ts.map +1 -1
  139. package/dist/translations/languages/pl.js +3 -0
  140. package/dist/translations/languages/pl.js.map +1 -1
  141. package/dist/translations/languages/pt.d.ts.map +1 -1
  142. package/dist/translations/languages/pt.js +3 -0
  143. package/dist/translations/languages/pt.js.map +1 -1
  144. package/dist/translations/languages/ro.d.ts.map +1 -1
  145. package/dist/translations/languages/ro.js +3 -0
  146. package/dist/translations/languages/ro.js.map +1 -1
  147. package/dist/translations/languages/rs.d.ts.map +1 -1
  148. package/dist/translations/languages/rs.js +3 -0
  149. package/dist/translations/languages/rs.js.map +1 -1
  150. package/dist/translations/languages/rsLatin.d.ts.map +1 -1
  151. package/dist/translations/languages/rsLatin.js +3 -0
  152. package/dist/translations/languages/rsLatin.js.map +1 -1
  153. package/dist/translations/languages/ru.d.ts.map +1 -1
  154. package/dist/translations/languages/ru.js +3 -0
  155. package/dist/translations/languages/ru.js.map +1 -1
  156. package/dist/translations/languages/sk.d.ts.map +1 -1
  157. package/dist/translations/languages/sk.js +3 -0
  158. package/dist/translations/languages/sk.js.map +1 -1
  159. package/dist/translations/languages/sl.d.ts.map +1 -1
  160. package/dist/translations/languages/sl.js +3 -0
  161. package/dist/translations/languages/sl.js.map +1 -1
  162. package/dist/translations/languages/sv.d.ts.map +1 -1
  163. package/dist/translations/languages/sv.js +3 -0
  164. package/dist/translations/languages/sv.js.map +1 -1
  165. package/dist/translations/languages/ta.d.ts.map +1 -1
  166. package/dist/translations/languages/ta.js +3 -0
  167. package/dist/translations/languages/ta.js.map +1 -1
  168. package/dist/translations/languages/th.d.ts.map +1 -1
  169. package/dist/translations/languages/th.js +3 -0
  170. package/dist/translations/languages/th.js.map +1 -1
  171. package/dist/translations/languages/tr.d.ts.map +1 -1
  172. package/dist/translations/languages/tr.js +3 -0
  173. package/dist/translations/languages/tr.js.map +1 -1
  174. package/dist/translations/languages/uk.d.ts.map +1 -1
  175. package/dist/translations/languages/uk.js +3 -0
  176. package/dist/translations/languages/uk.js.map +1 -1
  177. package/dist/translations/languages/vi.d.ts.map +1 -1
  178. package/dist/translations/languages/vi.js +3 -0
  179. package/dist/translations/languages/vi.js.map +1 -1
  180. package/dist/translations/languages/zh.d.ts.map +1 -1
  181. package/dist/translations/languages/zh.js +3 -0
  182. package/dist/translations/languages/zh.js.map +1 -1
  183. package/dist/translations/languages/zhTw.d.ts.map +1 -1
  184. package/dist/translations/languages/zhTw.js +3 -0
  185. package/dist/translations/languages/zhTw.js.map +1 -1
  186. package/dist/types.d.ts +44 -1
  187. package/dist/types.d.ts.map +1 -1
  188. package/dist/types.js.map +1 -1
  189. package/dist/utilities/buildDisabledFieldRegex.d.ts +11 -2
  190. package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -1
  191. package/dist/utilities/buildDisabledFieldRegex.js +33 -7
  192. package/dist/utilities/buildDisabledFieldRegex.js.map +1 -1
  193. package/dist/utilities/buildDisabledFieldRegex.spec.js +64 -0
  194. package/dist/utilities/buildDisabledFieldRegex.spec.js.map +1 -0
  195. package/dist/utilities/collectTimezoneCompanionFields.d.ts +24 -0
  196. package/dist/utilities/collectTimezoneCompanionFields.d.ts.map +1 -0
  197. package/dist/utilities/collectTimezoneCompanionFields.js +89 -0
  198. package/dist/utilities/collectTimezoneCompanionFields.js.map +1 -0
  199. package/dist/utilities/collectTimezoneCompanionFields.spec.js +319 -0
  200. package/dist/utilities/collectTimezoneCompanionFields.spec.js.map +1 -0
  201. package/dist/utilities/fieldToRegex.d.ts +14 -0
  202. package/dist/utilities/fieldToRegex.d.ts.map +1 -0
  203. package/dist/utilities/fieldToRegex.js +34 -0
  204. package/dist/utilities/fieldToRegex.js.map +1 -0
  205. package/dist/utilities/fieldToRegex.spec.js +151 -0
  206. package/dist/utilities/fieldToRegex.spec.js.map +1 -0
  207. package/dist/utilities/flattenObject.d.ts +7 -1
  208. package/dist/utilities/flattenObject.d.ts.map +1 -1
  209. package/dist/utilities/flattenObject.js +30 -18
  210. package/dist/utilities/flattenObject.js.map +1 -1
  211. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -1
  212. package/dist/utilities/getExportFieldFunctions.js +7 -0
  213. package/dist/utilities/getExportFieldFunctions.js.map +1 -1
  214. package/dist/utilities/getFileFromDoc.d.ts +26 -0
  215. package/dist/utilities/getFileFromDoc.d.ts.map +1 -0
  216. package/dist/utilities/getFileFromDoc.js +67 -0
  217. package/dist/utilities/getFileFromDoc.js.map +1 -0
  218. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -1
  219. package/dist/utilities/getImportFieldFunctions.js +2 -16
  220. package/dist/utilities/getImportFieldFunctions.js.map +1 -1
  221. package/dist/utilities/getPluginCollections.d.ts +1 -0
  222. package/dist/utilities/getPluginCollections.d.ts.map +1 -1
  223. package/dist/utilities/getPluginCollections.js +59 -10
  224. package/dist/utilities/getPluginCollections.js.map +1 -1
  225. package/dist/utilities/getSchemaColumns.d.ts +8 -2
  226. package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
  227. package/dist/utilities/getSchemaColumns.js +61 -27
  228. package/dist/utilities/getSchemaColumns.js.map +1 -1
  229. package/dist/utilities/parseCSV.d.ts.map +1 -1
  230. package/dist/utilities/parseCSV.js +4 -10
  231. package/dist/utilities/parseCSV.js.map +1 -1
  232. package/dist/utilities/resolveLimit.d.ts +15 -0
  233. package/dist/utilities/resolveLimit.d.ts.map +1 -0
  234. package/dist/utilities/resolveLimit.js +21 -0
  235. package/dist/utilities/resolveLimit.js.map +1 -0
  236. package/dist/utilities/unflattenObject.d.ts +13 -0
  237. package/dist/utilities/unflattenObject.d.ts.map +1 -1
  238. package/dist/utilities/unflattenObject.js +64 -65
  239. package/dist/utilities/unflattenObject.js.map +1 -1
  240. package/package.json +8 -8
  241. package/dist/utilities/getvalueAtPath.d.ts +0 -15
  242. package/dist/utilities/getvalueAtPath.d.ts.map +0 -1
  243. package/dist/utilities/getvalueAtPath.js +0 -49
  244. package/dist/utilities/getvalueAtPath.js.map +0 -1
@@ -1,5 +1,17 @@
1
1
  import { processRichTextField } from './processRichTextField.js';
2
- export const unflattenObject = ({ data, fields, fromCSVFunctions = {}, req })=>{
2
+ /**
3
+ * Converts flattened CSV data back into a nested document structure.
4
+ *
5
+ * The algorithm:
6
+ * 1. Sorts keys to ensure array indices are processed in order
7
+ * 2. For each flattened key (e.g., "blocks_0_hero_title"), splits by underscore into path segments
8
+ * 3. Traverses/builds the nested structure, handling:
9
+ * - Arrays (numeric segments like "0", "1")
10
+ * - Blocks (blockType detection from slug patterns)
11
+ * - Polymorphic relationships (_relationTo and _id suffix pairs)
12
+ * - Regular nested objects
13
+ * 4. Post-processes to handle localized fields, hasMany conversions, and relationship transforms
14
+ */ export const unflattenObject = ({ data, fields, fromCSVFunctions = {}, req })=>{
3
15
  if (!data || typeof data !== 'object') {
4
16
  return {};
5
17
  }
@@ -31,7 +43,6 @@ export const unflattenObject = ({ data, fields, fromCSVFunctions = {}, req })=>{
31
43
  // Check if this is a polymorphic relationship field
32
44
  const isPolymorphic = fields.some((field)=>field.name === baseKey && field.type === 'relationship' && 'relationTo' in field && Array.isArray(field.relationTo));
33
45
  if (isPolymorphic) {
34
- // Check if we've already processed this field
35
46
  if (baseKey in result) {
36
47
  continue;
37
48
  }
@@ -64,29 +75,27 @@ export const unflattenObject = ({ data, fields, fromCSVFunctions = {}, req })=>{
64
75
  value
65
76
  });
66
77
  }
67
- // Parse the flat key into segments
68
78
  // Example: "blocks_0_content_text" -> ["blocks", "0", "content", "text"]
69
- const segments = flatKey.split('_');
70
- let current = result;
71
- for(let i = 0; i < segments.length; i++){
72
- const segment = segments[i];
79
+ const pathSegments = flatKey.split('_');
80
+ let currentObject = result;
81
+ for(let i = 0; i < pathSegments.length; i++){
82
+ const segment = pathSegments[i];
73
83
  if (!segment) {
74
84
  continue;
75
85
  } // Skip empty segments
76
- const nextSegment = segments[i + 1];
77
- const isLast = i === segments.length - 1;
86
+ const nextSegment = pathSegments[i + 1];
87
+ const isLast = i === pathSegments.length - 1;
78
88
  // Check if next segment is a numeric array index (e.g., "0", "1", "2")
79
89
  const isArrayIndex = nextSegment !== undefined && /^\d+$/.test(nextSegment);
80
90
  if (isLast) {
81
91
  // Special handling for blockType suffix in blocks
82
92
  if (segment === 'blockType' && i >= 3) {
83
93
  // Pattern: blocks_0_hero_blockType -> set blockType on the block
84
- const blockFieldName = segments[0] // 'blocks'
94
+ const blockFieldName = pathSegments[0] // 'blocks'
85
95
  ;
86
96
  const isBlockField = fields.some((field)=>field.name === blockFieldName && field.type === 'blocks');
87
- if (isBlockField && segments[1]?.match(/^\d+$/)) {
88
- // This is a block type field
89
- const parent = getParentObject(result, segments.slice(0, 2));
97
+ if (isBlockField && pathSegments[1]?.match(/^\d+$/)) {
98
+ const parent = getParentObject(result, pathSegments.slice(0, 2));
90
99
  if (parent && typeof parent === 'object') {
91
100
  parent.blockType = value;
92
101
  }
@@ -95,10 +104,9 @@ export const unflattenObject = ({ data, fields, fromCSVFunctions = {}, req })=>{
95
104
  }
96
105
  // Special handling for relationship fields with _id suffix
97
106
  if (segment === 'id' && i > 0) {
98
- const parentKey = segments[i - 1];
99
- // Check if the previous segment is an array index
100
- const prevIsIndex = parentKey ? /^\d+$/.test(parentKey) : false;
101
- if (!prevIsIndex) {
107
+ const parentKey = pathSegments[i - 1];
108
+ const isPreviousSegmentArrayIndex = parentKey ? /^\d+$/.test(parentKey) : false;
109
+ if (!isPreviousSegmentArrayIndex) {
102
110
  // Check if this is a relationship field
103
111
  const isRelationship = fields.some((field)=>field.name === parentKey && field.type === 'relationship');
104
112
  if (isRelationship) {
@@ -106,11 +114,9 @@ export const unflattenObject = ({ data, fields, fromCSVFunctions = {}, req })=>{
106
114
  const field = fields.find((f)=>f.name === parentKey && f.type === 'relationship');
107
115
  const isPolymorphic = field && 'relationTo' in field && Array.isArray(field.relationTo);
108
116
  if (isPolymorphic) {
109
- // For polymorphic relationships, check for the corresponding _relationTo field
110
- const relationToKey = segments.slice(0, i).concat('relationTo').join('_');
117
+ const relationToKey = pathSegments.slice(0, i).concat('relationTo').join('_');
111
118
  const relationToValue = data[relationToKey];
112
- // This is a polymorphic relationship
113
- const parent = getParentObject(result, segments.slice(0, i - 1));
119
+ const parent = getParentObject(result, pathSegments.slice(0, i - 1));
114
120
  if (parent && parentKey && typeof parent === 'object') {
115
121
  // Both fields must be defined to create/update the relationship
116
122
  // If either is undefined, skip the field entirely (preserve existing data)
@@ -132,8 +138,7 @@ export const unflattenObject = ({ data, fields, fromCSVFunctions = {}, req })=>{
132
138
  }
133
139
  continue;
134
140
  } else if (!isPolymorphic) {
135
- // Non-polymorphic relationship
136
- const parent = getParentObject(result, segments.slice(0, i - 1));
141
+ const parent = getParentObject(result, pathSegments.slice(0, i - 1));
137
142
  if (parent && parentKey && typeof parent === 'object') {
138
143
  parent[parentKey] = value;
139
144
  }
@@ -142,9 +147,9 @@ export const unflattenObject = ({ data, fields, fromCSVFunctions = {}, req })=>{
142
147
  }
143
148
  }
144
149
  }
145
- // Special handling for _relationTo suffix (skip it, handled above)
150
+ // _relationTo suffix is handled when processing the _id field above
146
151
  if (segment === 'relationTo' && i > 0) {
147
- const parentKey = segments[i - 1];
152
+ const parentKey = pathSegments[i - 1];
148
153
  if (parentKey && !parentKey.match(/^\d+$/)) {
149
154
  const field = fields.find((f)=>f.name === parentKey && f.type === 'relationship');
150
155
  const isPolymorphic = field && 'relationTo' in field && Array.isArray(field.relationTo);
@@ -153,14 +158,13 @@ export const unflattenObject = ({ data, fields, fromCSVFunctions = {}, req })=>{
153
158
  }
154
159
  }
155
160
  }
156
- current[segment] = value;
161
+ currentObject[segment] = value;
157
162
  } else if (isArrayIndex && nextSegment !== undefined) {
158
- // Initialize array if needed
159
- if (!current[segment] || !Array.isArray(current[segment])) {
160
- current[segment] = [];
163
+ if (!currentObject[segment] || !Array.isArray(currentObject[segment])) {
164
+ currentObject[segment] = [];
161
165
  }
162
166
  const arrayIndex = parseInt(nextSegment);
163
- const arr = current[segment];
167
+ const arr = currentObject[segment];
164
168
  // Ensure array has sufficient length
165
169
  while(arr.length <= arrayIndex){
166
170
  arr.push(null);
@@ -169,65 +173,55 @@ export const unflattenObject = ({ data, fields, fromCSVFunctions = {}, req })=>{
169
173
  if (arr[arrayIndex] === null || arr[arrayIndex] === undefined) {
170
174
  arr[arrayIndex] = {};
171
175
  }
172
- // Check if this is a blocks field with block slug pattern
176
+ // Handle blocks field with block slug pattern (e.g., blocks_0_hero_title)
173
177
  const isBlocksField = fields.some((f)=>f.name === segment && f.type === 'blocks');
174
- if (isBlocksField && i + 3 < segments.length) {
175
- // Pattern: blocks_0_hero_title where 'hero' is the block slug
176
- const blockSlug = segments[i + 2];
177
- const blockFieldName = segments[i + 3];
178
+ if (isBlocksField && i + 3 < pathSegments.length) {
179
+ const blockSlug = pathSegments[i + 2];
180
+ const blockFieldName = pathSegments[i + 3];
178
181
  if (blockSlug && blockFieldName) {
179
182
  const blockObject = arr[arrayIndex];
180
- // Set the blockType based on the slug
181
183
  blockObject.blockType = blockSlug;
182
- // Handle nested block fields
183
- if (i + 3 === segments.length - 1) {
184
- // Direct field on the block
184
+ if (i + 3 === pathSegments.length - 1) {
185
185
  blockObject[blockFieldName] = value;
186
186
  } else {
187
- // Nested field in the block
188
187
  if (!blockObject[blockFieldName] || typeof blockObject[blockFieldName] !== 'object') {
189
188
  blockObject[blockFieldName] = {};
190
189
  }
191
- // Continue processing remaining segments
192
- current = blockObject[blockFieldName];
193
- i = i + 3; // Skip index, slug, and field name
194
- continue; // Continue processing the remaining segments (not break!)
190
+ currentObject = blockObject[blockFieldName];
191
+ i = i + 3;
192
+ continue;
195
193
  }
196
194
  break;
197
195
  }
198
196
  }
199
- // If this is the last segment after the index, set the value
200
- if (i + 2 === segments.length - 1) {
201
- const lastSegment = segments[segments.length - 1];
197
+ if (i + 2 === pathSegments.length - 1) {
198
+ const lastSegment = pathSegments[pathSegments.length - 1];
202
199
  if (lastSegment && arr[arrayIndex] && typeof arr[arrayIndex] === 'object') {
203
200
  ;
204
201
  arr[arrayIndex][lastSegment] = value;
205
202
  }
206
203
  break;
207
- } else if (i + 1 === segments.length - 1) {
204
+ } else if (i + 1 === pathSegments.length - 1) {
208
205
  // Direct array value (e.g., tags_0 = "value")
209
206
  arr[arrayIndex] = value;
210
207
  break;
211
208
  } else {
212
- // Continue traversing into the array element
213
- current = arr[arrayIndex];
214
- i++; // skip the index segment
209
+ currentObject = arr[arrayIndex];
210
+ i++;
215
211
  }
216
212
  } else {
217
- // Regular object property
218
- // Check if this segment is already set to null (polymorphic relationship already processed)
219
- if (current[segment] === null && isLast && segment === 'relationTo') {
213
+ // Skip if already set to null (polymorphic relationship already processed)
214
+ if (currentObject[segment] === null && isLast && segment === 'relationTo') {
220
215
  continue;
221
216
  }
222
- if (!current[segment] || typeof current[segment] !== 'object' || Array.isArray(current[segment])) {
223
- current[segment] = {};
217
+ if (!currentObject[segment] || typeof currentObject[segment] !== 'object' || Array.isArray(currentObject[segment])) {
218
+ currentObject[segment] = {};
224
219
  }
225
- // Handle special cases for polymorphic relationships
226
- if (segment === 'relationTo' && i > 0 && segments[i - 1]?.match(/^\d+$/)) {
227
- // This is part of a polymorphic relationship array
228
- current[segment] = value;
229
- } else if (typeof current[segment] === 'object' && !Array.isArray(current[segment]) && current[segment] !== null) {
230
- current = current[segment];
220
+ // Handle polymorphic relationship arrays
221
+ if (segment === 'relationTo' && i > 0 && pathSegments[i - 1]?.match(/^\d+$/)) {
222
+ currentObject[segment] = value;
223
+ } else if (typeof currentObject[segment] === 'object' && !Array.isArray(currentObject[segment]) && currentObject[segment] !== null) {
224
+ currentObject = currentObject[segment];
231
225
  }
232
226
  }
233
227
  }
@@ -272,9 +266,14 @@ const getParentObject = (obj, segments)=>{
272
266
  }
273
267
  return current;
274
268
  };
275
- const postProcessDocument = (doc, fields)=>{
276
- // Handle localized fields - transform from field_locale to { field: { locale: value } }
277
- // This is the format Payload stores in the database
269
+ /**
270
+ * Post-processes the unflattened document to handle special field types:
271
+ * - Localized fields: transforms field_locale keys to nested { field: { locale: value } }
272
+ * - Number hasMany: converts comma-separated strings or arrays to number arrays
273
+ * - Relationship hasMany: converts comma-separated IDs to arrays
274
+ * - Polymorphic relationships: transforms flat {relationTo, id} to {relationTo, value}
275
+ * - Rich text fields: ensures proper data structure
276
+ */ const postProcessDocument = (doc, fields)=>{
278
277
  const localizedFields = fields.filter((field)=>field.localized);
279
278
  const processedLocalizedFields = new Set();
280
279
  for (const field of localizedFields){
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/unflattenObject.ts"],"sourcesContent":["import type { FlattenedField, PayloadRequest } from 'payload'\n\nimport type { FromCSVFunction } from '../types.js'\n\nimport { processRichTextField } from './processRichTextField.js'\n\ntype UnflattenArgs = {\n data: Record<string, unknown>\n fields: FlattenedField[]\n fromCSVFunctions?: Record<string, FromCSVFunction>\n req: PayloadRequest\n}\n\nexport const unflattenObject = ({\n data,\n fields,\n fromCSVFunctions = {},\n req,\n}: UnflattenArgs): Record<string, unknown> => {\n if (!data || typeof data !== 'object') {\n return {}\n }\n\n const result: Record<string, unknown> = {}\n\n // Sort keys to ensure array indices are processed in order\n const sortedKeys = Object.keys(data).sort((a, b) => {\n // Extract array indices from flattened keys (e.g., \"field_0_subfield\" -> \"0\")\n const aMatch = a.match(/_(\\d+)(?:_|$)/)\n const bMatch = b.match(/_(\\d+)(?:_|$)/)\n\n if (aMatch && bMatch && aMatch.index !== undefined && bMatch.index !== undefined) {\n const aBase = a.substring(0, aMatch.index)\n const bBase = b.substring(0, bMatch.index)\n\n if (aBase === bBase) {\n return (parseInt(aMatch?.[1] ?? '0', 10) || 0) - (parseInt(bMatch?.[1] ?? '0', 10) || 0)\n }\n }\n\n return a.localeCompare(b)\n })\n\n for (const flatKey of sortedKeys) {\n let value = data[flatKey]\n\n // Skip undefined values but keep null for required field validation\n if (value === undefined) {\n continue\n }\n\n // Check if this is a _relationTo key for a polymorphic relationship\n if (flatKey.endsWith('_relationTo')) {\n const baseKey = flatKey.replace(/_relationTo$/, '')\n const idKey = `${baseKey}_id`\n\n // Check if this is a polymorphic relationship field\n const isPolymorphic = fields.some(\n (field) =>\n field.name === baseKey &&\n field.type === 'relationship' &&\n 'relationTo' in field &&\n Array.isArray(field.relationTo),\n )\n\n if (isPolymorphic) {\n // Check if we've already processed this field\n if (baseKey in result) {\n // Skipping because already processed\n continue\n }\n\n // If the corresponding _id key is undefined, skip processing entirely\n // This prevents creating empty objects when we should preserve existing data\n if (!(idKey in data) || data[idKey] === undefined) {\n continue\n }\n }\n }\n\n // Check if this is a _id key for a polymorphic relationship where _relationTo is undefined\n if (flatKey.endsWith('_id')) {\n const baseKey = flatKey.replace(/_id$/, '')\n const relationToKey = `${baseKey}_relationTo`\n\n // Check if this is a polymorphic relationship field\n const isPolymorphic = fields.some(\n (field) =>\n field.name === baseKey &&\n field.type === 'relationship' &&\n 'relationTo' in field &&\n Array.isArray(field.relationTo),\n )\n\n if (isPolymorphic) {\n // If the corresponding _relationTo key is undefined, skip processing entirely\n // This prevents creating empty objects when we should preserve existing data\n if (!(relationToKey in data) || data[relationToKey] === undefined) {\n continue\n }\n }\n }\n\n // Apply fromCSV function if available\n if (fromCSVFunctions[flatKey]) {\n value = fromCSVFunctions[flatKey]({\n columnName: flatKey,\n data,\n value,\n })\n }\n\n // Parse the flat key into segments\n // Example: \"blocks_0_content_text\" -> [\"blocks\", \"0\", \"content\", \"text\"]\n const segments = flatKey.split('_')\n let current: Record<string, unknown> = result\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n if (!segment) {\n continue\n } // Skip empty segments\n\n const nextSegment = segments[i + 1]\n const isLast = i === segments.length - 1\n\n // Check if next segment is a numeric array index (e.g., \"0\", \"1\", \"2\")\n const isArrayIndex = nextSegment !== undefined && /^\\d+$/.test(nextSegment)\n\n if (isLast) {\n // Special handling for blockType suffix in blocks\n if (segment === 'blockType' && i >= 3) {\n // Pattern: blocks_0_hero_blockType -> set blockType on the block\n const blockFieldName = segments[0] // 'blocks'\n const isBlockField = fields.some(\n (field) => field.name === blockFieldName && field.type === 'blocks',\n )\n\n if (isBlockField && segments[1]?.match(/^\\d+$/)) {\n // This is a block type field\n const parent = getParentObject(result, segments.slice(0, 2))\n if (parent && typeof parent === 'object') {\n parent.blockType = value\n }\n continue\n }\n }\n\n // Special handling for relationship fields with _id suffix\n if (segment === 'id' && i > 0) {\n const parentKey = segments[i - 1]\n // Check if the previous segment is an array index\n const prevIsIndex = parentKey ? /^\\d+$/.test(parentKey) : false\n\n if (!prevIsIndex) {\n // Check if this is a relationship field\n const isRelationship = fields.some(\n (field) => field.name === parentKey && field.type === 'relationship',\n )\n\n if (isRelationship) {\n // Check if this is a polymorphic relationship field\n const field = fields.find((f) => f.name === parentKey && f.type === 'relationship')\n const isPolymorphic =\n field && 'relationTo' in field && Array.isArray(field.relationTo)\n\n if (isPolymorphic) {\n // For polymorphic relationships, check for the corresponding _relationTo field\n const relationToKey = segments.slice(0, i).concat('relationTo').join('_')\n const relationToValue = data[relationToKey]\n\n // This is a polymorphic relationship\n const parent = getParentObject(result, segments.slice(0, i - 1))\n if (parent && parentKey && typeof parent === 'object') {\n // Both fields must be defined to create/update the relationship\n // If either is undefined, skip the field entirely (preserve existing data)\n if (value !== undefined && relationToValue !== undefined) {\n // Check if both are explicitly null\n if (relationToValue === null && value === null) {\n // Only set to null if explicitly null (user typed \"null\" in CSV)\n parent[parentKey] = null\n } else if (relationToValue || value) {\n // At least one has a value, create the relationship\n parent[parentKey] = {\n relationTo: relationToValue,\n value, // This will be transformed to proper format in postProcess\n }\n }\n // If both are empty strings, don't set the field (handled by not meeting the above conditions)\n }\n // If either is undefined, don't set the field at all (preserve existing data)\n }\n continue\n } else if (!isPolymorphic) {\n // Non-polymorphic relationship\n const parent = getParentObject(result, segments.slice(0, i - 1))\n if (parent && parentKey && typeof parent === 'object') {\n parent[parentKey] = value\n }\n continue\n }\n }\n }\n }\n\n // Special handling for _relationTo suffix (skip it, handled above)\n if (segment === 'relationTo' && i > 0) {\n const parentKey = segments[i - 1]\n if (parentKey && !parentKey.match(/^\\d+$/)) {\n const field = fields.find((f) => f.name === parentKey && f.type === 'relationship')\n const isPolymorphic = field && 'relationTo' in field && Array.isArray(field.relationTo)\n\n if (isPolymorphic) {\n // For polymorphic relationships, this is handled when processing the _id field\n // Skip it entirely\n continue\n }\n }\n }\n\n current[segment] = value\n } else if (isArrayIndex && nextSegment !== undefined) {\n // Initialize array if needed\n if (!current[segment] || !Array.isArray(current[segment])) {\n current[segment] = []\n }\n\n const arrayIndex = parseInt(nextSegment)\n const arr = current[segment] as unknown[]\n\n // Ensure array has sufficient length\n while (arr.length <= arrayIndex) {\n arr.push(null)\n }\n\n // Handle array of objects\n if (arr[arrayIndex] === null || arr[arrayIndex] === undefined) {\n arr[arrayIndex] = {}\n }\n\n // Check if this is a blocks field with block slug pattern\n const isBlocksField = fields.some((f) => f.name === segment && f.type === 'blocks')\n if (isBlocksField && i + 3 < segments.length) {\n // Pattern: blocks_0_hero_title where 'hero' is the block slug\n const blockSlug = segments[i + 2]\n const blockFieldName = segments[i + 3]\n\n if (blockSlug && blockFieldName) {\n const blockObject = arr[arrayIndex] as Record<string, unknown>\n\n // Set the blockType based on the slug\n blockObject.blockType = blockSlug\n\n // Handle nested block fields\n if (i + 3 === segments.length - 1) {\n // Direct field on the block\n blockObject[blockFieldName] = value\n } else {\n // Nested field in the block\n if (!blockObject[blockFieldName] || typeof blockObject[blockFieldName] !== 'object') {\n blockObject[blockFieldName] = {}\n }\n // Continue processing remaining segments\n current = blockObject[blockFieldName] as Record<string, unknown>\n i = i + 3 // Skip index, slug, and field name\n continue // Continue processing the remaining segments (not break!)\n }\n break\n }\n }\n\n // If this is the last segment after the index, set the value\n if (i + 2 === segments.length - 1) {\n const lastSegment = segments[segments.length - 1]\n if (lastSegment && arr[arrayIndex] && typeof arr[arrayIndex] === 'object') {\n ;(arr[arrayIndex] as Record<string, unknown>)[lastSegment] = value\n }\n break\n } else if (i + 1 === segments.length - 1) {\n // Direct array value (e.g., tags_0 = \"value\")\n arr[arrayIndex] = value\n break\n } else {\n // Continue traversing into the array element\n current = arr[arrayIndex] as Record<string, unknown>\n i++ // skip the index segment\n }\n } else {\n // Regular object property\n // Check if this segment is already set to null (polymorphic relationship already processed)\n if (current[segment] === null && isLast && segment === 'relationTo') {\n // This is a relationTo for a polymorphic field that was already set to null\n // Skip creating a new object\n continue\n }\n\n if (\n !current[segment] ||\n typeof current[segment] !== 'object' ||\n Array.isArray(current[segment])\n ) {\n current[segment] = {}\n }\n\n // Handle special cases for polymorphic relationships\n if (segment === 'relationTo' && i > 0 && segments[i - 1]?.match(/^\\d+$/)) {\n // This is part of a polymorphic relationship array\n current[segment] = value\n } else if (\n typeof current[segment] === 'object' &&\n !Array.isArray(current[segment]) &&\n current[segment] !== null\n ) {\n current = current[segment] as Record<string, unknown>\n }\n }\n }\n }\n\n try {\n // Post-process to handle special structures\n postProcessDocument(result, fields)\n } catch (err) {\n // Log but don't throw - return partially processed result\n\n req.payload.logger.error({\n err,\n msg: '[plugin-import-export] Error in postProcessDocument',\n })\n }\n\n return result\n}\n\nconst getParentObject = (\n obj: Record<string, unknown>,\n segments: string[],\n): Record<string, unknown> | undefined => {\n let current: Record<string, unknown> = obj\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n const nextSegment = segments[i + 1]\n\n if (!segment) {\n continue\n }\n\n if (nextSegment && /^\\d+$/.test(nextSegment)) {\n const arrayIndex = parseInt(nextSegment)\n const arr = current[segment] as unknown[]\n\n if (Array.isArray(arr) && arr[arrayIndex]) {\n current = arr[arrayIndex] as Record<string, unknown>\n i++ // Skip the index\n } else {\n return undefined\n }\n } else {\n const next = current[segment]\n if (typeof next === 'object' && next !== null && !Array.isArray(next)) {\n current = next as Record<string, unknown>\n } else {\n return undefined\n }\n }\n }\n\n return current\n}\n\nconst postProcessDocument = (doc: Record<string, unknown>, fields: FlattenedField[]): void => {\n // Handle localized fields - transform from field_locale to { field: { locale: value } }\n // This is the format Payload stores in the database\n const localizedFields = fields.filter((field) => field.localized)\n const processedLocalizedFields = new Set<string>()\n\n for (const field of localizedFields) {\n if (processedLocalizedFields.has(field.name)) {\n continue\n }\n\n // Look for all locale-specific keys for this field\n const localePattern = new RegExp(`^${field.name}_([a-z]{2}(?:_[A-Z]{2})?)$`)\n const localeData: Record<string, unknown> = {}\n const keysToDelete: string[] = []\n\n for (const [key, value] of Object.entries(doc)) {\n const match = key.match(localePattern)\n if (match && match[1]) {\n const locale = match[1]\n localeData[locale] = value\n keysToDelete.push(key)\n }\n }\n\n // If we found locale-specific data, restructure it as Payload expects\n if (Object.keys(localeData).length > 0) {\n // Payload stores localized fields as nested objects: { field: { en: 'value', es: 'value' } }\n doc[field.name] = localeData\n keysToDelete.forEach((key) => delete doc[key])\n processedLocalizedFields.add(field.name)\n }\n }\n\n // Handle number fields with hasMany - convert string arrays to number arrays\n const numberFields = fields.filter((field) => field.type === 'number' && field.hasMany)\n for (const field of numberFields) {\n const value = doc[field.name]\n\n // Skip if field doesn't exist in document\n if (!(field.name in doc)) {\n continue\n }\n\n // Handle comma-separated string (e.g., \"1,2,3,4,5\")\n if (typeof value === 'string' && value.includes(',')) {\n doc[field.name] = value\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v !== '')\n .map((v) => {\n const num = parseFloat(v)\n return isNaN(num) ? 0 : num\n })\n }\n // Handle array of values from indexed columns (e.g., field_0, field_1, etc.)\n else if (Array.isArray(value)) {\n // Filter out null, undefined, and empty string values, then convert to numbers\n doc[field.name] = value\n .filter((v) => v !== null && v !== undefined && v !== '')\n .map((v) => {\n if (typeof v === 'string') {\n const num = parseFloat(v)\n return isNaN(num) ? 0 : num\n }\n return v\n })\n }\n // Handle single value for hasMany (convert to array)\n else if (value !== null && value !== undefined && value !== '') {\n const num = typeof value === 'string' ? parseFloat(value) : value\n doc[field.name] = isNaN(num as number) ? [] : [num]\n }\n // Handle empty/null values - convert to empty array for hasMany\n else {\n doc[field.name] = []\n }\n }\n\n // Handle relationship fields with hasMany - convert comma-separated IDs to arrays\n const relationshipFields = fields.filter(\n (field) =>\n (field.type === 'relationship' || field.type === 'upload') &&\n field.hasMany === true &&\n !Array.isArray(field.relationTo), // Skip polymorphic for now, handled separately\n )\n for (const field of relationshipFields) {\n const value = doc[field.name]\n\n // Handle comma-separated string of IDs (e.g., \"id1,id2,id3\")\n if (typeof value === 'string' && value.includes(',')) {\n doc[field.name] = value\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v !== '')\n }\n // Keep array as-is if already an array\n else if (Array.isArray(value)) {\n doc[field.name] = value.filter((v) => v !== null && v !== undefined && v !== '')\n }\n // Convert single value to array for hasMany\n else if (value !== null && value !== undefined && value !== '') {\n doc[field.name] = [value]\n }\n }\n\n // Handle polymorphic relationships - transform from flat structure to proper format\n for (const [key, value] of Object.entries(doc)) {\n // Handle arrays of polymorphic relationships\n if (Array.isArray(value)) {\n // Check if this array contains polymorphic relationship objects\n const hasPolymorphicItems = value.some(\n (item) => typeof item === 'object' && item !== null && 'relationTo' in item,\n )\n\n if (hasPolymorphicItems) {\n // Filter out null/invalid polymorphic items and transform valid ones\n const processedArray = []\n for (let i = 0; i < value.length; i++) {\n const item = value[i]\n if (typeof item === 'object' && item !== null && 'relationTo' in item) {\n const typedItem = item as Record<string, unknown>\n\n // Skip if both relationTo and value/id are null/empty\n if (!typedItem.relationTo || (!typedItem.id && !typedItem.value)) {\n continue\n }\n\n // Transform from {relationTo: 'collection', id: '123'} to {relationTo: 'collection', value: '123'}\n if ('id' in typedItem) {\n typedItem.value = typedItem.id\n delete typedItem.id\n }\n\n processedArray.push(typedItem)\n } else if (item !== null && item !== undefined) {\n processedArray.push(item)\n }\n }\n\n // Update the array with filtered results\n if (value.length !== processedArray.length) {\n doc[key] = processedArray.length > 0 ? processedArray : []\n }\n }\n // For non-polymorphic arrays, preserve null placeholders for sparse arrays\n }\n // Handle single polymorphic relationships\n else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Check if this is a single polymorphic relationship\n if ('relationTo' in value && ('id' in value || 'value' in value)) {\n const typedValue = value as Record<string, unknown>\n\n // If both relationTo and value are null/empty, set the whole field to null\n if (!typedValue.relationTo || (!typedValue.id && !typedValue.value)) {\n doc[key] = null\n } else {\n // If it has 'id', transform to 'value'\n if ('id' in typedValue && !('value' in typedValue)) {\n typedValue.value = typedValue.id\n delete typedValue.id\n }\n }\n } else {\n // Recursively process nested objects\n postProcessDocument(value as Record<string, unknown>, fields)\n }\n }\n }\n\n // Process rich text fields to ensure proper data types\n const richTextFields = fields.filter((field) => field.type === 'richText')\n for (const field of richTextFields) {\n if (field.name in doc && doc[field.name]) {\n doc[field.name] = processRichTextField(doc[field.name])\n }\n }\n\n // Also process rich text fields in blocks\n const blockFields = fields.filter((field) => field.type === 'blocks')\n for (const field of blockFields) {\n if (field.name in doc && Array.isArray(doc[field.name])) {\n const blocks = doc[field.name] as any[]\n for (const block of blocks) {\n if (!block || typeof block !== 'object') {\n continue\n }\n\n // Look for richText fields directly in the block\n for (const [key, value] of Object.entries(block)) {\n if (key === 'richText' || (typeof key === 'string' && key.includes('richText'))) {\n block[key] = processRichTextField(value)\n }\n }\n }\n }\n }\n}\n"],"names":["processRichTextField","unflattenObject","data","fields","fromCSVFunctions","req","result","sortedKeys","Object","keys","sort","a","b","aMatch","match","bMatch","index","undefined","aBase","substring","bBase","parseInt","localeCompare","flatKey","value","endsWith","baseKey","replace","idKey","isPolymorphic","some","field","name","type","Array","isArray","relationTo","relationToKey","columnName","segments","split","current","i","length","segment","nextSegment","isLast","isArrayIndex","test","blockFieldName","isBlockField","parent","getParentObject","slice","blockType","parentKey","prevIsIndex","isRelationship","find","f","concat","join","relationToValue","arrayIndex","arr","push","isBlocksField","blockSlug","blockObject","lastSegment","postProcessDocument","err","payload","logger","error","msg","obj","next","doc","localizedFields","filter","localized","processedLocalizedFields","Set","has","localePattern","RegExp","localeData","keysToDelete","key","entries","locale","forEach","add","numberFields","hasMany","includes","map","v","trim","num","parseFloat","isNaN","relationshipFields","hasPolymorphicItems","item","processedArray","typedItem","id","typedValue","richTextFields","blockFields","blocks","block"],"mappings":"AAIA,SAASA,oBAAoB,QAAQ,4BAA2B;AAShE,OAAO,MAAMC,kBAAkB,CAAC,EAC9BC,IAAI,EACJC,MAAM,EACNC,mBAAmB,CAAC,CAAC,EACrBC,GAAG,EACW;IACd,IAAI,CAACH,QAAQ,OAAOA,SAAS,UAAU;QACrC,OAAO,CAAC;IACV;IAEA,MAAMI,SAAkC,CAAC;IAEzC,2DAA2D;IAC3D,MAAMC,aAAaC,OAAOC,IAAI,CAACP,MAAMQ,IAAI,CAAC,CAACC,GAAGC;QAC5C,8EAA8E;QAC9E,MAAMC,SAASF,EAAEG,KAAK,CAAC;QACvB,MAAMC,SAASH,EAAEE,KAAK,CAAC;QAEvB,IAAID,UAAUE,UAAUF,OAAOG,KAAK,KAAKC,aAAaF,OAAOC,KAAK,KAAKC,WAAW;YAChF,MAAMC,QAAQP,EAAEQ,SAAS,CAAC,GAAGN,OAAOG,KAAK;YACzC,MAAMI,QAAQR,EAAEO,SAAS,CAAC,GAAGJ,OAAOC,KAAK;YAEzC,IAAIE,UAAUE,OAAO;gBACnB,OAAO,AAACC,CAAAA,SAASR,QAAQ,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA,IAAMQ,CAAAA,SAASN,QAAQ,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;YACxF;QACF;QAEA,OAAOJ,EAAEW,aAAa,CAACV;IACzB;IAEA,KAAK,MAAMW,WAAWhB,WAAY;QAChC,IAAIiB,QAAQtB,IAAI,CAACqB,QAAQ;QAEzB,oEAAoE;QACpE,IAAIC,UAAUP,WAAW;YACvB;QACF;QAEA,oEAAoE;QACpE,IAAIM,QAAQE,QAAQ,CAAC,gBAAgB;YACnC,MAAMC,UAAUH,QAAQI,OAAO,CAAC,gBAAgB;YAChD,MAAMC,QAAQ,GAAGF,QAAQ,GAAG,CAAC;YAE7B,oDAAoD;YACpD,MAAMG,gBAAgB1B,OAAO2B,IAAI,CAC/B,CAACC,QACCA,MAAMC,IAAI,KAAKN,WACfK,MAAME,IAAI,KAAK,kBACf,gBAAgBF,SAChBG,MAAMC,OAAO,CAACJ,MAAMK,UAAU;YAGlC,IAAIP,eAAe;gBACjB,8CAA8C;gBAC9C,IAAIH,WAAWpB,QAAQ;oBAErB;gBACF;gBAEA,sEAAsE;gBACtE,6EAA6E;gBAC7E,IAAI,CAAEsB,CAAAA,SAAS1B,IAAG,KAAMA,IAAI,CAAC0B,MAAM,KAAKX,WAAW;oBACjD;gBACF;YACF;QACF;QAEA,2FAA2F;QAC3F,IAAIM,QAAQE,QAAQ,CAAC,QAAQ;YAC3B,MAAMC,UAAUH,QAAQI,OAAO,CAAC,QAAQ;YACxC,MAAMU,gBAAgB,GAAGX,QAAQ,WAAW,CAAC;YAE7C,oDAAoD;YACpD,MAAMG,gBAAgB1B,OAAO2B,IAAI,CAC/B,CAACC,QACCA,MAAMC,IAAI,KAAKN,WACfK,MAAME,IAAI,KAAK,kBACf,gBAAgBF,SAChBG,MAAMC,OAAO,CAACJ,MAAMK,UAAU;YAGlC,IAAIP,eAAe;gBACjB,8EAA8E;gBAC9E,6EAA6E;gBAC7E,IAAI,CAAEQ,CAAAA,iBAAiBnC,IAAG,KAAMA,IAAI,CAACmC,cAAc,KAAKpB,WAAW;oBACjE;gBACF;YACF;QACF;QAEA,sCAAsC;QACtC,IAAIb,gBAAgB,CAACmB,QAAQ,EAAE;YAC7BC,QAAQpB,gBAAgB,CAACmB,QAAQ,CAAC;gBAChCe,YAAYf;gBACZrB;gBACAsB;YACF;QACF;QAEA,mCAAmC;QACnC,yEAAyE;QACzE,MAAMe,WAAWhB,QAAQiB,KAAK,CAAC;QAC/B,IAAIC,UAAmCnC;QAEvC,IAAK,IAAIoC,IAAI,GAAGA,IAAIH,SAASI,MAAM,EAAED,IAAK;YACxC,MAAME,UAAUL,QAAQ,CAACG,EAAE;YAC3B,IAAI,CAACE,SAAS;gBACZ;YACF,EAAE,sBAAsB;YAExB,MAAMC,cAAcN,QAAQ,CAACG,IAAI,EAAE;YACnC,MAAMI,SAASJ,MAAMH,SAASI,MAAM,GAAG;YAEvC,uEAAuE;YACvE,MAAMI,eAAeF,gBAAgB5B,aAAa,QAAQ+B,IAAI,CAACH;YAE/D,IAAIC,QAAQ;gBACV,kDAAkD;gBAClD,IAAIF,YAAY,eAAeF,KAAK,GAAG;oBACrC,iEAAiE;oBACjE,MAAMO,iBAAiBV,QAAQ,CAAC,EAAE,CAAC,WAAW;;oBAC9C,MAAMW,eAAe/C,OAAO2B,IAAI,CAC9B,CAACC,QAAUA,MAAMC,IAAI,KAAKiB,kBAAkBlB,MAAME,IAAI,KAAK;oBAG7D,IAAIiB,gBAAgBX,QAAQ,CAAC,EAAE,EAAEzB,MAAM,UAAU;wBAC/C,6BAA6B;wBAC7B,MAAMqC,SAASC,gBAAgB9C,QAAQiC,SAASc,KAAK,CAAC,GAAG;wBACzD,IAAIF,UAAU,OAAOA,WAAW,UAAU;4BACxCA,OAAOG,SAAS,GAAG9B;wBACrB;wBACA;oBACF;gBACF;gBAEA,2DAA2D;gBAC3D,IAAIoB,YAAY,QAAQF,IAAI,GAAG;oBAC7B,MAAMa,YAAYhB,QAAQ,CAACG,IAAI,EAAE;oBACjC,kDAAkD;oBAClD,MAAMc,cAAcD,YAAY,QAAQP,IAAI,CAACO,aAAa;oBAE1D,IAAI,CAACC,aAAa;wBAChB,wCAAwC;wBACxC,MAAMC,iBAAiBtD,OAAO2B,IAAI,CAChC,CAACC,QAAUA,MAAMC,IAAI,KAAKuB,aAAaxB,MAAME,IAAI,KAAK;wBAGxD,IAAIwB,gBAAgB;4BAClB,oDAAoD;4BACpD,MAAM1B,QAAQ5B,OAAOuD,IAAI,CAAC,CAACC,IAAMA,EAAE3B,IAAI,KAAKuB,aAAaI,EAAE1B,IAAI,KAAK;4BACpE,MAAMJ,gBACJE,SAAS,gBAAgBA,SAASG,MAAMC,OAAO,CAACJ,MAAMK,UAAU;4BAElE,IAAIP,eAAe;gCACjB,+EAA+E;gCAC/E,MAAMQ,gBAAgBE,SAASc,KAAK,CAAC,GAAGX,GAAGkB,MAAM,CAAC,cAAcC,IAAI,CAAC;gCACrE,MAAMC,kBAAkB5D,IAAI,CAACmC,cAAc;gCAE3C,qCAAqC;gCACrC,MAAMc,SAASC,gBAAgB9C,QAAQiC,SAASc,KAAK,CAAC,GAAGX,IAAI;gCAC7D,IAAIS,UAAUI,aAAa,OAAOJ,WAAW,UAAU;oCACrD,gEAAgE;oCAChE,2EAA2E;oCAC3E,IAAI3B,UAAUP,aAAa6C,oBAAoB7C,WAAW;wCACxD,oCAAoC;wCACpC,IAAI6C,oBAAoB,QAAQtC,UAAU,MAAM;4CAC9C,iEAAiE;4CACjE2B,MAAM,CAACI,UAAU,GAAG;wCACtB,OAAO,IAAIO,mBAAmBtC,OAAO;4CACnC,oDAAoD;4CACpD2B,MAAM,CAACI,UAAU,GAAG;gDAClBnB,YAAY0B;gDACZtC;4CACF;wCACF;oCACA,+FAA+F;oCACjG;gCACA,8EAA8E;gCAChF;gCACA;4BACF,OAAO,IAAI,CAACK,eAAe;gCACzB,+BAA+B;gCAC/B,MAAMsB,SAASC,gBAAgB9C,QAAQiC,SAASc,KAAK,CAAC,GAAGX,IAAI;gCAC7D,IAAIS,UAAUI,aAAa,OAAOJ,WAAW,UAAU;oCACrDA,MAAM,CAACI,UAAU,GAAG/B;gCACtB;gCACA;4BACF;wBACF;oBACF;gBACF;gBAEA,mEAAmE;gBACnE,IAAIoB,YAAY,gBAAgBF,IAAI,GAAG;oBACrC,MAAMa,YAAYhB,QAAQ,CAACG,IAAI,EAAE;oBACjC,IAAIa,aAAa,CAACA,UAAUzC,KAAK,CAAC,UAAU;wBAC1C,MAAMiB,QAAQ5B,OAAOuD,IAAI,CAAC,CAACC,IAAMA,EAAE3B,IAAI,KAAKuB,aAAaI,EAAE1B,IAAI,KAAK;wBACpE,MAAMJ,gBAAgBE,SAAS,gBAAgBA,SAASG,MAAMC,OAAO,CAACJ,MAAMK,UAAU;wBAEtF,IAAIP,eAAe;4BAGjB;wBACF;oBACF;gBACF;gBAEAY,OAAO,CAACG,QAAQ,GAAGpB;YACrB,OAAO,IAAIuB,gBAAgBF,gBAAgB5B,WAAW;gBACpD,6BAA6B;gBAC7B,IAAI,CAACwB,OAAO,CAACG,QAAQ,IAAI,CAACV,MAAMC,OAAO,CAACM,OAAO,CAACG,QAAQ,GAAG;oBACzDH,OAAO,CAACG,QAAQ,GAAG,EAAE;gBACvB;gBAEA,MAAMmB,aAAa1C,SAASwB;gBAC5B,MAAMmB,MAAMvB,OAAO,CAACG,QAAQ;gBAE5B,qCAAqC;gBACrC,MAAOoB,IAAIrB,MAAM,IAAIoB,WAAY;oBAC/BC,IAAIC,IAAI,CAAC;gBACX;gBAEA,0BAA0B;gBAC1B,IAAID,GAAG,CAACD,WAAW,KAAK,QAAQC,GAAG,CAACD,WAAW,KAAK9C,WAAW;oBAC7D+C,GAAG,CAACD,WAAW,GAAG,CAAC;gBACrB;gBAEA,0DAA0D;gBAC1D,MAAMG,gBAAgB/D,OAAO2B,IAAI,CAAC,CAAC6B,IAAMA,EAAE3B,IAAI,KAAKY,WAAWe,EAAE1B,IAAI,KAAK;gBAC1E,IAAIiC,iBAAiBxB,IAAI,IAAIH,SAASI,MAAM,EAAE;oBAC5C,8DAA8D;oBAC9D,MAAMwB,YAAY5B,QAAQ,CAACG,IAAI,EAAE;oBACjC,MAAMO,iBAAiBV,QAAQ,CAACG,IAAI,EAAE;oBAEtC,IAAIyB,aAAalB,gBAAgB;wBAC/B,MAAMmB,cAAcJ,GAAG,CAACD,WAAW;wBAEnC,sCAAsC;wBACtCK,YAAYd,SAAS,GAAGa;wBAExB,6BAA6B;wBAC7B,IAAIzB,IAAI,MAAMH,SAASI,MAAM,GAAG,GAAG;4BACjC,4BAA4B;4BAC5ByB,WAAW,CAACnB,eAAe,GAAGzB;wBAChC,OAAO;4BACL,4BAA4B;4BAC5B,IAAI,CAAC4C,WAAW,CAACnB,eAAe,IAAI,OAAOmB,WAAW,CAACnB,eAAe,KAAK,UAAU;gCACnFmB,WAAW,CAACnB,eAAe,GAAG,CAAC;4BACjC;4BACA,yCAAyC;4BACzCR,UAAU2B,WAAW,CAACnB,eAAe;4BACrCP,IAAIA,IAAI,GAAE,mCAAmC;4BAC7C,UAAS,0DAA0D;wBACrE;wBACA;oBACF;gBACF;gBAEA,6DAA6D;gBAC7D,IAAIA,IAAI,MAAMH,SAASI,MAAM,GAAG,GAAG;oBACjC,MAAM0B,cAAc9B,QAAQ,CAACA,SAASI,MAAM,GAAG,EAAE;oBACjD,IAAI0B,eAAeL,GAAG,CAACD,WAAW,IAAI,OAAOC,GAAG,CAACD,WAAW,KAAK,UAAU;;wBACvEC,GAAG,CAACD,WAAW,AAA4B,CAACM,YAAY,GAAG7C;oBAC/D;oBACA;gBACF,OAAO,IAAIkB,IAAI,MAAMH,SAASI,MAAM,GAAG,GAAG;oBACxC,8CAA8C;oBAC9CqB,GAAG,CAACD,WAAW,GAAGvC;oBAClB;gBACF,OAAO;oBACL,6CAA6C;oBAC7CiB,UAAUuB,GAAG,CAACD,WAAW;oBACzBrB,KAAI,yBAAyB;gBAC/B;YACF,OAAO;gBACL,0BAA0B;gBAC1B,4FAA4F;gBAC5F,IAAID,OAAO,CAACG,QAAQ,KAAK,QAAQE,UAAUF,YAAY,cAAc;oBAGnE;gBACF;gBAEA,IACE,CAACH,OAAO,CAACG,QAAQ,IACjB,OAAOH,OAAO,CAACG,QAAQ,KAAK,YAC5BV,MAAMC,OAAO,CAACM,OAAO,CAACG,QAAQ,GAC9B;oBACAH,OAAO,CAACG,QAAQ,GAAG,CAAC;gBACtB;gBAEA,qDAAqD;gBACrD,IAAIA,YAAY,gBAAgBF,IAAI,KAAKH,QAAQ,CAACG,IAAI,EAAE,EAAE5B,MAAM,UAAU;oBACxE,mDAAmD;oBACnD2B,OAAO,CAACG,QAAQ,GAAGpB;gBACrB,OAAO,IACL,OAAOiB,OAAO,CAACG,QAAQ,KAAK,YAC5B,CAACV,MAAMC,OAAO,CAACM,OAAO,CAACG,QAAQ,KAC/BH,OAAO,CAACG,QAAQ,KAAK,MACrB;oBACAH,UAAUA,OAAO,CAACG,QAAQ;gBAC5B;YACF;QACF;IACF;IAEA,IAAI;QACF,4CAA4C;QAC5C0B,oBAAoBhE,QAAQH;IAC9B,EAAE,OAAOoE,KAAK;QACZ,0DAA0D;QAE1DlE,IAAImE,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;YACvBH;YACAI,KAAK;QACP;IACF;IAEA,OAAOrE;AACT,EAAC;AAED,MAAM8C,kBAAkB,CACtBwB,KACArC;IAEA,IAAIE,UAAmCmC;IAEvC,IAAK,IAAIlC,IAAI,GAAGA,IAAIH,SAASI,MAAM,EAAED,IAAK;QACxC,MAAME,UAAUL,QAAQ,CAACG,EAAE;QAC3B,MAAMG,cAAcN,QAAQ,CAACG,IAAI,EAAE;QAEnC,IAAI,CAACE,SAAS;YACZ;QACF;QAEA,IAAIC,eAAe,QAAQG,IAAI,CAACH,cAAc;YAC5C,MAAMkB,aAAa1C,SAASwB;YAC5B,MAAMmB,MAAMvB,OAAO,CAACG,QAAQ;YAE5B,IAAIV,MAAMC,OAAO,CAAC6B,QAAQA,GAAG,CAACD,WAAW,EAAE;gBACzCtB,UAAUuB,GAAG,CAACD,WAAW;gBACzBrB,KAAI,iBAAiB;YACvB,OAAO;gBACL,OAAOzB;YACT;QACF,OAAO;YACL,MAAM4D,OAAOpC,OAAO,CAACG,QAAQ;YAC7B,IAAI,OAAOiC,SAAS,YAAYA,SAAS,QAAQ,CAAC3C,MAAMC,OAAO,CAAC0C,OAAO;gBACrEpC,UAAUoC;YACZ,OAAO;gBACL,OAAO5D;YACT;QACF;IACF;IAEA,OAAOwB;AACT;AAEA,MAAM6B,sBAAsB,CAACQ,KAA8B3E;IACzD,wFAAwF;IACxF,oDAAoD;IACpD,MAAM4E,kBAAkB5E,OAAO6E,MAAM,CAAC,CAACjD,QAAUA,MAAMkD,SAAS;IAChE,MAAMC,2BAA2B,IAAIC;IAErC,KAAK,MAAMpD,SAASgD,gBAAiB;QACnC,IAAIG,yBAAyBE,GAAG,CAACrD,MAAMC,IAAI,GAAG;YAC5C;QACF;QAEA,mDAAmD;QACnD,MAAMqD,gBAAgB,IAAIC,OAAO,CAAC,CAAC,EAAEvD,MAAMC,IAAI,CAAC,0BAA0B,CAAC;QAC3E,MAAMuD,aAAsC,CAAC;QAC7C,MAAMC,eAAyB,EAAE;QAEjC,KAAK,MAAM,CAACC,KAAKjE,MAAM,IAAIhB,OAAOkF,OAAO,CAACZ,KAAM;YAC9C,MAAMhE,QAAQ2E,IAAI3E,KAAK,CAACuE;YACxB,IAAIvE,SAASA,KAAK,CAAC,EAAE,EAAE;gBACrB,MAAM6E,SAAS7E,KAAK,CAAC,EAAE;gBACvByE,UAAU,CAACI,OAAO,GAAGnE;gBACrBgE,aAAavB,IAAI,CAACwB;YACpB;QACF;QAEA,sEAAsE;QACtE,IAAIjF,OAAOC,IAAI,CAAC8E,YAAY5C,MAAM,GAAG,GAAG;YACtC,6FAA6F;YAC7FmC,GAAG,CAAC/C,MAAMC,IAAI,CAAC,GAAGuD;YAClBC,aAAaI,OAAO,CAAC,CAACH,MAAQ,OAAOX,GAAG,CAACW,IAAI;YAC7CP,yBAAyBW,GAAG,CAAC9D,MAAMC,IAAI;QACzC;IACF;IAEA,6EAA6E;IAC7E,MAAM8D,eAAe3F,OAAO6E,MAAM,CAAC,CAACjD,QAAUA,MAAME,IAAI,KAAK,YAAYF,MAAMgE,OAAO;IACtF,KAAK,MAAMhE,SAAS+D,aAAc;QAChC,MAAMtE,QAAQsD,GAAG,CAAC/C,MAAMC,IAAI,CAAC;QAE7B,0CAA0C;QAC1C,IAAI,CAAED,CAAAA,MAAMC,IAAI,IAAI8C,GAAE,GAAI;YACxB;QACF;QAEA,oDAAoD;QACpD,IAAI,OAAOtD,UAAU,YAAYA,MAAMwE,QAAQ,CAAC,MAAM;YACpDlB,GAAG,CAAC/C,MAAMC,IAAI,CAAC,GAAGR,MACfgB,KAAK,CAAC,KACNyD,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,IACjBnB,MAAM,CAAC,CAACkB,IAAMA,MAAM,IACpBD,GAAG,CAAC,CAACC;gBACJ,MAAME,MAAMC,WAAWH;gBACvB,OAAOI,MAAMF,OAAO,IAAIA;YAC1B;QACJ,OAEK,IAAIlE,MAAMC,OAAO,CAACX,QAAQ;YAC7B,+EAA+E;YAC/EsD,GAAG,CAAC/C,MAAMC,IAAI,CAAC,GAAGR,MACfwD,MAAM,CAAC,CAACkB,IAAMA,MAAM,QAAQA,MAAMjF,aAAaiF,MAAM,IACrDD,GAAG,CAAC,CAACC;gBACJ,IAAI,OAAOA,MAAM,UAAU;oBACzB,MAAME,MAAMC,WAAWH;oBACvB,OAAOI,MAAMF,OAAO,IAAIA;gBAC1B;gBACA,OAAOF;YACT;QACJ,OAEK,IAAI1E,UAAU,QAAQA,UAAUP,aAAaO,UAAU,IAAI;YAC9D,MAAM4E,MAAM,OAAO5E,UAAU,WAAW6E,WAAW7E,SAASA;YAC5DsD,GAAG,CAAC/C,MAAMC,IAAI,CAAC,GAAGsE,MAAMF,OAAiB,EAAE,GAAG;gBAACA;aAAI;QACrD,OAEK;YACHtB,GAAG,CAAC/C,MAAMC,IAAI,CAAC,GAAG,EAAE;QACtB;IACF;IAEA,kFAAkF;IAClF,MAAMuE,qBAAqBpG,OAAO6E,MAAM,CACtC,CAACjD,QACC,AAACA,CAAAA,MAAME,IAAI,KAAK,kBAAkBF,MAAME,IAAI,KAAK,QAAO,KACxDF,MAAMgE,OAAO,KAAK,QAClB,CAAC7D,MAAMC,OAAO,CAACJ,MAAMK,UAAU;IAEnC,KAAK,MAAML,SAASwE,mBAAoB;QACtC,MAAM/E,QAAQsD,GAAG,CAAC/C,MAAMC,IAAI,CAAC;QAE7B,6DAA6D;QAC7D,IAAI,OAAOR,UAAU,YAAYA,MAAMwE,QAAQ,CAAC,MAAM;YACpDlB,GAAG,CAAC/C,MAAMC,IAAI,CAAC,GAAGR,MACfgB,KAAK,CAAC,KACNyD,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,IACjBnB,MAAM,CAAC,CAACkB,IAAMA,MAAM;QACzB,OAEK,IAAIhE,MAAMC,OAAO,CAACX,QAAQ;YAC7BsD,GAAG,CAAC/C,MAAMC,IAAI,CAAC,GAAGR,MAAMwD,MAAM,CAAC,CAACkB,IAAMA,MAAM,QAAQA,MAAMjF,aAAaiF,MAAM;QAC/E,OAEK,IAAI1E,UAAU,QAAQA,UAAUP,aAAaO,UAAU,IAAI;YAC9DsD,GAAG,CAAC/C,MAAMC,IAAI,CAAC,GAAG;gBAACR;aAAM;QAC3B;IACF;IAEA,oFAAoF;IACpF,KAAK,MAAM,CAACiE,KAAKjE,MAAM,IAAIhB,OAAOkF,OAAO,CAACZ,KAAM;QAC9C,6CAA6C;QAC7C,IAAI5C,MAAMC,OAAO,CAACX,QAAQ;YACxB,gEAAgE;YAChE,MAAMgF,sBAAsBhF,MAAMM,IAAI,CACpC,CAAC2E,OAAS,OAAOA,SAAS,YAAYA,SAAS,QAAQ,gBAAgBA;YAGzE,IAAID,qBAAqB;gBACvB,qEAAqE;gBACrE,MAAME,iBAAiB,EAAE;gBACzB,IAAK,IAAIhE,IAAI,GAAGA,IAAIlB,MAAMmB,MAAM,EAAED,IAAK;oBACrC,MAAM+D,OAAOjF,KAAK,CAACkB,EAAE;oBACrB,IAAI,OAAO+D,SAAS,YAAYA,SAAS,QAAQ,gBAAgBA,MAAM;wBACrE,MAAME,YAAYF;wBAElB,sDAAsD;wBACtD,IAAI,CAACE,UAAUvE,UAAU,IAAK,CAACuE,UAAUC,EAAE,IAAI,CAACD,UAAUnF,KAAK,EAAG;4BAChE;wBACF;wBAEA,mGAAmG;wBACnG,IAAI,QAAQmF,WAAW;4BACrBA,UAAUnF,KAAK,GAAGmF,UAAUC,EAAE;4BAC9B,OAAOD,UAAUC,EAAE;wBACrB;wBAEAF,eAAezC,IAAI,CAAC0C;oBACtB,OAAO,IAAIF,SAAS,QAAQA,SAASxF,WAAW;wBAC9CyF,eAAezC,IAAI,CAACwC;oBACtB;gBACF;gBAEA,yCAAyC;gBACzC,IAAIjF,MAAMmB,MAAM,KAAK+D,eAAe/D,MAAM,EAAE;oBAC1CmC,GAAG,CAACW,IAAI,GAAGiB,eAAe/D,MAAM,GAAG,IAAI+D,iBAAiB,EAAE;gBAC5D;YACF;QACA,2EAA2E;QAC7E,OAEK,IAAI,OAAOlF,UAAU,YAAYA,UAAU,QAAQ,CAACU,MAAMC,OAAO,CAACX,QAAQ;YAC7E,qDAAqD;YACrD,IAAI,gBAAgBA,SAAU,CAAA,QAAQA,SAAS,WAAWA,KAAI,GAAI;gBAChE,MAAMqF,aAAarF;gBAEnB,2EAA2E;gBAC3E,IAAI,CAACqF,WAAWzE,UAAU,IAAK,CAACyE,WAAWD,EAAE,IAAI,CAACC,WAAWrF,KAAK,EAAG;oBACnEsD,GAAG,CAACW,IAAI,GAAG;gBACb,OAAO;oBACL,uCAAuC;oBACvC,IAAI,QAAQoB,cAAc,CAAE,CAAA,WAAWA,UAAS,GAAI;wBAClDA,WAAWrF,KAAK,GAAGqF,WAAWD,EAAE;wBAChC,OAAOC,WAAWD,EAAE;oBACtB;gBACF;YACF,OAAO;gBACL,qCAAqC;gBACrCtC,oBAAoB9C,OAAkCrB;YACxD;QACF;IACF;IAEA,uDAAuD;IACvD,MAAM2G,iBAAiB3G,OAAO6E,MAAM,CAAC,CAACjD,QAAUA,MAAME,IAAI,KAAK;IAC/D,KAAK,MAAMF,SAAS+E,eAAgB;QAClC,IAAI/E,MAAMC,IAAI,IAAI8C,OAAOA,GAAG,CAAC/C,MAAMC,IAAI,CAAC,EAAE;YACxC8C,GAAG,CAAC/C,MAAMC,IAAI,CAAC,GAAGhC,qBAAqB8E,GAAG,CAAC/C,MAAMC,IAAI,CAAC;QACxD;IACF;IAEA,0CAA0C;IAC1C,MAAM+E,cAAc5G,OAAO6E,MAAM,CAAC,CAACjD,QAAUA,MAAME,IAAI,KAAK;IAC5D,KAAK,MAAMF,SAASgF,YAAa;QAC/B,IAAIhF,MAAMC,IAAI,IAAI8C,OAAO5C,MAAMC,OAAO,CAAC2C,GAAG,CAAC/C,MAAMC,IAAI,CAAC,GAAG;YACvD,MAAMgF,SAASlC,GAAG,CAAC/C,MAAMC,IAAI,CAAC;YAC9B,KAAK,MAAMiF,SAASD,OAAQ;gBAC1B,IAAI,CAACC,SAAS,OAAOA,UAAU,UAAU;oBACvC;gBACF;gBAEA,iDAAiD;gBACjD,KAAK,MAAM,CAACxB,KAAKjE,MAAM,IAAIhB,OAAOkF,OAAO,CAACuB,OAAQ;oBAChD,IAAIxB,QAAQ,cAAe,OAAOA,QAAQ,YAAYA,IAAIO,QAAQ,CAAC,aAAc;wBAC/EiB,KAAK,CAACxB,IAAI,GAAGzF,qBAAqBwB;oBACpC;gBACF;YACF;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/utilities/unflattenObject.ts"],"sourcesContent":["import type { FlattenedField, PayloadRequest } from 'payload'\n\nimport type { FromCSVFunction } from '../types.js'\n\nimport { processRichTextField } from './processRichTextField.js'\n\ntype UnflattenArgs = {\n data: Record<string, unknown>\n fields: FlattenedField[]\n fromCSVFunctions?: Record<string, FromCSVFunction>\n req: PayloadRequest\n}\n\n/**\n * Converts flattened CSV data back into a nested document structure.\n *\n * The algorithm:\n * 1. Sorts keys to ensure array indices are processed in order\n * 2. For each flattened key (e.g., \"blocks_0_hero_title\"), splits by underscore into path segments\n * 3. Traverses/builds the nested structure, handling:\n * - Arrays (numeric segments like \"0\", \"1\")\n * - Blocks (blockType detection from slug patterns)\n * - Polymorphic relationships (_relationTo and _id suffix pairs)\n * - Regular nested objects\n * 4. Post-processes to handle localized fields, hasMany conversions, and relationship transforms\n */\nexport const unflattenObject = ({\n data,\n fields,\n fromCSVFunctions = {},\n req,\n}: UnflattenArgs): Record<string, unknown> => {\n if (!data || typeof data !== 'object') {\n return {}\n }\n\n const result: Record<string, unknown> = {}\n\n // Sort keys to ensure array indices are processed in order\n const sortedKeys = Object.keys(data).sort((a, b) => {\n // Extract array indices from flattened keys (e.g., \"field_0_subfield\" -> \"0\")\n const aMatch = a.match(/_(\\d+)(?:_|$)/)\n const bMatch = b.match(/_(\\d+)(?:_|$)/)\n\n if (aMatch && bMatch && aMatch.index !== undefined && bMatch.index !== undefined) {\n const aBase = a.substring(0, aMatch.index)\n const bBase = b.substring(0, bMatch.index)\n\n if (aBase === bBase) {\n return (parseInt(aMatch?.[1] ?? '0', 10) || 0) - (parseInt(bMatch?.[1] ?? '0', 10) || 0)\n }\n }\n\n return a.localeCompare(b)\n })\n\n for (const flatKey of sortedKeys) {\n let value = data[flatKey]\n\n // Skip undefined values but keep null for required field validation\n if (value === undefined) {\n continue\n }\n\n // Check if this is a _relationTo key for a polymorphic relationship\n if (flatKey.endsWith('_relationTo')) {\n const baseKey = flatKey.replace(/_relationTo$/, '')\n const idKey = `${baseKey}_id`\n\n // Check if this is a polymorphic relationship field\n const isPolymorphic = fields.some(\n (field) =>\n field.name === baseKey &&\n field.type === 'relationship' &&\n 'relationTo' in field &&\n Array.isArray(field.relationTo),\n )\n\n if (isPolymorphic) {\n if (baseKey in result) {\n continue\n }\n\n // If the corresponding _id key is undefined, skip processing entirely\n // This prevents creating empty objects when we should preserve existing data\n if (!(idKey in data) || data[idKey] === undefined) {\n continue\n }\n }\n }\n\n // Check if this is a _id key for a polymorphic relationship where _relationTo is undefined\n if (flatKey.endsWith('_id')) {\n const baseKey = flatKey.replace(/_id$/, '')\n const relationToKey = `${baseKey}_relationTo`\n\n // Check if this is a polymorphic relationship field\n const isPolymorphic = fields.some(\n (field) =>\n field.name === baseKey &&\n field.type === 'relationship' &&\n 'relationTo' in field &&\n Array.isArray(field.relationTo),\n )\n\n if (isPolymorphic) {\n // If the corresponding _relationTo key is undefined, skip processing entirely\n // This prevents creating empty objects when we should preserve existing data\n if (!(relationToKey in data) || data[relationToKey] === undefined) {\n continue\n }\n }\n }\n\n // Apply fromCSV function if available\n if (fromCSVFunctions[flatKey]) {\n value = fromCSVFunctions[flatKey]({\n columnName: flatKey,\n data,\n value,\n })\n }\n\n // Example: \"blocks_0_content_text\" -> [\"blocks\", \"0\", \"content\", \"text\"]\n const pathSegments = flatKey.split('_')\n let currentObject: Record<string, unknown> = result\n\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i]\n if (!segment) {\n continue\n } // Skip empty segments\n\n const nextSegment = pathSegments[i + 1]\n const isLast = i === pathSegments.length - 1\n\n // Check if next segment is a numeric array index (e.g., \"0\", \"1\", \"2\")\n const isArrayIndex = nextSegment !== undefined && /^\\d+$/.test(nextSegment)\n\n if (isLast) {\n // Special handling for blockType suffix in blocks\n if (segment === 'blockType' && i >= 3) {\n // Pattern: blocks_0_hero_blockType -> set blockType on the block\n const blockFieldName = pathSegments[0] // 'blocks'\n const isBlockField = fields.some(\n (field) => field.name === blockFieldName && field.type === 'blocks',\n )\n\n if (isBlockField && pathSegments[1]?.match(/^\\d+$/)) {\n const parent = getParentObject(result, pathSegments.slice(0, 2))\n if (parent && typeof parent === 'object') {\n parent.blockType = value\n }\n continue\n }\n }\n\n // Special handling for relationship fields with _id suffix\n if (segment === 'id' && i > 0) {\n const parentKey = pathSegments[i - 1]\n const isPreviousSegmentArrayIndex = parentKey ? /^\\d+$/.test(parentKey) : false\n\n if (!isPreviousSegmentArrayIndex) {\n // Check if this is a relationship field\n const isRelationship = fields.some(\n (field) => field.name === parentKey && field.type === 'relationship',\n )\n\n if (isRelationship) {\n // Check if this is a polymorphic relationship field\n const field = fields.find((f) => f.name === parentKey && f.type === 'relationship')\n const isPolymorphic =\n field && 'relationTo' in field && Array.isArray(field.relationTo)\n\n if (isPolymorphic) {\n const relationToKey = pathSegments.slice(0, i).concat('relationTo').join('_')\n const relationToValue = data[relationToKey]\n\n const parent = getParentObject(result, pathSegments.slice(0, i - 1))\n if (parent && parentKey && typeof parent === 'object') {\n // Both fields must be defined to create/update the relationship\n // If either is undefined, skip the field entirely (preserve existing data)\n if (value !== undefined && relationToValue !== undefined) {\n // Check if both are explicitly null\n if (relationToValue === null && value === null) {\n // Only set to null if explicitly null (user typed \"null\" in CSV)\n parent[parentKey] = null\n } else if (relationToValue || value) {\n // At least one has a value, create the relationship\n parent[parentKey] = {\n relationTo: relationToValue,\n value, // This will be transformed to proper format in postProcess\n }\n }\n // If both are empty strings, don't set the field (handled by not meeting the above conditions)\n }\n // If either is undefined, don't set the field at all (preserve existing data)\n }\n continue\n } else if (!isPolymorphic) {\n const parent = getParentObject(result, pathSegments.slice(0, i - 1))\n if (parent && parentKey && typeof parent === 'object') {\n parent[parentKey] = value\n }\n continue\n }\n }\n }\n }\n\n // _relationTo suffix is handled when processing the _id field above\n if (segment === 'relationTo' && i > 0) {\n const parentKey = pathSegments[i - 1]\n if (parentKey && !parentKey.match(/^\\d+$/)) {\n const field = fields.find((f) => f.name === parentKey && f.type === 'relationship')\n const isPolymorphic = field && 'relationTo' in field && Array.isArray(field.relationTo)\n\n if (isPolymorphic) {\n // For polymorphic relationships, this is handled when processing the _id field\n // Skip it entirely\n continue\n }\n }\n }\n\n currentObject[segment] = value\n } else if (isArrayIndex && nextSegment !== undefined) {\n if (!currentObject[segment] || !Array.isArray(currentObject[segment])) {\n currentObject[segment] = []\n }\n\n const arrayIndex = parseInt(nextSegment)\n const arr = currentObject[segment] as unknown[]\n\n // Ensure array has sufficient length\n while (arr.length <= arrayIndex) {\n arr.push(null)\n }\n\n // Handle array of objects\n if (arr[arrayIndex] === null || arr[arrayIndex] === undefined) {\n arr[arrayIndex] = {}\n }\n\n // Handle blocks field with block slug pattern (e.g., blocks_0_hero_title)\n const isBlocksField = fields.some((f) => f.name === segment && f.type === 'blocks')\n if (isBlocksField && i + 3 < pathSegments.length) {\n const blockSlug = pathSegments[i + 2]\n const blockFieldName = pathSegments[i + 3]\n\n if (blockSlug && blockFieldName) {\n const blockObject = arr[arrayIndex] as Record<string, unknown>\n blockObject.blockType = blockSlug\n\n if (i + 3 === pathSegments.length - 1) {\n blockObject[blockFieldName] = value\n } else {\n if (!blockObject[blockFieldName] || typeof blockObject[blockFieldName] !== 'object') {\n blockObject[blockFieldName] = {}\n }\n currentObject = blockObject[blockFieldName] as Record<string, unknown>\n i = i + 3\n continue\n }\n break\n }\n }\n\n if (i + 2 === pathSegments.length - 1) {\n const lastSegment = pathSegments[pathSegments.length - 1]\n if (lastSegment && arr[arrayIndex] && typeof arr[arrayIndex] === 'object') {\n ;(arr[arrayIndex] as Record<string, unknown>)[lastSegment] = value\n }\n break\n } else if (i + 1 === pathSegments.length - 1) {\n // Direct array value (e.g., tags_0 = \"value\")\n arr[arrayIndex] = value\n break\n } else {\n currentObject = arr[arrayIndex] as Record<string, unknown>\n i++\n }\n } else {\n // Skip if already set to null (polymorphic relationship already processed)\n if (currentObject[segment] === null && isLast && segment === 'relationTo') {\n continue\n }\n\n if (\n !currentObject[segment] ||\n typeof currentObject[segment] !== 'object' ||\n Array.isArray(currentObject[segment])\n ) {\n currentObject[segment] = {}\n }\n\n // Handle polymorphic relationship arrays\n if (segment === 'relationTo' && i > 0 && pathSegments[i - 1]?.match(/^\\d+$/)) {\n currentObject[segment] = value\n } else if (\n typeof currentObject[segment] === 'object' &&\n !Array.isArray(currentObject[segment]) &&\n currentObject[segment] !== null\n ) {\n currentObject = currentObject[segment] as Record<string, unknown>\n }\n }\n }\n }\n\n try {\n // Post-process to handle special structures\n postProcessDocument(result, fields)\n } catch (err) {\n // Log but don't throw - return partially processed result\n\n req.payload.logger.error({\n err,\n msg: '[plugin-import-export] Error in postProcessDocument',\n })\n }\n\n return result\n}\n\nconst getParentObject = (\n obj: Record<string, unknown>,\n segments: string[],\n): Record<string, unknown> | undefined => {\n let current: Record<string, unknown> = obj\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]\n const nextSegment = segments[i + 1]\n\n if (!segment) {\n continue\n }\n\n if (nextSegment && /^\\d+$/.test(nextSegment)) {\n const arrayIndex = parseInt(nextSegment)\n const arr = current[segment] as unknown[]\n\n if (Array.isArray(arr) && arr[arrayIndex]) {\n current = arr[arrayIndex] as Record<string, unknown>\n i++ // Skip the index\n } else {\n return undefined\n }\n } else {\n const next = current[segment]\n if (typeof next === 'object' && next !== null && !Array.isArray(next)) {\n current = next as Record<string, unknown>\n } else {\n return undefined\n }\n }\n }\n\n return current\n}\n\n/**\n * Post-processes the unflattened document to handle special field types:\n * - Localized fields: transforms field_locale keys to nested { field: { locale: value } }\n * - Number hasMany: converts comma-separated strings or arrays to number arrays\n * - Relationship hasMany: converts comma-separated IDs to arrays\n * - Polymorphic relationships: transforms flat {relationTo, id} to {relationTo, value}\n * - Rich text fields: ensures proper data structure\n */\nconst postProcessDocument = (doc: Record<string, unknown>, fields: FlattenedField[]): void => {\n const localizedFields = fields.filter((field) => field.localized)\n const processedLocalizedFields = new Set<string>()\n\n for (const field of localizedFields) {\n if (processedLocalizedFields.has(field.name)) {\n continue\n }\n\n // Look for all locale-specific keys for this field\n const localePattern = new RegExp(`^${field.name}_([a-z]{2}(?:_[A-Z]{2})?)$`)\n const localeData: Record<string, unknown> = {}\n const keysToDelete: string[] = []\n\n for (const [key, value] of Object.entries(doc)) {\n const match = key.match(localePattern)\n if (match && match[1]) {\n const locale = match[1]\n localeData[locale] = value\n keysToDelete.push(key)\n }\n }\n\n // If we found locale-specific data, restructure it as Payload expects\n if (Object.keys(localeData).length > 0) {\n // Payload stores localized fields as nested objects: { field: { en: 'value', es: 'value' } }\n doc[field.name] = localeData\n keysToDelete.forEach((key) => delete doc[key])\n processedLocalizedFields.add(field.name)\n }\n }\n\n // Handle number fields with hasMany - convert string arrays to number arrays\n const numberFields = fields.filter((field) => field.type === 'number' && field.hasMany)\n for (const field of numberFields) {\n const value = doc[field.name]\n\n // Skip if field doesn't exist in document\n if (!(field.name in doc)) {\n continue\n }\n\n // Handle comma-separated string (e.g., \"1,2,3,4,5\")\n if (typeof value === 'string' && value.includes(',')) {\n doc[field.name] = value\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v !== '')\n .map((v) => {\n const num = parseFloat(v)\n return isNaN(num) ? 0 : num\n })\n }\n // Handle array of values from indexed columns (e.g., field_0, field_1, etc.)\n else if (Array.isArray(value)) {\n // Filter out null, undefined, and empty string values, then convert to numbers\n doc[field.name] = value\n .filter((v) => v !== null && v !== undefined && v !== '')\n .map((v) => {\n if (typeof v === 'string') {\n const num = parseFloat(v)\n return isNaN(num) ? 0 : num\n }\n return v\n })\n }\n // Handle single value for hasMany (convert to array)\n else if (value !== null && value !== undefined && value !== '') {\n const num = typeof value === 'string' ? parseFloat(value) : value\n doc[field.name] = isNaN(num as number) ? [] : [num]\n }\n // Handle empty/null values - convert to empty array for hasMany\n else {\n doc[field.name] = []\n }\n }\n\n // Handle relationship fields with hasMany - convert comma-separated IDs to arrays\n const relationshipFields = fields.filter(\n (field) =>\n (field.type === 'relationship' || field.type === 'upload') &&\n field.hasMany === true &&\n !Array.isArray(field.relationTo), // Skip polymorphic for now, handled separately\n )\n for (const field of relationshipFields) {\n const value = doc[field.name]\n\n // Handle comma-separated string of IDs (e.g., \"id1,id2,id3\")\n if (typeof value === 'string' && value.includes(',')) {\n doc[field.name] = value\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v !== '')\n }\n // Keep array as-is if already an array\n else if (Array.isArray(value)) {\n doc[field.name] = value.filter((v) => v !== null && v !== undefined && v !== '')\n }\n // Convert single value to array for hasMany\n else if (value !== null && value !== undefined && value !== '') {\n doc[field.name] = [value]\n }\n }\n\n // Handle polymorphic relationships - transform from flat structure to proper format\n for (const [key, value] of Object.entries(doc)) {\n // Handle arrays of polymorphic relationships\n if (Array.isArray(value)) {\n // Check if this array contains polymorphic relationship objects\n const hasPolymorphicItems = value.some(\n (item) => typeof item === 'object' && item !== null && 'relationTo' in item,\n )\n\n if (hasPolymorphicItems) {\n // Filter out null/invalid polymorphic items and transform valid ones\n const processedArray = []\n for (let i = 0; i < value.length; i++) {\n const item = value[i]\n if (typeof item === 'object' && item !== null && 'relationTo' in item) {\n const typedItem = item as Record<string, unknown>\n\n // Skip if both relationTo and value/id are null/empty\n if (!typedItem.relationTo || (!typedItem.id && !typedItem.value)) {\n continue\n }\n\n // Transform from {relationTo: 'collection', id: '123'} to {relationTo: 'collection', value: '123'}\n if ('id' in typedItem) {\n typedItem.value = typedItem.id\n delete typedItem.id\n }\n\n processedArray.push(typedItem)\n } else if (item !== null && item !== undefined) {\n processedArray.push(item)\n }\n }\n\n // Update the array with filtered results\n if (value.length !== processedArray.length) {\n doc[key] = processedArray.length > 0 ? processedArray : []\n }\n }\n // For non-polymorphic arrays, preserve null placeholders for sparse arrays\n }\n // Handle single polymorphic relationships\n else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Check if this is a single polymorphic relationship\n if ('relationTo' in value && ('id' in value || 'value' in value)) {\n const typedValue = value as Record<string, unknown>\n\n // If both relationTo and value are null/empty, set the whole field to null\n if (!typedValue.relationTo || (!typedValue.id && !typedValue.value)) {\n doc[key] = null\n } else {\n // If it has 'id', transform to 'value'\n if ('id' in typedValue && !('value' in typedValue)) {\n typedValue.value = typedValue.id\n delete typedValue.id\n }\n }\n } else {\n // Recursively process nested objects\n postProcessDocument(value as Record<string, unknown>, fields)\n }\n }\n }\n\n // Process rich text fields to ensure proper data types\n const richTextFields = fields.filter((field) => field.type === 'richText')\n for (const field of richTextFields) {\n if (field.name in doc && doc[field.name]) {\n doc[field.name] = processRichTextField(doc[field.name])\n }\n }\n\n // Also process rich text fields in blocks\n const blockFields = fields.filter((field) => field.type === 'blocks')\n for (const field of blockFields) {\n if (field.name in doc && Array.isArray(doc[field.name])) {\n const blocks = doc[field.name] as any[]\n for (const block of blocks) {\n if (!block || typeof block !== 'object') {\n continue\n }\n\n // Look for richText fields directly in the block\n for (const [key, value] of Object.entries(block)) {\n if (key === 'richText' || (typeof key === 'string' && key.includes('richText'))) {\n block[key] = processRichTextField(value)\n }\n }\n }\n }\n }\n}\n"],"names":["processRichTextField","unflattenObject","data","fields","fromCSVFunctions","req","result","sortedKeys","Object","keys","sort","a","b","aMatch","match","bMatch","index","undefined","aBase","substring","bBase","parseInt","localeCompare","flatKey","value","endsWith","baseKey","replace","idKey","isPolymorphic","some","field","name","type","Array","isArray","relationTo","relationToKey","columnName","pathSegments","split","currentObject","i","length","segment","nextSegment","isLast","isArrayIndex","test","blockFieldName","isBlockField","parent","getParentObject","slice","blockType","parentKey","isPreviousSegmentArrayIndex","isRelationship","find","f","concat","join","relationToValue","arrayIndex","arr","push","isBlocksField","blockSlug","blockObject","lastSegment","postProcessDocument","err","payload","logger","error","msg","obj","segments","current","next","doc","localizedFields","filter","localized","processedLocalizedFields","Set","has","localePattern","RegExp","localeData","keysToDelete","key","entries","locale","forEach","add","numberFields","hasMany","includes","map","v","trim","num","parseFloat","isNaN","relationshipFields","hasPolymorphicItems","item","processedArray","typedItem","id","typedValue","richTextFields","blockFields","blocks","block"],"mappings":"AAIA,SAASA,oBAAoB,QAAQ,4BAA2B;AAShE;;;;;;;;;;;;CAYC,GACD,OAAO,MAAMC,kBAAkB,CAAC,EAC9BC,IAAI,EACJC,MAAM,EACNC,mBAAmB,CAAC,CAAC,EACrBC,GAAG,EACW;IACd,IAAI,CAACH,QAAQ,OAAOA,SAAS,UAAU;QACrC,OAAO,CAAC;IACV;IAEA,MAAMI,SAAkC,CAAC;IAEzC,2DAA2D;IAC3D,MAAMC,aAAaC,OAAOC,IAAI,CAACP,MAAMQ,IAAI,CAAC,CAACC,GAAGC;QAC5C,8EAA8E;QAC9E,MAAMC,SAASF,EAAEG,KAAK,CAAC;QACvB,MAAMC,SAASH,EAAEE,KAAK,CAAC;QAEvB,IAAID,UAAUE,UAAUF,OAAOG,KAAK,KAAKC,aAAaF,OAAOC,KAAK,KAAKC,WAAW;YAChF,MAAMC,QAAQP,EAAEQ,SAAS,CAAC,GAAGN,OAAOG,KAAK;YACzC,MAAMI,QAAQR,EAAEO,SAAS,CAAC,GAAGJ,OAAOC,KAAK;YAEzC,IAAIE,UAAUE,OAAO;gBACnB,OAAO,AAACC,CAAAA,SAASR,QAAQ,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA,IAAMQ,CAAAA,SAASN,QAAQ,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;YACxF;QACF;QAEA,OAAOJ,EAAEW,aAAa,CAACV;IACzB;IAEA,KAAK,MAAMW,WAAWhB,WAAY;QAChC,IAAIiB,QAAQtB,IAAI,CAACqB,QAAQ;QAEzB,oEAAoE;QACpE,IAAIC,UAAUP,WAAW;YACvB;QACF;QAEA,oEAAoE;QACpE,IAAIM,QAAQE,QAAQ,CAAC,gBAAgB;YACnC,MAAMC,UAAUH,QAAQI,OAAO,CAAC,gBAAgB;YAChD,MAAMC,QAAQ,GAAGF,QAAQ,GAAG,CAAC;YAE7B,oDAAoD;YACpD,MAAMG,gBAAgB1B,OAAO2B,IAAI,CAC/B,CAACC,QACCA,MAAMC,IAAI,KAAKN,WACfK,MAAME,IAAI,KAAK,kBACf,gBAAgBF,SAChBG,MAAMC,OAAO,CAACJ,MAAMK,UAAU;YAGlC,IAAIP,eAAe;gBACjB,IAAIH,WAAWpB,QAAQ;oBACrB;gBACF;gBAEA,sEAAsE;gBACtE,6EAA6E;gBAC7E,IAAI,CAAEsB,CAAAA,SAAS1B,IAAG,KAAMA,IAAI,CAAC0B,MAAM,KAAKX,WAAW;oBACjD;gBACF;YACF;QACF;QAEA,2FAA2F;QAC3F,IAAIM,QAAQE,QAAQ,CAAC,QAAQ;YAC3B,MAAMC,UAAUH,QAAQI,OAAO,CAAC,QAAQ;YACxC,MAAMU,gBAAgB,GAAGX,QAAQ,WAAW,CAAC;YAE7C,oDAAoD;YACpD,MAAMG,gBAAgB1B,OAAO2B,IAAI,CAC/B,CAACC,QACCA,MAAMC,IAAI,KAAKN,WACfK,MAAME,IAAI,KAAK,kBACf,gBAAgBF,SAChBG,MAAMC,OAAO,CAACJ,MAAMK,UAAU;YAGlC,IAAIP,eAAe;gBACjB,8EAA8E;gBAC9E,6EAA6E;gBAC7E,IAAI,CAAEQ,CAAAA,iBAAiBnC,IAAG,KAAMA,IAAI,CAACmC,cAAc,KAAKpB,WAAW;oBACjE;gBACF;YACF;QACF;QAEA,sCAAsC;QACtC,IAAIb,gBAAgB,CAACmB,QAAQ,EAAE;YAC7BC,QAAQpB,gBAAgB,CAACmB,QAAQ,CAAC;gBAChCe,YAAYf;gBACZrB;gBACAsB;YACF;QACF;QAEA,yEAAyE;QACzE,MAAMe,eAAehB,QAAQiB,KAAK,CAAC;QACnC,IAAIC,gBAAyCnC;QAE7C,IAAK,IAAIoC,IAAI,GAAGA,IAAIH,aAAaI,MAAM,EAAED,IAAK;YAC5C,MAAME,UAAUL,YAAY,CAACG,EAAE;YAC/B,IAAI,CAACE,SAAS;gBACZ;YACF,EAAE,sBAAsB;YAExB,MAAMC,cAAcN,YAAY,CAACG,IAAI,EAAE;YACvC,MAAMI,SAASJ,MAAMH,aAAaI,MAAM,GAAG;YAE3C,uEAAuE;YACvE,MAAMI,eAAeF,gBAAgB5B,aAAa,QAAQ+B,IAAI,CAACH;YAE/D,IAAIC,QAAQ;gBACV,kDAAkD;gBAClD,IAAIF,YAAY,eAAeF,KAAK,GAAG;oBACrC,iEAAiE;oBACjE,MAAMO,iBAAiBV,YAAY,CAAC,EAAE,CAAC,WAAW;;oBAClD,MAAMW,eAAe/C,OAAO2B,IAAI,CAC9B,CAACC,QAAUA,MAAMC,IAAI,KAAKiB,kBAAkBlB,MAAME,IAAI,KAAK;oBAG7D,IAAIiB,gBAAgBX,YAAY,CAAC,EAAE,EAAEzB,MAAM,UAAU;wBACnD,MAAMqC,SAASC,gBAAgB9C,QAAQiC,aAAac,KAAK,CAAC,GAAG;wBAC7D,IAAIF,UAAU,OAAOA,WAAW,UAAU;4BACxCA,OAAOG,SAAS,GAAG9B;wBACrB;wBACA;oBACF;gBACF;gBAEA,2DAA2D;gBAC3D,IAAIoB,YAAY,QAAQF,IAAI,GAAG;oBAC7B,MAAMa,YAAYhB,YAAY,CAACG,IAAI,EAAE;oBACrC,MAAMc,8BAA8BD,YAAY,QAAQP,IAAI,CAACO,aAAa;oBAE1E,IAAI,CAACC,6BAA6B;wBAChC,wCAAwC;wBACxC,MAAMC,iBAAiBtD,OAAO2B,IAAI,CAChC,CAACC,QAAUA,MAAMC,IAAI,KAAKuB,aAAaxB,MAAME,IAAI,KAAK;wBAGxD,IAAIwB,gBAAgB;4BAClB,oDAAoD;4BACpD,MAAM1B,QAAQ5B,OAAOuD,IAAI,CAAC,CAACC,IAAMA,EAAE3B,IAAI,KAAKuB,aAAaI,EAAE1B,IAAI,KAAK;4BACpE,MAAMJ,gBACJE,SAAS,gBAAgBA,SAASG,MAAMC,OAAO,CAACJ,MAAMK,UAAU;4BAElE,IAAIP,eAAe;gCACjB,MAAMQ,gBAAgBE,aAAac,KAAK,CAAC,GAAGX,GAAGkB,MAAM,CAAC,cAAcC,IAAI,CAAC;gCACzE,MAAMC,kBAAkB5D,IAAI,CAACmC,cAAc;gCAE3C,MAAMc,SAASC,gBAAgB9C,QAAQiC,aAAac,KAAK,CAAC,GAAGX,IAAI;gCACjE,IAAIS,UAAUI,aAAa,OAAOJ,WAAW,UAAU;oCACrD,gEAAgE;oCAChE,2EAA2E;oCAC3E,IAAI3B,UAAUP,aAAa6C,oBAAoB7C,WAAW;wCACxD,oCAAoC;wCACpC,IAAI6C,oBAAoB,QAAQtC,UAAU,MAAM;4CAC9C,iEAAiE;4CACjE2B,MAAM,CAACI,UAAU,GAAG;wCACtB,OAAO,IAAIO,mBAAmBtC,OAAO;4CACnC,oDAAoD;4CACpD2B,MAAM,CAACI,UAAU,GAAG;gDAClBnB,YAAY0B;gDACZtC;4CACF;wCACF;oCACA,+FAA+F;oCACjG;gCACA,8EAA8E;gCAChF;gCACA;4BACF,OAAO,IAAI,CAACK,eAAe;gCACzB,MAAMsB,SAASC,gBAAgB9C,QAAQiC,aAAac,KAAK,CAAC,GAAGX,IAAI;gCACjE,IAAIS,UAAUI,aAAa,OAAOJ,WAAW,UAAU;oCACrDA,MAAM,CAACI,UAAU,GAAG/B;gCACtB;gCACA;4BACF;wBACF;oBACF;gBACF;gBAEA,oEAAoE;gBACpE,IAAIoB,YAAY,gBAAgBF,IAAI,GAAG;oBACrC,MAAMa,YAAYhB,YAAY,CAACG,IAAI,EAAE;oBACrC,IAAIa,aAAa,CAACA,UAAUzC,KAAK,CAAC,UAAU;wBAC1C,MAAMiB,QAAQ5B,OAAOuD,IAAI,CAAC,CAACC,IAAMA,EAAE3B,IAAI,KAAKuB,aAAaI,EAAE1B,IAAI,KAAK;wBACpE,MAAMJ,gBAAgBE,SAAS,gBAAgBA,SAASG,MAAMC,OAAO,CAACJ,MAAMK,UAAU;wBAEtF,IAAIP,eAAe;4BAGjB;wBACF;oBACF;gBACF;gBAEAY,aAAa,CAACG,QAAQ,GAAGpB;YAC3B,OAAO,IAAIuB,gBAAgBF,gBAAgB5B,WAAW;gBACpD,IAAI,CAACwB,aAAa,CAACG,QAAQ,IAAI,CAACV,MAAMC,OAAO,CAACM,aAAa,CAACG,QAAQ,GAAG;oBACrEH,aAAa,CAACG,QAAQ,GAAG,EAAE;gBAC7B;gBAEA,MAAMmB,aAAa1C,SAASwB;gBAC5B,MAAMmB,MAAMvB,aAAa,CAACG,QAAQ;gBAElC,qCAAqC;gBACrC,MAAOoB,IAAIrB,MAAM,IAAIoB,WAAY;oBAC/BC,IAAIC,IAAI,CAAC;gBACX;gBAEA,0BAA0B;gBAC1B,IAAID,GAAG,CAACD,WAAW,KAAK,QAAQC,GAAG,CAACD,WAAW,KAAK9C,WAAW;oBAC7D+C,GAAG,CAACD,WAAW,GAAG,CAAC;gBACrB;gBAEA,0EAA0E;gBAC1E,MAAMG,gBAAgB/D,OAAO2B,IAAI,CAAC,CAAC6B,IAAMA,EAAE3B,IAAI,KAAKY,WAAWe,EAAE1B,IAAI,KAAK;gBAC1E,IAAIiC,iBAAiBxB,IAAI,IAAIH,aAAaI,MAAM,EAAE;oBAChD,MAAMwB,YAAY5B,YAAY,CAACG,IAAI,EAAE;oBACrC,MAAMO,iBAAiBV,YAAY,CAACG,IAAI,EAAE;oBAE1C,IAAIyB,aAAalB,gBAAgB;wBAC/B,MAAMmB,cAAcJ,GAAG,CAACD,WAAW;wBACnCK,YAAYd,SAAS,GAAGa;wBAExB,IAAIzB,IAAI,MAAMH,aAAaI,MAAM,GAAG,GAAG;4BACrCyB,WAAW,CAACnB,eAAe,GAAGzB;wBAChC,OAAO;4BACL,IAAI,CAAC4C,WAAW,CAACnB,eAAe,IAAI,OAAOmB,WAAW,CAACnB,eAAe,KAAK,UAAU;gCACnFmB,WAAW,CAACnB,eAAe,GAAG,CAAC;4BACjC;4BACAR,gBAAgB2B,WAAW,CAACnB,eAAe;4BAC3CP,IAAIA,IAAI;4BACR;wBACF;wBACA;oBACF;gBACF;gBAEA,IAAIA,IAAI,MAAMH,aAAaI,MAAM,GAAG,GAAG;oBACrC,MAAM0B,cAAc9B,YAAY,CAACA,aAAaI,MAAM,GAAG,EAAE;oBACzD,IAAI0B,eAAeL,GAAG,CAACD,WAAW,IAAI,OAAOC,GAAG,CAACD,WAAW,KAAK,UAAU;;wBACvEC,GAAG,CAACD,WAAW,AAA4B,CAACM,YAAY,GAAG7C;oBAC/D;oBACA;gBACF,OAAO,IAAIkB,IAAI,MAAMH,aAAaI,MAAM,GAAG,GAAG;oBAC5C,8CAA8C;oBAC9CqB,GAAG,CAACD,WAAW,GAAGvC;oBAClB;gBACF,OAAO;oBACLiB,gBAAgBuB,GAAG,CAACD,WAAW;oBAC/BrB;gBACF;YACF,OAAO;gBACL,2EAA2E;gBAC3E,IAAID,aAAa,CAACG,QAAQ,KAAK,QAAQE,UAAUF,YAAY,cAAc;oBACzE;gBACF;gBAEA,IACE,CAACH,aAAa,CAACG,QAAQ,IACvB,OAAOH,aAAa,CAACG,QAAQ,KAAK,YAClCV,MAAMC,OAAO,CAACM,aAAa,CAACG,QAAQ,GACpC;oBACAH,aAAa,CAACG,QAAQ,GAAG,CAAC;gBAC5B;gBAEA,yCAAyC;gBACzC,IAAIA,YAAY,gBAAgBF,IAAI,KAAKH,YAAY,CAACG,IAAI,EAAE,EAAE5B,MAAM,UAAU;oBAC5E2B,aAAa,CAACG,QAAQ,GAAGpB;gBAC3B,OAAO,IACL,OAAOiB,aAAa,CAACG,QAAQ,KAAK,YAClC,CAACV,MAAMC,OAAO,CAACM,aAAa,CAACG,QAAQ,KACrCH,aAAa,CAACG,QAAQ,KAAK,MAC3B;oBACAH,gBAAgBA,aAAa,CAACG,QAAQ;gBACxC;YACF;QACF;IACF;IAEA,IAAI;QACF,4CAA4C;QAC5C0B,oBAAoBhE,QAAQH;IAC9B,EAAE,OAAOoE,KAAK;QACZ,0DAA0D;QAE1DlE,IAAImE,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;YACvBH;YACAI,KAAK;QACP;IACF;IAEA,OAAOrE;AACT,EAAC;AAED,MAAM8C,kBAAkB,CACtBwB,KACAC;IAEA,IAAIC,UAAmCF;IAEvC,IAAK,IAAIlC,IAAI,GAAGA,IAAImC,SAASlC,MAAM,EAAED,IAAK;QACxC,MAAME,UAAUiC,QAAQ,CAACnC,EAAE;QAC3B,MAAMG,cAAcgC,QAAQ,CAACnC,IAAI,EAAE;QAEnC,IAAI,CAACE,SAAS;YACZ;QACF;QAEA,IAAIC,eAAe,QAAQG,IAAI,CAACH,cAAc;YAC5C,MAAMkB,aAAa1C,SAASwB;YAC5B,MAAMmB,MAAMc,OAAO,CAAClC,QAAQ;YAE5B,IAAIV,MAAMC,OAAO,CAAC6B,QAAQA,GAAG,CAACD,WAAW,EAAE;gBACzCe,UAAUd,GAAG,CAACD,WAAW;gBACzBrB,KAAI,iBAAiB;YACvB,OAAO;gBACL,OAAOzB;YACT;QACF,OAAO;YACL,MAAM8D,OAAOD,OAAO,CAAClC,QAAQ;YAC7B,IAAI,OAAOmC,SAAS,YAAYA,SAAS,QAAQ,CAAC7C,MAAMC,OAAO,CAAC4C,OAAO;gBACrED,UAAUC;YACZ,OAAO;gBACL,OAAO9D;YACT;QACF;IACF;IAEA,OAAO6D;AACT;AAEA;;;;;;;CAOC,GACD,MAAMR,sBAAsB,CAACU,KAA8B7E;IACzD,MAAM8E,kBAAkB9E,OAAO+E,MAAM,CAAC,CAACnD,QAAUA,MAAMoD,SAAS;IAChE,MAAMC,2BAA2B,IAAIC;IAErC,KAAK,MAAMtD,SAASkD,gBAAiB;QACnC,IAAIG,yBAAyBE,GAAG,CAACvD,MAAMC,IAAI,GAAG;YAC5C;QACF;QAEA,mDAAmD;QACnD,MAAMuD,gBAAgB,IAAIC,OAAO,CAAC,CAAC,EAAEzD,MAAMC,IAAI,CAAC,0BAA0B,CAAC;QAC3E,MAAMyD,aAAsC,CAAC;QAC7C,MAAMC,eAAyB,EAAE;QAEjC,KAAK,MAAM,CAACC,KAAKnE,MAAM,IAAIhB,OAAOoF,OAAO,CAACZ,KAAM;YAC9C,MAAMlE,QAAQ6E,IAAI7E,KAAK,CAACyE;YACxB,IAAIzE,SAASA,KAAK,CAAC,EAAE,EAAE;gBACrB,MAAM+E,SAAS/E,KAAK,CAAC,EAAE;gBACvB2E,UAAU,CAACI,OAAO,GAAGrE;gBACrBkE,aAAazB,IAAI,CAAC0B;YACpB;QACF;QAEA,sEAAsE;QACtE,IAAInF,OAAOC,IAAI,CAACgF,YAAY9C,MAAM,GAAG,GAAG;YACtC,6FAA6F;YAC7FqC,GAAG,CAACjD,MAAMC,IAAI,CAAC,GAAGyD;YAClBC,aAAaI,OAAO,CAAC,CAACH,MAAQ,OAAOX,GAAG,CAACW,IAAI;YAC7CP,yBAAyBW,GAAG,CAAChE,MAAMC,IAAI;QACzC;IACF;IAEA,6EAA6E;IAC7E,MAAMgE,eAAe7F,OAAO+E,MAAM,CAAC,CAACnD,QAAUA,MAAME,IAAI,KAAK,YAAYF,MAAMkE,OAAO;IACtF,KAAK,MAAMlE,SAASiE,aAAc;QAChC,MAAMxE,QAAQwD,GAAG,CAACjD,MAAMC,IAAI,CAAC;QAE7B,0CAA0C;QAC1C,IAAI,CAAED,CAAAA,MAAMC,IAAI,IAAIgD,GAAE,GAAI;YACxB;QACF;QAEA,oDAAoD;QACpD,IAAI,OAAOxD,UAAU,YAAYA,MAAM0E,QAAQ,CAAC,MAAM;YACpDlB,GAAG,CAACjD,MAAMC,IAAI,CAAC,GAAGR,MACfgB,KAAK,CAAC,KACN2D,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,IACjBnB,MAAM,CAAC,CAACkB,IAAMA,MAAM,IACpBD,GAAG,CAAC,CAACC;gBACJ,MAAME,MAAMC,WAAWH;gBACvB,OAAOI,MAAMF,OAAO,IAAIA;YAC1B;QACJ,OAEK,IAAIpE,MAAMC,OAAO,CAACX,QAAQ;YAC7B,+EAA+E;YAC/EwD,GAAG,CAACjD,MAAMC,IAAI,CAAC,GAAGR,MACf0D,MAAM,CAAC,CAACkB,IAAMA,MAAM,QAAQA,MAAMnF,aAAamF,MAAM,IACrDD,GAAG,CAAC,CAACC;gBACJ,IAAI,OAAOA,MAAM,UAAU;oBACzB,MAAME,MAAMC,WAAWH;oBACvB,OAAOI,MAAMF,OAAO,IAAIA;gBAC1B;gBACA,OAAOF;YACT;QACJ,OAEK,IAAI5E,UAAU,QAAQA,UAAUP,aAAaO,UAAU,IAAI;YAC9D,MAAM8E,MAAM,OAAO9E,UAAU,WAAW+E,WAAW/E,SAASA;YAC5DwD,GAAG,CAACjD,MAAMC,IAAI,CAAC,GAAGwE,MAAMF,OAAiB,EAAE,GAAG;gBAACA;aAAI;QACrD,OAEK;YACHtB,GAAG,CAACjD,MAAMC,IAAI,CAAC,GAAG,EAAE;QACtB;IACF;IAEA,kFAAkF;IAClF,MAAMyE,qBAAqBtG,OAAO+E,MAAM,CACtC,CAACnD,QACC,AAACA,CAAAA,MAAME,IAAI,KAAK,kBAAkBF,MAAME,IAAI,KAAK,QAAO,KACxDF,MAAMkE,OAAO,KAAK,QAClB,CAAC/D,MAAMC,OAAO,CAACJ,MAAMK,UAAU;IAEnC,KAAK,MAAML,SAAS0E,mBAAoB;QACtC,MAAMjF,QAAQwD,GAAG,CAACjD,MAAMC,IAAI,CAAC;QAE7B,6DAA6D;QAC7D,IAAI,OAAOR,UAAU,YAAYA,MAAM0E,QAAQ,CAAC,MAAM;YACpDlB,GAAG,CAACjD,MAAMC,IAAI,CAAC,GAAGR,MACfgB,KAAK,CAAC,KACN2D,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,IACjBnB,MAAM,CAAC,CAACkB,IAAMA,MAAM;QACzB,OAEK,IAAIlE,MAAMC,OAAO,CAACX,QAAQ;YAC7BwD,GAAG,CAACjD,MAAMC,IAAI,CAAC,GAAGR,MAAM0D,MAAM,CAAC,CAACkB,IAAMA,MAAM,QAAQA,MAAMnF,aAAamF,MAAM;QAC/E,OAEK,IAAI5E,UAAU,QAAQA,UAAUP,aAAaO,UAAU,IAAI;YAC9DwD,GAAG,CAACjD,MAAMC,IAAI,CAAC,GAAG;gBAACR;aAAM;QAC3B;IACF;IAEA,oFAAoF;IACpF,KAAK,MAAM,CAACmE,KAAKnE,MAAM,IAAIhB,OAAOoF,OAAO,CAACZ,KAAM;QAC9C,6CAA6C;QAC7C,IAAI9C,MAAMC,OAAO,CAACX,QAAQ;YACxB,gEAAgE;YAChE,MAAMkF,sBAAsBlF,MAAMM,IAAI,CACpC,CAAC6E,OAAS,OAAOA,SAAS,YAAYA,SAAS,QAAQ,gBAAgBA;YAGzE,IAAID,qBAAqB;gBACvB,qEAAqE;gBACrE,MAAME,iBAAiB,EAAE;gBACzB,IAAK,IAAIlE,IAAI,GAAGA,IAAIlB,MAAMmB,MAAM,EAAED,IAAK;oBACrC,MAAMiE,OAAOnF,KAAK,CAACkB,EAAE;oBACrB,IAAI,OAAOiE,SAAS,YAAYA,SAAS,QAAQ,gBAAgBA,MAAM;wBACrE,MAAME,YAAYF;wBAElB,sDAAsD;wBACtD,IAAI,CAACE,UAAUzE,UAAU,IAAK,CAACyE,UAAUC,EAAE,IAAI,CAACD,UAAUrF,KAAK,EAAG;4BAChE;wBACF;wBAEA,mGAAmG;wBACnG,IAAI,QAAQqF,WAAW;4BACrBA,UAAUrF,KAAK,GAAGqF,UAAUC,EAAE;4BAC9B,OAAOD,UAAUC,EAAE;wBACrB;wBAEAF,eAAe3C,IAAI,CAAC4C;oBACtB,OAAO,IAAIF,SAAS,QAAQA,SAAS1F,WAAW;wBAC9C2F,eAAe3C,IAAI,CAAC0C;oBACtB;gBACF;gBAEA,yCAAyC;gBACzC,IAAInF,MAAMmB,MAAM,KAAKiE,eAAejE,MAAM,EAAE;oBAC1CqC,GAAG,CAACW,IAAI,GAAGiB,eAAejE,MAAM,GAAG,IAAIiE,iBAAiB,EAAE;gBAC5D;YACF;QACA,2EAA2E;QAC7E,OAEK,IAAI,OAAOpF,UAAU,YAAYA,UAAU,QAAQ,CAACU,MAAMC,OAAO,CAACX,QAAQ;YAC7E,qDAAqD;YACrD,IAAI,gBAAgBA,SAAU,CAAA,QAAQA,SAAS,WAAWA,KAAI,GAAI;gBAChE,MAAMuF,aAAavF;gBAEnB,2EAA2E;gBAC3E,IAAI,CAACuF,WAAW3E,UAAU,IAAK,CAAC2E,WAAWD,EAAE,IAAI,CAACC,WAAWvF,KAAK,EAAG;oBACnEwD,GAAG,CAACW,IAAI,GAAG;gBACb,OAAO;oBACL,uCAAuC;oBACvC,IAAI,QAAQoB,cAAc,CAAE,CAAA,WAAWA,UAAS,GAAI;wBAClDA,WAAWvF,KAAK,GAAGuF,WAAWD,EAAE;wBAChC,OAAOC,WAAWD,EAAE;oBACtB;gBACF;YACF,OAAO;gBACL,qCAAqC;gBACrCxC,oBAAoB9C,OAAkCrB;YACxD;QACF;IACF;IAEA,uDAAuD;IACvD,MAAM6G,iBAAiB7G,OAAO+E,MAAM,CAAC,CAACnD,QAAUA,MAAME,IAAI,KAAK;IAC/D,KAAK,MAAMF,SAASiF,eAAgB;QAClC,IAAIjF,MAAMC,IAAI,IAAIgD,OAAOA,GAAG,CAACjD,MAAMC,IAAI,CAAC,EAAE;YACxCgD,GAAG,CAACjD,MAAMC,IAAI,CAAC,GAAGhC,qBAAqBgF,GAAG,CAACjD,MAAMC,IAAI,CAAC;QACxD;IACF;IAEA,0CAA0C;IAC1C,MAAMiF,cAAc9G,OAAO+E,MAAM,CAAC,CAACnD,QAAUA,MAAME,IAAI,KAAK;IAC5D,KAAK,MAAMF,SAASkF,YAAa;QAC/B,IAAIlF,MAAMC,IAAI,IAAIgD,OAAO9C,MAAMC,OAAO,CAAC6C,GAAG,CAACjD,MAAMC,IAAI,CAAC,GAAG;YACvD,MAAMkF,SAASlC,GAAG,CAACjD,MAAMC,IAAI,CAAC;YAC9B,KAAK,MAAMmF,SAASD,OAAQ;gBAC1B,IAAI,CAACC,SAAS,OAAOA,UAAU,UAAU;oBACvC;gBACF;gBAEA,iDAAiD;gBACjD,KAAK,MAAM,CAACxB,KAAKnE,MAAM,IAAIhB,OAAOoF,OAAO,CAACuB,OAAQ;oBAChD,IAAIxB,QAAQ,cAAe,OAAOA,QAAQ,YAAYA,IAAIO,QAAQ,CAAC,aAAc;wBAC/EiB,KAAK,CAACxB,IAAI,GAAG3F,qBAAqBwB;oBACpC;gBACF;YACF;QACF;IACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/plugin-import-export",
3
- "version": "3.75.0",
3
+ "version": "3.76.0-canary.1",
4
4
  "description": "Import-Export plugin for Payload",
5
5
  "keywords": [
6
6
  "payload",
@@ -64,17 +64,17 @@
64
64
  "csv-parse": "5.6.0",
65
65
  "csv-stringify": "6.5.2",
66
66
  "qs-esm": "7.0.2",
67
- "@payloadcms/translations": "3.75.0",
68
- "@payloadcms/ui": "3.75.0"
67
+ "@payloadcms/ui": "3.76.0-canary.1",
68
+ "@payloadcms/translations": "3.76.0-canary.1"
69
69
  },
70
70
  "devDependencies": {
71
- "@payloadcms/ui": "3.75.0",
72
- "payload": "3.75.0",
73
- "@payloadcms/eslint-config": "3.28.0"
71
+ "@payloadcms/eslint-config": "3.28.0",
72
+ "@payloadcms/ui": "3.76.0-canary.1",
73
+ "payload": "3.76.0-canary.1"
74
74
  },
75
75
  "peerDependencies": {
76
- "@payloadcms/ui": "3.75.0",
77
- "payload": "3.75.0"
76
+ "@payloadcms/ui": "3.76.0-canary.1",
77
+ "payload": "3.76.0-canary.1"
78
78
  },
79
79
  "homepage:": "https://payloadcms.com",
80
80
  "scripts": {
@@ -1,15 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,49 +0,0 @@
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
@@ -1 +0,0 @@
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"}