@svgrid/enterprise 2.5.3 → 2.6.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 (624) hide show
  1. package/dist/SvAlertRuleEditor.svelte.d.ts +13 -0
  2. package/dist/SvAlertsManager.svelte.d.ts +14 -0
  3. package/dist/SvAlertsPanel.svelte.d.ts +9 -0
  4. package/dist/SvAuthGate.svelte.d.ts +22 -0
  5. package/dist/SvBoard.svelte.d.ts +35 -0
  6. package/dist/SvExportMenu.svelte.d.ts +61 -0
  7. package/{src → dist}/SvExpressionEditor.svelte +4 -1
  8. package/dist/SvExpressionEditor.svelte.d.ts +12 -0
  9. package/dist/SvFileInput.svelte.d.ts +20 -0
  10. package/dist/SvGridAlerts.svelte.d.ts +77 -0
  11. package/dist/SvGridBoard.svelte.d.ts +30 -0
  12. package/{src → dist}/SvGridEditPanel.svelte +173 -28
  13. package/dist/SvGridEditPanel.svelte.d.ts +75 -0
  14. package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
  15. package/dist/SvGridScheduler.svelte.d.ts +30 -0
  16. package/dist/SvImportDialog.svelte.d.ts +88 -0
  17. package/dist/SvLookupInput.svelte.d.ts +21 -0
  18. package/dist/SvPivotDesigner.svelte.d.ts +176 -0
  19. package/dist/SvRecordDetail.svelte.d.ts +58 -0
  20. package/dist/SvSchedule.svelte.d.ts +29 -0
  21. package/dist/SvSchemaChart.svelte.d.ts +61 -0
  22. package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
  23. package/dist/alerts/alert-engine-attach.d.ts +79 -0
  24. package/dist/alerts/alert-engine-attach.js +106 -0
  25. package/dist/alerts/alert-engine.d.ts +42 -0
  26. package/dist/alerts/alert-engine.js +196 -0
  27. package/dist/alerts/alert-formats.d.ts +26 -0
  28. package/dist/alerts/alert-formats.js +58 -0
  29. package/dist/alerts/alert-observer.d.ts +54 -0
  30. package/dist/alerts/alert-observer.js +156 -0
  31. package/dist/alerts/alert-scheduler.d.ts +30 -0
  32. package/dist/alerts/alert-scheduler.js +54 -0
  33. package/dist/alerts/alert-storage.d.ts +31 -0
  34. package/dist/alerts/alert-storage.js +92 -0
  35. package/dist/alerts/alert-store.svelte.d.ts +24 -0
  36. package/dist/alerts/alert-store.svelte.js +69 -0
  37. package/dist/alerts/alert-types.d.ts +86 -0
  38. package/dist/alerts/alert-types.js +1 -0
  39. package/dist/alerts.d.ts +2 -0
  40. package/{src/alerts.ts → dist/alerts.js} +9 -9
  41. package/dist/board.d.ts +7 -0
  42. package/{src/board.ts → dist/board.js} +13 -14
  43. package/dist/cdn/svgrid-enterprise.svelte-external.js +3220 -2607
  44. package/dist/designer/assets/index-BfzoL904.css +1 -0
  45. package/dist/designer/assets/{index-CBYU-KNn.js → index-CKdwDseq.js} +139 -139
  46. package/dist/designer/assets/src-DCKhP5Xy.css +1 -0
  47. package/dist/designer/assets/{src-i309BeJb.js → src-DLsSdh3J.js} +213 -193
  48. package/dist/designer/index.html +4 -4
  49. package/dist/edit-panel.d.ts +105 -0
  50. package/dist/edit-panel.js +350 -0
  51. package/dist/export-conditional.d.ts +31 -0
  52. package/dist/export-conditional.js +65 -0
  53. package/dist/export-ooxml.d.ts +93 -0
  54. package/dist/export-ooxml.js +385 -0
  55. package/dist/export-pdf.d.ts +107 -0
  56. package/dist/export-pdf.js +144 -0
  57. package/dist/export-print.d.ts +55 -0
  58. package/dist/export-print.js +91 -0
  59. package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
  60. package/dist/export-serialize.js +11 -0
  61. package/dist/export-xls.d.ts +26 -0
  62. package/dist/export-xls.js +157 -0
  63. package/dist/export.d.ts +323 -0
  64. package/dist/export.js +1021 -0
  65. package/dist/expressions/evaluate.d.ts +17 -0
  66. package/dist/expressions/evaluate.js +214 -0
  67. package/dist/expressions/expression-columns.d.ts +61 -0
  68. package/dist/expressions/expression-columns.js +72 -0
  69. package/dist/expressions/expression-types.d.ts +125 -0
  70. package/dist/expressions/expression-types.js +1 -0
  71. package/dist/expressions/parse.d.ts +25 -0
  72. package/dist/expressions/parse.js +537 -0
  73. package/dist/import.d.ts +232 -0
  74. package/dist/import.js +846 -0
  75. package/dist/index.d.ts +66 -0
  76. package/dist/index.js +91 -0
  77. package/dist/install.d.ts +70 -0
  78. package/dist/install.js +61 -0
  79. package/dist/license-core.d.ts +37 -0
  80. package/dist/license-core.js +81 -0
  81. package/dist/license.d.ts +30 -0
  82. package/dist/license.js +139 -0
  83. package/dist/master-detail.d.ts +23 -0
  84. package/dist/master-detail.js +35 -0
  85. package/dist/node/studio.js +683 -13
  86. package/dist/pivot-chart.d.ts +28 -0
  87. package/dist/pivot-chart.js +71 -0
  88. package/dist/pivot-designer.d.ts +69 -0
  89. package/dist/pivot-designer.js +38 -0
  90. package/dist/pivot-enable.d.ts +6 -0
  91. package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
  92. package/dist/pivot.d.ts +111 -0
  93. package/dist/pivot.js +353 -0
  94. package/dist/print.d.ts +33 -0
  95. package/dist/print.js +61 -0
  96. package/dist/revoked.d.ts +1 -0
  97. package/{src/revoked.ts → dist/revoked.js} +5 -6
  98. package/dist/scheduler-assignments.d.ts +64 -0
  99. package/dist/scheduler-assignments.js +92 -0
  100. package/dist/scheduler-axis.d.ts +81 -0
  101. package/dist/scheduler-axis.js +180 -0
  102. package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
  103. package/dist/scheduler-booking.js +50 -0
  104. package/dist/scheduler-config.d.ts +177 -0
  105. package/dist/scheduler-config.js +1 -0
  106. package/dist/scheduler-dependencies.d.ts +89 -0
  107. package/dist/scheduler-dependencies.js +179 -0
  108. package/dist/scheduler-freebusy.d.ts +19 -0
  109. package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
  110. package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
  111. package/dist/scheduler-heatmap.js +41 -0
  112. package/dist/scheduler-resource-tree.d.ts +48 -0
  113. package/dist/scheduler-resource-tree.js +78 -0
  114. package/dist/scheduler-slots.d.ts +37 -0
  115. package/dist/scheduler-slots.js +80 -0
  116. package/dist/scheduler-summary.d.ts +41 -0
  117. package/dist/scheduler-summary.js +54 -0
  118. package/dist/scheduler.d.ts +7 -0
  119. package/{src/scheduler.ts → dist/scheduler.js} +13 -14
  120. package/dist/scheduling.d.ts +132 -0
  121. package/dist/scheduling.js +228 -0
  122. package/dist/schema-designer.d.ts +42 -0
  123. package/dist/schema-designer.js +117 -0
  124. package/dist/schema.d.ts +408 -0
  125. package/dist/schema.js +225 -0
  126. package/dist/smart-shim.d.ts +62 -0
  127. package/dist/smart-shim.js +34 -0
  128. package/dist/sources/aggregate.d.ts +43 -0
  129. package/dist/sources/aggregate.js +60 -0
  130. package/dist/sources/auth-supabase.d.ts +69 -0
  131. package/dist/sources/auth-supabase.js +39 -0
  132. package/dist/sources/dashboard.d.ts +65 -0
  133. package/dist/sources/dashboard.js +95 -0
  134. package/dist/sources/field-inference.d.ts +23 -0
  135. package/dist/sources/field-inference.js +52 -0
  136. package/dist/sources/filters.d.ts +35 -0
  137. package/dist/sources/filters.js +52 -0
  138. package/dist/sources/index.d.ts +18 -0
  139. package/dist/sources/index.js +18 -0
  140. package/dist/sources/introspect-supabase.d.ts +30 -0
  141. package/dist/sources/introspect-supabase.js +134 -0
  142. package/dist/sources/realtime-supabase.d.ts +37 -0
  143. package/dist/sources/realtime-supabase.js +52 -0
  144. package/dist/sources/relation-lookup.d.ts +50 -0
  145. package/dist/sources/relation-lookup.js +77 -0
  146. package/dist/sources/rest-adapters.d.ts +48 -0
  147. package/dist/sources/rest-adapters.js +85 -0
  148. package/dist/sources/rest.d.ts +38 -0
  149. package/dist/sources/rest.js +86 -0
  150. package/dist/sources/schema-from-columns.d.ts +37 -0
  151. package/dist/sources/schema-from-columns.js +48 -0
  152. package/dist/sources/supabase.d.ts +33 -0
  153. package/dist/sources/supabase.js +74 -0
  154. package/dist/sources/with-entity-rules.d.ts +25 -0
  155. package/dist/sources/with-entity-rules.js +47 -0
  156. package/dist/sources/with-relation-labels.d.ts +26 -0
  157. package/dist/sources/with-relation-labels.js +38 -0
  158. package/dist/staged-editing.d.ts +85 -0
  159. package/dist/staged-editing.js +0 -0
  160. package/dist/studio/bug-report.d.ts +61 -0
  161. package/dist/studio/bug-report.js +126 -0
  162. package/dist/studio/cli.d.ts +56 -0
  163. package/dist/studio/cli.js +70 -0
  164. package/dist/studio/copilot-core.d.ts +22 -0
  165. package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
  166. package/dist/studio/csv.d.ts +36 -0
  167. package/dist/studio/csv.js +173 -0
  168. package/dist/studio/db-connect-string.d.ts +45 -0
  169. package/dist/studio/db-connect-string.js +113 -0
  170. package/dist/studio/deploy-cli.d.ts +35 -0
  171. package/dist/studio/deploy-cli.js +81 -0
  172. package/dist/studio/emit-project.d.ts +77 -0
  173. package/dist/studio/emit-project.js +5463 -0
  174. package/dist/studio/emit-schema.d.ts +110 -0
  175. package/dist/studio/emit-schema.js +1128 -0
  176. package/dist/studio/index.d.ts +35 -0
  177. package/dist/studio/index.js +41 -0
  178. package/dist/studio/init-flow.d.ts +58 -0
  179. package/dist/studio/init-flow.js +451 -0
  180. package/dist/studio/introspect-db.d.ts +47 -0
  181. package/dist/studio/introspect-db.js +255 -0
  182. package/dist/studio/introspect-openapi.d.ts +19 -0
  183. package/dist/studio/introspect-openapi.js +244 -0
  184. package/dist/studio/introspect-prisma.d.ts +25 -0
  185. package/dist/studio/introspect-prisma.js +164 -0
  186. package/dist/studio/introspect.d.ts +35 -0
  187. package/dist/studio/introspect.js +306 -0
  188. package/dist/studio/project.d.ts +1448 -0
  189. package/dist/studio/project.js +2187 -0
  190. package/dist/studio/sample-data.d.ts +19 -0
  191. package/dist/studio/sample-data.js +207 -0
  192. package/dist/studio/samples/ats.d.ts +2 -0
  193. package/dist/studio/samples/ats.js +194 -0
  194. package/dist/studio/samples/clinic.d.ts +2 -0
  195. package/dist/studio/samples/clinic.js +171 -0
  196. package/dist/studio/samples/crm.d.ts +2 -0
  197. package/dist/studio/samples/crm.js +280 -0
  198. package/dist/studio/samples/datasets.d.ts +38 -0
  199. package/dist/studio/samples/datasets.js +296 -0
  200. package/dist/studio/samples/ecommerce.d.ts +2 -0
  201. package/dist/studio/samples/ecommerce.js +178 -0
  202. package/dist/studio/samples/events.d.ts +2 -0
  203. package/dist/studio/samples/events.js +192 -0
  204. package/dist/studio/samples/fleet.d.ts +2 -0
  205. package/dist/studio/samples/fleet.js +203 -0
  206. package/dist/studio/samples/gym.d.ts +2 -0
  207. package/dist/studio/samples/gym.js +205 -0
  208. package/dist/studio/samples/hr.d.ts +2 -0
  209. package/dist/studio/samples/hr.js +186 -0
  210. package/dist/studio/samples/index.d.ts +13 -0
  211. package/dist/studio/samples/index.js +44 -0
  212. package/dist/studio/samples/insurance.d.ts +2 -0
  213. package/dist/studio/samples/insurance.js +220 -0
  214. package/dist/studio/samples/inventory.d.ts +2 -0
  215. package/dist/studio/samples/inventory.js +204 -0
  216. package/dist/studio/samples/invoicing.d.ts +2 -0
  217. package/dist/studio/samples/invoicing.js +154 -0
  218. package/dist/studio/samples/library.d.ts +2 -0
  219. package/dist/studio/samples/library.js +171 -0
  220. package/dist/studio/samples/live-data.d.ts +5 -0
  221. package/dist/studio/samples/live-data.js +261 -0
  222. package/dist/studio/samples/projects.d.ts +2 -0
  223. package/dist/studio/samples/projects.js +203 -0
  224. package/dist/studio/samples/realestate.d.ts +2 -0
  225. package/dist/studio/samples/realestate.js +187 -0
  226. package/dist/studio/samples/restaurant.d.ts +2 -0
  227. package/dist/studio/samples/restaurant.js +180 -0
  228. package/dist/studio/samples/school.d.ts +2 -0
  229. package/dist/studio/samples/school.js +188 -0
  230. package/dist/studio/samples/shared.d.ts +142 -0
  231. package/dist/studio/samples/shared.js +164 -0
  232. package/dist/studio/samples/starter.d.ts +4 -0
  233. package/dist/studio/samples/starter.js +237 -0
  234. package/dist/studio/samples/subscriptions.d.ts +2 -0
  235. package/dist/studio/samples/subscriptions.js +175 -0
  236. package/dist/studio/samples/support.d.ts +2 -0
  237. package/dist/studio/samples/support.js +209 -0
  238. package/dist/studio/scaffold-app.d.ts +22 -0
  239. package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
  240. package/dist/studio/scaffold.d.ts +63 -0
  241. package/dist/studio/scaffold.js +346 -0
  242. package/dist/studio/screen-suites.d.ts +193 -0
  243. package/dist/studio/screen-suites.js +297 -0
  244. package/dist/studio/themes.d.ts +34 -0
  245. package/dist/studio/themes.js +41 -0
  246. package/dist/studio/ui-components.d.ts +89 -0
  247. package/dist/studio/ui-components.generated.d.ts +29 -0
  248. package/dist/studio/ui-components.generated.js +7319 -0
  249. package/dist/studio/ui-components.js +673 -0
  250. package/dist/studio/user-error.d.ts +23 -0
  251. package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
  252. package/dist/studio/verify.d.ts +34 -0
  253. package/dist/studio/verify.js +47 -0
  254. package/dist/sveltekit/in-memory.d.ts +14 -0
  255. package/dist/sveltekit/in-memory.js +113 -0
  256. package/dist/sveltekit/index.d.ts +6 -0
  257. package/dist/sveltekit/index.js +5 -0
  258. package/dist/sveltekit/query-plan.d.ts +44 -0
  259. package/dist/sveltekit/query-plan.js +76 -0
  260. package/dist/sveltekit/sql-source.d.ts +47 -0
  261. package/dist/sveltekit/sql-source.js +106 -0
  262. package/dist/sveltekit/sql.d.ts +48 -0
  263. package/dist/sveltekit/sql.js +73 -0
  264. package/dist/sveltekit/transport.d.ts +209 -0
  265. package/dist/sveltekit/transport.js +219 -0
  266. package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
  267. package/dist/sveltekit/types.js +1 -0
  268. package/dist/upgrade-prompt.d.ts +16 -0
  269. package/dist/upgrade-prompt.js +141 -0
  270. package/dist/version.d.ts +13 -0
  271. package/{src/version.ts → dist/version.js} +1 -1
  272. package/dist/watermark.d.ts +2 -0
  273. package/dist/watermark.js +146 -0
  274. package/package.json +28 -26
  275. package/dist/designer/assets/index-oYok52zd.css +0 -1
  276. package/dist/designer/assets/src-D-O2F805.css +0 -1
  277. package/src/SvBoard.dom.test.ts +0 -67
  278. package/src/SvGridAlerts.dom.test.ts +0 -113
  279. package/src/SvGridEditPanel.dom.test.ts +0 -320
  280. package/src/SvRecordDetail.dom.test.ts +0 -137
  281. package/src/SvSchedule.dom.test.ts +0 -57
  282. package/src/ai-export-pdf.dom.test.ts +0 -77
  283. package/src/ai-export-xlsx.dom.test.ts +0 -90
  284. package/src/ai-export.dom.test.ts +0 -114
  285. package/src/alerts/alert-engine-attach.ts +0 -165
  286. package/src/alerts/alert-engine.test.ts +0 -135
  287. package/src/alerts/alert-engine.ts +0 -260
  288. package/src/alerts/alert-formats.test.ts +0 -87
  289. package/src/alerts/alert-formats.ts +0 -77
  290. package/src/alerts/alert-observer.test.ts +0 -189
  291. package/src/alerts/alert-observer.ts +0 -208
  292. package/src/alerts/alert-scheduler.ts +0 -96
  293. package/src/alerts/alert-storage.test.ts +0 -54
  294. package/src/alerts/alert-storage.ts +0 -116
  295. package/src/alerts/alert-store.svelte.ts +0 -80
  296. package/src/alerts/alert-types.ts +0 -94
  297. package/src/board.dom.test.ts +0 -941
  298. package/src/edit-panel.test.ts +0 -322
  299. package/src/edit-panel.ts +0 -379
  300. package/src/export-conditional.test.ts +0 -60
  301. package/src/export-conditional.ts +0 -94
  302. package/src/export-ooxml.test.ts +0 -152
  303. package/src/export-ooxml.ts +0 -489
  304. package/src/export-pdf.test.ts +0 -138
  305. package/src/export-pdf.ts +0 -245
  306. package/src/export-print.test.ts +0 -66
  307. package/src/export-print.ts +0 -132
  308. package/src/export-serialize.test.ts +0 -56
  309. package/src/export-xls.ts +0 -199
  310. package/src/export-xlsx-roundtrip.test.ts +0 -120
  311. package/src/export-xlsx.test.ts +0 -150
  312. package/src/export.test.ts +0 -349
  313. package/src/export.ts +0 -1464
  314. package/src/expressions/evaluate.test.ts +0 -111
  315. package/src/expressions/evaluate.ts +0 -237
  316. package/src/expressions/expression-columns.ts +0 -133
  317. package/src/expressions/expression-types.ts +0 -84
  318. package/src/expressions/parse.test.ts +0 -106
  319. package/src/expressions/parse.ts +0 -610
  320. package/src/import-automap.test.ts +0 -131
  321. package/src/import-hardening.test.ts +0 -158
  322. package/src/import.test.ts +0 -415
  323. package/src/import.ts +0 -1044
  324. package/src/index.ts +0 -569
  325. package/src/install.ts +0 -154
  326. package/src/license-core.test.ts +0 -23
  327. package/src/license-core.ts +0 -107
  328. package/src/license-expiry.test.ts +0 -144
  329. package/src/license.ts +0 -157
  330. package/src/master-detail.test.ts +0 -61
  331. package/src/master-detail.ts +0 -42
  332. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  333. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
  334. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
  335. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
  336. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
  337. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
  338. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
  339. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
  340. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
  341. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
  342. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
  343. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
  344. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
  345. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
  346. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
  347. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  348. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  349. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  350. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  351. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  352. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  353. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  354. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  355. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  356. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  357. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  358. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  359. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  360. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  361. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  362. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  363. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  364. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  365. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  366. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  367. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  368. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  369. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  370. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  371. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  372. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  373. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  374. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  375. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  376. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  377. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  378. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  379. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  380. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  381. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  382. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
  383. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
  384. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
  385. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
  386. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
  387. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
  388. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
  389. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
  390. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
  391. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
  392. package/src/pivot-chart.test.ts +0 -86
  393. package/src/pivot-chart.ts +0 -112
  394. package/src/pivot-designer.ts +0 -101
  395. package/src/pivot.test.ts +0 -335
  396. package/src/pivot.ts +0 -578
  397. package/src/print.ts +0 -107
  398. package/src/scheduler-assignments.test.ts +0 -97
  399. package/src/scheduler-assignments.ts +0 -134
  400. package/src/scheduler-axis.test.ts +0 -108
  401. package/src/scheduler-axis.ts +0 -238
  402. package/src/scheduler-booking.test.ts +0 -57
  403. package/src/scheduler-config.ts +0 -179
  404. package/src/scheduler-dependencies.test.ts +0 -155
  405. package/src/scheduler-dependencies.ts +0 -223
  406. package/src/scheduler-freebusy.test.ts +0 -41
  407. package/src/scheduler-heatmap.test.ts +0 -39
  408. package/src/scheduler-resource-tree.test.ts +0 -84
  409. package/src/scheduler-resource-tree.ts +0 -107
  410. package/src/scheduler-slots.test.ts +0 -53
  411. package/src/scheduler-slots.ts +0 -94
  412. package/src/scheduler-summary.test.ts +0 -47
  413. package/src/scheduler-summary.ts +0 -81
  414. package/src/scheduling.test.ts +0 -194
  415. package/src/scheduling.ts +0 -293
  416. package/src/schema-designer.test.ts +0 -121
  417. package/src/schema-designer.ts +0 -142
  418. package/src/schema.test.ts +0 -268
  419. package/src/schema.ts +0 -562
  420. package/src/smart-shim.ts +0 -107
  421. package/src/sources/aggregate.test.ts +0 -79
  422. package/src/sources/aggregate.ts +0 -102
  423. package/src/sources/auth-supabase.test.ts +0 -80
  424. package/src/sources/auth-supabase.ts +0 -87
  425. package/src/sources/dashboard.kpi.test.ts +0 -50
  426. package/src/sources/dashboard.test.ts +0 -61
  427. package/src/sources/dashboard.ts +0 -136
  428. package/src/sources/field-inference.test.ts +0 -60
  429. package/src/sources/field-inference.ts +0 -63
  430. package/src/sources/filters.test.ts +0 -58
  431. package/src/sources/filters.ts +0 -70
  432. package/src/sources/index.ts +0 -67
  433. package/src/sources/introspect-supabase.test.ts +0 -112
  434. package/src/sources/introspect-supabase.ts +0 -139
  435. package/src/sources/realtime-supabase.test.ts +0 -93
  436. package/src/sources/realtime-supabase.ts +0 -99
  437. package/src/sources/relation-lookup.test.ts +0 -99
  438. package/src/sources/relation-lookup.ts +0 -128
  439. package/src/sources/rest-adapters.test.ts +0 -95
  440. package/src/sources/rest-adapters.ts +0 -120
  441. package/src/sources/rest.test.ts +0 -104
  442. package/src/sources/rest.ts +0 -129
  443. package/src/sources/schema-from-columns.test.ts +0 -106
  444. package/src/sources/schema-from-columns.ts +0 -88
  445. package/src/sources/supabase.test.ts +0 -110
  446. package/src/sources/supabase.ts +0 -99
  447. package/src/sources/with-entity-rules.test.ts +0 -104
  448. package/src/sources/with-entity-rules.ts +0 -78
  449. package/src/sources/with-relation-labels.test.ts +0 -75
  450. package/src/sources/with-relation-labels.ts +0 -73
  451. package/src/staged-editing.ts +0 -0
  452. package/src/studio/bug-report.test.ts +0 -101
  453. package/src/studio/bug-report.ts +0 -165
  454. package/src/studio/cli.test.ts +0 -187
  455. package/src/studio/cli.ts +0 -117
  456. package/src/studio/copilot-core.test.ts +0 -45
  457. package/src/studio/csv.test.ts +0 -90
  458. package/src/studio/csv.ts +0 -165
  459. package/src/studio/db-connect-string.test.ts +0 -94
  460. package/src/studio/db-connect-string.ts +0 -128
  461. package/src/studio/deploy-cli.test.ts +0 -56
  462. package/src/studio/deploy-cli.ts +0 -100
  463. package/src/studio/emit-project.test.ts +0 -3324
  464. package/src/studio/emit-project.ts +0 -5377
  465. package/src/studio/emit-schema.test.ts +0 -111
  466. package/src/studio/emit-schema.ts +0 -1181
  467. package/src/studio/index.ts +0 -380
  468. package/src/studio/init-flow.test.ts +0 -514
  469. package/src/studio/init-flow.ts +0 -556
  470. package/src/studio/introspect-db.test.ts +0 -186
  471. package/src/studio/introspect-db.ts +0 -312
  472. package/src/studio/introspect-openapi.test.ts +0 -84
  473. package/src/studio/introspect-openapi.ts +0 -252
  474. package/src/studio/introspect-prisma.test.ts +0 -99
  475. package/src/studio/introspect-prisma.ts +0 -175
  476. package/src/studio/introspect.test.ts +0 -172
  477. package/src/studio/introspect.ts +0 -310
  478. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  479. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  480. package/src/studio/pipeline.test.ts +0 -42
  481. package/src/studio/project-robust.test.ts +0 -157
  482. package/src/studio/project.test.ts +0 -929
  483. package/src/studio/project.ts +0 -2394
  484. package/src/studio/sample-data.test.ts +0 -58
  485. package/src/studio/sample-data.ts +0 -203
  486. package/src/studio/samples/ats.ts +0 -202
  487. package/src/studio/samples/clinic.ts +0 -179
  488. package/src/studio/samples/crm.ts +0 -291
  489. package/src/studio/samples/datasets.test.ts +0 -84
  490. package/src/studio/samples/datasets.ts +0 -340
  491. package/src/studio/samples/ecommerce.ts +0 -187
  492. package/src/studio/samples/events.ts +0 -201
  493. package/src/studio/samples/fleet.ts +0 -213
  494. package/src/studio/samples/gym.ts +0 -215
  495. package/src/studio/samples/hr.ts +0 -195
  496. package/src/studio/samples/index.ts +0 -55
  497. package/src/studio/samples/insurance.ts +0 -229
  498. package/src/studio/samples/inventory.ts +0 -213
  499. package/src/studio/samples/invoicing.ts +0 -162
  500. package/src/studio/samples/library.ts +0 -180
  501. package/src/studio/samples/live-data.test.ts +0 -99
  502. package/src/studio/samples/live-data.ts +0 -306
  503. package/src/studio/samples/projects.ts +0 -212
  504. package/src/studio/samples/realestate.ts +0 -196
  505. package/src/studio/samples/restaurant.ts +0 -189
  506. package/src/studio/samples/samples.test.ts +0 -304
  507. package/src/studio/samples/school.ts +0 -197
  508. package/src/studio/samples/seed-floor.test.ts +0 -25
  509. package/src/studio/samples/shared.ts +0 -237
  510. package/src/studio/samples/starter.ts +0 -251
  511. package/src/studio/samples/subscriptions.ts +0 -183
  512. package/src/studio/samples/support.ts +0 -216
  513. package/src/studio/scaffold-app.test.ts +0 -91
  514. package/src/studio/scaffold.test.ts +0 -192
  515. package/src/studio/scaffold.ts +0 -390
  516. package/src/studio/screen-suites.test.ts +0 -269
  517. package/src/studio/screen-suites.ts +0 -448
  518. package/src/studio/themes.ts +0 -62
  519. package/src/studio/ui-components-surface.test.ts +0 -185
  520. package/src/studio/ui-components.generated.ts +0 -7154
  521. package/src/studio/ui-components.ts +0 -742
  522. package/src/studio/verify.test.ts +0 -47
  523. package/src/studio/verify.ts +0 -79
  524. package/src/sveltekit/in-memory.test.ts +0 -104
  525. package/src/sveltekit/in-memory.ts +0 -129
  526. package/src/sveltekit/index.ts +0 -24
  527. package/src/sveltekit/query-plan.test.ts +0 -109
  528. package/src/sveltekit/query-plan.ts +0 -125
  529. package/src/sveltekit/sql-source.test.ts +0 -198
  530. package/src/sveltekit/sql-source.ts +0 -171
  531. package/src/sveltekit/sql.test.ts +0 -80
  532. package/src/sveltekit/sql.ts +0 -131
  533. package/src/sveltekit/transport-scope.test.ts +0 -125
  534. package/src/sveltekit/transport.test.ts +0 -201
  535. package/src/sveltekit/transport.ts +0 -373
  536. package/src/upgrade-prompt.test.ts +0 -71
  537. package/src/upgrade-prompt.ts +0 -162
  538. package/src/version.test.ts +0 -17
  539. package/src/watermark.test.ts +0 -97
  540. package/src/watermark.ts +0 -156
  541. /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
  542. /package/{src → dist}/SvAlertsManager.svelte +0 -0
  543. /package/{src → dist}/SvAlertsPanel.svelte +0 -0
  544. /package/{src → dist}/SvAuthGate.svelte +0 -0
  545. /package/{src → dist}/SvBoard.svelte +0 -0
  546. /package/{src → dist}/SvExportMenu.svelte +0 -0
  547. /package/{src → dist}/SvFileInput.svelte +0 -0
  548. /package/{src → dist}/SvGridAlerts.svelte +0 -0
  549. /package/{src → dist}/SvGridBoard.svelte +0 -0
  550. /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
  551. /package/{src → dist}/SvGridScheduler.svelte +0 -0
  552. /package/{src → dist}/SvImportDialog.svelte +0 -0
  553. /package/{src → dist}/SvLookupInput.svelte +0 -0
  554. /package/{src → dist}/SvPivotDesigner.svelte +0 -0
  555. /package/{src → dist}/SvRecordDetail.svelte +0 -0
  556. /package/{src → dist}/SvSchedule.svelte +0 -0
  557. /package/{src → dist}/SvSchemaChart.svelte +0 -0
  558. /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
  559. /package/{src → dist}/pdfmake-shims.d.ts +0 -0
  560. /package/{src → dist}/smart.export.d.ts +0 -0
  561. /package/{src → dist}/smart.export.js +0 -0
  562. /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
  563. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
  564. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
  565. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
  566. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
  567. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
  568. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
  569. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
  570. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
  571. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
  572. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
  573. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
  574. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
  575. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
  576. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
  577. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
  578. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
  579. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
  580. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
  581. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
  582. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
  583. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
  584. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
  585. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
  586. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
  587. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
  588. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
  589. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
  590. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
  591. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
  592. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
  593. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
  594. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
  595. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
  596. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
  597. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
  598. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
  599. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
  600. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
  601. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
  602. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
  603. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
  604. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
  605. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
  606. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
  607. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
  608. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
  609. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
  610. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
  611. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
  612. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
  613. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
  614. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
  615. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
  616. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
  617. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
  618. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
  619. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
  620. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
  621. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
  622. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
  623. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
  624. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -0
