@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
@@ -1,187 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
- import type { EntitySchema } from '../schema'
3
- import { resolveSchema, resolveSchemas, runStudioAdd, runStudioAddApp, type StudioIO } from './cli'
4
- import { MANAGED_END, MANAGED_START } from './scaffold'
5
-
6
- /** In-memory StudioIO for tests. */
7
- function memIO(seed: Record<string, string> = {}) {
8
- const files = new Map<string, string>(Object.entries(seed))
9
- const io: StudioIO = {
10
- readFile: async (p) => (files.has(p) ? files.get(p)! : null),
11
- writeFile: async (p, c) => {
12
- files.set(p, c)
13
- },
14
- }
15
- return { io, files }
16
- }
17
-
18
- const drizzle = `
19
- import { pgTable, serial, text, integer, boolean } from 'drizzle-orm/pg-core'
20
- export const users = pgTable('users', {
21
- id: serial('id').primaryKey(),
22
- name: text('name').notNull(),
23
- active: boolean('active'),
24
- })
25
- export const orders = pgTable('orders', {
26
- id: serial('id').primaryKey(),
27
- total: integer('total'),
28
- })
29
- `
30
-
31
- describe('runStudioAdd', () => {
32
- it('introspects a Drizzle file, writes the 3 files, and verifies', async () => {
33
- const { io, files } = memIO({ 'src/lib/db/schema.ts': drizzle })
34
- const res = await runStudioAdd({ from: 'src/lib/db/schema.ts' }, io)
35
-
36
- expect(res.schema.name).toBe('users') // first table
37
- expect(res.written).toEqual([
38
- 'src/lib/users.schema.ts',
39
- 'src/routes/api/users/+server.ts',
40
- 'src/routes/users/+page.svelte',
41
- ])
42
- expect(res.verify.ok).toBe(true) // generated page compiles
43
- expect(files.get('src/routes/users/+page.svelte')).toContain('<SvGrid')
44
- })
45
-
46
- it('selects a specific table with `table`', async () => {
47
- const { io } = memIO({ 'schema.ts': drizzle })
48
- const res = await runStudioAdd({ from: 'schema.ts', table: 'orders' }, io)
49
- expect(res.schema.name).toBe('orders')
50
- expect(res.schema.fields.map((f) => f.field)).toEqual(['id', 'total'])
51
- })
52
-
53
- it('scaffolds a real SQL data source when dataSource:"sql"', async () => {
54
- const { io, files } = memIO({ 'schema.ts': drizzle })
55
- await runStudioAdd({ from: 'schema.ts', dataSource: 'sql' }, io)
56
- const server = files.get('src/routes/api/users/+server.ts')!
57
- expect(server).toContain('createSqlDataSource')
58
- expect(server).toContain("table: \"users\"")
59
- expect(server).toContain('execute:')
60
- })
61
-
62
- it('regenerating preserves user edits outside the managed region', async () => {
63
- const { io, files } = memIO({ 'schema.ts': drizzle })
64
- await runStudioAdd({ from: 'schema.ts' }, io)
65
-
66
- // User hand-edits the page outside the managed block.
67
- const page = files.get('src/routes/users/+page.svelte')!
68
- const edited = page.replace('<div class="page">', '<div class="page my-custom-class">')
69
- files.set('src/routes/users/+page.svelte', edited)
70
-
71
- // Regenerate.
72
- await runStudioAdd({ from: 'schema.ts' }, io)
73
- const after = files.get('src/routes/users/+page.svelte')!
74
- expect(after).toContain('my-custom-class') // user edit survived
75
- expect(after).toContain(MANAGED_START)
76
- expect(after).toContain(MANAGED_END)
77
- })
78
-
79
- it('throws a helpful error when no input is given', async () => {
80
- const { io } = memIO()
81
- await expect(runStudioAdd({}, io)).rejects.toThrow(/provide `from`/)
82
- })
83
-
84
- it('accepts a ready EntitySchema directly', async () => {
85
- const schema: EntitySchema = {
86
- name: 'tags',
87
- idField: 'id',
88
- fields: [{ field: 'id', type: 'text', primaryKey: true }, { field: 'label', type: 'text' }],
89
- }
90
- const { io } = memIO()
91
- const res = await runStudioAdd({ schema }, io)
92
- expect(res.written).toHaveLength(3)
93
- expect(res.verify.ok).toBe(true)
94
- })
95
- })
96
-
97
- describe('runStudioAddApp', () => {
98
- const companies: EntitySchema = {
99
- name: 'companies', idField: 'id',
100
- fields: [{ field: 'id', type: 'number', primaryKey: true }, { field: 'name', type: 'text' }],
101
- }
102
- const contacts: EntitySchema = {
103
- name: 'contacts', idField: 'id',
104
- fields: [
105
- { field: 'id', type: 'number', primaryKey: true },
106
- { field: 'name', type: 'text' },
107
- { field: 'company_id', type: 'relation', relation: { entity: 'companies', foreignKey: 'company_id', labelField: 'name' } },
108
- ],
109
- }
110
-
111
- it('writes every entity screen plus the app shell, and verifies', async () => {
112
- const { io, files } = memIO()
113
- const res = await runStudioAddApp([companies, contacts], {}, io)
114
- expect(res.written).toContain('src/routes/+layout.svelte')
115
- expect(res.written).toContain('src/routes/+page.svelte')
116
- expect(res.written).toContain('src/routes/companies/+page.svelte')
117
- expect(res.written).toContain('src/routes/contacts/+page.svelte')
118
- expect(files.get('src/routes/+layout.svelte')).toContain('"href":"/contacts"')
119
- expect(res.verify.ok).toBe(true)
120
- })
121
- })
122
-
123
- // A linked Drizzle file (posts.authorId -> users) and the equivalent Prisma.
124
- const linkedDrizzle = `
125
- import { pgTable, serial, text, integer } from 'drizzle-orm/pg-core'
126
- export const users = pgTable('users', {
127
- id: serial('id').primaryKey(),
128
- name: text('name').notNull(),
129
- })
130
- export const posts = pgTable('posts', {
131
- id: serial('id').primaryKey(),
132
- title: text('title').notNull(),
133
- authorId: integer('author_id').references(() => users.id),
134
- })
135
- `
136
-
137
- const linkedPrisma = `
138
- model User {
139
- id Int @id @default(autoincrement())
140
- name String
141
- posts Post[]
142
- }
143
- model Post {
144
- id Int @id @default(autoincrement())
145
- title String
146
- author User @relation(fields: [authorId], references: [id])
147
- authorId Int
148
- }
149
- `
150
-
151
- describe('resolveSchema (single, from a file)', () => {
152
- it('detects Prisma by content and turns @relation into a relation field', async () => {
153
- const { io } = memIO({ 'schema.prisma': linkedPrisma })
154
- const schema = await resolveSchema({ from: 'schema.prisma', table: 'Post' }, io)
155
- const rel = schema.fields.find((f) => f.field === 'authorId')!
156
- expect(rel.type).toBe('relation')
157
- expect(rel.relation?.entity).toBe('User')
158
- })
159
-
160
- it('parses a Drizzle .references() column as a relation', async () => {
161
- const { io } = memIO({ 'schema.ts': linkedDrizzle })
162
- const schema = await resolveSchema({ from: 'schema.ts', table: 'posts' }, io)
163
- expect(schema.fields.find((f) => f.field === 'authorId')?.type).toBe('relation')
164
- })
165
- })
166
-
167
- describe('resolveSchemas + runStudioAddApp (--all --from a file)', () => {
168
- it('scaffolds a linked app from a Drizzle schema and verifies', async () => {
169
- const { io, files } = memIO({ 'schema.ts': linkedDrizzle })
170
- const schemas = await resolveSchemas('schema.ts', io)
171
- expect(schemas.map((s) => s.name)).toEqual(['users', 'posts'])
172
-
173
- const res = await runStudioAddApp(schemas, {}, io)
174
- expect(res.written).toContain('src/routes/users/+page.svelte')
175
- expect(res.written).toContain('src/routes/posts/+page.svelte')
176
- expect(files.get('src/routes/+layout.svelte')).toContain('"href":"/posts"')
177
- expect(res.verify.ok).toBe(true)
178
- })
179
-
180
- it('scaffolds a linked app from a Prisma schema and verifies', async () => {
181
- const { io } = memIO({ 'schema.prisma': linkedPrisma })
182
- const schemas = await resolveSchemas('schema.prisma', io)
183
- expect(schemas.map((s) => s.name)).toEqual(['User', 'Post'])
184
- const res = await runStudioAddApp(schemas, {}, io)
185
- expect(res.verify.ok).toBe(true)
186
- })
187
- })
package/src/studio/cli.ts DELETED
@@ -1,117 +0,0 @@
1
- /**
2
- * runStudioAdd - the one-command pipeline behind `@svgrid/studio add`: read a
3
- * schema, introspect it, scaffold the files, merge-write them (preserving user
4
- * edits outside managed regions), and verify the output compiles. This is the
5
- * whole "CRUD screen in seconds" flow.
6
- *
7
- * Filesystem access is injected (`StudioIO`), so the orchestration is pure and
8
- * unit-testable; the actual CLI bin supplies node:fs. No process/fs imports
9
- * here, so it also runs in the browser (e.g. the designer's future
10
- * write-to-project action).
11
- */
12
- import type { EntitySchema } from '../schema.js'
13
- import { introspectDrizzle, introspectDrizzleAll, introspectJson } from './introspect.js'
14
- import { introspectPrisma, introspectPrismaAll } from './introspect-prisma.js'
15
- import { mergeManaged, scaffold, skipUserOwned, type ScaffoldOptions } from './scaffold.js'
16
- import { scaffoldApp, type ScaffoldAppOptions } from './scaffold-app.js'
17
- import { verifyScaffold, type VerifyResult } from './verify.js'
18
-
19
- /** A `.prisma` file (by extension or a `model X {` block) parses as Prisma; otherwise Drizzle. */
20
- function isPrismaSource(path: string, source: string): boolean {
21
- return /\.prisma$/i.test(path) || /\bmodel\s+\w+\s*\{/.test(source)
22
- }
23
-
24
- export type StudioIO = {
25
- /** Read a file; resolve to null when it doesn't exist. */
26
- readFile: (path: string) => Promise<string | null>
27
- /** Write a file, creating parent directories as needed. */
28
- writeFile: (path: string, contents: string) => Promise<void>
29
- }
30
-
31
- export type AddOptions = ScaffoldOptions & {
32
- /** Path to a Drizzle schema file to introspect. */
33
- from?: string
34
- /** Which table in the Drizzle file to use (defaults to the first). */
35
- table?: string
36
- /** Sample JSON rows to infer from, as an alternative to `from`. */
37
- rows?: Array<Record<string, unknown>>
38
- /** Entity name (required with `rows`, ignored with `from`). */
39
- name?: string
40
- /** A ready EntitySchema, bypassing introspection. */
41
- schema?: EntitySchema
42
- }
43
-
44
- export type AddResult = {
45
- schema: EntitySchema
46
- /** Paths written, in order. */
47
- written: string[]
48
- verify: VerifyResult
49
- }
50
-
51
- /** Resolve an EntitySchema from whichever input was provided. */
52
- export async function resolveSchema(options: AddOptions, io: StudioIO): Promise<EntitySchema> {
53
- if (options.schema) return options.schema
54
- if (options.from) {
55
- const src = await io.readFile(options.from)
56
- if (src == null) throw new Error(`runStudioAdd: schema file not found: ${options.from}`)
57
- return isPrismaSource(options.from, src)
58
- ? introspectPrisma(src, options.table)
59
- : introspectDrizzle(src, options.table)
60
- }
61
- if (options.rows) {
62
- return introspectJson(options.name ?? options.route ?? 'entity', options.rows)
63
- }
64
- throw new Error('runStudioAdd: provide `from` (a Drizzle or Prisma schema file), `rows`, or `schema`')
65
- }
66
-
67
- /**
68
- * Resolve **every** entity from a Drizzle or Prisma schema file (the `--all
69
- * --from` path), linked so foreign keys become working relation lookups.
70
- */
71
- export async function resolveSchemas(from: string, io: StudioIO): Promise<EntitySchema[]> {
72
- const src = await io.readFile(from)
73
- if (src == null) throw new Error(`runStudioAddApp: schema file not found: ${from}`)
74
- return isPrismaSource(from, src) ? introspectPrismaAll(src) : introspectDrizzleAll(src)
75
- }
76
-
77
- /** Merge-write a set of generated files, preserving user edits outside managed regions. */
78
- async function writeAll(files: { path: string; contents: string; userOwned?: boolean }[], io: StudioIO): Promise<string[]> {
79
- const written: string[] = []
80
- for (const file of files) {
81
- const existing = await io.readFile(file.path)
82
- // User-owned companions (a screen's `handlers.ts`) carry no managed markers -
83
- // they're scaffolded once and then the developer's code forever. Skip if it
84
- // already exists so a regenerate never clobbers hand-written logic. See
85
- // HANDLERS-DESIGN.md (the round-trip contract).
86
- if (skipUserOwned(file, existing != null)) continue
87
- // Regenerating? Replace only the managed region, keep the user's edits.
88
- await io.writeFile(file.path, mergeManaged(existing, file.contents))
89
- written.push(file.path)
90
- }
91
- return written
92
- }
93
-
94
- export async function runStudioAdd(options: AddOptions, io: StudioIO): Promise<AddResult> {
95
- const schema = await resolveSchema(options, io)
96
- const { files } = scaffold(schema, options)
97
- const written = await writeAll(files, io)
98
- const verify = await verifyScaffold(files)
99
- return { schema, written, verify }
100
- }
101
-
102
- export type AddAppResult = { written: string[]; verify: VerifyResult }
103
-
104
- /**
105
- * Scaffold a whole multi-entity app - every entity's screen plus a nav layout
106
- * and home page - and merge-write it. The `--all` path behind `svgrid-studio`.
107
- */
108
- export async function runStudioAddApp(
109
- schemas: EntitySchema[],
110
- options: ScaffoldAppOptions,
111
- io: StudioIO,
112
- ): Promise<AddAppResult> {
113
- const { files } = scaffoldApp(schemas, options)
114
- const written = await writeAll(files, io)
115
- const verify = await verifyScaffold(files)
116
- return { written, verify }
117
- }
@@ -1,45 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
- import { buildCopilotMessages, projectFromModelText } from './copilot-core'
3
- import { createProject, serializeProject } from './project'
4
- import type { EntitySchema } from '../schema'
5
-
6
- const customers: EntitySchema = {
7
- name: 'customers',
8
- label: 'Customers',
9
- idField: 'id',
10
- fields: [
11
- { field: 'id', label: 'Id', type: 'text', primaryKey: true },
12
- { field: 'name', label: 'Name', type: 'text' },
13
- ],
14
- }
15
-
16
- describe('copilot core', () => {
17
- it('builds a request carrying the model rules, the current project, and the instruction', () => {
18
- const p = createProject([customers])
19
- const { system, messages } = buildCopilotMessages('Add a status enum field to customers', p)
20
- expect(system).toMatch(/COMPLETE updated project as JSON/)
21
- expect(system).toMatch(/PRESERVE everything/)
22
- expect(system).toContain('board') // block kinds listed from the palette
23
- expect(system).toContain('radio-group') // component keys listed from the registry
24
- expect(messages).toHaveLength(1)
25
- expect(messages[0]!.content).toContain('"customers"') // current project inlined
26
- expect(messages[0]!.content).toContain('Add a status enum field to customers')
27
- })
28
-
29
- it('parses a clean JSON reply into a validated project', () => {
30
- const p = createProject([customers])
31
- const out = projectFromModelText(serializeProject(p))
32
- expect(out.entities[0]!.name).toBe('customers')
33
- })
34
-
35
- it('tolerates fenced and prose-wrapped replies', () => {
36
- const json = serializeProject(createProject([customers]))
37
- expect(projectFromModelText('```json\n' + json + '\n```').entities).toHaveLength(1)
38
- expect(projectFromModelText('Here is the updated project:\n' + json + '\nDone!').entities).toHaveLength(1)
39
- })
40
-
41
- it('rejects non-JSON and invalid projects with useful errors', () => {
42
- expect(() => projectFromModelText('Sorry, I cannot do that.')).toThrow(/no JSON object/)
43
- expect(() => projectFromModelText('{"entities": [], "screens": []}')).toThrow(/invalid project|entity/i)
44
- })
45
- })
@@ -1,90 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { parseCsv, detectDelimiter, csvToEntity } from './csv.js'
3
-
4
- describe('parseCsv', () => {
5
- it('parses a simple grid', () => {
6
- expect(parseCsv('a,b,c\n1,2,3\n4,5,6')).toEqual([
7
- ['a', 'b', 'c'],
8
- ['1', '2', '3'],
9
- ['4', '5', '6'],
10
- ])
11
- })
12
-
13
- it('handles quoted fields, commas, escaped quotes, and embedded newlines', () => {
14
- const text = 'name,note\n"Doe, John","said ""hi"""\n"Ada","line1\nline2"'
15
- expect(parseCsv(text)).toEqual([
16
- ['name', 'note'],
17
- ['Doe, John', 'said "hi"'],
18
- ['Ada', 'line1\nline2'],
19
- ])
20
- })
21
-
22
- it('auto-detects the delimiter (semicolon / tab / pipe), ignoring quoted separators', () => {
23
- expect(detectDelimiter('a;b;c\n1;2;3')).toBe(';')
24
- expect(detectDelimiter('a\tb\tc\n1\t2\t3')).toBe('\t')
25
- expect(detectDelimiter('a|b|c')).toBe('|')
26
- expect(detectDelimiter('a,b,c')).toBe(',')
27
- // A comma inside a quoted header field must not sway a semicolon file.
28
- expect(detectDelimiter('"a,x";b;c\n1;2;3')).toBe(';')
29
- })
30
-
31
- it('parses a semicolon-delimited (European/Excel) file', () => {
32
- expect(parseCsv('name;amount\n"Doe; John";1.200')).toEqual([
33
- ['name', 'amount'],
34
- ['Doe; John', '1.200'],
35
- ])
36
- })
37
-
38
- it('handles CRLF and a trailing newline, and strips a BOM', () => {
39
- expect(parseCsv('a,b\r\n1,2\r\n')).toEqual([
40
- ['a', 'b'],
41
- ['1', '2'],
42
- ])
43
- })
44
- })
45
-
46
- describe('csvToEntity', () => {
47
- it('infers types per column and coerces values', () => {
48
- const csv = 'id,name,mrr,active,joined\n1,Ada,1200,true,2024-01-02\n2,Alan,240.5,no,2024-03-04'
49
- const { schema, rows } = csvToEntity('customers', csv)
50
- const t = Object.fromEntries(schema.fields.map((f) => [f.field, f.type]))
51
- expect(t).toEqual({ id: 'number', name: 'text', mrr: 'number', active: 'boolean', joined: 'dateString' })
52
- expect(rows[0]).toEqual({ id: 1, name: 'Ada', mrr: 1200, active: true, joined: '2024-01-02' })
53
- expect(rows[1]!.mrr).toBe(240.5)
54
- expect(rows[1]!.active).toBe(false)
55
- })
56
-
57
- it('marks an existing id column as the primary key', () => {
58
- const { schema } = csvToEntity('t', 'id,name\n1,a')
59
- const id = schema.fields.find((f) => f.field === 'id')!
60
- expect(id.primaryKey).toBe(true)
61
- expect(id.readonly).toBe(true)
62
- })
63
-
64
- it('synthesizes a string id when none is present', () => {
65
- const { schema, rows } = csvToEntity('t', 'name,city\nAda,London\nAlan,Leeds')
66
- const id = schema.fields.find((f) => f.field === 'id')!
67
- expect(id.primaryKey).toBe(true)
68
- expect(rows.map((r) => r.id)).toEqual(['1', '2'])
69
- expect(rows[0]).toMatchObject({ id: '1', name: 'Ada', city: 'London' })
70
- })
71
-
72
- it('renames unsafe headers to safe keys and reports them', () => {
73
- const { schema, renamed, rows } = csvToEntity('t', 'First Name,E-mail Address\nAda,ada@x.io')
74
- const keys = schema.fields.map((f) => f.field)
75
- expect(keys).toContain('first_name')
76
- expect(keys).toContain('e_mail_address')
77
- expect(renamed.map((r) => r.field)).toEqual(expect.arrayContaining(['first_name', 'e_mail_address']))
78
- expect(rows[0]).toMatchObject({ first_name: 'Ada', e_mail_address: 'ada@x.io' })
79
- })
80
-
81
- it('treats empty cells as null and parses thousands separators', () => {
82
- const { rows } = csvToEntity('t', 'id,amount\n1,"1,200"\n2,')
83
- expect(rows[0]!.amount).toBe(1200)
84
- expect(rows[1]!.amount).toBeNull()
85
- })
86
-
87
- it('returns an empty entity for empty input', () => {
88
- expect(csvToEntity('t', '').rows).toEqual([])
89
- })
90
- })
package/src/studio/csv.ts DELETED
@@ -1,165 +0,0 @@
1
- /**
2
- * CSV / spreadsheet import - turn a pasted or uploaded CSV into a runnable
3
- * entity: infer an `EntitySchema` from the header + values, and return the
4
- * parsed rows (coerced to real JS types) so they can seed a data source.
5
- *
6
- * Pure and dependency-free: a hand-rolled RFC-4180-ish reader (quoted fields,
7
- * escaped `""`, embedded newlines, CRLF), then per-column type inference. The
8
- * Studio generator and the visual designer both call `csvToEntity` to add a
9
- * table from a file the user drops in - no backend, no parsing library.
10
- */
11
- import type { EntityField, EntityFieldType, EntitySchema } from '../schema.js'
12
- import { refineFields } from '../sources/field-inference.js'
13
-
14
- /**
15
- * Sniff the field delimiter from the first (unquoted) line: whichever of
16
- * `,` `;` `\t` `|` occurs most. Handles Excel/European exports (`;`) and TSV.
17
- */
18
- export function detectDelimiter(text: string): ',' | ';' | '\t' | '|' {
19
- const s = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text
20
- const firstLine = s.slice(0, (s.indexOf('\n') + 1 || s.length + 1) - 1)
21
- const candidates: Array<',' | ';' | '\t' | '|'> = [',', ';', '\t', '|']
22
- let best: ',' | ';' | '\t' | '|' = ','
23
- let bestCount = -1
24
- for (const d of candidates) {
25
- // Count only outside quotes so a comma inside "a,b" doesn't sway the guess.
26
- let count = 0, inQ = false
27
- for (const ch of firstLine) {
28
- if (ch === '"') inQ = !inQ
29
- else if (ch === d && !inQ) count++
30
- }
31
- if (count > bestCount) { bestCount = count; best = d }
32
- }
33
- return best
34
- }
35
-
36
- /** Parse CSV/TSV text into a matrix of string cells. Handles quotes, `""`, embedded
37
- * newlines, CRLF, and auto-detects the delimiter (comma / semicolon / tab / pipe). */
38
- export function parseCsv(text: string, delimiter?: string): string[][] {
39
- const delim = delimiter ?? detectDelimiter(text)
40
- const rows: string[][] = []
41
- let row: string[] = []
42
- let field = ''
43
- let inQuotes = false
44
- // Strip a UTF-8 BOM if present so the first header isn't polluted.
45
- const s = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text
46
- for (let i = 0; i < s.length; i++) {
47
- const c = s[i]
48
- if (inQuotes) {
49
- if (c === '"') {
50
- if (s[i + 1] === '"') { field += '"'; i++ } // escaped quote
51
- else inQuotes = false
52
- } else field += c
53
- } else if (c === '"') {
54
- inQuotes = true
55
- } else if (c === delim) {
56
- row.push(field); field = ''
57
- } else if (c === '\n') {
58
- row.push(field); field = ''; rows.push(row); row = []
59
- } else if (c === '\r') {
60
- // swallow; the paired \n (or EOF) ends the row
61
- } else {
62
- field += c
63
- }
64
- }
65
- // Flush the trailing field/row (files without a final newline).
66
- if (field !== '' || row.length > 0) { row.push(field); rows.push(row) }
67
- // Drop fully-empty trailing rows (a blank final line).
68
- return rows.filter((r) => !(r.length === 1 && r[0] === ''))
69
- }
70
-
71
- const TRUE_SET = new Set(['true', 'yes', 'y', '1'])
72
- const FALSE_SET = new Set(['false', 'no', 'n', '0'])
73
- const DATE_RE = /^\d{4}-\d{2}-\d{2}$/
74
- const DATETIME_RE = /^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}/
75
- const NUMBER_RE = /^-?(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?$/ // 1200, -3.5, 1,200
76
-
77
- /** Coerce one raw cell to a JS value, given the column's inferred type. Empty -> null. */
78
- function coerce(raw: string, type: EntityFieldType): unknown {
79
- const v = raw.trim()
80
- if (v === '') return null
81
- switch (type) {
82
- case 'number': return Number(v.replace(/,/g, ''))
83
- case 'boolean': return TRUE_SET.has(v.toLowerCase())
84
- default: return v // text / date / datetime / json stay strings (grid + schema handle them)
85
- }
86
- }
87
-
88
- /** Infer a column's type from all its non-empty raw values. Defaults to text. */
89
- function inferColumnType(values: string[]): EntityFieldType {
90
- const nonEmpty = values.map((v) => v.trim()).filter((v) => v !== '')
91
- if (nonEmpty.length === 0) return 'text'
92
- const all = (pred: (v: string) => boolean) => nonEmpty.every(pred)
93
- if (all((v) => NUMBER_RE.test(v))) return 'number'
94
- if (all((v) => TRUE_SET.has(v.toLowerCase()) || FALSE_SET.has(v.toLowerCase()))) return 'boolean'
95
- if (all((v) => DATETIME_RE.test(v))) return 'datetime'
96
- if (all((v) => DATE_RE.test(v))) return 'dateString'
97
- return 'text'
98
- }
99
-
100
- /** Turn a header string into a safe, camel-ish field key. */
101
- function toFieldKey(header: string, index: number, taken: Set<string>): string {
102
- let key = header.trim().replace(/[^\w]+/g, '_').replace(/^_+|_+$/g, '').toLowerCase()
103
- if (/^\d/.test(key)) key = 'col_' + key
104
- if (!key) key = `col_${index + 1}`
105
- let unique = key, n = 2
106
- while (taken.has(unique)) unique = `${key}_${n++}`
107
- taken.add(unique)
108
- return unique
109
- }
110
-
111
- export type CsvEntity = {
112
- schema: EntitySchema
113
- rows: Array<Record<string, unknown>>
114
- /** Fields whose header was renamed to a safe key (original -> key), for a UI note. */
115
- renamed: Array<{ header: string; field: string }>
116
- }
117
-
118
- /**
119
- * Parse CSV text into a ready-to-use entity: an `EntitySchema` (types inferred
120
- * per column, an `id` primary key ensured) plus the coerced rows to seed with.
121
- *
122
- * If the file has no id-like column, a synthetic string `id` (`"1"`, `"2"`, ...)
123
- * is added so the grid, edit form, and CRUD have a stable row key.
124
- */
125
- export function csvToEntity(name: string, text: string): CsvEntity {
126
- const matrix = parseCsv(text)
127
- if (matrix.length === 0) return { schema: { name, fields: [] }, rows: [], renamed: [] }
128
-
129
- const headers = matrix[0]!
130
- const body = matrix.slice(1)
131
- const taken = new Set<string>()
132
- const renamed: Array<{ header: string; field: string }> = []
133
- const cols = headers.map((h, i) => {
134
- const field = toFieldKey(h, i, taken)
135
- const values = body.map((r) => r[i] ?? '')
136
- const type = inferColumnType(values)
137
- if (field !== h.trim()) renamed.push({ header: h.trim() || `Column ${i + 1}`, field })
138
- return { field, type, index: i }
139
- })
140
-
141
- const rows = body.map((r) => {
142
- const obj: Record<string, unknown> = {}
143
- for (const c of cols) obj[c.field] = coerce(r[c.index] ?? '', c.type)
144
- return obj
145
- })
146
-
147
- // Ensure a primary key: reuse an existing id-like column, else synthesize one.
148
- const idCol = cols.find((c) => c.field === 'id') ?? cols.find((c) => /(^|_)id$/.test(c.field))
149
- if (!idCol) {
150
- rows.forEach((row, i) => { row.id = String(i + 1) })
151
- cols.unshift({ field: 'id', type: 'text', index: -1 })
152
- }
153
-
154
- const fields: EntityField[] = cols.map((c) => {
155
- const f: EntityField = { field: c.field, type: c.type }
156
- const isId = idCol ? c.field === idCol.field : c.field === 'id'
157
- if (isId) { f.primaryKey = true; f.readonly = true }
158
- return f
159
- })
160
-
161
- // Let introspectJson refine any 'json'/edge types from the actual coerced values,
162
- // but keep our column types + pk decisions (they saw every row, not just the first).
163
- const schema: EntitySchema = refineFields({ name, fields })
164
- return { schema, rows, renamed }
165
- }