@svgrid/enterprise 2.5.2 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (620) 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/dist/SvExpressionEditor.svelte.d.ts +12 -0
  8. package/dist/SvFileInput.svelte.d.ts +20 -0
  9. package/dist/SvGridAlerts.svelte.d.ts +77 -0
  10. package/dist/SvGridBoard.svelte.d.ts +30 -0
  11. package/dist/SvGridEditPanel.svelte.d.ts +73 -0
  12. package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
  13. package/dist/SvGridScheduler.svelte.d.ts +30 -0
  14. package/dist/SvImportDialog.svelte.d.ts +88 -0
  15. package/dist/SvLookupInput.svelte.d.ts +21 -0
  16. package/dist/SvPivotDesigner.svelte.d.ts +176 -0
  17. package/dist/SvRecordDetail.svelte.d.ts +58 -0
  18. package/dist/SvSchedule.svelte.d.ts +29 -0
  19. package/dist/SvSchemaChart.svelte.d.ts +61 -0
  20. package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
  21. package/dist/alerts/alert-engine-attach.d.ts +79 -0
  22. package/dist/alerts/alert-engine-attach.js +106 -0
  23. package/dist/alerts/alert-engine.d.ts +42 -0
  24. package/dist/alerts/alert-engine.js +196 -0
  25. package/dist/alerts/alert-formats.d.ts +26 -0
  26. package/dist/alerts/alert-formats.js +58 -0
  27. package/dist/alerts/alert-observer.d.ts +54 -0
  28. package/dist/alerts/alert-observer.js +156 -0
  29. package/dist/alerts/alert-scheduler.d.ts +30 -0
  30. package/dist/alerts/alert-scheduler.js +54 -0
  31. package/dist/alerts/alert-storage.d.ts +31 -0
  32. package/dist/alerts/alert-storage.js +92 -0
  33. package/dist/alerts/alert-store.svelte.d.ts +24 -0
  34. package/dist/alerts/alert-store.svelte.js +69 -0
  35. package/dist/alerts/alert-types.d.ts +86 -0
  36. package/dist/alerts/alert-types.js +1 -0
  37. package/dist/alerts.d.ts +2 -0
  38. package/{src/alerts.ts → dist/alerts.js} +9 -9
  39. package/dist/board.d.ts +7 -0
  40. package/{src/board.ts → dist/board.js} +13 -14
  41. package/dist/cdn/svgrid-enterprise.svelte-external.js +2987 -2981
  42. package/dist/designer/assets/{index-CM5xvaOy.js → index-BF0UH638.js} +3 -3
  43. package/dist/designer/assets/{src-D-ET9Mmo.js → src-BPJruwB9.js} +184 -184
  44. package/dist/designer/index.html +2 -2
  45. package/dist/edit-panel.d.ts +105 -0
  46. package/dist/edit-panel.js +350 -0
  47. package/dist/export-conditional.d.ts +31 -0
  48. package/dist/export-conditional.js +65 -0
  49. package/dist/export-ooxml.d.ts +93 -0
  50. package/dist/export-ooxml.js +385 -0
  51. package/dist/export-pdf.d.ts +107 -0
  52. package/dist/export-pdf.js +144 -0
  53. package/dist/export-print.d.ts +55 -0
  54. package/dist/export-print.js +91 -0
  55. package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
  56. package/dist/export-serialize.js +11 -0
  57. package/dist/export-xls.d.ts +26 -0
  58. package/dist/export-xls.js +157 -0
  59. package/dist/export.d.ts +323 -0
  60. package/dist/export.js +1021 -0
  61. package/dist/expressions/evaluate.d.ts +17 -0
  62. package/dist/expressions/evaluate.js +214 -0
  63. package/dist/expressions/expression-columns.d.ts +61 -0
  64. package/dist/expressions/expression-columns.js +72 -0
  65. package/dist/expressions/expression-types.d.ts +125 -0
  66. package/dist/expressions/expression-types.js +1 -0
  67. package/dist/expressions/parse.d.ts +25 -0
  68. package/dist/expressions/parse.js +537 -0
  69. package/dist/import.d.ts +232 -0
  70. package/dist/import.js +846 -0
  71. package/dist/index.d.ts +66 -0
  72. package/dist/index.js +91 -0
  73. package/dist/install.d.ts +70 -0
  74. package/dist/install.js +61 -0
  75. package/dist/license-core.d.ts +37 -0
  76. package/dist/license-core.js +81 -0
  77. package/dist/license.d.ts +30 -0
  78. package/dist/license.js +139 -0
  79. package/dist/master-detail.d.ts +23 -0
  80. package/dist/master-detail.js +35 -0
  81. package/dist/node/studio.js +1 -1
  82. package/dist/pivot-chart.d.ts +28 -0
  83. package/dist/pivot-chart.js +71 -0
  84. package/dist/pivot-designer.d.ts +69 -0
  85. package/dist/pivot-designer.js +38 -0
  86. package/dist/pivot-enable.d.ts +6 -0
  87. package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
  88. package/dist/pivot.d.ts +111 -0
  89. package/dist/pivot.js +353 -0
  90. package/dist/print.d.ts +33 -0
  91. package/dist/print.js +61 -0
  92. package/dist/revoked.d.ts +1 -0
  93. package/{src/revoked.ts → dist/revoked.js} +5 -6
  94. package/dist/scheduler-assignments.d.ts +64 -0
  95. package/dist/scheduler-assignments.js +92 -0
  96. package/dist/scheduler-axis.d.ts +81 -0
  97. package/dist/scheduler-axis.js +180 -0
  98. package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
  99. package/dist/scheduler-booking.js +50 -0
  100. package/dist/scheduler-config.d.ts +177 -0
  101. package/dist/scheduler-config.js +1 -0
  102. package/dist/scheduler-dependencies.d.ts +89 -0
  103. package/dist/scheduler-dependencies.js +179 -0
  104. package/dist/scheduler-freebusy.d.ts +19 -0
  105. package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
  106. package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
  107. package/dist/scheduler-heatmap.js +41 -0
  108. package/dist/scheduler-resource-tree.d.ts +48 -0
  109. package/dist/scheduler-resource-tree.js +78 -0
  110. package/dist/scheduler-slots.d.ts +37 -0
  111. package/dist/scheduler-slots.js +80 -0
  112. package/dist/scheduler-summary.d.ts +41 -0
  113. package/dist/scheduler-summary.js +54 -0
  114. package/dist/scheduler.d.ts +7 -0
  115. package/{src/scheduler.ts → dist/scheduler.js} +13 -14
  116. package/dist/scheduling.d.ts +132 -0
  117. package/dist/scheduling.js +228 -0
  118. package/dist/schema-designer.d.ts +42 -0
  119. package/dist/schema-designer.js +117 -0
  120. package/dist/schema.d.ts +369 -0
  121. package/dist/schema.js +216 -0
  122. package/dist/smart-shim.d.ts +62 -0
  123. package/dist/smart-shim.js +34 -0
  124. package/dist/sources/aggregate.d.ts +43 -0
  125. package/dist/sources/aggregate.js +60 -0
  126. package/dist/sources/auth-supabase.d.ts +69 -0
  127. package/dist/sources/auth-supabase.js +39 -0
  128. package/dist/sources/dashboard.d.ts +65 -0
  129. package/dist/sources/dashboard.js +95 -0
  130. package/dist/sources/field-inference.d.ts +23 -0
  131. package/dist/sources/field-inference.js +52 -0
  132. package/dist/sources/filters.d.ts +35 -0
  133. package/dist/sources/filters.js +52 -0
  134. package/dist/sources/index.d.ts +18 -0
  135. package/dist/sources/index.js +18 -0
  136. package/dist/sources/introspect-supabase.d.ts +30 -0
  137. package/dist/sources/introspect-supabase.js +134 -0
  138. package/dist/sources/realtime-supabase.d.ts +37 -0
  139. package/dist/sources/realtime-supabase.js +52 -0
  140. package/dist/sources/relation-lookup.d.ts +50 -0
  141. package/dist/sources/relation-lookup.js +77 -0
  142. package/dist/sources/rest-adapters.d.ts +48 -0
  143. package/dist/sources/rest-adapters.js +85 -0
  144. package/dist/sources/rest.d.ts +38 -0
  145. package/dist/sources/rest.js +86 -0
  146. package/dist/sources/schema-from-columns.d.ts +37 -0
  147. package/dist/sources/schema-from-columns.js +48 -0
  148. package/dist/sources/supabase.d.ts +33 -0
  149. package/dist/sources/supabase.js +74 -0
  150. package/dist/sources/with-entity-rules.d.ts +25 -0
  151. package/dist/sources/with-entity-rules.js +47 -0
  152. package/dist/sources/with-relation-labels.d.ts +26 -0
  153. package/dist/sources/with-relation-labels.js +38 -0
  154. package/dist/staged-editing.d.ts +85 -0
  155. package/dist/staged-editing.js +0 -0
  156. package/dist/studio/bug-report.d.ts +61 -0
  157. package/dist/studio/bug-report.js +126 -0
  158. package/dist/studio/cli.d.ts +56 -0
  159. package/dist/studio/cli.js +70 -0
  160. package/dist/studio/copilot-core.d.ts +22 -0
  161. package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
  162. package/dist/studio/csv.d.ts +36 -0
  163. package/dist/studio/csv.js +173 -0
  164. package/dist/studio/db-connect-string.d.ts +45 -0
  165. package/dist/studio/db-connect-string.js +113 -0
  166. package/dist/studio/deploy-cli.d.ts +35 -0
  167. package/dist/studio/deploy-cli.js +81 -0
  168. package/dist/studio/emit-project.d.ts +77 -0
  169. package/dist/studio/emit-project.js +5389 -0
  170. package/dist/studio/emit-schema.d.ts +110 -0
  171. package/dist/studio/emit-schema.js +1128 -0
  172. package/dist/studio/index.d.ts +35 -0
  173. package/dist/studio/index.js +38 -0
  174. package/dist/studio/init-flow.d.ts +58 -0
  175. package/dist/studio/init-flow.js +451 -0
  176. package/dist/studio/introspect-db.d.ts +47 -0
  177. package/dist/studio/introspect-db.js +255 -0
  178. package/dist/studio/introspect-openapi.d.ts +19 -0
  179. package/dist/studio/introspect-openapi.js +244 -0
  180. package/dist/studio/introspect-prisma.d.ts +25 -0
  181. package/dist/studio/introspect-prisma.js +164 -0
  182. package/dist/studio/introspect.d.ts +35 -0
  183. package/dist/studio/introspect.js +306 -0
  184. package/dist/studio/project.d.ts +1327 -0
  185. package/dist/studio/project.js +1798 -0
  186. package/dist/studio/sample-data.d.ts +19 -0
  187. package/dist/studio/sample-data.js +207 -0
  188. package/dist/studio/samples/ats.d.ts +2 -0
  189. package/dist/studio/samples/ats.js +194 -0
  190. package/dist/studio/samples/clinic.d.ts +2 -0
  191. package/dist/studio/samples/clinic.js +171 -0
  192. package/dist/studio/samples/crm.d.ts +2 -0
  193. package/dist/studio/samples/crm.js +280 -0
  194. package/dist/studio/samples/datasets.d.ts +38 -0
  195. package/dist/studio/samples/datasets.js +296 -0
  196. package/dist/studio/samples/ecommerce.d.ts +2 -0
  197. package/dist/studio/samples/ecommerce.js +178 -0
  198. package/dist/studio/samples/events.d.ts +2 -0
  199. package/dist/studio/samples/events.js +192 -0
  200. package/dist/studio/samples/fleet.d.ts +2 -0
  201. package/dist/studio/samples/fleet.js +203 -0
  202. package/dist/studio/samples/gym.d.ts +2 -0
  203. package/dist/studio/samples/gym.js +205 -0
  204. package/dist/studio/samples/hr.d.ts +2 -0
  205. package/dist/studio/samples/hr.js +186 -0
  206. package/dist/studio/samples/index.d.ts +13 -0
  207. package/dist/studio/samples/index.js +44 -0
  208. package/dist/studio/samples/insurance.d.ts +2 -0
  209. package/dist/studio/samples/insurance.js +220 -0
  210. package/dist/studio/samples/inventory.d.ts +2 -0
  211. package/dist/studio/samples/inventory.js +204 -0
  212. package/dist/studio/samples/invoicing.d.ts +2 -0
  213. package/dist/studio/samples/invoicing.js +154 -0
  214. package/dist/studio/samples/library.d.ts +2 -0
  215. package/dist/studio/samples/library.js +171 -0
  216. package/dist/studio/samples/live-data.d.ts +5 -0
  217. package/dist/studio/samples/live-data.js +261 -0
  218. package/dist/studio/samples/projects.d.ts +2 -0
  219. package/dist/studio/samples/projects.js +203 -0
  220. package/dist/studio/samples/realestate.d.ts +2 -0
  221. package/dist/studio/samples/realestate.js +187 -0
  222. package/dist/studio/samples/restaurant.d.ts +2 -0
  223. package/dist/studio/samples/restaurant.js +180 -0
  224. package/dist/studio/samples/school.d.ts +2 -0
  225. package/dist/studio/samples/school.js +188 -0
  226. package/dist/studio/samples/shared.d.ts +142 -0
  227. package/dist/studio/samples/shared.js +164 -0
  228. package/dist/studio/samples/starter.d.ts +4 -0
  229. package/dist/studio/samples/starter.js +237 -0
  230. package/dist/studio/samples/subscriptions.d.ts +2 -0
  231. package/dist/studio/samples/subscriptions.js +175 -0
  232. package/dist/studio/samples/support.d.ts +2 -0
  233. package/dist/studio/samples/support.js +209 -0
  234. package/dist/studio/scaffold-app.d.ts +22 -0
  235. package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
  236. package/dist/studio/scaffold.d.ts +63 -0
  237. package/dist/studio/scaffold.js +346 -0
  238. package/dist/studio/screen-suites.d.ts +193 -0
  239. package/dist/studio/screen-suites.js +297 -0
  240. package/dist/studio/themes.d.ts +34 -0
  241. package/dist/studio/themes.js +41 -0
  242. package/dist/studio/ui-components.d.ts +89 -0
  243. package/dist/studio/ui-components.generated.d.ts +29 -0
  244. package/dist/studio/ui-components.generated.js +7139 -0
  245. package/dist/studio/ui-components.js +673 -0
  246. package/dist/studio/user-error.d.ts +23 -0
  247. package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
  248. package/dist/studio/verify.d.ts +34 -0
  249. package/dist/studio/verify.js +47 -0
  250. package/dist/sveltekit/in-memory.d.ts +14 -0
  251. package/dist/sveltekit/in-memory.js +113 -0
  252. package/dist/sveltekit/index.d.ts +6 -0
  253. package/dist/sveltekit/index.js +5 -0
  254. package/dist/sveltekit/query-plan.d.ts +44 -0
  255. package/dist/sveltekit/query-plan.js +76 -0
  256. package/dist/sveltekit/sql-source.d.ts +47 -0
  257. package/dist/sveltekit/sql-source.js +106 -0
  258. package/dist/sveltekit/sql.d.ts +48 -0
  259. package/dist/sveltekit/sql.js +73 -0
  260. package/dist/sveltekit/transport.d.ts +209 -0
  261. package/dist/sveltekit/transport.js +219 -0
  262. package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
  263. package/dist/sveltekit/types.js +1 -0
  264. package/dist/upgrade-prompt.d.ts +16 -0
  265. package/dist/upgrade-prompt.js +141 -0
  266. package/dist/version.d.ts +13 -0
  267. package/{src/version.ts → dist/version.js} +1 -1
  268. package/dist/watermark.d.ts +2 -0
  269. package/dist/watermark.js +146 -0
  270. package/package.json +26 -24
  271. package/src/SvBoard.dom.test.ts +0 -67
  272. package/src/SvGridAlerts.dom.test.ts +0 -113
  273. package/src/SvGridEditPanel.dom.test.ts +0 -320
  274. package/src/SvRecordDetail.dom.test.ts +0 -137
  275. package/src/SvSchedule.dom.test.ts +0 -57
  276. package/src/ai-export-pdf.dom.test.ts +0 -77
  277. package/src/ai-export-xlsx.dom.test.ts +0 -90
  278. package/src/ai-export.dom.test.ts +0 -114
  279. package/src/alerts/alert-engine-attach.ts +0 -165
  280. package/src/alerts/alert-engine.test.ts +0 -135
  281. package/src/alerts/alert-engine.ts +0 -260
  282. package/src/alerts/alert-formats.test.ts +0 -87
  283. package/src/alerts/alert-formats.ts +0 -77
  284. package/src/alerts/alert-observer.test.ts +0 -189
  285. package/src/alerts/alert-observer.ts +0 -208
  286. package/src/alerts/alert-scheduler.ts +0 -96
  287. package/src/alerts/alert-storage.test.ts +0 -54
  288. package/src/alerts/alert-storage.ts +0 -116
  289. package/src/alerts/alert-store.svelte.ts +0 -80
  290. package/src/alerts/alert-types.ts +0 -94
  291. package/src/board.dom.test.ts +0 -941
  292. package/src/edit-panel.test.ts +0 -322
  293. package/src/edit-panel.ts +0 -379
  294. package/src/export-conditional.test.ts +0 -60
  295. package/src/export-conditional.ts +0 -94
  296. package/src/export-ooxml.test.ts +0 -152
  297. package/src/export-ooxml.ts +0 -489
  298. package/src/export-pdf.test.ts +0 -138
  299. package/src/export-pdf.ts +0 -245
  300. package/src/export-print.test.ts +0 -66
  301. package/src/export-print.ts +0 -132
  302. package/src/export-serialize.test.ts +0 -56
  303. package/src/export-xls.ts +0 -199
  304. package/src/export-xlsx-roundtrip.test.ts +0 -120
  305. package/src/export-xlsx.test.ts +0 -150
  306. package/src/export.test.ts +0 -349
  307. package/src/export.ts +0 -1464
  308. package/src/expressions/evaluate.test.ts +0 -111
  309. package/src/expressions/evaluate.ts +0 -237
  310. package/src/expressions/expression-columns.ts +0 -133
  311. package/src/expressions/expression-types.ts +0 -84
  312. package/src/expressions/parse.test.ts +0 -106
  313. package/src/expressions/parse.ts +0 -610
  314. package/src/import-automap.test.ts +0 -131
  315. package/src/import-hardening.test.ts +0 -158
  316. package/src/import.test.ts +0 -415
  317. package/src/import.ts +0 -1044
  318. package/src/index.ts +0 -569
  319. package/src/install.ts +0 -154
  320. package/src/license-core.test.ts +0 -23
  321. package/src/license-core.ts +0 -107
  322. package/src/license-expiry.test.ts +0 -127
  323. package/src/license.ts +0 -137
  324. package/src/master-detail.test.ts +0 -61
  325. package/src/master-detail.ts +0 -42
  326. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  327. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
  328. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
  329. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
  330. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
  331. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
  332. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
  333. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
  334. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
  335. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
  336. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
  337. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
  338. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
  339. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
  340. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
  341. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  342. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  343. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  344. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  345. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  346. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  347. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  348. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  349. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  350. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  351. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  352. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  353. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  354. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  355. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  356. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  357. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  358. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  359. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  360. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  361. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  362. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  363. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  364. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  365. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  366. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  367. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  368. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  369. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  370. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  371. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  372. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  373. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  374. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  375. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  376. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
  377. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
  378. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
  379. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
  380. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
  381. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
  382. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
  383. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
  384. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
  385. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
  386. package/src/pivot-chart.test.ts +0 -86
  387. package/src/pivot-chart.ts +0 -112
  388. package/src/pivot-designer.ts +0 -101
  389. package/src/pivot.test.ts +0 -335
  390. package/src/pivot.ts +0 -578
  391. package/src/print.ts +0 -107
  392. package/src/scheduler-assignments.test.ts +0 -97
  393. package/src/scheduler-assignments.ts +0 -134
  394. package/src/scheduler-axis.test.ts +0 -108
  395. package/src/scheduler-axis.ts +0 -238
  396. package/src/scheduler-booking.test.ts +0 -57
  397. package/src/scheduler-config.ts +0 -179
  398. package/src/scheduler-dependencies.test.ts +0 -155
  399. package/src/scheduler-dependencies.ts +0 -223
  400. package/src/scheduler-freebusy.test.ts +0 -41
  401. package/src/scheduler-heatmap.test.ts +0 -39
  402. package/src/scheduler-resource-tree.test.ts +0 -84
  403. package/src/scheduler-resource-tree.ts +0 -107
  404. package/src/scheduler-slots.test.ts +0 -53
  405. package/src/scheduler-slots.ts +0 -94
  406. package/src/scheduler-summary.test.ts +0 -47
  407. package/src/scheduler-summary.ts +0 -81
  408. package/src/scheduling.test.ts +0 -194
  409. package/src/scheduling.ts +0 -293
  410. package/src/schema-designer.test.ts +0 -121
  411. package/src/schema-designer.ts +0 -142
  412. package/src/schema.test.ts +0 -268
  413. package/src/schema.ts +0 -562
  414. package/src/smart-shim.ts +0 -107
  415. package/src/sources/aggregate.test.ts +0 -79
  416. package/src/sources/aggregate.ts +0 -102
  417. package/src/sources/auth-supabase.test.ts +0 -80
  418. package/src/sources/auth-supabase.ts +0 -87
  419. package/src/sources/dashboard.kpi.test.ts +0 -50
  420. package/src/sources/dashboard.test.ts +0 -61
  421. package/src/sources/dashboard.ts +0 -136
  422. package/src/sources/field-inference.test.ts +0 -60
  423. package/src/sources/field-inference.ts +0 -63
  424. package/src/sources/filters.test.ts +0 -58
  425. package/src/sources/filters.ts +0 -70
  426. package/src/sources/index.ts +0 -67
  427. package/src/sources/introspect-supabase.test.ts +0 -112
  428. package/src/sources/introspect-supabase.ts +0 -139
  429. package/src/sources/realtime-supabase.test.ts +0 -93
  430. package/src/sources/realtime-supabase.ts +0 -99
  431. package/src/sources/relation-lookup.test.ts +0 -99
  432. package/src/sources/relation-lookup.ts +0 -128
  433. package/src/sources/rest-adapters.test.ts +0 -95
  434. package/src/sources/rest-adapters.ts +0 -120
  435. package/src/sources/rest.test.ts +0 -104
  436. package/src/sources/rest.ts +0 -129
  437. package/src/sources/schema-from-columns.test.ts +0 -106
  438. package/src/sources/schema-from-columns.ts +0 -88
  439. package/src/sources/supabase.test.ts +0 -110
  440. package/src/sources/supabase.ts +0 -99
  441. package/src/sources/with-entity-rules.test.ts +0 -104
  442. package/src/sources/with-entity-rules.ts +0 -78
  443. package/src/sources/with-relation-labels.test.ts +0 -75
  444. package/src/sources/with-relation-labels.ts +0 -73
  445. package/src/staged-editing.ts +0 -0
  446. package/src/studio/bug-report.test.ts +0 -101
  447. package/src/studio/bug-report.ts +0 -165
  448. package/src/studio/cli.test.ts +0 -187
  449. package/src/studio/cli.ts +0 -117
  450. package/src/studio/copilot-core.test.ts +0 -45
  451. package/src/studio/csv.test.ts +0 -90
  452. package/src/studio/csv.ts +0 -165
  453. package/src/studio/db-connect-string.test.ts +0 -94
  454. package/src/studio/db-connect-string.ts +0 -128
  455. package/src/studio/deploy-cli.test.ts +0 -56
  456. package/src/studio/deploy-cli.ts +0 -100
  457. package/src/studio/emit-project.test.ts +0 -3324
  458. package/src/studio/emit-project.ts +0 -5377
  459. package/src/studio/emit-schema.test.ts +0 -111
  460. package/src/studio/emit-schema.ts +0 -1181
  461. package/src/studio/index.ts +0 -380
  462. package/src/studio/init-flow.test.ts +0 -514
  463. package/src/studio/init-flow.ts +0 -556
  464. package/src/studio/introspect-db.test.ts +0 -186
  465. package/src/studio/introspect-db.ts +0 -312
  466. package/src/studio/introspect-openapi.test.ts +0 -84
  467. package/src/studio/introspect-openapi.ts +0 -252
  468. package/src/studio/introspect-prisma.test.ts +0 -99
  469. package/src/studio/introspect-prisma.ts +0 -175
  470. package/src/studio/introspect.test.ts +0 -172
  471. package/src/studio/introspect.ts +0 -310
  472. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  473. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  474. package/src/studio/pipeline.test.ts +0 -42
  475. package/src/studio/project-robust.test.ts +0 -157
  476. package/src/studio/project.test.ts +0 -929
  477. package/src/studio/project.ts +0 -2394
  478. package/src/studio/sample-data.test.ts +0 -58
  479. package/src/studio/sample-data.ts +0 -203
  480. package/src/studio/samples/ats.ts +0 -202
  481. package/src/studio/samples/clinic.ts +0 -179
  482. package/src/studio/samples/crm.ts +0 -291
  483. package/src/studio/samples/datasets.test.ts +0 -84
  484. package/src/studio/samples/datasets.ts +0 -340
  485. package/src/studio/samples/ecommerce.ts +0 -187
  486. package/src/studio/samples/events.ts +0 -201
  487. package/src/studio/samples/fleet.ts +0 -213
  488. package/src/studio/samples/gym.ts +0 -215
  489. package/src/studio/samples/hr.ts +0 -195
  490. package/src/studio/samples/index.ts +0 -55
  491. package/src/studio/samples/insurance.ts +0 -229
  492. package/src/studio/samples/inventory.ts +0 -213
  493. package/src/studio/samples/invoicing.ts +0 -162
  494. package/src/studio/samples/library.ts +0 -180
  495. package/src/studio/samples/live-data.test.ts +0 -99
  496. package/src/studio/samples/live-data.ts +0 -306
  497. package/src/studio/samples/projects.ts +0 -212
  498. package/src/studio/samples/realestate.ts +0 -196
  499. package/src/studio/samples/restaurant.ts +0 -189
  500. package/src/studio/samples/samples.test.ts +0 -304
  501. package/src/studio/samples/school.ts +0 -197
  502. package/src/studio/samples/seed-floor.test.ts +0 -25
  503. package/src/studio/samples/shared.ts +0 -237
  504. package/src/studio/samples/starter.ts +0 -251
  505. package/src/studio/samples/subscriptions.ts +0 -183
  506. package/src/studio/samples/support.ts +0 -216
  507. package/src/studio/scaffold-app.test.ts +0 -91
  508. package/src/studio/scaffold.test.ts +0 -192
  509. package/src/studio/scaffold.ts +0 -390
  510. package/src/studio/screen-suites.test.ts +0 -269
  511. package/src/studio/screen-suites.ts +0 -448
  512. package/src/studio/themes.ts +0 -62
  513. package/src/studio/ui-components-surface.test.ts +0 -185
  514. package/src/studio/ui-components.generated.ts +0 -7154
  515. package/src/studio/ui-components.ts +0 -742
  516. package/src/studio/verify.test.ts +0 -47
  517. package/src/studio/verify.ts +0 -79
  518. package/src/sveltekit/in-memory.test.ts +0 -104
  519. package/src/sveltekit/in-memory.ts +0 -129
  520. package/src/sveltekit/index.ts +0 -24
  521. package/src/sveltekit/query-plan.test.ts +0 -109
  522. package/src/sveltekit/query-plan.ts +0 -125
  523. package/src/sveltekit/sql-source.test.ts +0 -198
  524. package/src/sveltekit/sql-source.ts +0 -171
  525. package/src/sveltekit/sql.test.ts +0 -80
  526. package/src/sveltekit/sql.ts +0 -131
  527. package/src/sveltekit/transport-scope.test.ts +0 -125
  528. package/src/sveltekit/transport.test.ts +0 -201
  529. package/src/sveltekit/transport.ts +0 -373
  530. package/src/upgrade-prompt.test.ts +0 -71
  531. package/src/upgrade-prompt.ts +0 -162
  532. package/src/version.test.ts +0 -17
  533. package/src/watermark.test.ts +0 -97
  534. package/src/watermark.ts +0 -156
  535. /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
  536. /package/{src → dist}/SvAlertsManager.svelte +0 -0
  537. /package/{src → dist}/SvAlertsPanel.svelte +0 -0
  538. /package/{src → dist}/SvAuthGate.svelte +0 -0
  539. /package/{src → dist}/SvBoard.svelte +0 -0
  540. /package/{src → dist}/SvExportMenu.svelte +0 -0
  541. /package/{src → dist}/SvExpressionEditor.svelte +0 -0
  542. /package/{src → dist}/SvFileInput.svelte +0 -0
  543. /package/{src → dist}/SvGridAlerts.svelte +0 -0
  544. /package/{src → dist}/SvGridBoard.svelte +0 -0
  545. /package/{src → dist}/SvGridEditPanel.svelte +0 -0
  546. /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
  547. /package/{src → dist}/SvGridScheduler.svelte +0 -0
  548. /package/{src → dist}/SvImportDialog.svelte +0 -0
  549. /package/{src → dist}/SvLookupInput.svelte +0 -0
  550. /package/{src → dist}/SvPivotDesigner.svelte +0 -0
  551. /package/{src → dist}/SvRecordDetail.svelte +0 -0
  552. /package/{src → dist}/SvSchedule.svelte +0 -0
  553. /package/{src → dist}/SvSchemaChart.svelte +0 -0
  554. /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
  555. /package/{src → dist}/pdfmake-shims.d.ts +0 -0
  556. /package/{src → dist}/smart.export.d.ts +0 -0
  557. /package/{src → dist}/smart.export.js +0 -0
  558. /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
  559. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
  560. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
  561. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
  562. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
  563. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
  564. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
  565. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
  566. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
  567. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
  568. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
  569. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
  570. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
  571. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
  572. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
  573. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
  574. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
  575. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
  576. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
  577. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
  578. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
  579. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
  580. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
  581. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
  582. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
  583. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
  584. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
  585. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
  586. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
  587. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
  588. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
  589. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
  590. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
  591. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
  592. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
  593. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
  594. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
  595. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
  596. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
  597. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
  598. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
  599. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
  600. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
  601. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
  602. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
  603. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
  604. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
  605. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
  606. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
  607. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
  608. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
  609. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
  610. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
  611. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
  612. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
  613. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
  614. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
  615. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
  616. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
  617. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
  618. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
  619. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
  620. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -0
