@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
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `@svgrid/enterprise/studio` - the pure, Svelte-free Studio core. Introspect a
3
+ * data source into an `EntitySchema`, then scaffold runnable SvelteKit code
4
+ * from it. Importable from Node (the MCP generator) as well as bundlers (the
5
+ * visual designer), since nothing here touches Svelte or the DOM.
6
+ */
7
+ export { inferType, introspectJson, introspectDrizzle, introspectDrizzleAll } from './introspect.js';
8
+ export { refineField, refineFields } from '../sources/field-inference.js';
9
+ export { parseCsv, detectDelimiter, csvToEntity, type CsvEntity } from './csv.js';
10
+ export { introspectPrisma, introspectPrismaAll } from './introspect-prisma.js';
11
+ export { introspectOpenApi, type OpenApiImport } from './introspect-openapi.js';
12
+ export { introspectDatabase, listDatabaseTables, countTableRows, probeConnection, mapSqlType, type SqlDialectName, type DbExecute, type IntrospectDbOptions, type TableRowCount, } from './introspect-db.js';
13
+ export { buildConnectionString, parseConnectionString, redactConnectionString, isFileDialect, DRIVER_PACKAGE, DEFAULT_PORT, type SqlConnectionParts, } from './db-connect-string.js';
14
+ export { scaffold, mergeManaged, skipUserOwned, MANAGED_START, MANAGED_END, type GeneratedFile, type ScaffoldOptions, } from './scaffold.js';
15
+ export { scaffoldApp, type ScaffoldAppOptions } from './scaffold-app.js';
16
+ export { emitStudioApp, emitEntityModules, entityScreenPage, prepareEntities } from './emit-schema.js';
17
+ export { emitStudioProject, emitStudioAppBundle, emitStudioFragment, runtimeDeps, studioDeployInfo, screenHandles, screenDataset, ctxCompletions, componentHandleMembers, ctxAmbientDts, GRID_API_MEMBERS, type BlockHandle, type HandleTier } from './emit-project.js';
18
+ export { sampleApps, getSampleApp, type SampleApp } from './samples/index.js';
19
+ export { starterProject } from './samples/starter.js';
20
+ export { liveDataSamples, getLiveDataSample } from './samples/live-data.js';
21
+ export { starterDatasets, getStarterDataset, type StarterDataset } from './samples/datasets.js';
22
+ export { runStudioInit, parseSelection, type PromptIO, type DbGateway, type FetchText, type InitFlags, type InitResult, } from './init-flow.js';
23
+ export { UserError, isUserError } from './user-error.js';
24
+ export { crudSuiteScreens, addCrudSuite, crudAppFromSchemas, listScreen, formScreen, detailScreen, dashScreen, statusPills, gridConfig, type CrudScreenKind, type CrudEditingMode, type CrudSuiteOptions, type CrudAppOptions, type GridOpts, type Tile, } from './screen-suites.js';
25
+ export { sanitizeStudioProject, buildStudioBugReport, type SanitizeResult, type BugReport, type BugReportInput, type StudioEnv, } from './bug-report.js';
26
+ export { generateValue, generateRows } from './sample-data.js';
27
+ export { studioThemes, defaultStudioTheme, getStudioTheme, resolveThemeTokens, resolveThemeTokensFor, isDarkTheme, themeStyleString, type StudioTheme } from './themes.js';
28
+ export { createProject, defaultScreenFor, defaultBlockConfig, gridColumns, entityOf, blockPalette, addBlock, addBlockAt, addComponentBlock, removeBlock, duplicateBlock, moveBlock, reorderBlock, updateBlock, addEntity, removeEntity, updateEntity, addScreen, addFreestandingScreen, addScreenAction, removeScreenAction, enableScreenCode, disableScreenCode, setScreenRenderGrid, screenLayoutOf, buildDockLayout, reconcileDock, syncDockPanes, setScreenLayout, isPaneLayout, PANE_LAYOUTS, buildCanvasLayout, canvasRectOf, setCanvasRect, CANVAS_COLS, CANVAS_ROW_PX, CANVAS_GAP_PX, type CanvasRect, applyGridPreset, gridPresetLabel, GRID_PRESETS, setScreenDock, reseedScreenDock, setDockPaneTitle, dockPaneTitleOf, dockPaneIds, setLayoutOpts, gridOpts, stackOpts, splitOpts, dockOpts, canvasOpts, type ScreenLayout, type GridPreset, type LayoutOpts, type GridLayoutOpts, type StackLayoutOpts, type SplitLayoutOpts, type DockLayoutOpts, type CanvasLayoutOpts, setHandlerBody, setScreenHandlersSource, setHandlerSteps, addHandlerStep, updateHandlerStep, moveHandlerStep, stepsToCode, compileStep, compileHandlerSteps, compileValue, compileCondition, compileTriggerStep, compileTriggerSteps, triggersOf, setTrigger, TRIGGER_EVENTS, type TriggerStep, type TriggerEvent, type EntityTriggers, setJob, type ScheduledJob, type ScheduledJobKind, setTenancy, tenantField, isTenantScoped, type TenancyConfig, clickSlot, ssrScreenShape, ssrEligible, withSsrDefaults, setScreenRenderMode, eventSlot, rowSelectSlot, changeSlot, FORM_SUBMIT, GRID_EVENTS, type GridEventDef, addStateVar, updateStateVar, removeStateVar, stateInitExpr, stateTsType, type ActionStep, type ActionStepType, type StateVar, type StateVarType, type LogicValue, type LogicOp, type Condition, type FieldValue, setComponentName, setComponentBinding, componentHasBindings, componentHandleName, ON_LOAD, removeScreen, updateScreen, duplicateScreen, reorderScreen, insertBlock, setDataSource, setDeployTarget, setAuth, setDataLayer, seedUsers, defaultEntitySource, flattenBlocks, TAB_CHILD_KINDS, CONTAINER_CHILD_KINDS, CONTAINER_DISPLAY_KINDS, addTab, removeTab, renameTab, addTabBlock, addTabComponent, removeTabBlock, addAccordionSection, removeAccordionSection, renameAccordionSection, setAccordionMultiple, addAccordionBlock, addAccordionComponent, removeAccordionBlock, setEntityDataSource, entityDataSource, setTheme, setThemePreset, setShell, sanitizeProject, screenFromTemplate, addScreenFromTemplate, serializeProject, parseProject, validateProject, isProjectValid, blockColumns, blockStyleCss, blockClassName, sanitizeClassName, mergeBlockStyle, type BlockStyle, roleCanScreen, roleCanAction, CRUD_ACTIONS, type CrudAction, type RoleAccess, type AccessControl, type AuthConfig, type OAuthProvider, type SeedUser, type I18nConfig, type DeployTarget, type StudioProject, type Screen, type ScreenNav, type Block, type BlockKind, type BlockConfig, type GridConfig, type GridColumnConfig, type ColumnFormat, type ColumnCellType, type GridExportConfig, type GridFilterUi, type TreeDataConfig, type SchedulerViewConfig, type SchedulerViewMode, type RowLink, type RowAction, type RowActionKind, type ActionConfig, type ComponentConfig, type ComponentBinding, type FormatOp, type FormatRule, type GridEditing, type GridDensity, type GridAlign, type PagerPosition, type FormConfig, type ChartConfig, type KpiConfig, type KpiFormat, type GaugeConfig, type TreeConfig, type TabsConfig, type StudioTab, type AccordionConfig, type AccordionSection, type DashboardConfig, type MasterDetailConfig, type LookupConfig, type PivotConfig, type FilterPanelConfig, type RecordConfig, type BoardConfig, type CalendarConfig, type DetailConfig, type DetailRelated, type Reduce, type DataSourceKind, type EntityDataSource, type MemorySource, type RestSource, type RestAdapterConfig, type SqlSource, type SupabaseSource, type PgliteSource, type RestMethod, type ParamLocation, type ParamType, type RequestParam, type SqlDialectKind, type ProjectTheme, type ShellConfig, type ShellStyle, type ScreenTemplate, type PaletteItem, type ProjectIssue, } from './project.js';
29
+ export { verifyScaffold, summarizeVerify, type VerifyResult, type VerifyIssue, type VerifySeverity, } from './verify.js';
30
+ export { UI_COMPONENT_REGISTRY, uiComponentSpec, gridPropSurface, gridApiSettableProps, GRID_CURATED_PROPS, STANDARD_UI_EVENTS, type UiPropType, type UiPropGroup, type UiComponentEvent, type UiComponentProp, type UiComponentSpec, } from './ui-components.js';
31
+ export { buildCopilotMessages, projectFromModelText, type CopilotMessages } from './copilot-core.js';
32
+ export { resolveDeployTarget, deployCommands, missingEnvKeys, type DeployProvider, type DeployResolution, type DeployPlanCommands, } from './deploy-cli.js';
33
+ export { runStudioAdd, runStudioAddApp, resolveSchema, resolveSchemas, type StudioIO, type AddOptions, type AddResult, type AddAppResult, } from './cli.js';
34
+ export { resolveIdField, schemaToColumns, schemaToFormFields, linkRelationLabels, pickLabelField, type EntitySchema, type EntityField, type EntityFieldType, } from '../schema.js';
35
+ export { checkLicenseKey, type LicenseInfo, type LicenseStatus } from '../license-core.js';
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `@svgrid/enterprise/studio` - the pure, Svelte-free Studio core. Introspect a
3
+ * data source into an `EntitySchema`, then scaffold runnable SvelteKit code
4
+ * from it. Importable from Node (the MCP generator) as well as bundlers (the
5
+ * visual designer), since nothing here touches Svelte or the DOM.
6
+ */
7
+ export { inferType, introspectJson, introspectDrizzle, introspectDrizzleAll } from './introspect.js';
8
+ export { refineField, refineFields } from '../sources/field-inference.js';
9
+ export { parseCsv, detectDelimiter, csvToEntity } from './csv.js';
10
+ export { introspectPrisma, introspectPrismaAll } from './introspect-prisma.js';
11
+ export { introspectOpenApi } from './introspect-openapi.js';
12
+ export { introspectDatabase, listDatabaseTables, countTableRows, probeConnection, mapSqlType, } from './introspect-db.js';
13
+ export { buildConnectionString, parseConnectionString, redactConnectionString, isFileDialect, DRIVER_PACKAGE, DEFAULT_PORT, } from './db-connect-string.js';
14
+ export { scaffold, mergeManaged, skipUserOwned, MANAGED_START, MANAGED_END, } from './scaffold.js';
15
+ export { scaffoldApp } from './scaffold-app.js';
16
+ export { emitStudioApp, emitEntityModules, entityScreenPage, prepareEntities } from './emit-schema.js';
17
+ export { emitStudioProject, emitStudioAppBundle, emitStudioFragment, runtimeDeps, studioDeployInfo, screenHandles, screenDataset, ctxCompletions, componentHandleMembers, ctxAmbientDts, GRID_API_MEMBERS } from './emit-project.js';
18
+ export { sampleApps, getSampleApp } from './samples/index.js';
19
+ export { starterProject } from './samples/starter.js';
20
+ export { liveDataSamples, getLiveDataSample } from './samples/live-data.js';
21
+ export { starterDatasets, getStarterDataset } from './samples/datasets.js';
22
+ export { runStudioInit, parseSelection, } from './init-flow.js';
23
+ export { UserError, isUserError } from './user-error.js';
24
+ export { crudSuiteScreens, addCrudSuite, crudAppFromSchemas, listScreen, formScreen, detailScreen, dashScreen, statusPills, gridConfig, } from './screen-suites.js';
25
+ export { sanitizeStudioProject, buildStudioBugReport, } from './bug-report.js';
26
+ export { generateValue, generateRows } from './sample-data.js';
27
+ export { studioThemes, defaultStudioTheme, getStudioTheme, resolveThemeTokens, resolveThemeTokensFor, isDarkTheme, themeStyleString } from './themes.js';
28
+ export { createProject, defaultScreenFor, defaultBlockConfig, gridColumns, entityOf, blockPalette, addBlock, addBlockAt, addComponentBlock, removeBlock, duplicateBlock, moveBlock, reorderBlock, updateBlock, addEntity, removeEntity, updateEntity, addScreen, addFreestandingScreen, addScreenAction, removeScreenAction, enableScreenCode, disableScreenCode, setScreenRenderGrid, screenLayoutOf, buildDockLayout, reconcileDock, syncDockPanes, setScreenLayout, isPaneLayout, PANE_LAYOUTS, buildCanvasLayout, canvasRectOf, setCanvasRect, CANVAS_COLS, CANVAS_ROW_PX, CANVAS_GAP_PX, applyGridPreset, gridPresetLabel, GRID_PRESETS, setScreenDock, reseedScreenDock, setDockPaneTitle, dockPaneTitleOf, dockPaneIds, setLayoutOpts, gridOpts, stackOpts, splitOpts, dockOpts, canvasOpts, setHandlerBody, setScreenHandlersSource, setHandlerSteps, addHandlerStep, updateHandlerStep, moveHandlerStep, stepsToCode, compileStep, compileHandlerSteps, compileValue, compileCondition, compileTriggerStep, compileTriggerSteps, triggersOf, setTrigger, TRIGGER_EVENTS, setJob, setTenancy, tenantField, isTenantScoped, clickSlot, ssrScreenShape, ssrEligible, withSsrDefaults, setScreenRenderMode, eventSlot, rowSelectSlot, changeSlot, FORM_SUBMIT, GRID_EVENTS, addStateVar, updateStateVar, removeStateVar, stateInitExpr, stateTsType, setComponentName, setComponentBinding, componentHasBindings, componentHandleName, ON_LOAD, removeScreen, updateScreen, duplicateScreen, reorderScreen, insertBlock, setDataSource, setDeployTarget, setAuth, setDataLayer, seedUsers, defaultEntitySource, flattenBlocks, TAB_CHILD_KINDS, CONTAINER_CHILD_KINDS, CONTAINER_DISPLAY_KINDS, addTab, removeTab, renameTab, addTabBlock, addTabComponent, removeTabBlock, addAccordionSection, removeAccordionSection, renameAccordionSection, setAccordionMultiple, addAccordionBlock, addAccordionComponent, removeAccordionBlock, setEntityDataSource, entityDataSource, setTheme, setThemePreset, setShell, sanitizeProject, screenFromTemplate, addScreenFromTemplate, serializeProject, parseProject, validateProject, isProjectValid, blockColumns, blockStyleCss, blockClassName, sanitizeClassName, mergeBlockStyle, roleCanScreen, roleCanAction, CRUD_ACTIONS, } from './project.js';
29
+ export { verifyScaffold, summarizeVerify, } from './verify.js';
30
+ export { UI_COMPONENT_REGISTRY, uiComponentSpec, gridPropSurface, gridApiSettableProps, GRID_CURATED_PROPS, STANDARD_UI_EVENTS, } from './ui-components.js';
31
+ export { buildCopilotMessages, projectFromModelText } from './copilot-core.js';
32
+ export { resolveDeployTarget, deployCommands, missingEnvKeys, } from './deploy-cli.js';
33
+ export { runStudioAdd, runStudioAddApp, resolveSchema, resolveSchemas, } from './cli.js';
34
+ // Re-export the schema surface so consumers get everything from one entry.
35
+ export { resolveIdField, schemaToColumns, schemaToFormFields, linkRelationLabels, pickLabelField, } from '../schema.js';
36
+ // Pure license classification, so the Node/MCP generator can soft-gate with the
37
+ // same rules as the browser (see license-core.ts). No DOM, safe in Node.
38
+ export { checkLicenseKey } from '../license-core.js';
@@ -0,0 +1,58 @@
1
+ import type { StudioIO } from './cli.js';
2
+ import { type DbExecute, type SqlDialectName } from './introspect-db.js';
3
+ import { type StudioProject } from './project.js';
4
+ /** Terminal I/O, injected so the flow can be scripted in tests. */
5
+ export type PromptIO = {
6
+ /** Ask a question; `def` is used when the user just hits Enter. */
7
+ ask: (question: string, def?: string) => Promise<string>;
8
+ /** Print a line (progress, headings, results). */
9
+ say: (line: string) => void;
10
+ };
11
+ /** Live-database access, injected by the bin (drivers are node-only). */
12
+ export type DbGateway = {
13
+ /** Make sure the dialect's driver is installed; report why not if it isn't. */
14
+ ensureDriver: (dialect: SqlDialectName) => Promise<{
15
+ ok: boolean;
16
+ message?: string;
17
+ }>;
18
+ connect: (dialect: SqlDialectName, url: string) => Promise<DbExecute>;
19
+ };
20
+ /** Read a REST endpoint or an OpenAPI document (injected: the bin uses fetch/fs). */
21
+ export type FetchText = (source: string) => Promise<string>;
22
+ export type InitFlags = {
23
+ /** Where to write the app. Default `.`. */
24
+ out?: string;
25
+ /** Skip the source question and go straight to a live database. */
26
+ db?: SqlDialectName;
27
+ /** Connection string for `db`. */
28
+ url?: string;
29
+ /** Supabase project URL - skips the source question and both prompts. */
30
+ supabaseUrl?: string;
31
+ /** Supabase anon key. */
32
+ supabaseKey?: string;
33
+ /** Pick a starter dataset by id, skipping the source question. */
34
+ dataset?: string;
35
+ /** Theme preset id. */
36
+ theme?: string;
37
+ dark?: boolean;
38
+ /** App title (skips the question). */
39
+ title?: string;
40
+ /** Take every default; ask nothing that has one. */
41
+ yes?: boolean;
42
+ /** Write into a folder that already holds another app, without asking. */
43
+ force?: boolean;
44
+ };
45
+ export type InitResult = {
46
+ project: StudioProject;
47
+ /** Paths written, in order. */
48
+ written: string[];
49
+ /** What to tell the user to do next. */
50
+ nextSteps: string[];
51
+ };
52
+ /** Parse "all", "none", a comma list of names, or a list of 1-based numbers. */
53
+ export declare function parseSelection(answer: string, items: string[]): string[];
54
+ /**
55
+ * The whole guided flow: ask, build, write. Returns the project and what was
56
+ * written so the caller can print next steps (or assert them in a test).
57
+ */
58
+ export declare function runStudioInit(flags: InitFlags, prompts: PromptIO, db: DbGateway | null, io: StudioIO, fetchText?: FetchText | null): Promise<InitResult>;
@@ -0,0 +1,451 @@
1
+ import { crudAppFromSchemas } from './screen-suites.js';
2
+ import { starterDatasets, getStarterDataset } from './samples/datasets.js';
3
+ import { introspectDatabase, listDatabaseTables, countTableRows } from './introspect-db.js';
4
+ import { introspectOpenApi } from './introspect-openapi.js';
5
+ import { introspectJson } from './introspect.js';
6
+ import { introspectSupabaseTable, listSupabaseTables } from '../sources/introspect-supabase.js';
7
+ import { buildConnectionString, isFileDialect } from './db-connect-string.js';
8
+ import { emitStudioAppBundle } from './emit-project.js';
9
+ import { mergeManaged, skipUserOwned } from './scaffold.js';
10
+ import { getStudioTheme, studioThemes } from './themes.js';
11
+ import { UserError } from './user-error.js';
12
+ import { serializeProject } from './project.js';
13
+ const SOURCES = [
14
+ { key: 'sample', label: 'Sample data', hint: 'a seeded pair of related tables - see a working app immediately' },
15
+ { key: 'db', label: 'An existing database', hint: 'Postgres, MySQL, SQL Server or SQLite - reads your tables' },
16
+ { key: 'supabase', label: 'Supabase', hint: 'project URL + anon key, read over the REST API - no driver needed' },
17
+ { key: 'pglite', label: 'Local Postgres in the browser (PGlite)', hint: 'real SQL, persists, no server to set up' },
18
+ { key: 'rest', label: 'A REST API or OpenAPI spec', hint: 'infers the tables from the endpoint' },
19
+ ];
20
+ const DIALECTS = ['postgres', 'supabase', 'mysql', 'mssql', 'sqlite'];
21
+ /** Shown above the connection prompt so the expected shape is never a guess. */
22
+ const CONNECTION_EXAMPLES = {
23
+ postgres: 'postgres://user:password@localhost:5432/mydb',
24
+ supabase: 'postgres://postgres:password@db.abcdefgh.supabase.co:5432/postgres',
25
+ mysql: 'mysql://user:password@localhost:3306/mydb',
26
+ mssql: 'Server=localhost,1433;Database=mydb;User Id=sa;Password=secret;Encrypt=false',
27
+ sqlite: './data.db',
28
+ };
29
+ /**
30
+ * Files that mean the target folder already holds an app. Writing the bundle
31
+ * over one of these replaces it wholesale (they carry no managed markers), so
32
+ * the flow stops and asks first. A `studio.config.json` is the exception: that
33
+ * folder IS a Studio app, and re-running init there is a regenerate.
34
+ */
35
+ const CLOBBER_MARKERS = [
36
+ 'package.json',
37
+ 'svelte.config.js',
38
+ 'svelte.config.ts',
39
+ 'vite.config.ts',
40
+ 'src/routes/+layout.svelte',
41
+ '.env',
42
+ ];
43
+ /** Ask a numbered-list question; returns the chosen index. */
44
+ async function pick(prompts, heading, items, def = 1) {
45
+ prompts.say('');
46
+ prompts.say(heading);
47
+ items.forEach((item, i) => prompts.say(` ${i + 1}. ${item.label}${item.hint ? ` - ${item.hint}` : ''}`));
48
+ const answer = (await prompts.ask('Pick a number:', String(def))).trim();
49
+ const n = Number(answer);
50
+ return Number.isFinite(n) && n >= 1 && n <= items.length ? n - 1 : def - 1;
51
+ }
52
+ const isYes = (answer, def) => {
53
+ const a = answer.trim().toLowerCase();
54
+ if (!a)
55
+ return def;
56
+ return a === 'y' || a === 'yes';
57
+ };
58
+ /** Parse "all", "none", a comma list of names, or a list of 1-based numbers. */
59
+ export function parseSelection(answer, items) {
60
+ const raw = answer.trim();
61
+ if (!raw || raw.toLowerCase() === 'all' || raw === '*')
62
+ return items;
63
+ if (raw.toLowerCase() === 'none')
64
+ return [];
65
+ const picked = [];
66
+ for (const part of raw.split(',').map((p) => p.trim()).filter(Boolean)) {
67
+ const n = Number(part);
68
+ if (Number.isFinite(n) && n >= 1 && n <= items.length) {
69
+ const item = items[n - 1];
70
+ if (!picked.includes(item))
71
+ picked.push(item);
72
+ continue;
73
+ }
74
+ const match = items.find((i) => i.toLowerCase() === part.toLowerCase());
75
+ if (match && !picked.includes(match))
76
+ picked.push(match);
77
+ }
78
+ return picked;
79
+ }
80
+ /** The rows of a REST response: a bare array, or the usual wrapper key. */
81
+ function unwrapRows(body) {
82
+ if (Array.isArray(body))
83
+ return body;
84
+ if (body && typeof body === 'object') {
85
+ for (const key of ['data', 'items', 'results', 'rows', 'records']) {
86
+ const v = body[key];
87
+ if (Array.isArray(v))
88
+ return v;
89
+ }
90
+ return [body];
91
+ }
92
+ return [];
93
+ }
94
+ /** Step 1-2: where does the data come from, and what tables does it have? */
95
+ async function gatherData(flags, prompts, db, fetchText) {
96
+ let source = 'sample';
97
+ if (flags.db)
98
+ source = 'db';
99
+ else if (flags.supabaseUrl)
100
+ source = 'supabase';
101
+ else if (flags.dataset)
102
+ source = 'sample';
103
+ else if (!flags.yes)
104
+ source = SOURCES[await pick(prompts, 'Where should the app get its data?', [...SOURCES])].key;
105
+ if (source === 'db')
106
+ return gatherFromDatabase(flags, prompts, db);
107
+ if (source === 'supabase')
108
+ return gatherFromSupabase(flags, prompts);
109
+ if (source === 'rest')
110
+ return gatherFromRest(prompts, fetchText);
111
+ // Sample data, stored in memory or in PGlite.
112
+ let datasetId = flags.dataset ?? starterDatasets[0].id;
113
+ if (!flags.dataset && !flags.yes) {
114
+ const i = await pick(prompts, 'Pick a starter dataset:', starterDatasets.map((d) => ({ label: d.name, hint: d.description })));
115
+ datasetId = starterDatasets[i].id;
116
+ }
117
+ const dataset = getStarterDataset(datasetId);
118
+ if (!dataset) {
119
+ throw new UserError(`Unknown dataset "${datasetId}".`, `Try one of: ${starterDatasets.map((d) => d.id).join(', ')}`);
120
+ }
121
+ const { entities, seed } = dataset.build();
122
+ const kind = source === 'pglite' ? 'pglite' : 'memory';
123
+ const sources = {};
124
+ for (const e of entities)
125
+ sources[e.name] = kind === 'pglite' ? { kind: 'pglite', table: e.name } : { kind: 'memory' };
126
+ prompts.say(` Using ${dataset.name} (${entities.length} tables).`);
127
+ return { schemas: entities, sources, seed, kind, title: dataset.name };
128
+ }
129
+ async function gatherFromDatabase(flags, prompts, db) {
130
+ if (!db)
131
+ throw new UserError('Connecting to a database is not available here.');
132
+ let dialect = flags.db;
133
+ if (!dialect) {
134
+ const i = await pick(prompts, 'Which database?', DIALECTS.map((d) => ({ label: d })));
135
+ dialect = DIALECTS[i];
136
+ }
137
+ let url = flags.url ?? '';
138
+ if (!url) {
139
+ if (isFileDialect(dialect)) {
140
+ url = (await prompts.ask('Database file:', './data.db')).trim();
141
+ }
142
+ else {
143
+ // Show the shape of the answer: a bare "Connection string:" prompt is the
144
+ // most common place a first run stalls.
145
+ prompts.say('');
146
+ prompts.say(` Example: ${CONNECTION_EXAMPLES[dialect] ?? CONNECTION_EXAMPLES.postgres}`);
147
+ const answer = (await prompts.ask('Connection string (blank to enter host/port instead):', '')).trim();
148
+ url = answer || buildConnectionString(dialect, await askConnectionParts(prompts));
149
+ }
150
+ }
151
+ if (!url)
152
+ throw new UserError('A connection string is required.');
153
+ const driver = await db.ensureDriver(dialect);
154
+ if (!driver.ok)
155
+ throw new UserError(driver.message ?? `Could not install the ${dialect} driver.`);
156
+ prompts.say(' Connecting...');
157
+ // A refused connection, a bad host, wrong credentials: the driver throws its
158
+ // own message here. That is the user's connection string to fix, not a defect,
159
+ // so keep the driver's wording but stop it looking like a crash.
160
+ let execute;
161
+ let tables;
162
+ try {
163
+ execute = await db.connect(dialect, url);
164
+ tables = await listDatabaseTables(dialect, execute);
165
+ }
166
+ catch (e) {
167
+ throw new UserError(`Could not read the database: ${e instanceof Error ? e.message : String(e)}`, `Check the connection string. Expected shape: ${CONNECTION_EXAMPLES[dialect] ?? CONNECTION_EXAMPLES.postgres}`);
168
+ }
169
+ if (tables.length === 0) {
170
+ throw new UserError('Connected, but the database has no tables.', 'Check that the connection string points at the right database and schema.');
171
+ }
172
+ const counts = await countTableRows(dialect, execute, tables);
173
+ prompts.say('');
174
+ prompts.say(`Found ${tables.length} ${tables.length === 1 ? 'table' : 'tables'}:`);
175
+ counts.forEach((t, i) => prompts.say(` ${i + 1}. ${t.name}${t.rows == null ? '' : ` (${t.rows} rows)`}`));
176
+ const answer = flags.yes ? 'all' : await prompts.ask('Which tables? (all, or a comma list of names/numbers)', 'all');
177
+ const picked = parseSelection(answer, tables);
178
+ if (picked.length === 0)
179
+ throw new UserError('No tables picked - nothing to build.');
180
+ const schemas = [];
181
+ const sources = {};
182
+ for (const table of picked) {
183
+ try {
184
+ const schema = await introspectDatabase({ dialect, table, execute });
185
+ schemas.push(schema);
186
+ sources[schema.name] = { kind: 'sql', table, dialect };
187
+ }
188
+ catch (e) {
189
+ // One unreadable table must never sink the run.
190
+ prompts.say(` ! Skipped ${table}: ${e instanceof Error ? e.message : String(e)}`);
191
+ }
192
+ }
193
+ if (schemas.length === 0)
194
+ throw new UserError('None of the picked tables could be read.');
195
+ prompts.say(` Read ${schemas.length} ${schemas.length === 1 ? 'table' : 'tables'}.`);
196
+ return { schemas, sources, seed: {}, kind: 'sql' };
197
+ }
198
+ /**
199
+ * Supabase reads over its own REST API, so this needs no driver and no
200
+ * DbGateway - just the project URL and the anon key.
201
+ */
202
+ async function gatherFromSupabase(flags, prompts) {
203
+ if (!flags.supabaseUrl || !flags.supabaseKey) {
204
+ // The designer's wizard says where these live; the CLI used to leave people
205
+ // hunting for them.
206
+ prompts.say('');
207
+ prompts.say(" Both are in your Supabase project's API settings (Project Settings -> API).");
208
+ prompts.say(' The URL looks like https://abcdefgh.supabase.co');
209
+ }
210
+ const url = (flags.supabaseUrl ?? (await prompts.ask('Project URL:', ''))).trim();
211
+ const key = (flags.supabaseKey ?? (await prompts.ask('Anon key:', ''))).trim();
212
+ if (!url || !key)
213
+ throw new UserError('Both the project URL and the anon key are required.');
214
+ prompts.say(' Reading the API...');
215
+ let tables;
216
+ try {
217
+ tables = await listSupabaseTables(url, key);
218
+ }
219
+ catch (e) {
220
+ throw new UserError(`Could not reach ${url}: ${e instanceof Error ? e.message : String(e)}`, "Check the project URL and anon key in Project Settings -> API.");
221
+ }
222
+ let picked;
223
+ if (tables.length) {
224
+ prompts.say('');
225
+ prompts.say(`Found ${tables.length} ${tables.length === 1 ? 'table' : 'tables'}:`);
226
+ tables.forEach((t, i) => prompts.say(` ${i + 1}. ${t}`));
227
+ const answer = flags.yes ? 'all' : await prompts.ask('Which tables? (all, or a comma list of names/numbers)', 'all');
228
+ picked = parseSelection(answer, tables);
229
+ }
230
+ else {
231
+ // The API doc is often CORS-blocked or restricted; naming the tables by hand
232
+ // still works because each one is introspected individually.
233
+ prompts.say(" Couldn't list the tables (the API doc may be restricted for this key).");
234
+ const typed = await prompts.ask('Table names (comma separated):', '');
235
+ picked = typed.split(',').map((t) => t.trim()).filter(Boolean);
236
+ }
237
+ if (picked.length === 0)
238
+ throw new UserError('No tables picked - nothing to build.');
239
+ const schemas = [];
240
+ const sources = {};
241
+ for (const table of picked) {
242
+ const schema = await introspectSupabaseTable({ url, key, table });
243
+ if (!schema?.fields.length) {
244
+ prompts.say(` ! Skipped ${table}: no columns could be read.`);
245
+ continue;
246
+ }
247
+ schemas.push(schema);
248
+ sources[schema.name] = { kind: 'supabase', table, url, key };
249
+ }
250
+ if (schemas.length === 0)
251
+ throw new UserError('None of the picked tables could be read.');
252
+ prompts.say(` Read ${schemas.length} ${schemas.length === 1 ? 'table' : 'tables'}.`);
253
+ return { schemas, sources, seed: {}, kind: 'supabase' };
254
+ }
255
+ async function askConnectionParts(prompts) {
256
+ return {
257
+ host: (await prompts.ask('Host:', 'localhost')).trim(),
258
+ port: (await prompts.ask('Port:', '')).trim(),
259
+ database: (await prompts.ask('Database:', 'app')).trim(),
260
+ user: (await prompts.ask('User:', 'postgres')).trim(),
261
+ password: (await prompts.ask('Password:', '')).trim(),
262
+ };
263
+ }
264
+ async function gatherFromRest(prompts, fetchText) {
265
+ if (!fetchText)
266
+ throw new UserError('Reading a REST endpoint is not available here.');
267
+ const src = (await prompts.ask('OpenAPI spec (file or URL), or a REST endpoint returning rows:', '')).trim();
268
+ if (!src)
269
+ throw new UserError('A spec path/URL or endpoint is required.');
270
+ const text = await fetchText(src);
271
+ // An OpenAPI document describes every resource; a plain endpoint gives one.
272
+ if (/"(openapi|swagger|paths)"\s*:/.test(text)) {
273
+ const { entities, sources, warnings } = introspectOpenApi(text);
274
+ for (const w of warnings)
275
+ prompts.say(` ! ${w}`);
276
+ if (entities.length === 0)
277
+ throw new UserError('The spec described no collection resources.');
278
+ prompts.say(` Read ${entities.length} REST ${entities.length === 1 ? 'resource' : 'resources'}.`);
279
+ return { schemas: entities, sources, seed: {}, kind: 'rest' };
280
+ }
281
+ let rows;
282
+ try {
283
+ rows = unwrapRows(JSON.parse(text));
284
+ }
285
+ catch {
286
+ throw new UserError(`${src} did not return JSON.`, 'Point this at an endpoint that returns rows, or at an OpenAPI (JSON) document.');
287
+ }
288
+ if (rows.length === 0)
289
+ throw new UserError('The endpoint returned no rows to read a shape from.');
290
+ // A local file path or a bare hostname reaches this line too; `new URL` would
291
+ // throw a raw "Invalid URL" that reads like a crash.
292
+ let url;
293
+ try {
294
+ url = new URL(src);
295
+ }
296
+ catch {
297
+ throw new UserError(`"${src}" is not a full URL, so there is no endpoint to call at runtime.`, 'Pass the absolute endpoint, for example https://api.example.com/widgets');
298
+ }
299
+ const path = url.pathname.replace(/^\/+|\/+$/g, '');
300
+ const suggested = path.split('/').filter(Boolean).pop() || 'items';
301
+ const name = ((await prompts.ask('Table name:', suggested)).trim() || suggested).replace(/\W+/g, '_');
302
+ const schema = introspectJson(name, rows);
303
+ prompts.say(` Read ${schema.fields.length} fields from ${rows.length} rows.`);
304
+ return {
305
+ schemas: [schema],
306
+ sources: { [name]: { kind: 'rest', baseUrl: url.origin, path, method: 'GET', params: [] } },
307
+ seed: {},
308
+ kind: 'rest',
309
+ };
310
+ }
311
+ /** Step 3: which pages does each table get, and how are rows edited? */
312
+ async function askScreens(schemas, flags, prompts) {
313
+ const perEntity = {};
314
+ let editing = 'form';
315
+ let full = true;
316
+ if (!flags.yes) {
317
+ full = isYes(await prompts.ask('\nGenerate a list, an edit form and a record page for each table? (Y/n)', 'y'), true);
318
+ const modes = [
319
+ { label: 'A popup form', value: 'form' },
320
+ { label: 'In the grid (like a spreadsheet)', value: 'inline' },
321
+ { label: 'On the record page', value: 'detail' },
322
+ ];
323
+ editing = modes[await pick(prompts, 'How should rows be edited?', modes)].value;
324
+ }
325
+ for (const schema of schemas) {
326
+ const hasChildren = schemas.some((e) => e.fields.some((f) => f.type === 'relation' && f.relation?.entity === schema.name));
327
+ const screens = full
328
+ ? hasChildren || editing === 'detail' ? ['list', 'form', 'detail'] : ['list', 'form']
329
+ : ['list'];
330
+ perEntity[schema.name] = { screens, editing };
331
+ }
332
+ return perEntity;
333
+ }
334
+ /** Step 4: the app's look. */
335
+ async function askTheme(flags, prompts) {
336
+ let preset = flags.theme?.trim().toLowerCase();
337
+ if (preset && !getStudioTheme(preset)) {
338
+ prompts.say(` ! Unknown theme "${preset}" - using tailwind.`);
339
+ preset = undefined;
340
+ }
341
+ if (!preset && !flags.yes) {
342
+ const i = await pick(prompts, 'Theme:', studioThemes.map((t) => ({ label: t.name, hint: t.id })));
343
+ preset = studioThemes[i]?.id;
344
+ }
345
+ preset ?? (preset = 'tailwind');
346
+ const dark = flags.dark ?? (flags.yes ? false : isYes(await prompts.ask('Dark mode? (y/N)', 'n'), false));
347
+ return { preset, mode: dark ? 'dark' : 'light' };
348
+ }
349
+ /** Prefix a path with the output folder (`.` writes into the current one). */
350
+ const inDir = (outDir, path) => (!outDir || outDir === '.' ? '' : outDir.replace(/[\\/]+$/, '') + '/') + path;
351
+ /** Which marker files are present in `outDir` right now. */
352
+ async function markersIn(outDir, io) {
353
+ const found = new Set();
354
+ for (const marker of CLOBBER_MARKERS) {
355
+ if ((await io.readFile(inDir(outDir, marker))) != null)
356
+ found.add(marker);
357
+ }
358
+ return found;
359
+ }
360
+ /**
361
+ * Stop before overwriting somebody else's app.
362
+ *
363
+ * `init` defaults to the current folder, and bare `svgrid-studio` in a terminal
364
+ * runs it, so a mistaken run inside an existing project would replace its
365
+ * package.json, svelte config and .env without a word. Re-running init on a
366
+ * folder Studio itself generated is a regenerate, not a clobber, so a
367
+ * `studio.config.json` waves the check through.
368
+ *
369
+ * `before` is the set of markers seen at startup, and only those count. Picking a
370
+ * database makes Studio install a driver into this folder first, which writes a
371
+ * package.json - without the snapshot the flow would trip over a file it had
372
+ * just created itself and refuse to build anything.
373
+ */
374
+ async function confirmTargetFolder(outDir, flags, prompts, io, before) {
375
+ if (flags.force)
376
+ return;
377
+ if ((await io.readFile(inDir(outDir, 'studio.config.json'))) != null)
378
+ return;
379
+ const present = await markersIn(outDir, io);
380
+ // `before` only describes the folder it was taken in; anywhere else, whatever
381
+ // is on disk now was there before we started.
382
+ const found = CLOBBER_MARKERS.filter((m) => present.has(m) && (before == null || before.has(m)));
383
+ if (found.length === 0)
384
+ return;
385
+ const where = !outDir || outDir === '.' ? 'This folder' : outDir;
386
+ const message = `${where} already has ${found.join(', ')}, and Studio would overwrite ${found.length === 1 ? 'it' : 'them'}.`;
387
+ if (flags.yes) {
388
+ throw new UserError(message, 'Pick an empty folder with --out <dir>, or pass --force to overwrite anyway.');
389
+ }
390
+ prompts.say('');
391
+ prompts.say(` ! ${message}`);
392
+ if (!isYes(await prompts.ask('Overwrite? (y/N)', 'n'), false)) {
393
+ throw new UserError('Stopped without writing anything.', 'Re-run with --out <dir> to build somewhere else.');
394
+ }
395
+ }
396
+ /** Merge-write the generated files, preserving edits outside managed regions. */
397
+ async function writeAll(files, outDir, io) {
398
+ const written = [];
399
+ for (const file of files) {
400
+ const path = inDir(outDir, file.path);
401
+ const existing = await io.readFile(path);
402
+ if (skipUserOwned(file, existing != null))
403
+ continue;
404
+ await io.writeFile(path, mergeManaged(existing, file.contents));
405
+ written.push(path);
406
+ }
407
+ return written;
408
+ }
409
+ /**
410
+ * The whole guided flow: ask, build, write. Returns the project and what was
411
+ * written so the caller can print next steps (or assert them in a test).
412
+ */
413
+ export async function runStudioInit(flags, prompts, db, io, fetchText = null) {
414
+ prompts.say('SvGrid Studio - let\'s build your app.');
415
+ // Snapshot the likely target before anything (a driver install, say) can add
416
+ // files to it, so the overwrite guard below judges the folder as the user left
417
+ // it rather than as Studio just changed it.
418
+ const candidateDir = flags.out ?? '.';
419
+ const markersBefore = await markersIn(candidateDir, io);
420
+ const data = await gatherData(flags, prompts, db, fetchText);
421
+ const perEntity = await askScreens(data.schemas, flags, prompts);
422
+ const theme = await askTheme(flags, prompts);
423
+ const defaultTitle = flags.title ?? data.title ?? 'My app';
424
+ const title = flags.yes || flags.title ? defaultTitle : (await prompts.ask('\nApp name:', defaultTitle)).trim() || defaultTitle;
425
+ const outDir = flags.out ?? (flags.yes ? '.' : (await prompts.ask('Write it where?', '.')).trim() || '.');
426
+ await confirmTargetFolder(outDir, flags, prompts, io, outDir === candidateDir ? markersBefore : null);
427
+ const project = crudAppFromSchemas(data.schemas, {
428
+ title,
429
+ dataSource: data.kind,
430
+ sources: data.sources,
431
+ seed: data.seed,
432
+ perEntity,
433
+ overviewDashboard: true,
434
+ ...(theme ? { theme } : {}),
435
+ });
436
+ const files = emitStudioAppBundle(project);
437
+ const written = await writeAll(files, outDir, io);
438
+ // The design itself, so `svgrid-studio designer` reopens exactly this app.
439
+ const configPath = inDir(outDir, 'studio.config.json');
440
+ await io.writeFile(configPath, serializeProject(project));
441
+ written.push(configPath);
442
+ prompts.say('');
443
+ prompts.say(`Built "${title}": ${data.schemas.length} ${data.schemas.length === 1 ? 'table' : 'tables'}, ${project.screens.length} screens, ${written.length} files.`);
444
+ const nextSteps = [
445
+ ...(outDir && outDir !== '.' ? [`cd ${outDir}`] : []),
446
+ 'npm install',
447
+ 'npm run dev',
448
+ 'svgrid-studio designer # keep editing it visually',
449
+ ];
450
+ return { project, written, nextSteps };
451
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Live-database introspection - "connect to your database and scaffold". Reads
3
+ * a table's columns straight from the database catalog and maps them to an
4
+ * `EntitySchema`. Covers PostgreSQL (and Supabase, which is Postgres), MySQL,
5
+ * SQL Server, and SQLite.
6
+ *
7
+ * Driver-free, like `createSqlDataSource`: you pass an `execute(sql, params)`
8
+ * backed by your own connected client (pg, postgres.js, mysql2, mssql,
9
+ * better-sqlite3, the Supabase client, ...). Nothing here imports a driver, so
10
+ * it's testable and adds no dependencies.
11
+ */
12
+ import type { EntityFieldType, EntitySchema } from '../schema.js';
13
+ export type SqlDialectName = 'postgres' | 'supabase' | 'mysql' | 'mssql' | 'sqlite';
14
+ export type DbExecute = (sql: string, params: unknown[]) => Promise<Array<Record<string, unknown>>>;
15
+ /** Best-effort SQL type -> entity field type. The designer can refine edge cases. */
16
+ export declare function mapSqlType(raw: string): EntityFieldType;
17
+ export type IntrospectDbOptions = {
18
+ dialect: SqlDialectName;
19
+ table: string;
20
+ execute: DbExecute;
21
+ };
22
+ /** Read one table's columns (and foreign keys) from the live database into an EntitySchema. */
23
+ export declare function introspectDatabase(options: IntrospectDbOptions): Promise<EntitySchema>;
24
+ /** List the base tables in the connected database. */
25
+ export declare function listDatabaseTables(dialect: SqlDialectName, execute: DbExecute): Promise<string[]>;
26
+ export type TableRowCount = {
27
+ name: string;
28
+ rows: number | null;
29
+ };
30
+ /**
31
+ * Count rows in each table - powers the designer's "Test connection" step, which
32
+ * shows the user their real data volumes before they commit to importing. Fully
33
+ * resilient: a table that can't be counted (permissions, a view) yields
34
+ * `rows: null` instead of failing the whole probe.
35
+ */
36
+ export declare function countTableRows(dialect: SqlDialectName, execute: DbExecute, tables: string[]): Promise<TableRowCount[]>;
37
+ /**
38
+ * One round-trip "test connection": confirm we can talk to the database, list
39
+ * its tables, and (optionally) report each table's row count. Throws only if the
40
+ * connection itself is unusable (the caller maps that to a friendly message).
41
+ */
42
+ export declare function probeConnection(dialect: SqlDialectName, execute: DbExecute, opts?: {
43
+ counts?: boolean;
44
+ }): Promise<{
45
+ ok: true;
46
+ tables: TableRowCount[];
47
+ }>;