nuxt-ui-tools 1.11.2 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/README.md +11 -5
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +46 -0
  4. package/dist/runtime/dashboard/components/dashboard-stat.d.vue.ts +1 -1
  5. package/dist/runtime/dashboard/components/dashboard-stat.vue.d.ts +1 -1
  6. package/dist/runtime/file-preview/components/shell/file-preview-stage.d.vue.ts +2 -2
  7. package/dist/runtime/file-preview/components/shell/file-preview-stage.vue.d.ts +2 -2
  8. package/dist/runtime/form/fields/array-collapse/component.vue +2 -1
  9. package/dist/runtime/form/fields/array-list/component.vue +72 -63
  10. package/dist/runtime/form/fields/array-list/use-array-items.d.ts +1 -0
  11. package/dist/runtime/form/fields/array-list/use-array-items.js +4 -0
  12. package/dist/runtime/form/fields/array-table/component.vue +2 -1
  13. package/dist/runtime/form/types/api.d.ts +10 -2
  14. package/dist/runtime/i18n/locales/en.js +252 -130
  15. package/dist/runtime/i18n/locales/fr.js +252 -130
  16. package/dist/runtime/i18n/types.d.ts +242 -119
  17. package/dist/runtime/shared/types/query.d.ts +14 -4
  18. package/dist/runtime/shared/types/remote-options.d.ts +11 -0
  19. package/dist/runtime/shared/utils/define-remote-options.js +6 -0
  20. package/dist/runtime/shared/utils/file.d.ts +1 -1
  21. package/dist/runtime/spreadsheet/components/{steps/review/spreadsheet-review-overflow-alert.d.vue.ts → internal/spreadsheet-import-cell-editor.d.vue.ts} +8 -5
  22. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-cell-editor.vue +73 -0
  23. package/dist/runtime/spreadsheet/components/{steps/review/spreadsheet-review-overflow-alert.vue.d.ts → internal/spreadsheet-import-cell-editor.vue.d.ts} +8 -5
  24. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-column-row.d.vue.ts +17 -0
  25. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-column-row.vue +98 -0
  26. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-column-row.vue.d.ts +17 -0
  27. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-heading.d.vue.ts +17 -0
  28. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-heading.vue +20 -0
  29. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-heading.vue.d.ts +17 -0
  30. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-status-badge.d.vue.ts +10 -0
  31. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-status-badge.vue +34 -0
  32. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-status-badge.vue.d.ts +10 -0
  33. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-value-row.d.vue.ts +13 -0
  34. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-value-row.vue +113 -0
  35. package/dist/runtime/spreadsheet/components/internal/spreadsheet-import-value-row.vue.d.ts +13 -0
  36. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-column-mapping.d.vue.ts +35 -0
  37. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-column-mapping.vue +154 -0
  38. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-column-mapping.vue.d.ts +35 -0
  39. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-dropzone.d.vue.ts +23 -0
  40. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-dropzone.vue +83 -0
  41. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-dropzone.vue.d.ts +23 -0
  42. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-expected-columns.d.vue.ts +19 -0
  43. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-expected-columns.vue +45 -0
  44. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-expected-columns.vue.d.ts +19 -0
  45. package/dist/runtime/spreadsheet/components/{shared/spreadsheet-object-preview-table.d.vue.ts → parts/spreadsheet-import-export-button.d.vue.ts} +3 -2
  46. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-export-button.vue +34 -0
  47. package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-file-bar.vue.d.ts → parts/spreadsheet-import-export-button.vue.d.ts} +3 -4
  48. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-file-card.d.vue.ts +17 -0
  49. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-file-card.vue +49 -0
  50. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-file-card.vue.d.ts +17 -0
  51. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-progress.d.vue.ts +18 -0
  52. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-progress.vue +101 -0
  53. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-progress.vue.d.ts +18 -0
  54. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-row-inspector.d.vue.ts +22 -0
  55. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-row-inspector.vue +276 -0
  56. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-row-inspector.vue.d.ts +22 -0
  57. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-source-settings.d.vue.ts +11 -0
  58. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-source-settings.vue +164 -0
  59. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-source-settings.vue.d.ts +11 -0
  60. package/dist/runtime/spreadsheet/components/{shared/spreadsheet-value-preview.d.vue.ts → parts/spreadsheet-import-stat.d.vue.ts} +7 -4
  61. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-stat.vue +30 -0
  62. package/dist/runtime/spreadsheet/components/{shared/spreadsheet-value-preview.vue.d.ts → parts/spreadsheet-import-stat.vue.d.ts} +7 -4
  63. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-stats.d.vue.ts +26 -0
  64. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-stats.vue +55 -0
  65. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-stats.vue.d.ts +26 -0
  66. package/dist/runtime/spreadsheet/components/{shared/spreadsheet-object-preview-table.vue.d.ts → parts/spreadsheet-import-submit-button.d.vue.ts} +3 -2
  67. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-submit-button.vue +27 -0
  68. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-submit-button.vue.d.ts +8 -0
  69. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-summary.d.vue.ts +16 -0
  70. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-summary.vue +51 -0
  71. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-summary.vue.d.ts +16 -0
  72. package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-file-bar.d.vue.ts → parts/spreadsheet-import-table-toolbar.d.vue.ts} +2 -4
  73. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-table-toolbar.vue +217 -0
  74. package/dist/runtime/spreadsheet/components/{shared/spreadsheet-raw-preview-table.d.vue.ts → parts/spreadsheet-import-table-toolbar.vue.d.ts} +2 -2
  75. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-table.d.vue.ts +33 -0
  76. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-table.vue +302 -0
  77. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-table.vue.d.ts +33 -0
  78. package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-sidebar.d.vue.ts → parts/spreadsheet-import-template-button.d.vue.ts} +5 -4
  79. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-template-button.vue +31 -0
  80. package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-sidebar.vue.d.ts → parts/spreadsheet-import-template-button.vue.d.ts} +5 -4
  81. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-value-mapping.d.vue.ts +27 -0
  82. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-value-mapping.vue +162 -0
  83. package/dist/runtime/spreadsheet/components/parts/spreadsheet-import-value-mapping.vue.d.ts +27 -0
  84. package/dist/runtime/spreadsheet/components/spreadsheet-import-root.d.vue.ts +24 -0
  85. package/dist/runtime/spreadsheet/components/spreadsheet-import-root.vue +23 -0
  86. package/dist/runtime/spreadsheet/components/spreadsheet-import-root.vue.d.ts +24 -0
  87. package/dist/runtime/spreadsheet/components/spreadsheet-import.d.vue.ts +21 -6
  88. package/dist/runtime/spreadsheet/components/spreadsheet-import.vue +46 -262
  89. package/dist/runtime/spreadsheet/components/spreadsheet-import.vue.d.ts +21 -6
  90. package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-header.d.vue.ts → steps/spreadsheet-import-step-nav.d.vue.ts} +6 -2
  91. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-step-nav.vue +116 -0
  92. package/dist/runtime/spreadsheet/components/{layout/spreadsheet-import-header.vue.d.ts → steps/spreadsheet-import-step-nav.vue.d.ts} +6 -2
  93. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-step.d.vue.ts +26 -0
  94. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-step.vue +106 -0
  95. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-step.vue.d.ts +26 -0
  96. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-stepper.d.vue.ts +15 -0
  97. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-stepper.vue +131 -0
  98. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-stepper.vue.d.ts +15 -0
  99. package/dist/runtime/spreadsheet/composables/index.d.ts +2 -0
  100. package/dist/runtime/spreadsheet/composables/index.js +2 -0
  101. package/dist/runtime/spreadsheet/composables/use-spreadsheet-answers.d.ts +8 -0
  102. package/dist/runtime/spreadsheet/composables/use-spreadsheet-answers.js +19 -0
  103. package/dist/runtime/spreadsheet/composables/use-spreadsheet-columns.d.ts +23 -0
  104. package/dist/runtime/spreadsheet/composables/use-spreadsheet-columns.js +75 -0
  105. package/dist/runtime/spreadsheet/composables/use-spreadsheet-context.d.ts +8 -45
  106. package/dist/runtime/spreadsheet/composables/use-spreadsheet-context.js +28 -32
  107. package/dist/runtime/spreadsheet/composables/use-spreadsheet-edits.d.ts +11 -0
  108. package/dist/runtime/spreadsheet/composables/use-spreadsheet-edits.js +25 -0
  109. package/dist/runtime/spreadsheet/composables/use-spreadsheet-fields.d.ts +16 -0
  110. package/dist/runtime/spreadsheet/composables/use-spreadsheet-fields.js +20 -0
  111. package/dist/runtime/spreadsheet/composables/use-spreadsheet-file.d.ts +14 -0
  112. package/dist/runtime/spreadsheet/composables/use-spreadsheet-file.js +44 -0
  113. package/dist/runtime/spreadsheet/composables/use-spreadsheet-import-context.d.ts +12 -0
  114. package/dist/runtime/spreadsheet/composables/use-spreadsheet-import-context.js +22 -0
  115. package/dist/runtime/spreadsheet/composables/use-spreadsheet-import.d.ts +18 -7
  116. package/dist/runtime/spreadsheet/composables/use-spreadsheet-import.js +340 -109
  117. package/dist/runtime/spreadsheet/composables/use-spreadsheet-layout.d.ts +36 -0
  118. package/dist/runtime/spreadsheet/composables/use-spreadsheet-layout.js +95 -0
  119. package/dist/runtime/spreadsheet/composables/use-spreadsheet-options.d.ts +24 -0
  120. package/dist/runtime/spreadsheet/composables/use-spreadsheet-options.js +159 -0
  121. package/dist/runtime/spreadsheet/composables/use-spreadsheet-queries.d.ts +14 -0
  122. package/dist/runtime/spreadsheet/composables/use-spreadsheet-queries.js +11 -0
  123. package/dist/runtime/spreadsheet/composables/use-spreadsheet-review.d.ts +37 -169
  124. package/dist/runtime/spreadsheet/composables/use-spreadsheet-review.js +148 -408
  125. package/dist/runtime/spreadsheet/composables/use-spreadsheet-rows.d.ts +48 -26
  126. package/dist/runtime/spreadsheet/composables/use-spreadsheet-rows.js +334 -21
  127. package/dist/runtime/spreadsheet/composables/use-spreadsheet-steps.d.ts +33 -0
  128. package/dist/runtime/spreadsheet/composables/use-spreadsheet-steps.js +126 -0
  129. package/dist/runtime/spreadsheet/composables/use-spreadsheet-submit.d.ts +37 -0
  130. package/dist/runtime/spreadsheet/composables/use-spreadsheet-submit.js +136 -0
  131. package/dist/runtime/spreadsheet/composables/use-spreadsheet-values.d.ts +27 -0
  132. package/dist/runtime/spreadsheet/composables/use-spreadsheet-values.js +121 -0
  133. package/dist/runtime/spreadsheet/index.d.ts +0 -1
  134. package/dist/runtime/spreadsheet/index.js +0 -1
  135. package/dist/runtime/spreadsheet/schema/builder.d.ts +8 -0
  136. package/dist/runtime/spreadsheet/schema/builder.js +31 -0
  137. package/dist/runtime/spreadsheet/schema/index.d.ts +24 -32
  138. package/dist/runtime/spreadsheet/schema/index.js +4 -21
  139. package/dist/runtime/spreadsheet/types/columns.d.ts +252 -273
  140. package/dist/runtime/spreadsheet/types/fields.d.ts +64 -0
  141. package/dist/runtime/spreadsheet/types/importer.d.ts +308 -0
  142. package/dist/runtime/spreadsheet/types/index.d.ts +6 -10
  143. package/dist/runtime/spreadsheet/types/options.d.ts +47 -9
  144. package/dist/runtime/spreadsheet/types/rows.d.ts +57 -48
  145. package/dist/runtime/spreadsheet/types/schema.d.ts +162 -76
  146. package/dist/runtime/spreadsheet/types/shared.d.ts +19 -21
  147. package/dist/runtime/spreadsheet/types/source.d.ts +39 -15
  148. package/dist/runtime/spreadsheet/types/steps.d.ts +76 -0
  149. package/dist/runtime/spreadsheet/types/validation.d.ts +49 -69
  150. package/dist/runtime/spreadsheet/types/values.d.ts +77 -0
  151. package/dist/runtime/spreadsheet/utils/download.d.ts +2 -0
  152. package/dist/runtime/spreadsheet/utils/download.js +8 -0
  153. package/dist/runtime/spreadsheet/utils/export.d.ts +26 -0
  154. package/dist/runtime/spreadsheet/utils/export.js +50 -0
  155. package/dist/runtime/spreadsheet/utils/fields.d.ts +26 -0
  156. package/dist/runtime/spreadsheet/utils/fields.js +169 -0
  157. package/dist/runtime/spreadsheet/utils/guards.d.ts +18 -0
  158. package/dist/runtime/spreadsheet/utils/guards.js +27 -0
  159. package/dist/runtime/spreadsheet/utils/headers.d.ts +15 -0
  160. package/dist/runtime/spreadsheet/utils/headers.js +36 -0
  161. package/dist/runtime/spreadsheet/utils/identity.d.ts +24 -0
  162. package/dist/runtime/spreadsheet/utils/identity.js +57 -0
  163. package/dist/runtime/spreadsheet/utils/index.d.ts +15 -6
  164. package/dist/runtime/spreadsheet/utils/index.js +15 -6
  165. package/dist/runtime/spreadsheet/utils/layout.d.ts +12 -0
  166. package/dist/runtime/spreadsheet/utils/layout.js +37 -0
  167. package/dist/runtime/spreadsheet/utils/options.d.ts +31 -10
  168. package/dist/runtime/spreadsheet/utils/options.js +58 -30
  169. package/dist/runtime/spreadsheet/utils/parse.d.ts +6 -0
  170. package/dist/runtime/spreadsheet/utils/parse.js +147 -0
  171. package/dist/runtime/spreadsheet/utils/paths.d.ts +4 -0
  172. package/dist/runtime/spreadsheet/utils/paths.js +29 -0
  173. package/dist/runtime/spreadsheet/utils/rows.d.ts +69 -0
  174. package/dist/runtime/spreadsheet/utils/rows.js +168 -0
  175. package/dist/runtime/spreadsheet/utils/rules.d.ts +4 -0
  176. package/dist/runtime/spreadsheet/utils/rules.js +95 -0
  177. package/dist/runtime/spreadsheet/utils/suggestions.d.ts +20 -0
  178. package/dist/runtime/spreadsheet/utils/suggestions.js +43 -0
  179. package/dist/runtime/spreadsheet/utils/text.d.ts +9 -0
  180. package/dist/runtime/spreadsheet/utils/text.js +11 -0
  181. package/dist/runtime/spreadsheet/utils/workbook.d.ts +13 -0
  182. package/dist/runtime/spreadsheet/utils/workbook.js +121 -0
  183. package/dist/runtime/table/components/filters/tags/boolean-filter-tag.d.vue.ts +2 -2
  184. package/dist/runtime/table/components/filters/tags/boolean-filter-tag.vue.d.ts +2 -2
  185. package/dist/runtime/table/components/filters/tags/date-filter-tag.d.vue.ts +2 -2
  186. package/dist/runtime/table/components/filters/tags/date-filter-tag.vue.d.ts +2 -2
  187. package/dist/runtime/table/components/filters/tags/number-filter-tag.d.vue.ts +2 -2
  188. package/dist/runtime/table/components/filters/tags/number-filter-tag.vue.d.ts +2 -2
  189. package/dist/runtime/table/components/filters/tags/option-filter-tag.d.vue.ts +2 -2
  190. package/dist/runtime/table/components/filters/tags/option-filter-tag.vue.d.ts +2 -2
  191. package/dist/runtime/table/components/filters/tags/text-filter-tag.d.vue.ts +2 -2
  192. package/dist/runtime/table/components/filters/tags/text-filter-tag.vue.d.ts +2 -2
  193. package/dist/runtime/table/components/table/table-cell-ellipsis.d.ts +1 -1
  194. package/dist/runtime/table/composables/use-table-actions.d.ts +1 -1
  195. package/dist/runtime/table/composables/use-table-actions.js +11 -3
  196. package/dist/runtime/table/composables/use-table-internals.d.ts +3 -3
  197. package/dist/runtime/table/types/actions.d.ts +8 -1
  198. package/dist/runtime/table/utils/data-list-ui.d.ts +1 -1
  199. package/package.json +18 -3
  200. package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-file-bar.vue +0 -31
  201. package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-footer.d.vue.ts +0 -24
  202. package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-footer.vue +0 -69
  203. package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-footer.vue.d.ts +0 -24
  204. package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-header.vue +0 -36
  205. package/dist/runtime/spreadsheet/components/layout/spreadsheet-import-sidebar.vue +0 -63
  206. package/dist/runtime/spreadsheet/components/shared/spreadsheet-object-preview-table.vue +0 -67
  207. package/dist/runtime/spreadsheet/components/shared/spreadsheet-raw-preview-table.vue +0 -41
  208. package/dist/runtime/spreadsheet/components/shared/spreadsheet-raw-preview-table.vue.d.ts +0 -7
  209. package/dist/runtime/spreadsheet/components/shared/spreadsheet-summary-stats.d.vue.ts +0 -10
  210. package/dist/runtime/spreadsheet/components/shared/spreadsheet-summary-stats.vue +0 -25
  211. package/dist/runtime/spreadsheet/components/shared/spreadsheet-summary-stats.vue.d.ts +0 -10
  212. package/dist/runtime/spreadsheet/components/shared/spreadsheet-value-preview.vue +0 -201
  213. package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-summary.d.vue.ts +0 -11
  214. package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-summary.vue +0 -38
  215. package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-summary.vue.d.ts +0 -11
  216. package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-table.d.vue.ts +0 -45
  217. package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-table.vue +0 -219
  218. package/dist/runtime/spreadsheet/components/steps/matching/spreadsheet-matching-table.vue.d.ts +0 -45
  219. package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-accordion.d.vue.ts +0 -51
  220. package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-accordion.vue +0 -166
  221. package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-accordion.vue.d.ts +0 -51
  222. package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-summary.d.vue.ts +0 -11
  223. package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-summary.vue +0 -26
  224. package/dist/runtime/spreadsheet/components/steps/references/spreadsheet-references-summary.vue.d.ts +0 -11
  225. package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-inspection.d.vue.ts +0 -41
  226. package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-inspection.vue +0 -392
  227. package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-inspection.vue.d.ts +0 -41
  228. package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-overflow-alert.vue +0 -43
  229. package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-stats.d.vue.ts +0 -15
  230. package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-stats.vue +0 -40
  231. package/dist/runtime/spreadsheet/components/steps/review/spreadsheet-review-stats.vue.d.ts +0 -15
  232. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-matching-step.d.vue.ts +0 -7
  233. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-matching-step.vue +0 -137
  234. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-matching-step.vue.d.ts +0 -7
  235. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-references-step.d.vue.ts +0 -7
  236. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-references-step.vue +0 -222
  237. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-references-step.vue.d.ts +0 -7
  238. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-review-step.d.vue.ts +0 -7
  239. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-review-step.vue +0 -191
  240. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-review-step.vue.d.ts +0 -7
  241. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-structure-step.d.vue.ts +0 -7
  242. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-structure-step.vue +0 -62
  243. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-structure-step.vue.d.ts +0 -7
  244. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-upload-step.d.vue.ts +0 -8
  245. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-upload-step.vue +0 -81
  246. package/dist/runtime/spreadsheet/components/steps/spreadsheet-import-upload-step.vue.d.ts +0 -8
  247. package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-preview-table.d.vue.ts +0 -15
  248. package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-preview-table.vue +0 -95
  249. package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-preview-table.vue.d.ts +0 -15
  250. package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-sheet-list.d.vue.ts +0 -15
  251. package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-sheet-list.vue +0 -56
  252. package/dist/runtime/spreadsheet/components/steps/structure/spreadsheet-structure-sheet-list.vue.d.ts +0 -15
  253. package/dist/runtime/spreadsheet/components/types.d.ts +0 -41
  254. package/dist/runtime/spreadsheet/composables/use-spreadsheet-column-matching.d.ts +0 -18
  255. package/dist/runtime/spreadsheet/composables/use-spreadsheet-column-matching.js +0 -62
  256. package/dist/runtime/spreadsheet/composables/use-spreadsheet-internals.d.ts +0 -629
  257. package/dist/runtime/spreadsheet/composables/use-spreadsheet-internals.js +0 -68
  258. package/dist/runtime/spreadsheet/composables/use-spreadsheet-references.d.ts +0 -1
  259. package/dist/runtime/spreadsheet/composables/use-spreadsheet-references.js +0 -3
  260. package/dist/runtime/spreadsheet/composables/use-spreadsheet-resolutions.d.ts +0 -40
  261. package/dist/runtime/spreadsheet/composables/use-spreadsheet-resolutions.js +0 -97
  262. package/dist/runtime/spreadsheet/composables/use-spreadsheet-row-state.d.ts +0 -24
  263. package/dist/runtime/spreadsheet/composables/use-spreadsheet-row-state.js +0 -74
  264. package/dist/runtime/spreadsheet/composables/use-spreadsheet-source.d.ts +0 -27
  265. package/dist/runtime/spreadsheet/composables/use-spreadsheet-source.js +0 -109
  266. package/dist/runtime/spreadsheet/composables/use-spreadsheet-view.d.ts +0 -15
  267. package/dist/runtime/spreadsheet/composables/use-spreadsheet-view.js +0 -109
  268. package/dist/runtime/spreadsheet/schema/normalize.d.ts +0 -73
  269. package/dist/runtime/spreadsheet/schema/normalize.js +0 -136
  270. package/dist/runtime/spreadsheet/types/context.d.ts +0 -9
  271. package/dist/runtime/spreadsheet/types/import.d.ts +0 -55
  272. package/dist/runtime/spreadsheet/types/inference.d.ts +0 -83
  273. package/dist/runtime/spreadsheet/types/normalized.d.ts +0 -50
  274. package/dist/runtime/spreadsheet/types/normalized.js +0 -0
  275. package/dist/runtime/spreadsheet/types/pipeline.d.ts +0 -7
  276. package/dist/runtime/spreadsheet/types/pipeline.js +0 -0
  277. package/dist/runtime/spreadsheet/types/reference-session.d.ts +0 -43
  278. package/dist/runtime/spreadsheet/types/reference-session.js +0 -0
  279. package/dist/runtime/spreadsheet/types/references.d.ts +0 -32
  280. package/dist/runtime/spreadsheet/types/references.js +0 -0
  281. package/dist/runtime/spreadsheet/types/resolution.d.ts +0 -43
  282. package/dist/runtime/spreadsheet/types/resolution.js +0 -0
  283. package/dist/runtime/spreadsheet/utils/builders/core.d.ts +0 -17
  284. package/dist/runtime/spreadsheet/utils/builders/core.js +0 -262
  285. package/dist/runtime/spreadsheet/utils/builders/index.d.ts +0 -1
  286. package/dist/runtime/spreadsheet/utils/builders/index.js +0 -1
  287. package/dist/runtime/spreadsheet/utils/context.d.ts +0 -20
  288. package/dist/runtime/spreadsheet/utils/context.js +0 -25
  289. package/dist/runtime/spreadsheet/utils/display.d.ts +0 -6
  290. package/dist/runtime/spreadsheet/utils/display.js +0 -26
  291. package/dist/runtime/spreadsheet/utils/object.d.ts +0 -9
  292. package/dist/runtime/spreadsheet/utils/object.js +0 -78
  293. package/dist/runtime/spreadsheet/utils/references/candidates.d.ts +0 -6
  294. package/dist/runtime/spreadsheet/utils/references/candidates.js +0 -28
  295. package/dist/runtime/spreadsheet/utils/references/core.d.ts +0 -3
  296. package/dist/runtime/spreadsheet/utils/references/core.js +0 -3
  297. package/dist/runtime/spreadsheet/utils/references/guards.d.ts +0 -4
  298. package/dist/runtime/spreadsheet/utils/references/guards.js +0 -28
  299. package/dist/runtime/spreadsheet/utils/references/index.d.ts +0 -1
  300. package/dist/runtime/spreadsheet/utils/references/index.js +0 -1
  301. package/dist/runtime/spreadsheet/utils/references/resolutions.d.ts +0 -17
  302. package/dist/runtime/spreadsheet/utils/references/resolutions.js +0 -172
  303. package/dist/runtime/spreadsheet/utils/references/shared.d.ts +0 -3
  304. package/dist/runtime/spreadsheet/utils/references/shared.js +0 -26
  305. package/dist/runtime/spreadsheet/utils/references/sources.d.ts +0 -9
  306. package/dist/runtime/spreadsheet/utils/references/sources.js +0 -38
  307. package/dist/runtime/spreadsheet/utils/rows/core.d.ts +0 -4
  308. package/dist/runtime/spreadsheet/utils/rows/core.js +0 -4
  309. package/dist/runtime/spreadsheet/utils/rows/headers.d.ts +0 -2
  310. package/dist/runtime/spreadsheet/utils/rows/headers.js +0 -9
  311. package/dist/runtime/spreadsheet/utils/rows/index.d.ts +0 -1
  312. package/dist/runtime/spreadsheet/utils/rows/index.js +0 -1
  313. package/dist/runtime/spreadsheet/utils/rows/matching.d.ts +0 -5
  314. package/dist/runtime/spreadsheet/utils/rows/matching.js +0 -209
  315. package/dist/runtime/spreadsheet/utils/rows/parsing.d.ts +0 -7
  316. package/dist/runtime/spreadsheet/utils/rows/parsing.js +0 -209
  317. package/dist/runtime/spreadsheet/utils/rows/shared.d.ts +0 -17
  318. package/dist/runtime/spreadsheet/utils/rows/shared.js +0 -309
  319. package/dist/runtime/spreadsheet/utils/rows/summary.d.ts +0 -2
  320. package/dist/runtime/spreadsheet/utils/rows/summary.js +0 -10
  321. package/dist/runtime/spreadsheet/utils/source/core.d.ts +0 -9
  322. package/dist/runtime/spreadsheet/utils/source/core.js +0 -65
  323. package/dist/runtime/spreadsheet/utils/source/index.d.ts +0 -1
  324. package/dist/runtime/spreadsheet/utils/source/index.js +0 -1
  325. package/dist/runtime/spreadsheet/utils/validation/core.d.ts +0 -16
  326. package/dist/runtime/spreadsheet/utils/validation/core.js +0 -211
  327. package/dist/runtime/spreadsheet/utils/validation/index.d.ts +0 -1
  328. package/dist/runtime/spreadsheet/utils/validation/index.js +0 -1
  329. /package/dist/runtime/spreadsheet/{components/types.js → types/fields.js} +0 -0
  330. /package/dist/runtime/spreadsheet/types/{context.js → importer.js} +0 -0
  331. /package/dist/runtime/spreadsheet/types/{import.js → steps.js} +0 -0
  332. /package/dist/runtime/spreadsheet/types/{inference.js → values.js} +0 -0