package/dist/import.js ADDED
@@ -0,0 +1,846 @@
1
+ /**
2
+ * Pro Import feature
3
+ * ------------------
4
+ *
5
+ * Read Excel (.xlsx), CSV, TSV, or JSON in the browser and produce a typed
6
+ * preview of the parsed rows, including per-cell validation errors. The
7
+ * caller decides whether to commit the parsed rows into the grid via
8
+ * `api.addRows(...)`, or to render an editing modal so the user can fix
9
+ * issues first.
10
+ *
11
+ * Two flavours of usage:
12
+ *
13
+ * 1. Read + preview, then commit explicitly:
14
+ *
15
+ * const result = await api.importData({ file, format: 'auto' })
16
+ * // result.headers, result.rows, result.errors
17
+ * if (result.errors.length === 0) api.addRows(result.rows, 'bottom')
18
+ *
19
+ * 2. Read and commit in one go (no preview UX):
20
+ *
21
+ * await api.importData({ file, format: 'auto', commit: true })
22
+ *
23
+ * Both go through the same polite license soft-gate as `exportData` and
24
+ * `print`, so unlicensed evaluation works but emits a one-time nudge.
25
+ */
26
+ import { assertEnterpriseLicensed } from './license';
27
+ // ---------------------------------------------------------------------------
28
+ // Lazy peer dependency: jszip (xlsx only)
29
+ // ---------------------------------------------------------------------------
30
+ let jszipPromise = null;
31
+ async function getJSZip() {
32
+ if (typeof window === 'undefined') {
33
+ throw new Error('@svgrid/enterprise: importData requires a browser environment');
34
+ }
35
+ const g = globalThis;
36
+ if (g.JSZip)
37
+ return g.JSZip;
38
+ if (!jszipPromise) {
39
+ jszipPromise = (async () => {
40
+ let mod;
41
+ try {
42
+ // Optional peer, loaded on demand (keeps consumer type-checks clean when absent).
43
+ // @ts-ignore - "jszip" is an optional peerDependency
44
+ mod = await import('jszip');
45
+ }
46
+ catch {
47
+ throw new Error('@svgrid/enterprise: xlsx import requires the "jszip" peer dependency. ' +
48
+ 'Install it with: pnpm add jszip');
49
+ }
50
+ const J = mod.default ?? mod;
51
+ g.JSZip = J;
52
+ return J;
53
+ })();
54
+ }
55
+ return jszipPromise;
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // Format sniffing
59
+ // ---------------------------------------------------------------------------
60
+ function sniffFormat(file, declared) {
61
+ if (declared !== 'auto')
62
+ return declared;
63
+ // File: trust the extension.
64
+ if (file instanceof File && file.name) {
65
+ const ext = file.name.toLowerCase().split('.').pop() ?? '';
66
+ if (ext === 'xlsx')
67
+ return 'xlsx';
68
+ if (ext === 'csv')
69
+ return 'csv';
70
+ if (ext === 'tsv' || ext === 'tab')
71
+ return 'tsv';
72
+ if (ext === 'json')
73
+ return 'json';
74
+ }
75
+ // String: sniff the first non-whitespace char.
76
+ if (typeof file === 'string') {
77
+ const trimmed = file.trimStart();
78
+ if (trimmed.startsWith('[') || trimmed.startsWith('{'))
79
+ return 'json';
80
+ // Tab-rich heads are tsv; otherwise default to csv.
81
+ const firstLine = trimmed.slice(0, 200).split(/\r?\n/)[0] ?? '';
82
+ if ((firstLine.match(/\t/g)?.length ?? 0) >= 1)
83
+ return 'tsv';
84
+ return 'csv';
85
+ }
86
+ // Blob without a filename / extension: assume xlsx (the most common case
87
+ // the importer is asked to handle).
88
+ return 'xlsx';
89
+ }
90
+ // ---------------------------------------------------------------------------
91
+ // CSV / TSV parser
92
+ // ---------------------------------------------------------------------------
93
+ /**
94
+ * RFC 4180-flavour CSV / TSV parser. Handles:
95
+ * - quoted fields with embedded commas / tabs / newlines
96
+ * - escaped quotes ("") inside quoted fields
97
+ * - both \r\n and \n line endings
98
+ *
99
+ * Doesn't aim to be the world's fastest parser - it walks the string
100
+ * character-by-character. For files in the 10-100k row range this is
101
+ * fine; for million-row imports, do the import server-side.
102
+ */
103
+ function parseDelimited(text, sep) {
104
+ const rows = [];
105
+ let row = [];
106
+ let field = '';
107
+ let i = 0;
108
+ let inQuotes = false;
109
+ // Strip a UTF-8 BOM if present so the first header isn't named "ID".
110
+ if (text.charCodeAt(0) === 0xfeff)
111
+ i = 1;
112
+ while (i < text.length) {
113
+ const c = text[i];
114
+ if (inQuotes) {
115
+ if (c === '"') {
116
+ if (text[i + 1] === '"') {
117
+ field += '"';
118
+ i += 2;
119
+ continue;
120
+ }
121
+ inQuotes = false;
122
+ i += 1;
123
+ continue;
124
+ }
125
+ field += c;
126
+ i += 1;
127
+ continue;
128
+ }
129
+ if (c === '"') {
130
+ inQuotes = true;
131
+ i += 1;
132
+ continue;
133
+ }
134
+ if (c === sep) {
135
+ row.push(field);
136
+ field = '';
137
+ i += 1;
138
+ continue;
139
+ }
140
+ if (c === '\r') {
141
+ if (text[i + 1] === '\n')
142
+ i += 1;
143
+ row.push(field);
144
+ rows.push(row);
145
+ row = [];
146
+ field = '';
147
+ i += 1;
148
+ continue;
149
+ }
150
+ if (c === '\n') {
151
+ row.push(field);
152
+ rows.push(row);
153
+ row = [];
154
+ field = '';
155
+ i += 1;
156
+ continue;
157
+ }
158
+ field += c;
159
+ i += 1;
160
+ }
161
+ // Flush the trailing field / row (no trailing newline).
162
+ if (field.length > 0 || row.length > 0) {
163
+ row.push(field);
164
+ rows.push(row);
165
+ }
166
+ return rows;
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // XLSX parser (minimal)
170
+ // ---------------------------------------------------------------------------
171
+ /**
172
+ * Minimal SpreadsheetML reader. Supports the .xlsx shape Excel and Google
173
+ * Sheets produce by default: one default sheet, optional shared-strings
174
+ * table, inline strings, numbers, and dates expressed as serial numbers.
175
+ *
176
+ * The grid does NOT try to be a fully-featured Excel reader. Formulas
177
+ * are read as their cached value when present. Multi-sheet imports
178
+ * require the caller to pre-extract the desired sheet (or for a future
179
+ * release).
180
+ */
181
+ async function parseXlsx(file) {
182
+ const J = await getJSZip();
183
+ const buf = await file.arrayBuffer();
184
+ const zip = await J.loadAsync(buf);
185
+ // Read sharedStrings.xml if it exists.
186
+ let sharedStrings = [];
187
+ const ssEntry = zip.file('xl/sharedStrings.xml');
188
+ if (ssEntry) {
189
+ const ssText = await ssEntry.async('string');
190
+ sharedStrings = parseSharedStrings(ssText);
191
+ }
192
+ // Read the FIRST sheet. Workbook.xml -> rels mapping is involved; for the
193
+ // 99% case the first sheet lives at xl/worksheets/sheet1.xml.
194
+ const sheetEntry = zip.file('xl/worksheets/sheet1.xml') ??
195
+ zip.file('xl/worksheets/sheet 1.xml');
196
+ if (!sheetEntry) {
197
+ throw new Error('@svgrid/enterprise: could not locate sheet1.xml in the .xlsx archive');
198
+ }
199
+ const sheetText = await sheetEntry.async('string');
200
+ return parseSheetXml(sheetText, sharedStrings);
201
+ }
202
+ /** Pull every `<t>...</t>` out of sharedStrings.xml in document order. */
203
+ function parseSharedStrings(xml) {
204
+ const out = [];
205
+ // A shared-string item may be a plain <si><t>X</t></si> or a rich-text
206
+ // <si><r><t>X</t></r><r><t>Y</t></r></si>. Concatenate every <t> inside
207
+ // each <si>.
208
+ const itemRe = /<si\b[^>]*>([\s\S]*?)<\/si>/g;
209
+ const tRe = /<t\b[^>]*>([\s\S]*?)<\/t>/g;
210
+ let m;
211
+ while ((m = itemRe.exec(xml)) !== null) {
212
+ let combined = '';
213
+ let n;
214
+ tRe.lastIndex = 0;
215
+ while ((n = tRe.exec(m[1] ?? '')) !== null) {
216
+ combined += decodeXmlEntities(n[1] ?? '');
217
+ }
218
+ out.push(combined);
219
+ }
220
+ return out;
221
+ }
222
+ function decodeXmlEntities(s) {
223
+ return s
224
+ .replace(/&amp;/g, '&')
225
+ .replace(/&lt;/g, '<')
226
+ .replace(/&gt;/g, '>')
227
+ .replace(/&quot;/g, '"')
228
+ .replace(/&apos;/g, "'")
229
+ .replace(/&#10;/g, '\n')
230
+ .replace(/&#9;/g, '\t');
231
+ }
232
+ /**
233
+ * Convert a sheet's XML body into a dense `string[][]`. Holes in the
234
+ * cell stream (e.g. row jumps from col B to col E) are filled with
235
+ * empty strings so the result is rectangular.
236
+ */
237
+ function parseSheetXml(xml, sharedStrings) {
238
+ const rows = [];
239
+ const rowRe = /<row\b[^>]*>([\s\S]*?)<\/row>/g;
240
+ const cellRe = /<c\b([^>]*)>([\s\S]*?)<\/c>/g;
241
+ const inlineStrRe = /<is>\s*([\s\S]*?)\s*<\/is>/;
242
+ const tRe = /<t\b[^>]*>([\s\S]*?)<\/t>/g;
243
+ const vRe = /<v>([\s\S]*?)<\/v>/;
244
+ let rowMatch;
245
+ while ((rowMatch = rowRe.exec(xml)) !== null) {
246
+ const rowBody = rowMatch[1] ?? '';
247
+ const cells = [];
248
+ let cellMatch;
249
+ cellRe.lastIndex = 0;
250
+ while ((cellMatch = cellRe.exec(rowBody)) !== null) {
251
+ const attrs = cellMatch[1] ?? '';
252
+ const body = cellMatch[2] ?? '';
253
+ const ref = /r="([A-Z]+)\d+"/.exec(attrs)?.[1] ?? '';
254
+ const colIndex = colRefToIndex(ref);
255
+ const type = /t="([^"]+)"/.exec(attrs)?.[1] ?? 'n';
256
+ // Pad holes with empty strings so column alignment survives.
257
+ while (cells.length < colIndex)
258
+ cells.push('');
259
+ let value = '';
260
+ if (type === 's') {
261
+ const idx = Number(vRe.exec(body)?.[1] ?? '-1');
262
+ value = sharedStrings[idx] ?? '';
263
+ }
264
+ else if (type === 'inlineStr' || type === 'str') {
265
+ const inlineBody = inlineStrRe.exec(body)?.[1] ?? body;
266
+ let parts = '';
267
+ let n;
268
+ tRe.lastIndex = 0;
269
+ while ((n = tRe.exec(inlineBody)) !== null)
270
+ parts += decodeXmlEntities(n[1] ?? '');
271
+ value = parts || decodeXmlEntities(vRe.exec(body)?.[1] ?? '');
272
+ }
273
+ else if (type === 'b') {
274
+ value = vRe.exec(body)?.[1] === '1' ? 'true' : 'false';
275
+ }
276
+ else {
277
+ // Numeric or date - we surface as the raw number string. The
278
+ // caller's column type then handles parsing.
279
+ value = decodeXmlEntities(vRe.exec(body)?.[1] ?? '');
280
+ }
281
+ cells.push(value);
282
+ }
283
+ rows.push(cells);
284
+ }
285
+ return rows;
286
+ }
287
+ /** Excel column reference ("A", "B", ..., "AA", ...) to a zero-based index. */
288
+ function colRefToIndex(ref) {
289
+ if (!ref)
290
+ return 0;
291
+ let n = 0;
292
+ for (let i = 0; i < ref.length; i += 1) {
293
+ n = n * 26 + (ref.charCodeAt(i) - 64);
294
+ }
295
+ return Math.max(0, n - 1);
296
+ }
297
+ // ---------------------------------------------------------------------------
298
+ // Coerce raw string values into typed JS values based on a sample of other
299
+ // values in the same column. We don't ask the consumer for a schema - it
300
+ // would defeat the "drop a file in and go" UX - but we DO want
301
+ // "$1,234.56" to become 1234.56 and "true" to become true.
302
+ // ---------------------------------------------------------------------------
303
+ function inferAndCoerce(value) {
304
+ if (value === '')
305
+ return '';
306
+ const trimmed = value.trim();
307
+ if (trimmed === '')
308
+ return '';
309
+ // Boolean
310
+ if (trimmed === 'true' || trimmed === 'TRUE')
311
+ return true;
312
+ if (trimmed === 'false' || trimmed === 'FALSE')
313
+ return false;
314
+ // Currency / number with grouping. Strip $, commas, whitespace.
315
+ if (/^[-+]?\$?\s?[\d,]+(?:\.\d+)?$/.test(trimmed)) {
316
+ const n = parseFloat(trimmed.replace(/[$,\s]/g, ''));
317
+ if (!Number.isNaN(n))
318
+ return n;
319
+ }
320
+ // Bare integer / float
321
+ if (/^[-+]?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/i.test(trimmed)) {
322
+ const n = parseFloat(trimmed);
323
+ if (!Number.isNaN(n))
324
+ return n;
325
+ }
326
+ // ISO date (yyyy-mm-dd, optionally with time) -> keep as ISO string. We
327
+ // don't return a Date because most grid columns prefer strings on the
328
+ // wire (sort + filter + format paths are already date-aware).
329
+ if (/^\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2})?(?:Z|[+-]\d{2}:?\d{2})?)?$/.test(trimmed)) {
330
+ return trimmed;
331
+ }
332
+ return trimmed;
333
+ }
334
+ // ---------------------------------------------------------------------------
335
+ // Map source rows -> typed records.
336
+ // ---------------------------------------------------------------------------
337
+ /**
338
+ * Field names we refuse to write, because assigning them from untrusted file
339
+ * headers would let a malicious upload walk the prototype chain (prototype
340
+ * pollution). Applies to the default snake_case fallback AND anything a
341
+ * columnMap points at.
342
+ */
343
+ const UNSAFE_FIELDS = new Set(['__proto__', 'prototype', 'constructor']);
344
+ /** Resolve each source header to a target field (or null = drop the column),
345
+ * honouring the columnMap and refusing blank + pollution-prone names. */
346
+ function computeFields(headers, columnMap) {
347
+ return headers.map((h) => {
348
+ let field;
349
+ if (columnMap && Object.prototype.hasOwnProperty.call(columnMap, h)) {
350
+ field = columnMap[h] ?? null;
351
+ }
352
+ else {
353
+ field = h.toLowerCase().replace(/\s+/g, '_').replace(/[^a-z0-9_]/g, '');
354
+ }
355
+ if (field == null || field === '' || UNSAFE_FIELDS.has(field))
356
+ return null;
357
+ return field;
358
+ });
359
+ }
360
+ /** Build one typed record from a row of cells. Pure; no side effects on the
361
+ * shared error list (returns its own). */
362
+ function buildRecord(cells, headerCount, fields, columnTypes, outRowIndex) {
363
+ const rec = {};
364
+ const errors = [];
365
+ for (let i = 0; i < headerCount; i += 1) {
366
+ const field = fields[i];
367
+ if (field == null)
368
+ continue;
369
+ const raw = cells[i] ?? '';
370
+ const declaredType = columnTypes?.[field];
371
+ if (declaredType) {
372
+ const result = coerceTyped(raw, declaredType);
373
+ if (result.ok) {
374
+ rec[field] = result.value;
375
+ }
376
+ else {
377
+ errors.push({ rowIndex: outRowIndex, field, message: result.message });
378
+ // Park the raw string so downstream code still sees SOMETHING.
379
+ rec[field] = raw;
380
+ }
381
+ }
382
+ else {
383
+ rec[field] = inferAndCoerce(raw);
384
+ }
385
+ }
386
+ return { rec, errors };
387
+ }
388
+ /** Push `source` errors into `target`, stopping at `maxErrors`. Returns true
389
+ * when it had to truncate. */
390
+ function collectErrors(target, source, maxErrors) {
391
+ for (const e of source) {
392
+ if (maxErrors != null && target.length >= maxErrors)
393
+ return true;
394
+ target.push(e);
395
+ }
396
+ return false;
397
+ }
398
+ /** Drop duplicate rows by `key`, keeping the last occurrence in place. */
399
+ function dedupeRows(rows, key) {
400
+ const idx = new Map();
401
+ const out = [];
402
+ for (const r of rows) {
403
+ const k = r?.[key];
404
+ if (k == null) {
405
+ out.push(r);
406
+ continue;
407
+ }
408
+ const at = idx.get(k);
409
+ if (at !== undefined)
410
+ out[at] = r;
411
+ else {
412
+ idx.set(k, out.length);
413
+ out.push(r);
414
+ }
415
+ }
416
+ return { rows: out, deduped: rows.length - out.length };
417
+ }
418
+ function isBlankRow(cells) {
419
+ return cells.every((c) => c === undefined || c.trim() === '');
420
+ }
421
+ function abortError() {
422
+ const e = new Error('@svgrid/enterprise: import cancelled');
423
+ e.name = 'AbortError';
424
+ return e;
425
+ }
426
+ /** Yield to the event loop so a long map doesn't block paint / input. */
427
+ function nextTick() {
428
+ return new Promise((resolve) => setTimeout(resolve, 0));
429
+ }
430
+ function buildRecords(matrix, columnMap, columnTypes, maxErrors) {
431
+ if (matrix.length === 0)
432
+ return { headers: [], rows: [], skipped: 0, errors: [], errorsTruncated: false };
433
+ const headers = (matrix[0] ?? []).map((h) => h.trim());
434
+ const fields = computeFields(headers, columnMap);
435
+ const dataRows = matrix.slice(1);
436
+ const out = [];
437
+ const errors = [];
438
+ let skipped = 0;
439
+ let errorsTruncated = false;
440
+ // Skipped (blank) rows don't count toward the output row index used
441
+ // in errors, so the indices match what the consumer's preview UI shows.
442
+ let outRowIndex = 0;
443
+ for (const cells of dataRows) {
444
+ if (isBlankRow(cells)) {
445
+ skipped += 1;
446
+ continue;
447
+ }
448
+ const { rec, errors: rowErrs } = buildRecord(cells, headers.length, fields, columnTypes, outRowIndex);
449
+ if (rowErrs.length && collectErrors(errors, rowErrs, maxErrors))
450
+ errorsTruncated = true;
451
+ out.push(rec);
452
+ outRowIndex += 1;
453
+ }
454
+ return { headers, rows: out, skipped, errors, errorsTruncated };
455
+ }
456
+ /**
457
+ * Strict per-type coercion used when the consumer declares
458
+ * `columnTypes`. Returns either `{ ok: true, value }` or
459
+ * `{ ok: false, message }` describing why the value couldn't be
460
+ * shaped into the declared type.
461
+ *
462
+ * Empty values for required types (number, date) error rather than
463
+ * silently coerce to 0 / null - the consumer can drop the row in
464
+ * their validator if blanks should be tolerated.
465
+ */
466
+ function coerceTyped(raw, type) {
467
+ const trimmed = raw.trim();
468
+ // Empty cells map to `null` for most types and the empty string for
469
+ // `string` - this is the only case where typed import returns a
470
+ // null. Validator step is the right place to insist on "required".
471
+ if (trimmed === '') {
472
+ if (type === 'string')
473
+ return { ok: true, value: '' };
474
+ return { ok: true, value: null };
475
+ }
476
+ switch (type) {
477
+ case 'string':
478
+ return { ok: true, value: trimmed };
479
+ case 'boolean': {
480
+ const low = trimmed.toLowerCase();
481
+ if (low === 'true' || low === '1' || low === 'yes' || low === 'y')
482
+ return { ok: true, value: true };
483
+ if (low === 'false' || low === '0' || low === 'no' || low === 'n')
484
+ return { ok: true, value: false };
485
+ return { ok: false, message: `not a boolean: ${trimmed}` };
486
+ }
487
+ case 'number': {
488
+ const stripped = trimmed.replace(/[$,\s]/g, '');
489
+ const n = Number(stripped);
490
+ if (!Number.isFinite(n))
491
+ return { ok: false, message: `not a number: ${trimmed}` };
492
+ return { ok: true, value: n };
493
+ }
494
+ case 'integer': {
495
+ const stripped = trimmed.replace(/[$,\s]/g, '');
496
+ const n = Number(stripped);
497
+ if (!Number.isFinite(n) || !Number.isInteger(n)) {
498
+ return { ok: false, message: `not an integer: ${trimmed}` };
499
+ }
500
+ return { ok: true, value: n };
501
+ }
502
+ case 'date': {
503
+ // Accept ISO dates and a handful of common day-first / month-first
504
+ // shapes. Returns ISO yyyy-mm-dd.
505
+ const iso = trimmed.match(/^(\d{4})-(\d{2})-(\d{2})/);
506
+ if (iso)
507
+ return { ok: true, value: `${iso[1]}-${iso[2]}-${iso[3]}` };
508
+ // mm/dd/yyyy or dd/mm/yyyy - we don't try to disambiguate; the
509
+ // demo can declare the locale via its own validator if it cares.
510
+ const slash = trimmed.match(/^(\d{1,2})[/-](\d{1,2})[/-](\d{4})/);
511
+ if (slash) {
512
+ const [, a, b, y] = slash;
513
+ // Default to mm/dd/yyyy because it's the dominant locale where
514
+ // Excel exports without an explicit ISO format. Consumers
515
+ // wanting EU-style can pre-normalise the file.
516
+ return { ok: true, value: `${y}-${a.padStart(2, '0')}-${b.padStart(2, '0')}` };
517
+ }
518
+ const parsed = Date.parse(trimmed);
519
+ if (!Number.isNaN(parsed)) {
520
+ return { ok: true, value: new Date(parsed).toISOString().slice(0, 10) };
521
+ }
522
+ return { ok: false, message: `not a date: ${trimmed}` };
523
+ }
524
+ case 'datetime': {
525
+ // Accept anything Date.parse handles.
526
+ const parsed = Date.parse(trimmed);
527
+ if (Number.isNaN(parsed))
528
+ return { ok: false, message: `not a datetime: ${trimmed}` };
529
+ return { ok: true, value: new Date(parsed).toISOString().slice(0, 19) };
530
+ }
531
+ case 'json': {
532
+ try {
533
+ return { ok: true, value: JSON.parse(trimmed) };
534
+ }
535
+ catch {
536
+ return { ok: false, message: `not valid JSON: ${trimmed.slice(0, 30)}...` };
537
+ }
538
+ }
539
+ }
540
+ }
541
+ // ---------------------------------------------------------------------------
542
+ // Parse-once + map, so a UI (SvImportDialog) can read a file ONCE and then
543
+ // re-map / re-validate as the user tweaks the column mapping without paying
544
+ // the parse (or unzip, for xlsx) cost on every keystroke.
545
+ // ---------------------------------------------------------------------------
546
+ /**
547
+ * Read a file (or inline text) into a raw `string[][]` matrix - header row
548
+ * first - without any mapping, coercion, or validation. The cheap half of
549
+ * `importData`: parse the bytes once, then feed the matrix to
550
+ * `mapImportMatrix` as many times as the mapping UI needs.
551
+ */
552
+ export async function readImportMatrix(file, format = 'auto', opts = {}) {
553
+ if (opts.signal?.aborted)
554
+ throw abortError();
555
+ // Guard the byte size BEFORE reading, so an oversized upload never lands
556
+ // in memory.
557
+ if (opts.maxBytes != null && file instanceof Blob && file.size > opts.maxBytes) {
558
+ throw new Error(`@svgrid/enterprise: file is ${file.size.toLocaleString()} bytes, ` +
559
+ `over the ${opts.maxBytes.toLocaleString()}-byte import limit.`);
560
+ }
561
+ const fmt = sniffFormat(file, format);
562
+ let matrix;
563
+ if (fmt === 'xlsx') {
564
+ if (typeof file === 'string') {
565
+ throw new Error('@svgrid/enterprise: xlsx import expects a File or Blob, not a string. ' +
566
+ 'Use format: "csv" or "tsv" for inline text.');
567
+ }
568
+ matrix = await parseXlsx(file);
569
+ }
570
+ else if (fmt === 'json') {
571
+ const text = typeof file === 'string' ? file : await readText(file, opts.encoding);
572
+ matrix = jsonToMatrix(text);
573
+ }
574
+ else {
575
+ const sep = fmt === 'tsv' ? '\t' : ',';
576
+ const text = typeof file === 'string' ? file : await readText(file, opts.encoding);
577
+ matrix = parseDelimited(text, sep);
578
+ }
579
+ if (opts.signal?.aborted)
580
+ throw abortError();
581
+ return { format: fmt, matrix };
582
+ }
583
+ /** Run the validator over built rows, capping + flagging truncation. */
584
+ function applyValidator(rows, errors, validator, maxErrors, startIndex = 0) {
585
+ if (!validator)
586
+ return false;
587
+ let truncated = false;
588
+ for (let i = startIndex; i < rows.length; i += 1) {
589
+ const errs = validator(rows[i], i);
590
+ if (errs.length) {
591
+ const mapped = errs.map((e) => ({ rowIndex: i, field: e.field, message: e.message }));
592
+ if (collectErrors(errors, mapped, maxErrors)) {
593
+ truncated = true;
594
+ break;
595
+ }
596
+ }
597
+ }
598
+ return truncated;
599
+ }
600
+ /**
601
+ * Apply a column map + declared types + validator to an already-parsed
602
+ * matrix. The pure, synchronous half of `importData` - no I/O, no license
603
+ * gate - so a preview UI can call it on every mapping change. For very large
604
+ * files prefer `mapImportMatrixAsync`, which yields to keep the UI live.
605
+ */
606
+ export function mapImportMatrix(matrix, opts = {}) {
607
+ const built = buildRecords(matrix, opts.columnMap, opts.columnTypes, opts.maxErrors);
608
+ const errors = built.errors;
609
+ // Type-coercion errors come first; the validator runs on the rows we
610
+ // managed to build, so its errors share the same `rowIndex` basis.
611
+ let errorsTruncated = built.errorsTruncated;
612
+ if (applyValidator(built.rows, errors, opts.validator, opts.maxErrors))
613
+ errorsTruncated = true;
614
+ let rows = built.rows;
615
+ let deduped = 0;
616
+ if (opts.dedupeBy) {
617
+ const r = dedupeRows(rows, opts.dedupeBy);
618
+ rows = r.rows;
619
+ deduped = r.deduped;
620
+ }
621
+ return {
622
+ headers: built.headers,
623
+ rows,
624
+ errors,
625
+ skipped: built.skipped,
626
+ total: matrix.length > 0 ? matrix.length - 1 : 0,
627
+ errorsTruncated,
628
+ deduped,
629
+ };
630
+ }
631
+ /**
632
+ * Non-blocking sibling of `mapImportMatrix`: yields to the event loop every
633
+ * few thousand rows and reports progress, so mapping a 100k-row file never
634
+ * freezes the tab. Honors an AbortSignal. Used by `importData` and the
635
+ * SvImportDialog preview.
636
+ */
637
+ export async function mapImportMatrixAsync(matrix, opts = {}) {
638
+ const headers = (matrix[0] ?? []).map((h) => h.trim());
639
+ const fields = computeFields(headers, opts.columnMap);
640
+ const dataRows = matrix.slice(1);
641
+ const total = dataRows.length;
642
+ const chunk = Math.max(1, opts.chunkSize ?? 5000);
643
+ const rows = [];
644
+ const errors = [];
645
+ let skipped = 0;
646
+ let outRowIndex = 0;
647
+ let errorsTruncated = false;
648
+ for (let i = 0; i < total; i += 1) {
649
+ if (opts.signal?.aborted)
650
+ throw abortError();
651
+ const cells = dataRows[i];
652
+ if (isBlankRow(cells)) {
653
+ skipped += 1;
654
+ }
655
+ else {
656
+ const { rec, errors: rowErrs } = buildRecord(cells, headers.length, fields, opts.columnTypes, outRowIndex);
657
+ if (rowErrs.length && collectErrors(errors, rowErrs, opts.maxErrors))
658
+ errorsTruncated = true;
659
+ rows.push(rec);
660
+ outRowIndex += 1;
661
+ }
662
+ if ((i + 1) % chunk === 0) {
663
+ opts.onProgress?.({ phase: 'map', ratio: total ? (i + 1) / total : 1, done: i + 1, total });
664
+ await nextTick();
665
+ }
666
+ }
667
+ if (applyValidator(rows, errors, opts.validator, opts.maxErrors))
668
+ errorsTruncated = true;
669
+ let finalRows = rows;
670
+ let deduped = 0;
671
+ if (opts.dedupeBy) {
672
+ const r = dedupeRows(rows, opts.dedupeBy);
673
+ finalRows = r.rows;
674
+ deduped = r.deduped;
675
+ }
676
+ opts.onProgress?.({ phase: 'map', ratio: 1, done: total, total });
677
+ return {
678
+ headers,
679
+ rows: finalRows,
680
+ errors,
681
+ skipped,
682
+ total: matrix.length > 0 ? matrix.length - 1 : 0,
683
+ errorsTruncated,
684
+ deduped,
685
+ };
686
+ }
687
+ /** Fold a header / field down to letters + digits so "Unit Price", "unit_price"
688
+ * and "UnitPrice" all collapse to the same key. */
689
+ function normalizeHeader(s) {
690
+ return s.toLowerCase().replace(/[^a-z0-9]/g, '');
691
+ }
692
+ /**
693
+ * Fuzzy-match each source header to one of the grid's columns (by header
694
+ * label first, then field name) and return a `source header -> target
695
+ * field` map. Headers with no confident match are left OUT of the map, so
696
+ * `buildRecords` falls back to its snake_case default for them.
697
+ */
698
+ export function autoMapColumns(headers, columns) {
699
+ const byKey = new Map();
700
+ for (const c of columns) {
701
+ const field = c.field ?? c.header;
702
+ if (!field)
703
+ continue;
704
+ // Field name is the strongest signal, so register header first then let
705
+ // the field key overwrite on a collision.
706
+ if (c.header)
707
+ byKey.set(normalizeHeader(c.header), field);
708
+ if (c.field)
709
+ byKey.set(normalizeHeader(c.field), c.field);
710
+ }
711
+ const map = {};
712
+ for (const h of headers) {
713
+ const hit = byKey.get(normalizeHeader(h));
714
+ if (hit)
715
+ map[h] = hit;
716
+ }
717
+ return map;
718
+ }
719
+ /**
720
+ * Infer strict import types from each grid column's `format`, so a currency
721
+ * / number / percent column parses "$1,234" -> 1234 and a date column parses
722
+ * "2026-03-04" -> an ISO date. Columns with no informative format are left
723
+ * out (best-effort coercion applies).
724
+ */
725
+ export function inferImportColumnTypes(columns) {
726
+ const types = {};
727
+ for (const c of columns) {
728
+ if (!c.field)
729
+ continue;
730
+ const t = c.format?.type;
731
+ if (t === 'number' || t === 'currency' || t === 'percent')
732
+ types[c.field] = 'number';
733
+ else if (t === 'date')
734
+ types[c.field] = 'date';
735
+ else if (t === 'datetime')
736
+ types[c.field] = 'datetime';
737
+ }
738
+ return types;
739
+ }
740
+ // ---------------------------------------------------------------------------
741
+ // Public entry point
742
+ // ---------------------------------------------------------------------------
743
+ /**
744
+ * Read a file (or inline text), parse, optionally validate + commit. The
745
+ * sister function of `exportGrid`.
746
+ */
747
+ export async function importData(api, opts) {
748
+ assertEnterpriseLicensed('Import');
749
+ const { format, matrix } = await readImportMatrix(opts.file, opts.format ?? 'auto', {
750
+ maxBytes: opts.maxBytes,
751
+ encoding: opts.encoding,
752
+ signal: opts.signal,
753
+ });
754
+ // Enforce the row cap before we do the O(rows) mapping work: either reject
755
+ // outright, or truncate to the first maxRows and flag it.
756
+ const dataCount = matrix.length > 0 ? matrix.length - 1 : 0;
757
+ let workMatrix = matrix;
758
+ let truncated = false;
759
+ if (opts.maxRows != null && dataCount > opts.maxRows) {
760
+ if (opts.overLimit === 'truncate') {
761
+ workMatrix = matrix.slice(0, opts.maxRows + 1); // header + first maxRows
762
+ truncated = true;
763
+ }
764
+ else {
765
+ throw new Error(`@svgrid/enterprise: import has ${dataCount.toLocaleString()} rows, ` +
766
+ `over the maxRows limit of ${opts.maxRows.toLocaleString()}.`);
767
+ }
768
+ }
769
+ // Grid-aware auto-mapping: derive the columnMap + columnTypes from the
770
+ // grid's own columns, but let anything the caller passed win.
771
+ let columnMap = opts.columnMap;
772
+ let columnTypes = opts.columnTypes;
773
+ if (opts.autoMap) {
774
+ const gridCols = api.getColumns();
775
+ const headers = (workMatrix[0] ?? []).map((h) => h.trim());
776
+ columnMap = { ...autoMapColumns(headers, gridCols), ...(opts.columnMap ?? {}) };
777
+ columnTypes = { ...inferImportColumnTypes(gridCols), ...(opts.columnTypes ?? {}) };
778
+ }
779
+ const { headers, rows, errors, skipped, errorsTruncated, deduped } = await mapImportMatrixAsync(workMatrix, {
780
+ columnMap,
781
+ columnTypes,
782
+ validator: opts.validator,
783
+ maxErrors: opts.maxErrors,
784
+ dedupeBy: opts.dedupeBy,
785
+ signal: opts.signal,
786
+ onProgress: opts.onProgress,
787
+ });
788
+ if (opts.commit && errors.length === 0 && rows.length > 0) {
789
+ api.addRows(rows, opts.commitAt ?? 'bottom');
790
+ }
791
+ // `total` reports the ORIGINAL source row count even when truncated, so the
792
+ // caller can say "imported X of Y".
793
+ return { headers, rows, errors, skipped, total: dataCount, format, errorsTruncated, deduped, truncated };
794
+ }
795
+ // ---------------------------------------------------------------------------
796
+ // Helpers
797
+ // ---------------------------------------------------------------------------
798
+ async function readText(blob, encoding) {
799
+ // The default UTF-8 path is fastest; a declared non-UTF-8 encoding (legacy
800
+ // Windows-1252 CSVs, etc.) routes through TextDecoder.
801
+ if (encoding && encoding.toLowerCase() !== 'utf-8' && encoding.toLowerCase() !== 'utf8') {
802
+ const buf = await blob.arrayBuffer();
803
+ return new TextDecoder(encoding).decode(buf);
804
+ }
805
+ return blob.text();
806
+ }
807
+ /** Convert JSON text containing an array of objects into a `string[][]`
808
+ * matrix shaped like CSV: header row, then one row per record. */
809
+ function jsonToMatrix(text) {
810
+ const parsed = JSON.parse(text);
811
+ if (!Array.isArray(parsed)) {
812
+ throw new Error('@svgrid/enterprise: JSON import expects a top-level array');
813
+ }
814
+ if (parsed.length === 0)
815
+ return [];
816
+ // Collect the union of keys across the first ~50 records so we don't
817
+ // miss a column present only on later rows.
818
+ const headers = [];
819
+ const seen = new Set();
820
+ const sample = parsed.slice(0, 50);
821
+ for (const r of sample) {
822
+ if (r && typeof r === 'object') {
823
+ for (const k of Object.keys(r)) {
824
+ if (!seen.has(k)) {
825
+ seen.add(k);
826
+ headers.push(k);
827
+ }
828
+ }
829
+ }
830
+ }
831
+ const rows = [headers.slice()];
832
+ for (const r of parsed) {
833
+ const row = [];
834
+ for (const h of headers) {
835
+ const v = r?.[h];
836
+ if (v == null)
837
+ row.push('');
838
+ else if (typeof v === 'object')
839
+ row.push(JSON.stringify(v));
840
+ else
841
+ row.push(String(v));
842
+ }
843
+ rows.push(row);
844
+ }
845
+ return rows;
846
+ }