@@ -1,192 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
- import { compile } from 'svelte/compiler'
3
- import type { EntitySchema } from '../schema'
4
- import { MANAGED_END, MANAGED_START, mergeManaged, scaffold, skipUserOwned } from './scaffold'
5
-
6
- const schema: EntitySchema = {
7
- name: 'customers',
8
- label: 'Customer',
9
- idField: 'id',
10
- fields: [
11
- { field: 'id', type: 'text', primaryKey: true, readonly: true },
12
- { field: 'firstName', type: 'text', required: true },
13
- { field: 'age', type: 'number' },
14
- { field: 'tier', type: 'enum', options: [{ value: 'free', label: 'Free' }] },
15
- ],
16
- }
17
-
18
- describe('scaffold', () => {
19
- const { files } = scaffold(schema)
20
- const byPath = Object.fromEntries(files.map((f) => [f.path, f]))
21
-
22
- it('emits schema, server route, and page files at SvelteKit paths', () => {
23
- expect(Object.keys(byPath).sort()).toEqual([
24
- 'src/lib/customers.schema.ts',
25
- 'src/routes/api/customers/+server.ts',
26
- 'src/routes/customers/+page.svelte',
27
- ])
28
- })
29
-
30
- it('the schema file exports a typed EntitySchema literal and Row type', () => {
31
- const c = byPath['src/lib/customers.schema.ts']!.contents
32
- expect(c).toContain('export const customersSchema: EntitySchema<CustomersRow>')
33
- expect(c).toContain('export type CustomersRow = {')
34
- expect(c).toContain('age: number')
35
- expect(c).toContain('firstName: string')
36
- expect(c).toContain(`field: "tier", type: "enum"`)
37
- expect(c).toContain(`options: [{"value":"free","label":"Free"}]`)
38
- })
39
-
40
- it('the server route wires createKitHandlers', () => {
41
- const c = byPath['src/routes/api/customers/+server.ts']!.contents
42
- expect(c).toContain('createKitHandlers({ schema: customersSchema, source })')
43
- expect(c).toContain('export const { POST }')
44
- })
45
-
46
- it('the page wires the grid + edit panel over the transport', () => {
47
- const c = byPath['src/routes/customers/+page.svelte']!.contents
48
- expect(c).toContain("createKitDataSource<CustomersRow>({ endpoint: '/api/customers' })")
49
- expect(c).toContain('schemaToColumns(customersSchema)')
50
- expect(c).toContain('<SvGrid')
51
- expect(c).toContain('<SvGridEditPanel')
52
- })
53
-
54
- it('the page is a full data screen: sort, filter, paging, delete, optimistic', () => {
55
- const c = byPath['src/routes/customers/+page.svelte']!.contents
56
- expect(c).toContain('sortable')
57
- expect(c).toContain('externalSort')
58
- expect(c).toContain('controller.setSort(s)')
59
- expect(c).toContain('filterable')
60
- expect(c).toContain('showGlobalFilter')
61
- expect(c).toContain('controller.setFilter(') // server filtering
62
- expect(c).toContain('fitColumns') // columns fill the width
63
- expect(c).toContain('enableRowSummaries={false}') // no default summary
64
- expect(c).toContain('externalPagination') // native server pagination footer
65
- expect(c).toContain('onPaginationChange')
66
- expect(c).toContain('controller.setPage(') // pagination
67
- expect(c).toContain('removeSelected') // multi-select delete
68
- expect(c).toContain('optimistic: true')
69
- expect(c).toContain("getRowId: (r) => String(r.id)") // uses the primary key
70
- expect(c).toContain('role="alert"') // error state
71
- expect(c).toContain('emptyMessage=') // empty state
72
- })
73
-
74
- it('the generated page is syntactically valid Svelte (compiles)', () => {
75
- // Compile with Svelte's own compiler - validates markup, runes, bindings,
76
- // and snippets. (It does not resolve imports; that's the bundler's job.)
77
- const page = byPath['src/routes/customers/+page.svelte']!.contents
78
- expect(() => compile(page, { filename: '+page.svelte', generate: 'client' })).not.toThrow()
79
- })
80
-
81
- it('wraps every file body in managed markers', () => {
82
- for (const f of files) {
83
- expect(f.contents).toContain(MANAGED_START)
84
- expect(f.contents).toContain(MANAGED_END)
85
- }
86
- })
87
-
88
- it('emits a connected +server.ts for a database dialect', () => {
89
- const pg = scaffold(schema, { dataSource: 'postgres' }).files.find(
90
- (f) => f.path === 'src/routes/api/customers/+server.ts',
91
- )!.contents
92
- expect(pg).toContain("import pg from 'pg'")
93
- expect(pg).toContain('new pg.Pool({ connectionString: process.env.DATABASE_URL })')
94
- expect(pg).toContain('createSqlDataSource')
95
- expect(pg).toContain("placeholders: '$'")
96
- expect(pg).toContain('await pool.query(text, params)')
97
-
98
- const sqlite = scaffold(schema, { dataSource: 'sqlite' }).files.find((f) =>
99
- f.path.endsWith('+server.ts'),
100
- )!.contents
101
- expect(sqlite).toContain("import Database from 'better-sqlite3'")
102
- expect(sqlite).toContain('db.prepare(text).all(...params)')
103
-
104
- const mssql = scaffold(schema, { dataSource: 'mssql' }).files.find((f) =>
105
- f.path.endsWith('+server.ts'),
106
- )!.contents
107
- expect(mssql).toContain("import mssql from 'mssql'")
108
- expect(mssql).toContain("placeholders: '@'")
109
-
110
- // supabase reuses the postgres driver
111
- const supa = scaffold(schema, { dataSource: 'supabase' }).files.find((f) =>
112
- f.path.endsWith('+server.ts'),
113
- )!.contents
114
- expect(supa).toContain("import pg from 'pg'")
115
- })
116
-
117
- it('honors route/apiRoute overrides', () => {
118
- const { files: f2 } = scaffold(schema, { route: 'clients', apiRoute: '/data/clients' })
119
- const paths = f2.map((x) => x.path)
120
- expect(paths).toContain('src/routes/clients/+page.svelte')
121
- expect(paths).toContain('src/routes/data/clients/+server.ts')
122
- })
123
-
124
- it('the base page (no relations) has no lookup wiring', () => {
125
- const c = byPath['src/routes/customers/+page.svelte']!.contents
126
- expect(c).not.toContain('createRelationLookup')
127
- expect(c).not.toContain('lookups={lookups}')
128
- })
129
- })
130
-
131
- describe('scaffold with relation fields', () => {
132
- const relSchema: EntitySchema = {
133
- name: 'contacts',
134
- label: 'Contact',
135
- idField: 'id',
136
- fields: [
137
- { field: 'id', type: 'number', primaryKey: true, readonly: true },
138
- { field: 'name', type: 'text', required: true },
139
- { field: 'companyId', type: 'relation', label: 'Company', relation: { entity: 'companies', foreignKey: 'companyId', labelField: 'name' } },
140
- ],
141
- }
142
- const page = scaffold(relSchema).files.find((f) => f.path === 'src/routes/contacts/+page.svelte')!.contents
143
-
144
- it('generates a lookup over the related API route and wires it into the edit panel', () => {
145
- expect(page).toContain('createRelationLookup')
146
- expect(page).toContain('createKitDataSource({ endpoint: "/api/companies" })')
147
- expect(page).toContain('labelField: "name"')
148
- expect(page).toContain('const lookups = { "companyId": companyIdLookup }')
149
- expect(page).toContain('lookups={lookups}')
150
- })
151
-
152
- it('the page with lookups is valid Svelte (compiles)', () => {
153
- expect(() => compile(page, { filename: '+page.svelte', generate: 'client' })).not.toThrow()
154
- })
155
- })
156
-
157
- describe('mergeManaged', () => {
158
- it('uses the generated file whole when there is no existing content', () => {
159
- const gen = `head\n${MANAGED_START}\nX\n${MANAGED_END}\ntail`
160
- expect(mergeManaged(null, gen)).toBe(gen)
161
- })
162
-
163
- it('replaces only the managed region, preserving user edits outside', () => {
164
- const existing = `import x\n${MANAGED_START}\nOLD\n${MANAGED_END}\n// my custom helper\nconst keep = 1`
165
- const generated = `import y\n${MANAGED_START}\nNEW\n${MANAGED_END}\nignored tail`
166
- const merged = mergeManaged(existing, generated)
167
- expect(merged).toContain('import x') // user's import kept
168
- expect(merged).toContain('// my custom helper') // user's code kept
169
- expect(merged).toContain('const keep = 1')
170
- expect(merged).toContain('NEW') // managed region updated
171
- expect(merged).not.toContain('OLD')
172
- expect(merged).not.toContain('ignored tail')
173
- })
174
-
175
- it('falls back to generated when existing has no markers', () => {
176
- expect(mergeManaged('no markers here', 'GEN')).toBe('GEN')
177
- })
178
- })
179
-
180
- describe('skipUserOwned (the handlers.ts write-once contract)', () => {
181
- it('skips a user-owned file that already exists on disk (never clobber user code)', () => {
182
- expect(skipUserOwned({ userOwned: true }, true)).toBe(true)
183
- })
184
- it('writes a user-owned file when it does not exist yet (scaffold the stub once)', () => {
185
- expect(skipUserOwned({ userOwned: true }, false)).toBe(false)
186
- })
187
- it('always writes a generated (non-user-owned) file, whether or not it exists', () => {
188
- expect(skipUserOwned({ userOwned: false }, true)).toBe(false)
189
- expect(skipUserOwned({}, true)).toBe(false)
190
- expect(skipUserOwned({ userOwned: undefined }, true)).toBe(false)
191
- })
192
- })
@@ -1,390 +0,0 @@
1
- /**
2
- * scaffold - turn an `EntitySchema` into runnable SvelteKit files. The shared
3
- * code-emit core: both the AI generator (MCP `scaffold_entity` tool) and the
4
- * visual designer's "Generate code" action call this one function, so there is
5
- * a single source of truth for what generated code looks like.
6
- *
7
- * Every generated file wraps its body in `svgrid:managed` markers. A future
8
- * regeneration replaces only the managed region, so edits a user makes outside
9
- * the markers survive - idempotent generation, the thing that makes a
10
- * generator trustworthy enough to keep using.
11
- *
12
- * Pure string building. No filesystem, no Svelte. The `validate` (Standard
13
- * Schema) functions on a field cannot be serialized to a literal, so they are
14
- * omitted from the emitted schema with a note to re-add them by hand.
15
- */
16
- import { resolveIdField, type EntityField, type EntitySchema } from '../schema.js'
17
- import type { SqlDialectName } from './introspect-db.js'
18
-
19
- export type GeneratedFile = {
20
- path: string
21
- contents: string
22
- description: string
23
- /** A user-owned companion (e.g. a screen's `handlers.ts`): scaffolded once as a
24
- * starting stub, then never overwritten. In-place writers must skip it if it
25
- * already exists. See HANDLERS-DESIGN.md. */
26
- userOwned?: boolean
27
- }
28
-
29
- export type ScaffoldOptions = {
30
- /** Route segment for the page, defaults to the schema name. e.g. `'customers'`. */
31
- route?: string
32
- /** API route the page talks to, defaults to `/api/{route}`. */
33
- apiRoute?: string
34
- /** `$lib` path for the generated schema module, defaults to `$lib/{route}.schema`. */
35
- schemaImport?: string
36
- /**
37
- * Backend the generated API route uses:
38
- * - `'memory'` (default): `createInMemoryDataSource` - runs immediately, no DB.
39
- * - `'sql'`: `createSqlDataSource` with an `execute(text, params)` stub you fill in.
40
- * - a dialect (`'postgres'` | `'supabase'` | `'mysql'` | `'mssql'` | `'sqlite'`):
41
- * a fully-connected route wired to that driver via `process.env.DATABASE_URL`.
42
- */
43
- dataSource?: 'memory' | 'sql' | SqlDialectName
44
- }
45
-
46
- /** Per-dialect driver wiring for a connected `+server.ts`. */
47
- type DriverWiring = { imports: string; setup: string; dialectArg: string; execBody: string }
48
- const DRIVERS: Record<'postgres' | 'mysql' | 'mssql' | 'sqlite', DriverWiring> = {
49
- postgres: {
50
- imports: `import pg from 'pg'`,
51
- setup: `const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL })`,
52
- dialectArg: `\n dialect: { placeholders: '$', ilike: true },`,
53
- execBody: `const result = await pool.query(text, params)\n return result.rows`,
54
- },
55
- mysql: {
56
- imports: `import mysql from 'mysql2/promise'`,
57
- setup: `const pool = mysql.createPool(process.env.DATABASE_URL ?? '')`,
58
- dialectArg: ``,
59
- execBody: `const [rows] = await pool.query(text, params)\n return rows as Record<string, unknown>[]`,
60
- },
61
- mssql: {
62
- imports: `import mssql from 'mssql'`,
63
- setup: `const poolPromise = mssql.connect(process.env.DATABASE_URL ?? '')`,
64
- dialectArg: `\n dialect: { placeholders: '@' },`,
65
- execBody: `const pool = await poolPromise\n const request = pool.request()\n params.forEach((p, i) => request.input('p' + (i + 1), p))\n const result = await request.query(text)\n return result.recordset as Record<string, unknown>[]`,
66
- },
67
- sqlite: {
68
- imports: `import Database from 'better-sqlite3'`,
69
- setup: `const db = new Database(process.env.DATABASE_URL ?? 'data.db')`,
70
- dialectArg: ``,
71
- execBody: `return db.prepare(text).all(...params) as Record<string, unknown>[]`,
72
- },
73
- }
74
-
75
- /**
76
- * Whether an in-place writer must SKIP this file to preserve the developer's
77
- * code: a user-owned companion (a screen's `handlers.ts`) that already exists on
78
- * disk. Such files carry no `svgrid:managed` markers, so `mergeManaged` would
79
- * overwrite them wholesale - the write-once contract lives here instead, shared
80
- * by every writer (CLI regenerate + the designer's bundle write). See
81
- * HANDLERS-DESIGN.md.
82
- */
83
- export function skipUserOwned(file: Pick<GeneratedFile, 'userOwned'>, existsOnDisk: boolean): boolean {
84
- return file.userOwned === true && existsOnDisk
85
- }
86
-
87
- export const MANAGED_START = '// svgrid:managed:start'
88
- export const MANAGED_END = '// svgrid:managed:end'
89
- const MANAGED_NOTE = '// Regenerated by SvGrid Studio. Edits inside these markers are overwritten.'
90
-
91
- function pascal(name: string): string {
92
- return name
93
- .replace(/[_\-\s]+/g, ' ')
94
- .replace(/([a-z\d])([A-Z])/g, '$1 $2')
95
- .split(' ')
96
- .filter(Boolean)
97
- .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
98
- .join('')
99
- }
100
-
101
- function camel(name: string): string {
102
- const p = pascal(name)
103
- return p.charAt(0).toLowerCase() + p.slice(1)
104
- }
105
-
106
- function tsType(field: EntityField): string {
107
- switch (field.type) {
108
- case 'number':
109
- return 'number'
110
- case 'boolean':
111
- return 'boolean'
112
- default:
113
- return 'string'
114
- }
115
- }
116
-
117
- function fieldLiteral(field: EntityField): string {
118
- const parts = [`field: ${JSON.stringify(field.field)}`, `type: ${JSON.stringify(field.type)}`]
119
- if (field.label) parts.push(`label: ${JSON.stringify(field.label)}`)
120
- if (field.primaryKey) parts.push('primaryKey: true')
121
- if (field.readonly) parts.push('readonly: true')
122
- if (field.required) parts.push('required: true')
123
- if (field.hidden) parts.push(`hidden: ${JSON.stringify(field.hidden)}`)
124
- if (field.options) parts.push(`options: ${JSON.stringify(field.options)}`)
125
- if (field.relation) parts.push(`relation: ${JSON.stringify(field.relation)}`)
126
- return ` { ${parts.join(', ')} }`
127
- }
128
-
129
- function schemaLiteral(schema: EntitySchema, constName: string, rowType: string): string {
130
- const head = [` name: ${JSON.stringify(schema.name)}`]
131
- if (schema.label) head.push(` label: ${JSON.stringify(schema.label)}`)
132
- if (schema.idField) head.push(` idField: ${JSON.stringify(schema.idField)}`)
133
- const fields = schema.fields.map(fieldLiteral).join(',\n')
134
- return `export const ${constName}: EntitySchema<${rowType}> = {\n${head.join(',\n')},\n fields: [\n${fields}\n ],\n}`
135
- }
136
-
137
- function managed(body: string): string {
138
- return `${MANAGED_START}\n${MANAGED_NOTE}\n${body}\n${MANAGED_END}`
139
- }
140
-
141
- export function scaffold(schema: EntitySchema, options: ScaffoldOptions = {}): { files: GeneratedFile[] } {
142
- const route = options.route ?? schema.name
143
- const apiRoute = options.apiRoute ?? `/api/${route}`
144
- const schemaImport = options.schemaImport ?? `$lib/${route}.schema`
145
- const constName = `${camel(schema.name)}Schema`
146
- const rowType = `${pascal(schema.name)}Row`
147
- const idField = resolveIdField(schema)
148
- const label = schema.label ?? schema.name
149
-
150
- const rowFields = schema.fields
151
- .map((f) => ` ${f.field}: ${tsType(f)}`)
152
- .join('\n')
153
-
154
- // 1. The schema module ($lib).
155
- const schemaFile: GeneratedFile = {
156
- path: `src/lib/${route}.schema.ts`,
157
- description: 'Entity schema + row type. Re-add any Standard Schema `validate` functions here by hand.',
158
- contents: `import type { EntitySchema } from '@svgrid/enterprise'
159
-
160
- ${managed(`export type ${rowType} = {
161
- ${rowFields}
162
- }
163
-
164
- ${schemaLiteral(schema, constName, rowType)}`)}
165
- `,
166
- }
167
-
168
- // 2. The API route: SvelteKit +server.ts using the transport handlers.
169
- const dataSource = options.dataSource ?? 'memory'
170
- const driver = dataSource === 'supabase' ? DRIVERS.postgres : DRIVERS[dataSource as 'postgres']
171
- let serverImport: string
172
- let serverBody: string
173
- let serverDescription: string
174
-
175
- if (driver) {
176
- // Fully-connected route: driver + DATABASE_URL, no manual editing needed.
177
- serverImport = `${driver.imports}
178
- import { createKitHandlers, createSqlDataSource } from '@svgrid/enterprise'`
179
- serverBody = `${driver.setup}
180
-
181
- const source = createSqlDataSource<${rowType}>({
182
- schema: ${constName},
183
- table: ${JSON.stringify(schema.name)},${driver.dialectArg}
184
- execute: async (text, params) => {
185
- ${driver.execBody}
186
- },
187
- })
188
-
189
- export const { POST } = createKitHandlers({ schema: ${constName}, source })`
190
- serverDescription = `API route connected to your ${dataSource} database via process.env.DATABASE_URL.`
191
- } else if (dataSource === 'sql') {
192
- serverImport = `import { createKitHandlers, createSqlDataSource } from '@svgrid/enterprise'`
193
- serverBody = `// Wire execute() to your SQL client: run \`text\` with \`params\`, return the rows.
194
- // Works with Drizzle (db.execute), postgres.js, better-sqlite3, mysql2, ...
195
- const source = createSqlDataSource<${rowType}>({
196
- schema: ${constName},
197
- table: ${JSON.stringify(schema.name)},
198
- dialect: { placeholders: '$', ilike: true },
199
- execute: async (text, params) => {
200
- throw new Error('TODO: run the query with your database client and return the rows.')
201
- },
202
- })
203
-
204
- export const { POST } = createKitHandlers({ schema: ${constName}, source })`
205
- serverDescription = 'API route. Fill in execute() with your SQL client (Drizzle / postgres.js / ...).'
206
- } else {
207
- serverImport = `import { createInMemoryDataSource, createKitHandlers } from '@svgrid/enterprise'`
208
- serverBody = `// Starts empty and in-memory so the screen runs immediately. Swap this for
209
- // a database-backed source (scaffold with dataSource:"sql" or a dialect) when ready.
210
- const source = createInMemoryDataSource<${rowType}>([], ${constName})
211
-
212
- export const { POST } = createKitHandlers({ schema: ${constName}, source })`
213
- serverDescription = 'API route using an in-memory source. Scaffold with a dialect for a real database.'
214
- }
215
-
216
- const serverFile: GeneratedFile = {
217
- path: `src/routes${apiRoute}/+server.ts`,
218
- description: serverDescription,
219
- contents: `${serverImport}
220
- import { ${constName}, type ${rowType} } from '${schemaImport}'
221
-
222
- ${managed(serverBody)}
223
- `,
224
- }
225
-
226
- // Relation (foreign-key) fields become searchable lookups in the edit form.
227
- // Each lookup queries the related entity's API route, so scaffold those tables
228
- // too (e.g. `npx @svgrid/studio add <relatedTable>`).
229
- const relationFields = schema.fields.filter(
230
- (f): f is EntityField & { relation: NonNullable<EntityField['relation']> } =>
231
- f.type === 'relation' && !!f.relation,
232
- )
233
- const hasLookups = relationFields.length > 0
234
- const lookupDecls = relationFields
235
- .map((f) => {
236
- const name = `${camel(f.field)}Lookup`
237
- const endpoint = JSON.stringify(`/api/${f.relation.entity}`)
238
- return ` const ${name} = createRelationLookup<Record<string, unknown>>({
239
- source: createKitDataSource({ endpoint: ${endpoint} }),
240
- labelField: ${JSON.stringify(f.relation.labelField)},
241
- })`
242
- })
243
- .join('\n')
244
- const lookupsMap = ` const lookups = { ${relationFields
245
- .map((f) => `${JSON.stringify(f.field)}: ${camel(f.field)}Lookup`)
246
- .join(', ')} }`
247
- const lookupsSection = hasLookups ? `\n\n${lookupDecls}\n${lookupsMap}` : ''
248
-
249
- // 3. The page: a full data screen - search, server sort + paging,
250
- // multi-select delete (optimistic), create/edit, loading/error/empty.
251
- const pageBody = ` const source = createKitDataSource<${rowType}>({ endpoint: '${apiRoute}' })
252
- const columns = schemaToColumns(${constName})${lookupsSection}
253
-
254
- let state = $state<ServerState<${rowType}>>({
255
- rows: [], total: 0, loading: false, saving: false, error: null,
256
- pageIndex: 0, pageSize: 25, pageCount: 1, sortModel: [], filterModel: {},
257
- })
258
- const controller = createServerDataSource<${rowType}>(source, {
259
- pageSize: 25,
260
- optimistic: true,
261
- getRowId: (r) => String(r.${idField}),
262
- onChange: (s) => (state = s),
263
- })
264
- controller.refresh()
265
-
266
- let selected = $state<${rowType}[]>([])
267
- let editing = $state<${rowType} | null | undefined>(undefined) // undefined = closed, null = create
268
-
269
- async function save({ mode, id, values }: { mode: 'create' | 'edit'; id: string | null; values: Partial<${rowType}> }) {
270
- if (mode === 'create') {
271
- await controller.createRow(values)
272
- controller.setPage(state.pageCount - 1) // jump to the new row (appended at the end)
273
- } else if (id) {
274
- await controller.updateRow(id, values)
275
- }
276
- editing = undefined
277
- }
278
-
279
- async function removeSelected() {
280
- for (const row of selected) await controller.deleteRow(String(row.${idField}))
281
- selected = []
282
- }`
283
-
284
- const pageFile: GeneratedFile = {
285
- path: `src/routes/${route}/+page.svelte`,
286
- description: 'The data screen: sort, filter, search, paging, multi-select delete, and create/edit - wired to the API route.',
287
- contents: `<script lang="ts">
288
- import { SvGrid, createServerDataSource } from '@svgrid/grid'
289
- import {
290
- SvGridEditPanel,
291
- createKitDataSource,${hasLookups ? '\n createRelationLookup,' : ''}
292
- schemaToColumns,
293
- type ServerState,
294
- } from '@svgrid/enterprise'
295
- import { ${constName}, type ${rowType} } from '${schemaImport}'
296
-
297
- ${managed(pageBody)}
298
- </script>
299
-
300
- <div class="page">
301
- <header class="page__toolbar">
302
- <h2 class="page__title">${label}</h2>
303
- <div class="page__actions">
304
- <button onclick={() => (editing = null)}>New</button>
305
- <button disabled={selected.length === 0} onclick={removeSelected}>
306
- Delete {selected.length > 0 ? '(' + selected.length + ')' : ''}
307
- </button>
308
- </div>
309
- </header>
310
-
311
- {#if state.error}<p class="page__error" role="alert">{state.error}</p>{/if}
312
-
313
- <SvGrid
314
- data={state.rows}
315
- {columns}
316
- loading={state.loading}
317
- loadingOverlay
318
- fitColumns
319
- enableRowSummaries={false}
320
- showRowSelection
321
- enableCellSelection
322
- sortable
323
- externalSort
324
- onSortingChange={(s) => controller.setSort(s)}
325
- filterable
326
- showGlobalFilter
327
- externalFilter
328
- onFiltersChange={(f) =>
329
- controller.setFilter({
330
- global: f.global || undefined,
331
- columns: Object.fromEntries(
332
- f.columns.map((c) => [c.id, { operator: c.operator, value: c.value, valueTo: c.valueTo, selectedValues: c.selectedValues }]),
333
- ),
334
- })}
335
- onRowClick={(e) => (editing = e.row)}
336
- onRowSelectionChange={(_sel, rows) => (selected = rows)}
337
- showPagination
338
- externalPagination
339
- rowCount={state.total}
340
- pageIndex={state.pageIndex}
341
- pageSize={state.pageSize}
342
- onPaginationChange={({ pageIndex, pageSize }) => {
343
- if (pageSize !== state.pageSize) controller.setPageSize(pageSize)
344
- else controller.setPage(pageIndex)
345
- }}
346
- emptyMessage="No ${label} yet"
347
- containerHeight={480}
348
- />
349
-
350
- {#if editing !== undefined}
351
- <SvGridEditPanel schema={${constName}} row={editing} ${hasLookups ? 'lookups={lookups} ' : ''}onSubmit={save} onCancel={() => (editing = undefined)} />
352
- {/if}
353
- </div>
354
-
355
- <style>
356
- .page { display: flex; flex-direction: column; gap: 12px; }
357
- .page__toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
358
- .page__title { margin: 0; font-size: 18px; font-weight: 600; }
359
- .page__actions { display: flex; gap: 8px; }
360
- .page__actions button { padding: 7px 12px; border: 1px solid #ccc; border-radius: 6px; background: #fff; cursor: pointer; }
361
- .page__error { margin: 0; padding: 8px 12px; color: #b3261e; background: #fdecea; border-radius: 6px; }
362
- </style>
363
- `,
364
- }
365
-
366
- return { files: [schemaFile, serverFile, pageFile] }
367
- }
368
-
369
- /**
370
- * Merge freshly-scaffolded files into existing file contents, replacing only
371
- * each file's `svgrid:managed` region and preserving everything a user wrote
372
- * outside it. When there's no existing content (or no markers in it), the new
373
- * file is used whole. This is what makes regeneration safe.
374
- */
375
- export function mergeManaged(existing: string | null | undefined, generated: string): string {
376
- if (!existing) return generated
377
-
378
- const startIdx = existing.indexOf(MANAGED_START)
379
- const endIdx = existing.indexOf(MANAGED_END)
380
- if (startIdx === -1 || endIdx === -1 || endIdx < startIdx) return generated
381
-
382
- const genStart = generated.indexOf(MANAGED_START)
383
- const genEnd = generated.indexOf(MANAGED_END)
384
- if (genStart === -1 || genEnd === -1) return generated
385
- const newRegion = generated.slice(genStart, genEnd + MANAGED_END.length)
386
-
387
- return (
388
- existing.slice(0, startIdx) + newRegion + existing.slice(endIdx + MANAGED_END.length)
389
- )
390
- }