@@ -1,10 +1,31 @@
1
- import type { SpreadsheetValue } from '../types/index.js';
2
- export interface SpreadsheetOptionEntry {
3
- label: string;
4
- value: SpreadsheetValue;
5
- }
6
- export declare function isSpreadsheetPrimitiveOption<T>(value: T): value is T & (string | number | boolean);
7
- export declare function isSpreadsheetOptionEntry<T>(value: T): value is T & SpreadsheetOptionEntry;
8
- export declare function resolveSpreadsheetOptionEntries<TParams>(source: SpreadsheetValue, params: TParams): readonly SpreadsheetValue[];
9
- export declare function getSpreadsheetOptionLabel<T>(option: T): string;
10
- export declare function getSpreadsheetOptionValue<T>(option: T): SpreadsheetValue | undefined;
1
+ import type { QueryFnDefinition } from '#ui-tools/shared/types/query';
2
+ import type { RemoteOptionsLoader } from '#ui-tools/shared/types/remote-options';
3
+ import type { SpreadsheetFieldOptions, SpreadsheetOptionItem, SpreadsheetOptionsSource, SpreadsheetResolvedOption } from '../types/index.js';
4
+ export declare function isSpreadsheetQueryDefinition<TData>(value: unknown): value is QueryFnDefinition<TData>;
5
+ export declare function isSpreadsheetRemoteLoader(value: unknown): value is RemoteOptionsLoader<SpreadsheetOptionItem>;
6
+ /**
7
+ * What a source gives once resolved against the context: a list, a query, or a remote loader.
8
+ * Sources reading the row are resolved per row instead (see `SpreadsheetField['select']`).
9
+ */
10
+ export declare function resolveSpreadsheetOptionsSource(source: SpreadsheetOptionsSource<unknown, SpreadsheetOptionItem>, ctx: unknown): {
11
+ kind: 'list';
12
+ items: readonly SpreadsheetOptionItem[];
13
+ } | {
14
+ kind: 'query';
15
+ query: QueryFnDefinition<readonly SpreadsheetOptionItem[]>;
16
+ } | {
17
+ kind: 'remote';
18
+ loader: RemoteOptionsLoader<SpreadsheetOptionItem>;
19
+ };
20
+ export declare function toSpreadsheetOption(item: SpreadsheetOptionItem): SpreadsheetResolvedOption;
21
+ /** Options indexed by every exact key they match: label, value, and aliases, normalized. */
22
+ export declare function indexSpreadsheetOptions(options: readonly SpreadsheetResolvedOption[]): Map<string, SpreadsheetResolvedOption>;
23
+ /** Options of a list, ready to match. */
24
+ export declare function createSpreadsheetFieldOptions(items: readonly SpreadsheetOptionItem[]): SpreadsheetFieldOptions;
25
+ /** Short stable id of a text (FNV-1a), for scope ids. */
26
+ export declare function hashSpreadsheetText(text: string): string;
27
+ /**
28
+ * Key of an answer: the normalized value, prefixed by the scope when the options depend on the
29
+ * row, since the same value may map to different options in each scope.
30
+ */
31
+ export declare function spreadsheetAnswerKey(key: string, scope: string | null | undefined): string;
@@ -1,38 +1,66 @@
1
- import { isBoolean, isFunction, isNumber, isString } from "#ui-tools/shared/utils/predicate";
2
- import { isSpreadsheetRecord } from "./object.js";
3
- function isSpreadsheetOptionResolver(value) {
4
- return isFunction(value);
1
+ import { isFunction } from "#ui-tools/shared/utils/predicate";
2
+ import { resolveTextValue } from "#ui-tools/shared/utils/render";
3
+ import {
4
+ isSpreadsheetOptionEntry,
5
+ isSpreadsheetOptionList,
6
+ isSpreadsheetOptionsResolver
7
+ } from "./guards.js";
8
+ import { isSpreadsheetRecord } from "./paths.js";
9
+ import { normalizeSpreadsheetText } from "./text.js";
10
+ export function isSpreadsheetQueryDefinition(value) {
11
+ return isSpreadsheetRecord(value) && Array.isArray(value.queryKey) && isFunction(value.queryFn);
5
12
  }
6
- export function isSpreadsheetPrimitiveOption(value) {
7
- return isString(value) || isNumber(value) || isBoolean(value);
13
+ export function isSpreadsheetRemoteLoader(value) {
14
+ return isSpreadsheetRecord(value) && isFunction(value.load) && isFunction(value.resolveSelected);
8
15
  }
9
- export function isSpreadsheetOptionEntry(value) {
10
- return isSpreadsheetRecord(value) && "label" in value && isString(value.label) && "value" in value;
11
- }
12
- export function resolveSpreadsheetOptionEntries(source, params) {
13
- if (Array.isArray(source)) {
14
- return source;
15
- }
16
- if (isSpreadsheetOptionResolver(source)) {
17
- return source(params);
16
+ export function resolveSpreadsheetOptionsSource(source, ctx) {
17
+ if (isSpreadsheetOptionList(source)) return { items: source, kind: "list" };
18
+ if (isSpreadsheetRemoteLoader(source)) return { kind: "remote", loader: source };
19
+ if (isSpreadsheetOptionsResolver(source)) {
20
+ const resolved = source({ ctx, row: {} });
21
+ return isSpreadsheetOptionList(resolved) ? { items: resolved, kind: "list" } : { kind: "query", query: resolved };
18
22
  }
19
- return [];
23
+ if (isSpreadsheetQueryDefinition(source))
24
+ return { kind: "query", query: source };
25
+ return { items: [], kind: "list" };
20
26
  }
21
- export function getSpreadsheetOptionLabel(option) {
22
- if (isSpreadsheetPrimitiveOption(option)) {
23
- return String(option);
24
- }
25
- if (isSpreadsheetOptionEntry(option)) {
26
- return option.label;
27
- }
28
- return "";
27
+ export function toSpreadsheetOption(item) {
28
+ if (isSpreadsheetOptionEntry(item))
29
+ return {
30
+ aliases: item.aliases ?? [],
31
+ label: resolveTextValue(item.label, String(item.value)),
32
+ value: item.value
33
+ };
34
+ return { aliases: [], label: String(item), value: item };
29
35
  }
30
- export function getSpreadsheetOptionValue(option) {
31
- if (isSpreadsheetPrimitiveOption(option)) {
32
- return option;
36
+ export function indexSpreadsheetOptions(options) {
37
+ const index = /* @__PURE__ */ new Map();
38
+ for (const option of options) {
39
+ for (const key of [option.label, String(option.value), ...option.aliases]) {
40
+ const normalized = normalizeSpreadsheetText(key);
41
+ if (normalized && !index.has(normalized)) index.set(normalized, option);
42
+ }
33
43
  }
34
- if (isSpreadsheetOptionEntry(option)) {
35
- return option.value;
44
+ return index;
45
+ }
46
+ export function createSpreadsheetFieldOptions(items) {
47
+ const options = items.map(toSpreadsheetOption);
48
+ return {
49
+ error: null,
50
+ index: indexSpreadsheetOptions(options),
51
+ options,
52
+ remote: false,
53
+ status: "ready"
54
+ };
55
+ }
56
+ export function hashSpreadsheetText(text) {
57
+ let hash = 2166136261;
58
+ for (let index = 0; index < text.length; index++) {
59
+ hash ^= text.charCodeAt(index);
60
+ hash = Math.imul(hash, 16777619);
36
61
  }
37
- return void 0;
62
+ return (hash >>> 0).toString(36);
63
+ }
64
+ export function spreadsheetAnswerKey(key, scope) {
65
+ return scope ? `${scope}:${key}` : key;
38
66
  }
@@ -0,0 +1,6 @@
1
+ /** Reads a date: an Excel date, an Excel serial number, or text in one of `formats`. Returns ISO or `null`. */
2
+ export declare function parseSpreadsheetDate(text: string, raw: unknown, formats: readonly string[]): string | null;
3
+ /** Reads a number, with `,` or `.` as decimal separator; spaces and the other separator are ignored. */
4
+ export declare function parseSpreadsheetNumber(text: string, raw: unknown, decimal: '.' | ','): number | null;
5
+ /** Reads a boolean from the texts accepted as true and false. Returns `null` for anything else. */
6
+ export declare function parseSpreadsheetBoolean(text: string, raw: unknown, trueTexts: readonly string[], falseTexts: readonly string[]): boolean | null;
@@ -0,0 +1,147 @@
1
+ import { SSF } from "xlsx";
2
+ import { normalizeSpreadsheetText } from "./text.js";
3
+ const MONTHS = [
4
+ ["january", "jan", "janvier", "janv"],
5
+ ["february", "feb", "fevrier", "fevr", "fev"],
6
+ ["march", "mar", "mars"],
7
+ ["april", "apr", "avril", "avr"],
8
+ ["may", "mai"],
9
+ ["june", "jun", "juin"],
10
+ ["july", "jul", "juillet", "juil"],
11
+ ["august", "aug", "aout"],
12
+ ["september", "sep", "sept", "septembre"],
13
+ ["october", "oct", "octobre"],
14
+ ["november", "nov", "novembre"],
15
+ ["december", "dec", "decembre"]
16
+ ];
17
+ const DEFAULT_DATE_FORMATS = [
18
+ "yyyy-MM-dd",
19
+ "yyyy-MM-dd HH:mm",
20
+ "yyyy-MM-dd HH:mm:ss",
21
+ "dd/MM/yyyy",
22
+ "dd/MM/yyyy HH:mm"
23
+ ];
24
+ const TOKENS = /yyyy|yy|MMMM|MMM|MM|M|dd|d|HH|H|hh|h|mm|ss|a/gu;
25
+ const pad = (value, length = 2) => String(value).padStart(length, "0");
26
+ function toIso(parts) {
27
+ const date = `${pad(parts.year, 4)}-${pad(parts.month)}-${pad(parts.day)}`;
28
+ if (!parts.hasTime) return date;
29
+ const time = `${pad(parts.hours)}:${pad(parts.minutes)}`;
30
+ return parts.seconds ? `${date}T${time}:${pad(parts.seconds)}` : `${date}T${time}`;
31
+ }
32
+ function isValidDate(parts) {
33
+ const date = new Date(parts.year, parts.month - 1, parts.day);
34
+ return date.getFullYear() === parts.year && date.getMonth() === parts.month - 1 && date.getDate() === parts.day && parts.hours < 24 && parts.minutes < 60 && parts.seconds < 60;
35
+ }
36
+ function monthFromName(name) {
37
+ const normalized = normalizeSpreadsheetText(name).replace(/\.$/u, "");
38
+ const index = MONTHS.findIndex((names) => names.includes(normalized));
39
+ return index < 0 ? 0 : index + 1;
40
+ }
41
+ const formatCache = /* @__PURE__ */ new Map();
42
+ function compileFormat(format) {
43
+ const cached = formatCache.get(format);
44
+ if (cached) return cached;
45
+ const tokens = [];
46
+ let source = "";
47
+ let last = 0;
48
+ for (const match of format.matchAll(TOKENS)) {
49
+ source += format.slice(last, match.index).replaceAll(/[.*+?^${}()|[\]\\]/gu, "\\$&").replaceAll(/\s+/gu, "\\s+");
50
+ tokens.push(match[0]);
51
+ source += match[0] === "MMMM" || match[0] === "MMM" ? "([\\p{L}]+\\.?)" : match[0] === "a" ? "([AaPp]\\.?[Mm]\\.?)" : match[0] === "yyyy" ? "(\\d{4})" : "(\\d{1,2})";
52
+ last = (match.index ?? 0) + match[0].length;
53
+ }
54
+ source += format.slice(last).replaceAll(/[.*+?^${}()|[\]\\]/gu, "\\$&").replaceAll(/\s+/gu, "\\s+");
55
+ const compiled = { pattern: new RegExp(`^${source}$`, "u"), tokens };
56
+ formatCache.set(format, compiled);
57
+ return compiled;
58
+ }
59
+ function parseWithFormat(text, format) {
60
+ const { pattern, tokens } = compileFormat(format);
61
+ const match = pattern.exec(text.trim());
62
+ if (!match) return null;
63
+ const parts = {
64
+ day: 1,
65
+ hasTime: false,
66
+ hours: 0,
67
+ minutes: 0,
68
+ month: 1,
69
+ seconds: 0,
70
+ year: 1970
71
+ };
72
+ let pm = null;
73
+ for (const [index, token] of tokens.entries()) {
74
+ const value = match[index + 1] ?? "";
75
+ const number = Number(value);
76
+ if (token === "yyyy") parts.year = number;
77
+ else if (token === "yy") parts.year = 2e3 + number;
78
+ else if (token === "MMMM" || token === "MMM") parts.month = monthFromName(value);
79
+ else if (token === "MM" || token === "M") parts.month = number;
80
+ else if (token === "dd" || token === "d") parts.day = number;
81
+ else if (token === "HH" || token === "H" || token === "hh" || token === "h") {
82
+ parts.hours = number;
83
+ parts.hasTime = true;
84
+ } else if (token === "mm") {
85
+ parts.minutes = number;
86
+ parts.hasTime = true;
87
+ } else if (token === "ss") parts.seconds = number;
88
+ else if (token === "a") pm = value.toLowerCase().startsWith("p");
89
+ }
90
+ if (pm !== null) {
91
+ if (parts.hours > 12 || parts.hours === 0) return null;
92
+ parts.hours = parts.hours % 12 + (pm ? 12 : 0);
93
+ }
94
+ return parts.month && isValidDate(parts) ? parts : null;
95
+ }
96
+ function partsFromDate(date) {
97
+ const hours = date.getHours();
98
+ const minutes = date.getMinutes();
99
+ const seconds = date.getSeconds();
100
+ return {
101
+ day: date.getDate(),
102
+ hasTime: Boolean(hours || minutes || seconds),
103
+ hours,
104
+ minutes,
105
+ month: date.getMonth() + 1,
106
+ seconds,
107
+ year: date.getFullYear()
108
+ };
109
+ }
110
+ export function parseSpreadsheetDate(text, raw, formats) {
111
+ if (raw instanceof Date && !Number.isNaN(raw.getTime())) return toIso(partsFromDate(raw));
112
+ if (typeof raw === "number") {
113
+ const code = SSF.parse_date_code(raw);
114
+ if (code && code.y > 1900) {
115
+ const parts = {
116
+ day: code.d,
117
+ hasTime: Boolean(code.H || code.M || code.S),
118
+ hours: code.H,
119
+ minutes: code.M,
120
+ month: code.m,
121
+ seconds: Math.round(code.S),
122
+ year: code.y
123
+ };
124
+ return toIso(parts);
125
+ }
126
+ }
127
+ for (const format of formats.length ? formats : DEFAULT_DATE_FORMATS) {
128
+ const parts = parseWithFormat(text, format);
129
+ if (parts) return toIso(parts);
130
+ }
131
+ return null;
132
+ }
133
+ export function parseSpreadsheetNumber(text, raw, decimal) {
134
+ if (typeof raw === "number" && Number.isFinite(raw)) return raw;
135
+ const compact = text.replaceAll(/[\s  ']/gu, "");
136
+ const normalized = decimal === "," ? compact.replaceAll(".", "").replace(",", ".") : compact.replaceAll(",", "");
137
+ if (!/^[+-]?(\d+\.?\d*|\.\d+)$/u.test(normalized)) return null;
138
+ const value = Number(normalized);
139
+ return Number.isFinite(value) ? value : null;
140
+ }
141
+ export function parseSpreadsheetBoolean(text, raw, trueTexts, falseTexts) {
142
+ if (typeof raw === "boolean") return raw;
143
+ const normalized = normalizeSpreadsheetText(text);
144
+ if (trueTexts.some((value) => normalizeSpreadsheetText(value) === normalized)) return true;
145
+ if (falseTexts.some((value) => normalizeSpreadsheetText(value) === normalized)) return false;
146
+ return null;
147
+ }
@@ -0,0 +1,4 @@
1
+ import type { SpreadsheetRecord, SpreadsheetValue } from '../types/index.js';
2
+ export declare function isSpreadsheetRecord<T>(value: T): value is T & SpreadsheetRecord;
3
+ export declare function getSpreadsheetPathValue(data: SpreadsheetRecord, path: string): SpreadsheetValue;
4
+ export declare function setSpreadsheetPathValue(target: SpreadsheetRecord, path: string, value: SpreadsheetValue): void;
@@ -0,0 +1,29 @@
1
+ import { isPlainObject } from "#ui-tools/shared/utils/predicate";
2
+ export function isSpreadsheetRecord(value) {
3
+ return isPlainObject(value);
4
+ }
5
+ export function getSpreadsheetPathValue(data, path) {
6
+ let current = data;
7
+ for (const part of path.split(".")) {
8
+ if (!isSpreadsheetRecord(current)) return void 0;
9
+ current = current[part];
10
+ }
11
+ return current;
12
+ }
13
+ export function setSpreadsheetPathValue(target, path, value) {
14
+ const parts = path.split(".");
15
+ let current = target;
16
+ for (const [index, part] of parts.entries()) {
17
+ if (index === parts.length - 1) {
18
+ current[part] = value;
19
+ return;
20
+ }
21
+ const next = current[part];
22
+ if (isSpreadsheetRecord(next)) current = next;
23
+ else {
24
+ const created = {};
25
+ current[part] = created;
26
+ current = created;
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,69 @@
1
+ import type { UiToolsTranslator } from '#ui-tools/i18n';
2
+ import type { SpreadsheetField, SpreadsheetFieldOptions, SpreadsheetRecord, SpreadsheetResolvedOption, SpreadsheetRowIssue, SpreadsheetValueAnswers } from '../types/index.js';
3
+ /** Options a select field checks a row against, and their scope when they depend on the row. */
4
+ export interface SpreadsheetRowOptions {
5
+ options: SpreadsheetFieldOptions | undefined;
6
+ /** Id of the set of options, when they depend on the row; `null` otherwise. */
7
+ scope: string | null;
8
+ }
9
+ /** What parsing needs besides the row: fields, their columns, options, answers, and the context. */
10
+ export interface SpreadsheetParseContext {
11
+ /** In declared order: a field reads the fields above it. */
12
+ fields: readonly SpreadsheetField[];
13
+ /** Column index of each field reading its own column. */
14
+ columns: ReadonlyMap<string, number>;
15
+ headers: readonly string[];
16
+ /** Options of a select field for a row, the fields above it parsed. */
17
+ optionsOf: (field: SpreadsheetField, row: SpreadsheetRecord) => SpreadsheetRowOptions;
18
+ answers: SpreadsheetValueAnswers;
19
+ ctx: unknown;
20
+ t: UiToolsTranslator;
21
+ }
22
+ /** A select item that matched no option, recorded to build the questions. */
23
+ export interface SpreadsheetUnmatchedToken {
24
+ field: string;
25
+ /** Normalized value. */
26
+ key: string;
27
+ value: string;
28
+ header: string;
29
+ scope: string | null;
30
+ }
31
+ export interface SpreadsheetMatchedToken {
32
+ field: string;
33
+ key: string;
34
+ value: string;
35
+ option: SpreadsheetResolvedOption;
36
+ scope: string | null;
37
+ }
38
+ export interface SpreadsheetCellResult {
39
+ text: string;
40
+ original: string;
41
+ display: string;
42
+ defaulted: boolean;
43
+ created: boolean;
44
+ /** Options of a select cell, for this row. */
45
+ choices: readonly SpreadsheetResolvedOption[];
46
+ }
47
+ export interface SpreadsheetParsedRow {
48
+ data: SpreadsheetRecord;
49
+ issues: SpreadsheetRowIssue[];
50
+ cells: Map<string, SpreadsheetCellResult>;
51
+ unmatched: SpreadsheetUnmatchedToken[];
52
+ matched: SpreadsheetMatchedToken[];
53
+ /** A value answered “skip these rows”, by the user or the policy. */
54
+ skipped: boolean;
55
+ }
56
+ /**
57
+ * Parses one data row, field by field in declared order: each field reads its cell (or the cell
58
+ * of its `from` column), applies its default, parser, options, and value answers, then its rules.
59
+ * Defaults, parsers, options, and rules receive the fields above as `row`. Nothing is guessed: a
60
+ * select value matches an option exactly, or it is answered, or it follows the column's `unknown`
61
+ * policy.
62
+ */
63
+ export declare function parseSpreadsheetRow(params: {
64
+ index: number;
65
+ cells: readonly string[];
66
+ raws: readonly unknown[] | undefined;
67
+ edits: Readonly<Record<string, string>> | undefined;
68
+ context: SpreadsheetParseContext;
69
+ }): SpreadsheetParsedRow;
@@ -0,0 +1,168 @@
1
+ import { spreadsheetAnswerKey } from "./options.js";
2
+ import { parseSpreadsheetBoolean, parseSpreadsheetDate, parseSpreadsheetNumber } from "./parse.js";
3
+ import { setSpreadsheetPathValue } from "./paths.js";
4
+ import { normalizeSpreadsheetText, splitSpreadsheetItems, toSpreadsheetText } from "./text.js";
5
+ function displayValue(field, value, options) {
6
+ const items = Array.isArray(value) ? value : [value];
7
+ return items.filter((item) => item !== null && item !== void 0).map((item) => {
8
+ if (field.kind !== "select") return toSpreadsheetText(item);
9
+ return options?.options.find((option) => option.value === item)?.label ?? toSpreadsheetText(item);
10
+ }).join(", ");
11
+ }
12
+ function parseScalar(params) {
13
+ const { field, text, raw } = params;
14
+ if (field.parse) {
15
+ try {
16
+ return {
17
+ value: field.parse({
18
+ cell: { header: params.header, raw: raw ?? text, rowIndex: params.rowIndex, text },
19
+ ctx: params.ctx,
20
+ row: params.row
21
+ })
22
+ };
23
+ } catch (error) {
24
+ return { error: error instanceof Error ? error.message : String(error) };
25
+ }
26
+ }
27
+ if (field.kind === "number") {
28
+ const value = parseSpreadsheetNumber(text, raw, field.decimal);
29
+ return value === null ? { error: "number" } : { value };
30
+ }
31
+ if (field.kind === "date") {
32
+ const value = parseSpreadsheetDate(text, raw, field.formats);
33
+ return value === null ? { error: "date" } : { value };
34
+ }
35
+ if (field.kind === "boolean") {
36
+ const value = parseSpreadsheetBoolean(text, raw, field.trueTexts, field.falseTexts);
37
+ return value === null ? { error: "boolean" } : { value };
38
+ }
39
+ return { value: text };
40
+ }
41
+ function errorMessage(error) {
42
+ return error instanceof Error ? error.message : String(error);
43
+ }
44
+ export function parseSpreadsheetRow(params) {
45
+ const { context, edits } = params;
46
+ const { t } = context;
47
+ const data = {};
48
+ const issues = [];
49
+ const cells = /* @__PURE__ */ new Map();
50
+ const unmatched = [];
51
+ const matched = [];
52
+ let skipped = false;
53
+ for (const field of context.fields) {
54
+ const from = field.select?.from ?? null;
55
+ const column = from ? context.columns.get(from) : context.columns.get(field.path);
56
+ const header = column === void 0 ? "" : context.headers[column] ?? "";
57
+ const original = from ? cells.get(from)?.text ?? "" : column === void 0 ? "" : toSpreadsheetText(params.cells[column]);
58
+ const edited = edits?.[field.path];
59
+ const text = edited ?? original;
60
+ const raw = edited === void 0 && !from && column !== void 0 ? params.raws?.[column] : void 0;
61
+ const issue = (code, message, level = "error") => issues.push({ code, field: field.path, level, message });
62
+ let resolved = { options: void 0, scope: null };
63
+ if (field.select) {
64
+ try {
65
+ resolved = context.optionsOf(field, data);
66
+ } catch (error) {
67
+ issue("options", errorMessage(error));
68
+ }
69
+ }
70
+ const { options, scope } = resolved;
71
+ const choices = options?.options ?? [];
72
+ if (!text) {
73
+ let value2 = field.separator ? [] : null;
74
+ if (field.defaultOf) {
75
+ try {
76
+ value2 = field.defaultOf(data) ?? value2;
77
+ } catch (error) {
78
+ issue("default", errorMessage(error));
79
+ }
80
+ }
81
+ setSpreadsheetPathValue(data, field.path, value2);
82
+ cells.set(field.path, {
83
+ choices,
84
+ created: false,
85
+ defaulted: field.hasDefault,
86
+ display: field.hasDefault ? displayValue(field, value2, options) : "",
87
+ original,
88
+ text
89
+ });
90
+ if (field.required && !field.hasDefault) issue("required", t("spreadsheet.issues.required"));
91
+ continue;
92
+ }
93
+ const items = field.separator ? splitSpreadsheetItems(text, field.separator) : [text];
94
+ const values = [];
95
+ let created = false;
96
+ if (field.kind === "select" && field.select) {
97
+ for (const item of items) {
98
+ const key = normalizeSpreadsheetText(item);
99
+ const option = options?.index.get(key);
100
+ if (option) {
101
+ values.push(option.value);
102
+ matched.push({ field: field.path, key, option, scope, value: item });
103
+ continue;
104
+ }
105
+ if (!options || options.status !== "ready") continue;
106
+ unmatched.push({ field: field.path, header, key, scope, value: item });
107
+ const answer = context.answers[field.path]?.[spreadsheetAnswerKey(key, scope)] ?? (field.select.unknown === "ask" || field.select.unknown === "error" ? void 0 : { action: field.select.unknown });
108
+ if (answer?.action === "map") values.push(answer.value);
109
+ else if (answer?.action === "create") {
110
+ values.push(item);
111
+ created = true;
112
+ } else if (answer?.action === "skip-rows") {
113
+ skipped = true;
114
+ issue("value.skipped", t("spreadsheet.issues.skipped", { value: item }), "info");
115
+ } else if (answer?.action === "leave-empty") continue;
116
+ else if (field.select.unknown === "error")
117
+ issue("value.not-found", t("spreadsheet.issues.notFound", { value: item }));
118
+ else issue("value.unknown", t("spreadsheet.issues.unknownValue", { value: item }));
119
+ }
120
+ } else {
121
+ for (const item of items) {
122
+ const result = parseScalar({
123
+ ctx: context.ctx,
124
+ field,
125
+ header,
126
+ raw: items.length > 1 ? void 0 : raw,
127
+ row: data,
128
+ rowIndex: params.index,
129
+ text: item
130
+ });
131
+ if ("value" in result) values.push(result.value);
132
+ else if (result.error === "number" || result.error === "date" || result.error === "boolean")
133
+ issue(result.error, t(`spreadsheet.issues.${result.error}`, { value: item }));
134
+ else issue("parse", result.error);
135
+ }
136
+ }
137
+ const value = field.separator ? values : values[0] ?? null;
138
+ setSpreadsheetPathValue(data, field.path, value);
139
+ cells.set(field.path, {
140
+ choices,
141
+ created,
142
+ defaulted: false,
143
+ display: displayValue(field, value, options) || text,
144
+ original,
145
+ text
146
+ });
147
+ if (field.required && (value === null || Array.isArray(value) && !value.length) && !issues.some((entry) => entry.field === field.path))
148
+ issue("required", t("spreadsheet.issues.required"));
149
+ let rules = [];
150
+ try {
151
+ rules = field.rulesOf(data);
152
+ } catch (error) {
153
+ issue("rules", errorMessage(error));
154
+ }
155
+ for (const rule of rules) {
156
+ const targets = field.separator ? values : [value];
157
+ for (const target of targets) {
158
+ if (target === null && !rule.required) continue;
159
+ const message = rule.check(target, { ctx: context.ctx });
160
+ if (message) {
161
+ issue(rule.name, message, rule.level);
162
+ break;
163
+ }
164
+ }
165
+ }
166
+ }
167
+ return { cells, data, issues, matched, skipped, unmatched };
168
+ }
@@ -0,0 +1,4 @@
1
+ import type { UiToolsTranslator } from '#ui-tools/i18n';
2
+ import type { SpreadsheetRuleBuilder } from '../types/index.js';
3
+ /** The `v` of `rules: (v) => [...]`, with messages from the locale. */
4
+ export declare function createSpreadsheetRuleBuilder(t: UiToolsTranslator): SpreadsheetRuleBuilder<unknown>;
@@ -0,0 +1,95 @@
1
+ import { isSpreadsheetMessageFunction } from "./guards.js";
2
+ const EMAIL = /^[^@\s]+@[^@\s]+\.[^@\s]{2,}$/u;
3
+ function resolveMessage(message, value, ctx) {
4
+ if (isSpreadsheetMessageFunction(message)) return String(message({ ctx, value }));
5
+ return typeof message === "string" || typeof message === "number" ? String(message) : String(message());
6
+ }
7
+ function createRule(params) {
8
+ return {
9
+ check(value, context) {
10
+ return params.test(value, context.ctx) ? null : resolveMessage(params.message, value, context.ctx);
11
+ },
12
+ level: params.level ?? "error",
13
+ name: params.name,
14
+ required: params.required ?? false
15
+ };
16
+ }
17
+ function withOptions(options, fallback) {
18
+ return { level: options?.level, message: options?.message ?? fallback };
19
+ }
20
+ function isEmpty(value) {
21
+ return value === null || value === void 0 || value === "" || Array.isArray(value) && value.length === 0;
22
+ }
23
+ const pad = (part) => String(part).padStart(2, "0");
24
+ function todayIso() {
25
+ const now = /* @__PURE__ */ new Date();
26
+ return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;
27
+ }
28
+ export function createSpreadsheetRuleBuilder(t) {
29
+ return {
30
+ between: (min, max, options) => createRule({
31
+ name: "between",
32
+ ...withOptions(
33
+ options,
34
+ ({ value }) => t("spreadsheet.issues.between", { max, min, value: String(value) })
35
+ ),
36
+ test: (value) => value >= min && value <= max
37
+ }),
38
+ email: (options) => createRule({
39
+ name: "email",
40
+ ...withOptions(options, () => t("spreadsheet.issues.email")),
41
+ test: (value) => EMAIL.test(value)
42
+ }),
43
+ max: (max, options) => createRule({
44
+ name: "max",
45
+ ...withOptions(
46
+ options,
47
+ ({ value }) => t("spreadsheet.issues.max", { max, value: String(value) })
48
+ ),
49
+ test: (value) => value <= max
50
+ }),
51
+ maxLength: (max, options) => createRule({
52
+ name: "maxLength",
53
+ ...withOptions(options, () => t("spreadsheet.issues.maxLength", { max })),
54
+ test: (value) => value.length <= max
55
+ }),
56
+ min: (min, options) => createRule({
57
+ name: "min",
58
+ ...withOptions(
59
+ options,
60
+ ({ value }) => t("spreadsheet.issues.min", { min, value: String(value) })
61
+ ),
62
+ test: (value) => value >= min
63
+ }),
64
+ minLength: (min, options) => createRule({
65
+ name: "minLength",
66
+ ...withOptions(options, () => t("spreadsheet.issues.minLength", { min })),
67
+ test: (value) => value.length >= min
68
+ }),
69
+ notFuture: (options) => createRule({
70
+ name: "notFuture",
71
+ ...withOptions(options, () => t("spreadsheet.issues.notFuture")),
72
+ test: (value) => value.slice(0, 10) <= todayIso()
73
+ }),
74
+ pattern: (pattern, options) => createRule({
75
+ name: "pattern",
76
+ ...withOptions(options, () => t("spreadsheet.issues.pattern")),
77
+ test: (value) => {
78
+ pattern.lastIndex = 0;
79
+ return pattern.test(value);
80
+ }
81
+ }),
82
+ required: (options) => createRule({
83
+ name: "required",
84
+ required: true,
85
+ ...withOptions(options, () => t("spreadsheet.issues.required")),
86
+ test: (value) => !isEmpty(value)
87
+ }),
88
+ validate: (options) => createRule({
89
+ level: options.level,
90
+ message: options.message,
91
+ name: options.name ?? "validate",
92
+ test: (value, ctx) => options.validator(value, { ctx })
93
+ })
94
+ };
95
+ }