@svgrid/enterprise 2.5.3 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (624) hide show
  1. package/dist/SvAlertRuleEditor.svelte.d.ts +13 -0
  2. package/dist/SvAlertsManager.svelte.d.ts +14 -0
  3. package/dist/SvAlertsPanel.svelte.d.ts +9 -0
  4. package/dist/SvAuthGate.svelte.d.ts +22 -0
  5. package/dist/SvBoard.svelte.d.ts +35 -0
  6. package/dist/SvExportMenu.svelte.d.ts +61 -0
  7. package/{src → dist}/SvExpressionEditor.svelte +4 -1
  8. package/dist/SvExpressionEditor.svelte.d.ts +12 -0
  9. package/dist/SvFileInput.svelte.d.ts +20 -0
  10. package/dist/SvGridAlerts.svelte.d.ts +77 -0
  11. package/dist/SvGridBoard.svelte.d.ts +30 -0
  12. package/{src → dist}/SvGridEditPanel.svelte +173 -28
  13. package/dist/SvGridEditPanel.svelte.d.ts +75 -0
  14. package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
  15. package/dist/SvGridScheduler.svelte.d.ts +30 -0
  16. package/dist/SvImportDialog.svelte.d.ts +88 -0
  17. package/dist/SvLookupInput.svelte.d.ts +21 -0
  18. package/dist/SvPivotDesigner.svelte.d.ts +176 -0
  19. package/dist/SvRecordDetail.svelte.d.ts +58 -0
  20. package/dist/SvSchedule.svelte.d.ts +29 -0
  21. package/dist/SvSchemaChart.svelte.d.ts +61 -0
  22. package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
  23. package/dist/alerts/alert-engine-attach.d.ts +79 -0
  24. package/dist/alerts/alert-engine-attach.js +106 -0
  25. package/dist/alerts/alert-engine.d.ts +42 -0
  26. package/dist/alerts/alert-engine.js +196 -0
  27. package/dist/alerts/alert-formats.d.ts +26 -0
  28. package/dist/alerts/alert-formats.js +58 -0
  29. package/dist/alerts/alert-observer.d.ts +54 -0
  30. package/dist/alerts/alert-observer.js +156 -0
  31. package/dist/alerts/alert-scheduler.d.ts +30 -0
  32. package/dist/alerts/alert-scheduler.js +54 -0
  33. package/dist/alerts/alert-storage.d.ts +31 -0
  34. package/dist/alerts/alert-storage.js +92 -0
  35. package/dist/alerts/alert-store.svelte.d.ts +24 -0
  36. package/dist/alerts/alert-store.svelte.js +69 -0
  37. package/dist/alerts/alert-types.d.ts +86 -0
  38. package/dist/alerts/alert-types.js +1 -0
  39. package/dist/alerts.d.ts +2 -0
  40. package/{src/alerts.ts → dist/alerts.js} +9 -9
  41. package/dist/board.d.ts +7 -0
  42. package/{src/board.ts → dist/board.js} +13 -14
  43. package/dist/cdn/svgrid-enterprise.svelte-external.js +3220 -2607
  44. package/dist/designer/assets/index-BfzoL904.css +1 -0
  45. package/dist/designer/assets/{index-CBYU-KNn.js → index-CKdwDseq.js} +139 -139
  46. package/dist/designer/assets/src-DCKhP5Xy.css +1 -0
  47. package/dist/designer/assets/{src-i309BeJb.js → src-DLsSdh3J.js} +213 -193
  48. package/dist/designer/index.html +4 -4
  49. package/dist/edit-panel.d.ts +105 -0
  50. package/dist/edit-panel.js +350 -0
  51. package/dist/export-conditional.d.ts +31 -0
  52. package/dist/export-conditional.js +65 -0
  53. package/dist/export-ooxml.d.ts +93 -0
  54. package/dist/export-ooxml.js +385 -0
  55. package/dist/export-pdf.d.ts +107 -0
  56. package/dist/export-pdf.js +144 -0
  57. package/dist/export-print.d.ts +55 -0
  58. package/dist/export-print.js +91 -0
  59. package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
  60. package/dist/export-serialize.js +11 -0
  61. package/dist/export-xls.d.ts +26 -0
  62. package/dist/export-xls.js +157 -0
  63. package/dist/export.d.ts +323 -0
  64. package/dist/export.js +1021 -0
  65. package/dist/expressions/evaluate.d.ts +17 -0
  66. package/dist/expressions/evaluate.js +214 -0
  67. package/dist/expressions/expression-columns.d.ts +61 -0
  68. package/dist/expressions/expression-columns.js +72 -0
  69. package/dist/expressions/expression-types.d.ts +125 -0
  70. package/dist/expressions/expression-types.js +1 -0
  71. package/dist/expressions/parse.d.ts +25 -0
  72. package/dist/expressions/parse.js +537 -0
  73. package/dist/import.d.ts +232 -0
  74. package/dist/import.js +846 -0
  75. package/dist/index.d.ts +66 -0
  76. package/dist/index.js +91 -0
  77. package/dist/install.d.ts +70 -0
  78. package/dist/install.js +61 -0
  79. package/dist/license-core.d.ts +37 -0
  80. package/dist/license-core.js +81 -0
  81. package/dist/license.d.ts +30 -0
  82. package/dist/license.js +139 -0
  83. package/dist/master-detail.d.ts +23 -0
  84. package/dist/master-detail.js +35 -0
  85. package/dist/node/studio.js +683 -13
  86. package/dist/pivot-chart.d.ts +28 -0
  87. package/dist/pivot-chart.js +71 -0
  88. package/dist/pivot-designer.d.ts +69 -0
  89. package/dist/pivot-designer.js +38 -0
  90. package/dist/pivot-enable.d.ts +6 -0
  91. package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
  92. package/dist/pivot.d.ts +111 -0
  93. package/dist/pivot.js +353 -0
  94. package/dist/print.d.ts +33 -0
  95. package/dist/print.js +61 -0
  96. package/dist/revoked.d.ts +1 -0
  97. package/{src/revoked.ts → dist/revoked.js} +5 -6
  98. package/dist/scheduler-assignments.d.ts +64 -0
  99. package/dist/scheduler-assignments.js +92 -0
  100. package/dist/scheduler-axis.d.ts +81 -0
  101. package/dist/scheduler-axis.js +180 -0
  102. package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
  103. package/dist/scheduler-booking.js +50 -0
  104. package/dist/scheduler-config.d.ts +177 -0
  105. package/dist/scheduler-config.js +1 -0
  106. package/dist/scheduler-dependencies.d.ts +89 -0
  107. package/dist/scheduler-dependencies.js +179 -0
  108. package/dist/scheduler-freebusy.d.ts +19 -0
  109. package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
  110. package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
  111. package/dist/scheduler-heatmap.js +41 -0
  112. package/dist/scheduler-resource-tree.d.ts +48 -0
  113. package/dist/scheduler-resource-tree.js +78 -0
  114. package/dist/scheduler-slots.d.ts +37 -0
  115. package/dist/scheduler-slots.js +80 -0
  116. package/dist/scheduler-summary.d.ts +41 -0
  117. package/dist/scheduler-summary.js +54 -0
  118. package/dist/scheduler.d.ts +7 -0
  119. package/{src/scheduler.ts → dist/scheduler.js} +13 -14
  120. package/dist/scheduling.d.ts +132 -0
  121. package/dist/scheduling.js +228 -0
  122. package/dist/schema-designer.d.ts +42 -0
  123. package/dist/schema-designer.js +117 -0
  124. package/dist/schema.d.ts +408 -0
  125. package/dist/schema.js +225 -0
  126. package/dist/smart-shim.d.ts +62 -0
  127. package/dist/smart-shim.js +34 -0
  128. package/dist/sources/aggregate.d.ts +43 -0
  129. package/dist/sources/aggregate.js +60 -0
  130. package/dist/sources/auth-supabase.d.ts +69 -0
  131. package/dist/sources/auth-supabase.js +39 -0
  132. package/dist/sources/dashboard.d.ts +65 -0
  133. package/dist/sources/dashboard.js +95 -0
  134. package/dist/sources/field-inference.d.ts +23 -0
  135. package/dist/sources/field-inference.js +52 -0
  136. package/dist/sources/filters.d.ts +35 -0
  137. package/dist/sources/filters.js +52 -0
  138. package/dist/sources/index.d.ts +18 -0
  139. package/dist/sources/index.js +18 -0
  140. package/dist/sources/introspect-supabase.d.ts +30 -0
  141. package/dist/sources/introspect-supabase.js +134 -0
  142. package/dist/sources/realtime-supabase.d.ts +37 -0
  143. package/dist/sources/realtime-supabase.js +52 -0
  144. package/dist/sources/relation-lookup.d.ts +50 -0
  145. package/dist/sources/relation-lookup.js +77 -0
  146. package/dist/sources/rest-adapters.d.ts +48 -0
  147. package/dist/sources/rest-adapters.js +85 -0
  148. package/dist/sources/rest.d.ts +38 -0
  149. package/dist/sources/rest.js +86 -0
  150. package/dist/sources/schema-from-columns.d.ts +37 -0
  151. package/dist/sources/schema-from-columns.js +48 -0
  152. package/dist/sources/supabase.d.ts +33 -0
  153. package/dist/sources/supabase.js +74 -0
  154. package/dist/sources/with-entity-rules.d.ts +25 -0
  155. package/dist/sources/with-entity-rules.js +47 -0
  156. package/dist/sources/with-relation-labels.d.ts +26 -0
  157. package/dist/sources/with-relation-labels.js +38 -0
  158. package/dist/staged-editing.d.ts +85 -0
  159. package/dist/staged-editing.js +0 -0
  160. package/dist/studio/bug-report.d.ts +61 -0
  161. package/dist/studio/bug-report.js +126 -0
  162. package/dist/studio/cli.d.ts +56 -0
  163. package/dist/studio/cli.js +70 -0
  164. package/dist/studio/copilot-core.d.ts +22 -0
  165. package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
  166. package/dist/studio/csv.d.ts +36 -0
  167. package/dist/studio/csv.js +173 -0
  168. package/dist/studio/db-connect-string.d.ts +45 -0
  169. package/dist/studio/db-connect-string.js +113 -0
  170. package/dist/studio/deploy-cli.d.ts +35 -0
  171. package/dist/studio/deploy-cli.js +81 -0
  172. package/dist/studio/emit-project.d.ts +77 -0
  173. package/dist/studio/emit-project.js +5463 -0
  174. package/dist/studio/emit-schema.d.ts +110 -0
  175. package/dist/studio/emit-schema.js +1128 -0
  176. package/dist/studio/index.d.ts +35 -0
  177. package/dist/studio/index.js +41 -0
  178. package/dist/studio/init-flow.d.ts +58 -0
  179. package/dist/studio/init-flow.js +451 -0
  180. package/dist/studio/introspect-db.d.ts +47 -0
  181. package/dist/studio/introspect-db.js +255 -0
  182. package/dist/studio/introspect-openapi.d.ts +19 -0
  183. package/dist/studio/introspect-openapi.js +244 -0
  184. package/dist/studio/introspect-prisma.d.ts +25 -0
  185. package/dist/studio/introspect-prisma.js +164 -0
  186. package/dist/studio/introspect.d.ts +35 -0
  187. package/dist/studio/introspect.js +306 -0
  188. package/dist/studio/project.d.ts +1448 -0
  189. package/dist/studio/project.js +2187 -0
  190. package/dist/studio/sample-data.d.ts +19 -0
  191. package/dist/studio/sample-data.js +207 -0
  192. package/dist/studio/samples/ats.d.ts +2 -0
  193. package/dist/studio/samples/ats.js +194 -0
  194. package/dist/studio/samples/clinic.d.ts +2 -0
  195. package/dist/studio/samples/clinic.js +171 -0
  196. package/dist/studio/samples/crm.d.ts +2 -0
  197. package/dist/studio/samples/crm.js +280 -0
  198. package/dist/studio/samples/datasets.d.ts +38 -0
  199. package/dist/studio/samples/datasets.js +296 -0
  200. package/dist/studio/samples/ecommerce.d.ts +2 -0
  201. package/dist/studio/samples/ecommerce.js +178 -0
  202. package/dist/studio/samples/events.d.ts +2 -0
  203. package/dist/studio/samples/events.js +192 -0
  204. package/dist/studio/samples/fleet.d.ts +2 -0
  205. package/dist/studio/samples/fleet.js +203 -0
  206. package/dist/studio/samples/gym.d.ts +2 -0
  207. package/dist/studio/samples/gym.js +205 -0
  208. package/dist/studio/samples/hr.d.ts +2 -0
  209. package/dist/studio/samples/hr.js +186 -0
  210. package/dist/studio/samples/index.d.ts +13 -0
  211. package/dist/studio/samples/index.js +44 -0
  212. package/dist/studio/samples/insurance.d.ts +2 -0
  213. package/dist/studio/samples/insurance.js +220 -0
  214. package/dist/studio/samples/inventory.d.ts +2 -0
  215. package/dist/studio/samples/inventory.js +204 -0
  216. package/dist/studio/samples/invoicing.d.ts +2 -0
  217. package/dist/studio/samples/invoicing.js +154 -0
  218. package/dist/studio/samples/library.d.ts +2 -0
  219. package/dist/studio/samples/library.js +171 -0
  220. package/dist/studio/samples/live-data.d.ts +5 -0
  221. package/dist/studio/samples/live-data.js +261 -0
  222. package/dist/studio/samples/projects.d.ts +2 -0
  223. package/dist/studio/samples/projects.js +203 -0
  224. package/dist/studio/samples/realestate.d.ts +2 -0
  225. package/dist/studio/samples/realestate.js +187 -0
  226. package/dist/studio/samples/restaurant.d.ts +2 -0
  227. package/dist/studio/samples/restaurant.js +180 -0
  228. package/dist/studio/samples/school.d.ts +2 -0
  229. package/dist/studio/samples/school.js +188 -0
  230. package/dist/studio/samples/shared.d.ts +142 -0
  231. package/dist/studio/samples/shared.js +164 -0
  232. package/dist/studio/samples/starter.d.ts +4 -0
  233. package/dist/studio/samples/starter.js +237 -0
  234. package/dist/studio/samples/subscriptions.d.ts +2 -0
  235. package/dist/studio/samples/subscriptions.js +175 -0
  236. package/dist/studio/samples/support.d.ts +2 -0
  237. package/dist/studio/samples/support.js +209 -0
  238. package/dist/studio/scaffold-app.d.ts +22 -0
  239. package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
  240. package/dist/studio/scaffold.d.ts +63 -0
  241. package/dist/studio/scaffold.js +346 -0
  242. package/dist/studio/screen-suites.d.ts +193 -0
  243. package/dist/studio/screen-suites.js +297 -0
  244. package/dist/studio/themes.d.ts +34 -0
  245. package/dist/studio/themes.js +41 -0
  246. package/dist/studio/ui-components.d.ts +89 -0
  247. package/dist/studio/ui-components.generated.d.ts +29 -0
  248. package/dist/studio/ui-components.generated.js +7319 -0
  249. package/dist/studio/ui-components.js +673 -0
  250. package/dist/studio/user-error.d.ts +23 -0
  251. package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
  252. package/dist/studio/verify.d.ts +34 -0
  253. package/dist/studio/verify.js +47 -0
  254. package/dist/sveltekit/in-memory.d.ts +14 -0
  255. package/dist/sveltekit/in-memory.js +113 -0
  256. package/dist/sveltekit/index.d.ts +6 -0
  257. package/dist/sveltekit/index.js +5 -0
  258. package/dist/sveltekit/query-plan.d.ts +44 -0
  259. package/dist/sveltekit/query-plan.js +76 -0
  260. package/dist/sveltekit/sql-source.d.ts +47 -0
  261. package/dist/sveltekit/sql-source.js +106 -0
  262. package/dist/sveltekit/sql.d.ts +48 -0
  263. package/dist/sveltekit/sql.js +73 -0
  264. package/dist/sveltekit/transport.d.ts +209 -0
  265. package/dist/sveltekit/transport.js +219 -0
  266. package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
  267. package/dist/sveltekit/types.js +1 -0
  268. package/dist/upgrade-prompt.d.ts +16 -0
  269. package/dist/upgrade-prompt.js +141 -0
  270. package/dist/version.d.ts +13 -0
  271. package/{src/version.ts → dist/version.js} +1 -1
  272. package/dist/watermark.d.ts +2 -0
  273. package/dist/watermark.js +146 -0
  274. package/package.json +28 -26
  275. package/dist/designer/assets/index-oYok52zd.css +0 -1
  276. package/dist/designer/assets/src-D-O2F805.css +0 -1
  277. package/src/SvBoard.dom.test.ts +0 -67
  278. package/src/SvGridAlerts.dom.test.ts +0 -113
  279. package/src/SvGridEditPanel.dom.test.ts +0 -320
  280. package/src/SvRecordDetail.dom.test.ts +0 -137
  281. package/src/SvSchedule.dom.test.ts +0 -57
  282. package/src/ai-export-pdf.dom.test.ts +0 -77
  283. package/src/ai-export-xlsx.dom.test.ts +0 -90
  284. package/src/ai-export.dom.test.ts +0 -114
  285. package/src/alerts/alert-engine-attach.ts +0 -165
  286. package/src/alerts/alert-engine.test.ts +0 -135
  287. package/src/alerts/alert-engine.ts +0 -260
  288. package/src/alerts/alert-formats.test.ts +0 -87
  289. package/src/alerts/alert-formats.ts +0 -77
  290. package/src/alerts/alert-observer.test.ts +0 -189
  291. package/src/alerts/alert-observer.ts +0 -208
  292. package/src/alerts/alert-scheduler.ts +0 -96
  293. package/src/alerts/alert-storage.test.ts +0 -54
  294. package/src/alerts/alert-storage.ts +0 -116
  295. package/src/alerts/alert-store.svelte.ts +0 -80
  296. package/src/alerts/alert-types.ts +0 -94
  297. package/src/board.dom.test.ts +0 -941
  298. package/src/edit-panel.test.ts +0 -322
  299. package/src/edit-panel.ts +0 -379
  300. package/src/export-conditional.test.ts +0 -60
  301. package/src/export-conditional.ts +0 -94
  302. package/src/export-ooxml.test.ts +0 -152
  303. package/src/export-ooxml.ts +0 -489
  304. package/src/export-pdf.test.ts +0 -138
  305. package/src/export-pdf.ts +0 -245
  306. package/src/export-print.test.ts +0 -66
  307. package/src/export-print.ts +0 -132
  308. package/src/export-serialize.test.ts +0 -56
  309. package/src/export-xls.ts +0 -199
  310. package/src/export-xlsx-roundtrip.test.ts +0 -120
  311. package/src/export-xlsx.test.ts +0 -150
  312. package/src/export.test.ts +0 -349
  313. package/src/export.ts +0 -1464
  314. package/src/expressions/evaluate.test.ts +0 -111
  315. package/src/expressions/evaluate.ts +0 -237
  316. package/src/expressions/expression-columns.ts +0 -133
  317. package/src/expressions/expression-types.ts +0 -84
  318. package/src/expressions/parse.test.ts +0 -106
  319. package/src/expressions/parse.ts +0 -610
  320. package/src/import-automap.test.ts +0 -131
  321. package/src/import-hardening.test.ts +0 -158
  322. package/src/import.test.ts +0 -415
  323. package/src/import.ts +0 -1044
  324. package/src/index.ts +0 -569
  325. package/src/install.ts +0 -154
  326. package/src/license-core.test.ts +0 -23
  327. package/src/license-core.ts +0 -107
  328. package/src/license-expiry.test.ts +0 -144
  329. package/src/license.ts +0 -157
  330. package/src/master-detail.test.ts +0 -61
  331. package/src/master-detail.ts +0 -42
  332. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  333. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
  334. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
  335. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
  336. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
  337. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
  338. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
  339. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
  340. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
  341. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
  342. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
  343. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
  344. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
  345. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
  346. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
  347. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  348. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  349. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  350. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  351. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  352. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  353. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  354. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  355. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  356. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  357. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  358. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  359. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  360. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  361. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  362. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  363. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  364. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  365. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  366. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  367. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  368. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  369. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  370. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  371. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  372. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  373. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  374. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  375. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  376. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  377. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  378. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  379. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  380. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  381. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  382. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
  383. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
  384. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
  385. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
  386. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
  387. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
  388. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
  389. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
  390. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
  391. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
  392. package/src/pivot-chart.test.ts +0 -86
  393. package/src/pivot-chart.ts +0 -112
  394. package/src/pivot-designer.ts +0 -101
  395. package/src/pivot.test.ts +0 -335
  396. package/src/pivot.ts +0 -578
  397. package/src/print.ts +0 -107
  398. package/src/scheduler-assignments.test.ts +0 -97
  399. package/src/scheduler-assignments.ts +0 -134
  400. package/src/scheduler-axis.test.ts +0 -108
  401. package/src/scheduler-axis.ts +0 -238
  402. package/src/scheduler-booking.test.ts +0 -57
  403. package/src/scheduler-config.ts +0 -179
  404. package/src/scheduler-dependencies.test.ts +0 -155
  405. package/src/scheduler-dependencies.ts +0 -223
  406. package/src/scheduler-freebusy.test.ts +0 -41
  407. package/src/scheduler-heatmap.test.ts +0 -39
  408. package/src/scheduler-resource-tree.test.ts +0 -84
  409. package/src/scheduler-resource-tree.ts +0 -107
  410. package/src/scheduler-slots.test.ts +0 -53
  411. package/src/scheduler-slots.ts +0 -94
  412. package/src/scheduler-summary.test.ts +0 -47
  413. package/src/scheduler-summary.ts +0 -81
  414. package/src/scheduling.test.ts +0 -194
  415. package/src/scheduling.ts +0 -293
  416. package/src/schema-designer.test.ts +0 -121
  417. package/src/schema-designer.ts +0 -142
  418. package/src/schema.test.ts +0 -268
  419. package/src/schema.ts +0 -562
  420. package/src/smart-shim.ts +0 -107
  421. package/src/sources/aggregate.test.ts +0 -79
  422. package/src/sources/aggregate.ts +0 -102
  423. package/src/sources/auth-supabase.test.ts +0 -80
  424. package/src/sources/auth-supabase.ts +0 -87
  425. package/src/sources/dashboard.kpi.test.ts +0 -50
  426. package/src/sources/dashboard.test.ts +0 -61
  427. package/src/sources/dashboard.ts +0 -136
  428. package/src/sources/field-inference.test.ts +0 -60
  429. package/src/sources/field-inference.ts +0 -63
  430. package/src/sources/filters.test.ts +0 -58
  431. package/src/sources/filters.ts +0 -70
  432. package/src/sources/index.ts +0 -67
  433. package/src/sources/introspect-supabase.test.ts +0 -112
  434. package/src/sources/introspect-supabase.ts +0 -139
  435. package/src/sources/realtime-supabase.test.ts +0 -93
  436. package/src/sources/realtime-supabase.ts +0 -99
  437. package/src/sources/relation-lookup.test.ts +0 -99
  438. package/src/sources/relation-lookup.ts +0 -128
  439. package/src/sources/rest-adapters.test.ts +0 -95
  440. package/src/sources/rest-adapters.ts +0 -120
  441. package/src/sources/rest.test.ts +0 -104
  442. package/src/sources/rest.ts +0 -129
  443. package/src/sources/schema-from-columns.test.ts +0 -106
  444. package/src/sources/schema-from-columns.ts +0 -88
  445. package/src/sources/supabase.test.ts +0 -110
  446. package/src/sources/supabase.ts +0 -99
  447. package/src/sources/with-entity-rules.test.ts +0 -104
  448. package/src/sources/with-entity-rules.ts +0 -78
  449. package/src/sources/with-relation-labels.test.ts +0 -75
  450. package/src/sources/with-relation-labels.ts +0 -73
  451. package/src/staged-editing.ts +0 -0
  452. package/src/studio/bug-report.test.ts +0 -101
  453. package/src/studio/bug-report.ts +0 -165
  454. package/src/studio/cli.test.ts +0 -187
  455. package/src/studio/cli.ts +0 -117
  456. package/src/studio/copilot-core.test.ts +0 -45
  457. package/src/studio/csv.test.ts +0 -90
  458. package/src/studio/csv.ts +0 -165
  459. package/src/studio/db-connect-string.test.ts +0 -94
  460. package/src/studio/db-connect-string.ts +0 -128
  461. package/src/studio/deploy-cli.test.ts +0 -56
  462. package/src/studio/deploy-cli.ts +0 -100
  463. package/src/studio/emit-project.test.ts +0 -3324
  464. package/src/studio/emit-project.ts +0 -5377
  465. package/src/studio/emit-schema.test.ts +0 -111
  466. package/src/studio/emit-schema.ts +0 -1181
  467. package/src/studio/index.ts +0 -380
  468. package/src/studio/init-flow.test.ts +0 -514
  469. package/src/studio/init-flow.ts +0 -556
  470. package/src/studio/introspect-db.test.ts +0 -186
  471. package/src/studio/introspect-db.ts +0 -312
  472. package/src/studio/introspect-openapi.test.ts +0 -84
  473. package/src/studio/introspect-openapi.ts +0 -252
  474. package/src/studio/introspect-prisma.test.ts +0 -99
  475. package/src/studio/introspect-prisma.ts +0 -175
  476. package/src/studio/introspect.test.ts +0 -172
  477. package/src/studio/introspect.ts +0 -310
  478. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  479. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  480. package/src/studio/pipeline.test.ts +0 -42
  481. package/src/studio/project-robust.test.ts +0 -157
  482. package/src/studio/project.test.ts +0 -929
  483. package/src/studio/project.ts +0 -2394
  484. package/src/studio/sample-data.test.ts +0 -58
  485. package/src/studio/sample-data.ts +0 -203
  486. package/src/studio/samples/ats.ts +0 -202
  487. package/src/studio/samples/clinic.ts +0 -179
  488. package/src/studio/samples/crm.ts +0 -291
  489. package/src/studio/samples/datasets.test.ts +0 -84
  490. package/src/studio/samples/datasets.ts +0 -340
  491. package/src/studio/samples/ecommerce.ts +0 -187
  492. package/src/studio/samples/events.ts +0 -201
  493. package/src/studio/samples/fleet.ts +0 -213
  494. package/src/studio/samples/gym.ts +0 -215
  495. package/src/studio/samples/hr.ts +0 -195
  496. package/src/studio/samples/index.ts +0 -55
  497. package/src/studio/samples/insurance.ts +0 -229
  498. package/src/studio/samples/inventory.ts +0 -213
  499. package/src/studio/samples/invoicing.ts +0 -162
  500. package/src/studio/samples/library.ts +0 -180
  501. package/src/studio/samples/live-data.test.ts +0 -99
  502. package/src/studio/samples/live-data.ts +0 -306
  503. package/src/studio/samples/projects.ts +0 -212
  504. package/src/studio/samples/realestate.ts +0 -196
  505. package/src/studio/samples/restaurant.ts +0 -189
  506. package/src/studio/samples/samples.test.ts +0 -304
  507. package/src/studio/samples/school.ts +0 -197
  508. package/src/studio/samples/seed-floor.test.ts +0 -25
  509. package/src/studio/samples/shared.ts +0 -237
  510. package/src/studio/samples/starter.ts +0 -251
  511. package/src/studio/samples/subscriptions.ts +0 -183
  512. package/src/studio/samples/support.ts +0 -216
  513. package/src/studio/scaffold-app.test.ts +0 -91
  514. package/src/studio/scaffold.test.ts +0 -192
  515. package/src/studio/scaffold.ts +0 -390
  516. package/src/studio/screen-suites.test.ts +0 -269
  517. package/src/studio/screen-suites.ts +0 -448
  518. package/src/studio/themes.ts +0 -62
  519. package/src/studio/ui-components-surface.test.ts +0 -185
  520. package/src/studio/ui-components.generated.ts +0 -7154
  521. package/src/studio/ui-components.ts +0 -742
  522. package/src/studio/verify.test.ts +0 -47
  523. package/src/studio/verify.ts +0 -79
  524. package/src/sveltekit/in-memory.test.ts +0 -104
  525. package/src/sveltekit/in-memory.ts +0 -129
  526. package/src/sveltekit/index.ts +0 -24
  527. package/src/sveltekit/query-plan.test.ts +0 -109
  528. package/src/sveltekit/query-plan.ts +0 -125
  529. package/src/sveltekit/sql-source.test.ts +0 -198
  530. package/src/sveltekit/sql-source.ts +0 -171
  531. package/src/sveltekit/sql.test.ts +0 -80
  532. package/src/sveltekit/sql.ts +0 -131
  533. package/src/sveltekit/transport-scope.test.ts +0 -125
  534. package/src/sveltekit/transport.test.ts +0 -201
  535. package/src/sveltekit/transport.ts +0 -373
  536. package/src/upgrade-prompt.test.ts +0 -71
  537. package/src/upgrade-prompt.ts +0 -162
  538. package/src/version.test.ts +0 -17
  539. package/src/watermark.test.ts +0 -97
  540. package/src/watermark.ts +0 -156
  541. /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
  542. /package/{src → dist}/SvAlertsManager.svelte +0 -0
  543. /package/{src → dist}/SvAlertsPanel.svelte +0 -0
  544. /package/{src → dist}/SvAuthGate.svelte +0 -0
  545. /package/{src → dist}/SvBoard.svelte +0 -0
  546. /package/{src → dist}/SvExportMenu.svelte +0 -0
  547. /package/{src → dist}/SvFileInput.svelte +0 -0
  548. /package/{src → dist}/SvGridAlerts.svelte +0 -0
  549. /package/{src → dist}/SvGridBoard.svelte +0 -0
  550. /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
  551. /package/{src → dist}/SvGridScheduler.svelte +0 -0
  552. /package/{src → dist}/SvImportDialog.svelte +0 -0
  553. /package/{src → dist}/SvLookupInput.svelte +0 -0
  554. /package/{src → dist}/SvPivotDesigner.svelte +0 -0
  555. /package/{src → dist}/SvRecordDetail.svelte +0 -0
  556. /package/{src → dist}/SvSchedule.svelte +0 -0
  557. /package/{src → dist}/SvSchemaChart.svelte +0 -0
  558. /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
  559. /package/{src → dist}/pdfmake-shims.d.ts +0 -0
  560. /package/{src → dist}/smart.export.d.ts +0 -0
  561. /package/{src → dist}/smart.export.js +0 -0
  562. /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
  563. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
  564. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
  565. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
  566. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
  567. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
  568. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
  569. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
  570. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
  571. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
  572. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
  573. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
  574. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
  575. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
  576. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
  577. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
  578. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
  579. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
  580. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
  581. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
  582. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
  583. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
  584. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
  585. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
  586. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
  587. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
  588. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
  589. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
  590. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
  591. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
  592. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
  593. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
  594. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
  595. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
  596. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
  597. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
  598. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
  599. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
  600. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
  601. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
  602. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
  603. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
  604. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
  605. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
  606. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
  607. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
  608. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
  609. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
  610. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
  611. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
  612. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
  613. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
  614. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
  615. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
  616. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
  617. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
  618. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
  619. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
  620. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
  621. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
  622. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
  623. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
  624. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Data-source adapters + introspection. Each adapter implements the grid's
3
+ * `ServerDataSource` over a specific backend, so the grid, edit form, sorting,
4
+ * filtering, and paging work identically regardless of where the data lives.
5
+ */
6
+ export { normalizeFilters } from './filters';
7
+ export { buildEntitySchema, pickLabelField, linkRelationLabels, } from './schema-from-columns';
8
+ export { createSupabaseDataSource } from './supabase';
9
+ export { createRestDataSource } from './rest';
10
+ export { offsetLimitAdapter, dummyJsonAdapter, jsonServerAdapter, } from './rest-adapters';
11
+ export { introspectSupabaseTable, listSupabaseTables } from './introspect-supabase';
12
+ export { createSupabaseRealtime, } from './realtime-supabase';
13
+ export { createRelationLookup, } from './relation-lookup';
14
+ export { createSupabaseAuth, } from './auth-supabase';
15
+ export { aggregateRows, chartFieldsFromSchema, } from './aggregate';
16
+ export { withEntityRules } from './with-entity-rules';
17
+ export { withRelationLabels } from './with-relation-labels';
18
+ export { reduceValue, kpiSeries, sparklinePoints, seriesDelta, formatKpiValue, dashboardFromSchema, } from './dashboard';
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Browser-side introspection for Supabase / PostgREST. Discovers a table's
3
+ * columns from the REST API alone (URL + anon key), so a screen can adapt to an
4
+ * arbitrary table with no server. Tries the most informative source first:
5
+ *
6
+ * 1. OpenAPI doc - names + types + primary key (best; sometimes CORS-blocked)
7
+ * 2. CSV header - names only, but works on an EMPTY table and is CORS-safe
8
+ * 3. sample row - names + types inferred from one row of data
9
+ *
10
+ * Returns null when none of them can determine the columns (e.g. an empty table
11
+ * whose OpenAPI is blocked) - the caller can then ask the user to list columns.
12
+ */
13
+ import type { RowData } from '@svgrid/grid';
14
+ import type { EntitySchema } from '../schema.js';
15
+ export type IntrospectSupabaseOptions = {
16
+ /** Project URL, e.g. `https://xxxx.supabase.co`. */
17
+ url: string;
18
+ /** anon public key. */
19
+ key: string;
20
+ table: string;
21
+ /** Custom fetch (SSR, tests). Defaults to the global `fetch`. */
22
+ fetch?: typeof fetch;
23
+ };
24
+ /** List a Supabase project's tables from its PostgREST OpenAPI doc (URL + anon key).
25
+ * Returns the exposed table names (sorted), or `[]` when the doc can't be read
26
+ * (CORS-blocked, bad key). Lets the Studio wizard offer a table picker instead of
27
+ * making the user hand-type the table name. */
28
+ export declare function listSupabaseTables(url: string, key: string, fetchFn?: typeof fetch): Promise<string[]>;
29
+ /** Introspect a Supabase/PostgREST table into an EntitySchema, or null. */
30
+ export declare function introspectSupabaseTable<TData extends RowData = RowData>(options: IntrospectSupabaseOptions): Promise<EntitySchema<TData> | null>;
@@ -0,0 +1,134 @@
1
+ import { buildEntitySchema } from './schema-from-columns.js';
2
+ const mapOpenApiType = (prop) => {
3
+ if (Array.isArray(prop.enum))
4
+ return 'enum';
5
+ if (prop.type === 'integer' || prop.type === 'number')
6
+ return 'number';
7
+ if (prop.type === 'boolean')
8
+ return 'boolean';
9
+ return 'text';
10
+ };
11
+ async function viaOpenApi(o, base) {
12
+ let res;
13
+ try {
14
+ res = await o.fetch(`${base}/rest/v1/`, {
15
+ headers: { apikey: o.key, Authorization: `Bearer ${o.key}`, Accept: 'application/json' },
16
+ });
17
+ }
18
+ catch {
19
+ return null; // network / CORS - let another path try
20
+ }
21
+ if (!res.ok)
22
+ return null;
23
+ let spec;
24
+ try {
25
+ spec = await res.json();
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ const defs = spec?.definitions ?? spec?.components?.schemas ?? {};
31
+ let def = defs[o.table];
32
+ if (!def) {
33
+ const key = Object.keys(defs).find((k) => k.toLowerCase() === o.table.toLowerCase());
34
+ if (key)
35
+ def = defs[key];
36
+ }
37
+ const props = def?.properties;
38
+ if (!props || !Object.keys(props).length)
39
+ return null;
40
+ const required = Array.isArray(def.required) ? def.required : [];
41
+ return Object.entries(props).map(([name, prop]) => {
42
+ const desc = prop?.description ?? '';
43
+ // PostgREST annotates a foreign key in the column description:
44
+ // "...<fk table='companies' column='id'/>"
45
+ const fk = /<fk\s+table=['"]([^'"]+)['"]\s+column=['"]([^'"]+)['"]/i.exec(desc);
46
+ return {
47
+ name,
48
+ type: mapOpenApiType(prop),
49
+ primaryKey: /primary key|<pk\/>/i.test(desc),
50
+ required: required.includes(name),
51
+ enumValues: Array.isArray(prop?.enum) ? prop.enum : undefined,
52
+ references: fk ? { table: fk[1], column: fk[2] } : undefined,
53
+ };
54
+ });
55
+ }
56
+ async function viaCsv(o, base) {
57
+ let res;
58
+ try {
59
+ res = await o.fetch(`${base}/rest/v1/${encodeURIComponent(o.table)}?select=*&limit=1`, {
60
+ headers: { apikey: o.key, Authorization: `Bearer ${o.key}`, Accept: 'text/csv' },
61
+ });
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ if (!res.ok)
67
+ return null;
68
+ const text = (await res.text()).trim();
69
+ const header = text.split(/\r?\n/)[0] ?? '';
70
+ const names = header.split(',').map((h) => h.trim().replace(/^"|"$/g, '')).filter(Boolean);
71
+ return names.length ? names.map((name) => ({ name })) : null;
72
+ }
73
+ async function viaSample(o, base) {
74
+ let res;
75
+ try {
76
+ res = await o.fetch(`${base}/rest/v1/${encodeURIComponent(o.table)}?select=*&limit=1`, {
77
+ headers: { apikey: o.key, Authorization: `Bearer ${o.key}`, Accept: 'application/json' },
78
+ });
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ if (!res.ok)
84
+ return null;
85
+ let rows;
86
+ try {
87
+ rows = await res.json();
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ const sample = Array.isArray(rows) ? rows[0] : undefined;
93
+ if (!sample)
94
+ return null;
95
+ return Object.entries(sample).map(([name, v]) => ({
96
+ name,
97
+ type: (typeof v === 'number' ? 'number' : typeof v === 'boolean' ? 'boolean' : 'text'),
98
+ }));
99
+ }
100
+ /** List a Supabase project's tables from its PostgREST OpenAPI doc (URL + anon key).
101
+ * Returns the exposed table names (sorted), or `[]` when the doc can't be read
102
+ * (CORS-blocked, bad key). Lets the Studio wizard offer a table picker instead of
103
+ * making the user hand-type the table name. */
104
+ export async function listSupabaseTables(url, key, fetchFn = globalThis.fetch) {
105
+ const base = url.replace(/\/+$/, '');
106
+ let res;
107
+ try {
108
+ res = await fetchFn(`${base}/rest/v1/`, { headers: { apikey: key, Authorization: `Bearer ${key}`, Accept: 'application/json' } });
109
+ }
110
+ catch {
111
+ return [];
112
+ }
113
+ if (!res.ok)
114
+ return [];
115
+ let spec;
116
+ try {
117
+ spec = await res.json();
118
+ }
119
+ catch {
120
+ return [];
121
+ }
122
+ const defs = spec?.definitions ?? spec?.components?.schemas ?? {};
123
+ // PostgREST also lists RPCs under `paths` as `/rpc/...`; `definitions` are the tables/views.
124
+ return Object.keys(defs).sort((a, b) => a.localeCompare(b));
125
+ }
126
+ /** Introspect a Supabase/PostgREST table into an EntitySchema, or null. */
127
+ export async function introspectSupabaseTable(options) {
128
+ const o = { fetch: globalThis.fetch, ...options };
129
+ const base = o.url.replace(/\/+$/, '');
130
+ const columns = (await viaOpenApi(o, base)) ?? (await viaSample(o, base)) ?? (await viaCsv(o, base));
131
+ if (!columns || !columns.length)
132
+ return null;
133
+ return buildEntitySchema(o.table, columns);
134
+ }
@@ -0,0 +1,37 @@
1
+ /** A normalized change event. `new` is the row after the change (INSERT/UPDATE); `old` its prior identity (UPDATE/DELETE). */
2
+ export type RealtimeChange<TData> = {
3
+ type: 'INSERT' | 'UPDATE' | 'DELETE';
4
+ new: TData | null;
5
+ old: Partial<TData> | null;
6
+ };
7
+ /** The slice of a `supabase-js` client + channel this needs. */
8
+ export type RealtimeChannelLike = {
9
+ on(type: 'postgres_changes', filter: Record<string, unknown>, cb: (payload: any) => void): RealtimeChannelLike;
10
+ subscribe(cb?: (status: string) => void): RealtimeChannelLike;
11
+ };
12
+ export type SupabaseRealtimeClientLike = {
13
+ channel(name: string): RealtimeChannelLike;
14
+ removeChannel(channel: RealtimeChannelLike): void;
15
+ };
16
+ export type SupabaseRealtimeConfig<TData> = {
17
+ client: SupabaseRealtimeClientLike;
18
+ table: string;
19
+ /** Postgres schema. Default `'public'`. */
20
+ schema?: string;
21
+ /** Only these events. Default `'*'` (all). */
22
+ event?: 'INSERT' | 'UPDATE' | 'DELETE' | '*';
23
+ /** PostgREST-style row filter, e.g. `'tier=eq.pro'`. */
24
+ filter?: string;
25
+ /** Unique channel name. Default `svgrid:{schema}:{table}`. */
26
+ channelName?: string;
27
+ /** Coalesce bursts: call `onChange` at most once per this window (trailing). */
28
+ debounceMs?: number;
29
+ /** Called for each change (or the last of a debounced burst). */
30
+ onChange: (change: RealtimeChange<TData>) => void;
31
+ /** Subscription status callback (`SUBSCRIBED`, `CHANNEL_ERROR`, ...). */
32
+ onStatus?: (status: string) => void;
33
+ };
34
+ export type SupabaseRealtimeHandle = {
35
+ unsubscribe(): void;
36
+ };
37
+ export declare function createSupabaseRealtime<TData = Record<string, unknown>>(config: SupabaseRealtimeConfig<TData>): SupabaseRealtimeHandle;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * createSupabaseRealtime - live updates for a Studio screen via Supabase
3
+ * Realtime (Postgres change streams). Subscribe to a table's INSERT / UPDATE /
4
+ * DELETE events and react - typically by refreshing the current page so the grid
5
+ * stays in sync with the database, no polling.
6
+ *
7
+ * const live = createSupabaseRealtime({
8
+ * client, table: 'customers',
9
+ * debounceMs: 200,
10
+ * onChange: () => controller.refresh(), // re-fetch the current page
11
+ * })
12
+ * // later: live.unsubscribe()
13
+ *
14
+ * You bring the same `supabase-js` client used for reads (BYO, no dependency).
15
+ * Because the server model is paged, the correct default is to `refresh()` on a
16
+ * change - that respects the active sort / filter / page. Use `debounceMs` to
17
+ * coalesce bursts into a single refetch. For per-row effects (e.g. flashing a
18
+ * changed row) read the normalized event passed to `onChange`.
19
+ */
20
+ import { nudgeEnterprise } from '../license';
21
+ export function createSupabaseRealtime(config) {
22
+ nudgeEnterprise('Studio'); // soft-gate; never blocks
23
+ const schema = config.schema ?? 'public';
24
+ const channelName = config.channelName ?? `svgrid:${schema}:${config.table}`;
25
+ let timer;
26
+ const emit = (change) => {
27
+ if (!config.debounceMs) {
28
+ config.onChange(change);
29
+ return;
30
+ }
31
+ if (timer)
32
+ clearTimeout(timer);
33
+ timer = setTimeout(() => config.onChange(change), config.debounceMs);
34
+ };
35
+ const channel = config.client
36
+ .channel(channelName)
37
+ .on('postgres_changes', { event: config.event ?? '*', schema, table: config.table, ...(config.filter ? { filter: config.filter } : {}) }, (payload) => {
38
+ emit({
39
+ type: payload.eventType,
40
+ new: (payload.new ?? null),
41
+ old: (payload.old ?? null),
42
+ });
43
+ })
44
+ .subscribe(config.onStatus);
45
+ return {
46
+ unsubscribe() {
47
+ if (timer)
48
+ clearTimeout(timer);
49
+ config.client.removeChannel(channel);
50
+ },
51
+ };
52
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * createRelationLookup - powers a foreign-key "lookup" field: search the related
3
+ * entity for options, and resolve a stored key back to its human label. It runs
4
+ * over the SAME `ServerDataSource` contract as everything else, so the related
5
+ * options can come from Supabase, REST, SQL, or in-memory - whatever backs the
6
+ * related table.
7
+ *
8
+ * const companyLookup = createRelationLookup({
9
+ * source: companiesSource, // the related entity's ServerDataSource
10
+ * schema: companiesSchema, // resolves the related primary key
11
+ * labelField: 'name', // what the user sees
12
+ * })
13
+ * await companyLookup.search('acme') // -> [{ value: '12', label: 'Acme Inc' }, ...]
14
+ * await companyLookup.labelFor('12') // -> 'Acme Inc'
15
+ *
16
+ * Pass it to `<SvGridEditPanel lookups={{ companyId: companyLookup }} />` and the
17
+ * `companyId` relation field renders a searchable picker instead of a raw input.
18
+ */
19
+ import type { RowData, ServerDataSource } from '@svgrid/grid';
20
+ import { type EntitySchema } from '../schema';
21
+ export type RelationOption = {
22
+ value: string;
23
+ label: string;
24
+ row: RowData;
25
+ };
26
+ export type RelationLookup = {
27
+ /** Search the related entity (global search); returns a page of options. */
28
+ search(query: string): Promise<RelationOption[]>;
29
+ /** Resolve a stored key to its label (cached). Returns the key itself if not found. */
30
+ labelFor(value: unknown): Promise<string | null>;
31
+ /**
32
+ * Resolve many keys at once (cached), fetching only the misses in a SINGLE
33
+ * request (a set / `IN` filter) - avoids the N+1 of calling `labelFor` per
34
+ * row. Returns a `value -> label` map (unresolved keys map to themselves).
35
+ */
36
+ labelsFor(values: ReadonlyArray<unknown>): Promise<Map<string, string>>;
37
+ };
38
+ export type RelationLookupConfig<TRelated extends RowData> = {
39
+ /** The related entity's read source (only `getRows` is used). */
40
+ source: Pick<ServerDataSource<TRelated>, 'getRows'>;
41
+ /** Field on the related row shown to the user. */
42
+ labelField: string;
43
+ /** Related primary-key field. Default: resolved from `schema`, else `'id'`. */
44
+ valueField?: string;
45
+ /** Related schema, used to resolve the key when `valueField` is omitted. */
46
+ schema?: EntitySchema<TRelated>;
47
+ /** Options fetched per search. Default 20. */
48
+ pageSize?: number;
49
+ };
50
+ export declare function createRelationLookup<TRelated extends RowData>(config: RelationLookupConfig<TRelated>): RelationLookup;
@@ -0,0 +1,77 @@
1
+ import { resolveIdField } from '../schema';
2
+ export function createRelationLookup(config) {
3
+ const pageSize = config.pageSize ?? 20;
4
+ const valueField = config.valueField ?? (config.schema ? resolveIdField(config.schema) : 'id');
5
+ const { labelField, source } = config;
6
+ const cache = new Map(); // value -> label
7
+ const toOption = (row) => {
8
+ const value = String(row[valueField] ?? '');
9
+ const label = String(row[labelField] ?? value);
10
+ cache.set(value, label);
11
+ return { value, label, row };
12
+ };
13
+ const request = (over) => ({
14
+ startRow: 0,
15
+ endRow: pageSize,
16
+ pageIndex: 0,
17
+ pageSize,
18
+ sortModel: [],
19
+ filterModel: {},
20
+ ...over,
21
+ });
22
+ return {
23
+ async search(query) {
24
+ const term = query.trim();
25
+ const { rows } = await source.getRows(request({ filterModel: term ? { global: term } : {} }));
26
+ return rows.map((r) => toOption(r));
27
+ },
28
+ async labelFor(value) {
29
+ if (value == null || value === '')
30
+ return null;
31
+ const key = String(value);
32
+ const cached = cache.get(key);
33
+ if (cached != null)
34
+ return cached;
35
+ const { rows } = await source.getRows(request({
36
+ endRow: 1,
37
+ pageSize: 1,
38
+ filterModel: { columns: { [valueField]: { operator: 'equals', value: key } } },
39
+ }));
40
+ const row = rows[0];
41
+ return row ? toOption(row).label : key;
42
+ },
43
+ async labelsFor(values) {
44
+ const result = new Map();
45
+ const missing = [];
46
+ for (const v of values) {
47
+ if (v == null || v === '')
48
+ continue;
49
+ const key = String(v);
50
+ if (result.has(key))
51
+ continue;
52
+ const cached = cache.get(key);
53
+ if (cached != null)
54
+ result.set(key, cached);
55
+ else if (!missing.includes(key))
56
+ missing.push(key);
57
+ }
58
+ if (missing.length > 0) {
59
+ // One request for every miss: a set (`IN`) filter on the key field.
60
+ const { rows } = await source.getRows(request({
61
+ endRow: missing.length,
62
+ pageSize: missing.length,
63
+ filterModel: { columns: { [valueField]: { operator: 'in', value: '', selectedValues: missing } } },
64
+ }));
65
+ for (const row of rows) {
66
+ const opt = toOption(row);
67
+ result.set(opt.value, opt.label);
68
+ }
69
+ // Anything still unresolved maps to the key itself.
70
+ for (const key of missing)
71
+ if (!result.has(key))
72
+ result.set(key, key);
73
+ }
74
+ return result;
75
+ },
76
+ };
77
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Wire-format adapters for `createRestDataSource`. A public / third-party API
3
+ * rarely speaks our default `offset&limit&sort` dialect - it uses `skip`, or
4
+ * `page`, or `_start`, and wraps its rows under `products` / `data` / a bare
5
+ * array with an `X-Total-Count` header. An adapter is just the `{ buildQuery,
6
+ * parse }` pair that teaches the REST source that dialect:
7
+ *
8
+ * createRestDataSource({ url: 'https://dummyjson.com/products',
9
+ * ...dummyJsonAdapter() })
10
+ *
11
+ * `offsetLimitAdapter` is the configurable base; `dummyJsonAdapter` and
12
+ * `jsonServerAdapter` are ready-made presets for two very common shapes.
13
+ */
14
+ import type { RowData } from '@svgrid/grid';
15
+ import type { RestDataSourceConfig } from './rest';
16
+ /** The parts of a REST config that describe a backend's wire format. */
17
+ export type RestAdapter<TData extends RowData> = Required<Pick<RestDataSourceConfig<TData>, 'buildQuery' | 'parse'>>;
18
+ export type OffsetLimitOptions = {
19
+ /** Query param for the first-row offset (default `offset`). */
20
+ offsetParam?: string;
21
+ /** Query param for the page size (default `limit`). */
22
+ limitParam?: string;
23
+ /** If set, single-column sort emits `<sortByParam>=<col>` + `<orderParam>=asc|desc`. */
24
+ sortByParam?: string;
25
+ orderParam?: string;
26
+ /** If set, the global search term is sent as `<searchParam>=<term>`. */
27
+ searchParam?: string;
28
+ /** Response key holding the row array (tried in order; falls back to `data`/`rows`/`items`). */
29
+ rowsKey?: string;
30
+ /** Response key holding the total count (tried in order; falls back to `total`/`count`). */
31
+ totalKey?: string;
32
+ };
33
+ /**
34
+ * The `?offset=..&limit=..` family (Supabase-ish REST, DummyJSON with `skip`,
35
+ * many hand-rolled APIs). Configure the param names + response keys once.
36
+ */
37
+ export declare function offsetLimitAdapter<TData extends RowData>(opts?: OffsetLimitOptions): RestAdapter<TData>;
38
+ /**
39
+ * DummyJSON (`https://dummyjson.com/<collection>`): `skip`/`limit` paging,
40
+ * `sortBy`/`order` sort, rows under `products`* + a `total` field.
41
+ * (*`rowsKey` defaults to `products`; pass one for `users`, `posts`, etc.)
42
+ */
43
+ export declare function dummyJsonAdapter<TData extends RowData>(rowsKey?: string): RestAdapter<TData>;
44
+ /**
45
+ * `json-server` / JSONPlaceholder: `_start`/`_limit` paging, `_sort`/`_order`
46
+ * multi-column sort, a bare JSON array with the total in `X-Total-Count`.
47
+ */
48
+ export declare function jsonServerAdapter<TData extends RowData>(): RestAdapter<TData>;
@@ -0,0 +1,85 @@
1
+ import { normalizeFilters } from './filters';
2
+ const pick = (body, keys) => {
3
+ const b = (body ?? {});
4
+ for (const k of keys)
5
+ if (b[k] != null)
6
+ return b[k];
7
+ return undefined;
8
+ };
9
+ /**
10
+ * The `?offset=..&limit=..` family (Supabase-ish REST, DummyJSON with `skip`,
11
+ * many hand-rolled APIs). Configure the param names + response keys once.
12
+ */
13
+ export function offsetLimitAdapter(opts = {}) {
14
+ const offsetParam = opts.offsetParam ?? 'offset';
15
+ const limitParam = opts.limitParam ?? 'limit';
16
+ const rowsKeys = [opts.rowsKey, 'data', 'rows', 'items'].filter(Boolean);
17
+ const totalKeys = [opts.totalKey, 'total', 'count', 'rowCount'].filter(Boolean);
18
+ return {
19
+ buildQuery(request) {
20
+ const params = {
21
+ [offsetParam]: String(request.startRow),
22
+ [limitParam]: String(request.endRow - request.startRow),
23
+ };
24
+ const first = request.sortModel[0];
25
+ if (opts.sortByParam && first) {
26
+ params[opts.sortByParam] = first.id;
27
+ if (opts.orderParam)
28
+ params[opts.orderParam] = first.desc ? 'desc' : 'asc';
29
+ }
30
+ if (opts.searchParam) {
31
+ const { search } = normalizeFilters(request.filterModel);
32
+ if (search)
33
+ params[opts.searchParam] = search;
34
+ }
35
+ return params;
36
+ },
37
+ parse(body) {
38
+ const rows = (pick(body, rowsKeys) ?? []);
39
+ const total = pick(body, totalKeys);
40
+ return { rows, rowCount: total != null ? Number(total) : rows.length };
41
+ },
42
+ };
43
+ }
44
+ /**
45
+ * DummyJSON (`https://dummyjson.com/<collection>`): `skip`/`limit` paging,
46
+ * `sortBy`/`order` sort, rows under `products`* + a `total` field.
47
+ * (*`rowsKey` defaults to `products`; pass one for `users`, `posts`, etc.)
48
+ */
49
+ export function dummyJsonAdapter(rowsKey = 'products') {
50
+ return offsetLimitAdapter({
51
+ offsetParam: 'skip',
52
+ limitParam: 'limit',
53
+ sortByParam: 'sortBy',
54
+ orderParam: 'order',
55
+ rowsKey,
56
+ totalKey: 'total',
57
+ });
58
+ }
59
+ /**
60
+ * `json-server` / JSONPlaceholder: `_start`/`_limit` paging, `_sort`/`_order`
61
+ * multi-column sort, a bare JSON array with the total in `X-Total-Count`.
62
+ */
63
+ export function jsonServerAdapter() {
64
+ return {
65
+ buildQuery(request) {
66
+ const params = {
67
+ _start: String(request.startRow),
68
+ _limit: String(request.endRow - request.startRow),
69
+ };
70
+ if (request.sortModel.length) {
71
+ params._sort = request.sortModel.map((s) => s.id).join(',');
72
+ params._order = request.sortModel.map((s) => (s.desc ? 'desc' : 'asc')).join(',');
73
+ }
74
+ const { search } = normalizeFilters(request.filterModel);
75
+ if (search)
76
+ params.q = search;
77
+ return params;
78
+ },
79
+ parse(body, response) {
80
+ const rows = Array.isArray(body) ? body : [];
81
+ const header = response.headers.get('x-total-count');
82
+ return { rows, rowCount: header != null ? Number(header) : rows.length };
83
+ },
84
+ };
85
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * createRestDataSource - a `ServerDataSource` over an HTTP/JSON API. Handles the
3
+ * request lifecycle and the four CRUD calls; you point it at a collection URL.
4
+ * The default request/response shaping suits a conventional REST endpoint, and
5
+ * every part is overridable (`buildQuery`, `parse`, `headers`, `fetch`) for
6
+ * bespoke or legacy APIs.
7
+ *
8
+ * const source = createRestDataSource({ url: '/api/customers', schema })
9
+ *
10
+ * Default wire format:
11
+ * read GET {url}?offset&limit&sort&search&<col>=<op>:<value>
12
+ * create POST {url} body: the new row
13
+ * update PATCH {url}/{id} body: the patch
14
+ * delete DELETE {url}/{id}
15
+ * where `sort` is a comma list with `-` for descending (e.g. `-createdAt,name`).
16
+ */
17
+ import type { RowData, ServerRequest, ServerResult } from '@svgrid/grid';
18
+ import { type EntitySchema } from '../schema';
19
+ import type { WritableDataSource } from '../sveltekit/types';
20
+ export type RestDataSourceConfig<TData extends RowData> = {
21
+ /** Collection endpoint, e.g. `/api/customers`. */
22
+ url: string;
23
+ /** Used to resolve the id field for update/delete when `idField` is omitted. */
24
+ schema?: EntitySchema<TData>;
25
+ /** Primary key property (default: from `schema`, else `'id'`). */
26
+ idField?: string;
27
+ /** Custom fetch (SSR, auth). Defaults to the global `fetch`. */
28
+ fetch?: typeof fetch;
29
+ /** Extra request headers, static or computed per call. */
30
+ headers?: Record<string, string> | (() => Record<string, string>);
31
+ /** Static query params merged into every read (e.g. an API key or filter). */
32
+ query?: Record<string, string>;
33
+ /** Build read query params from the grid request. Override for bespoke APIs. */
34
+ buildQuery?: (request: ServerRequest) => Record<string, string>;
35
+ /** Parse a read response body into rows + total. Override for bespoke shapes. */
36
+ parse?: (body: unknown, response: Response) => ServerResult<TData>;
37
+ };
38
+ export declare function createRestDataSource<TData extends RowData>(config: RestDataSourceConfig<TData>): WritableDataSource<TData>;
@@ -0,0 +1,86 @@
1
+ import { resolveIdField } from '../schema';
2
+ import { nudgeEnterprise } from '../license';
3
+ import { normalizeFilters } from './filters';
4
+ const encodePredicate = (p) => {
5
+ if (p.op === 'in')
6
+ return `in:${p.values.join(',')}`;
7
+ if (p.op === 'isNull')
8
+ return 'isNull';
9
+ if (p.op === 'between')
10
+ return `between:${p.value},${p.valueTo}`;
11
+ return `${p.op}:${p.value}`;
12
+ };
13
+ function defaultBuildQuery(request) {
14
+ const params = {
15
+ offset: String(request.startRow),
16
+ limit: String(request.endRow - request.startRow),
17
+ };
18
+ if (request.sortModel.length) {
19
+ params.sort = request.sortModel.map((s) => (s.desc ? '-' : '') + s.id).join(',');
20
+ }
21
+ const { predicates, search } = normalizeFilters(request.filterModel);
22
+ if (search)
23
+ params.search = search;
24
+ for (const p of predicates)
25
+ params[p.column] = encodePredicate(p);
26
+ return params;
27
+ }
28
+ function defaultParse(body, response) {
29
+ if (Array.isArray(body)) {
30
+ // Total from a Content-Range header (`items 0-9/240`) when present.
31
+ const range = response.headers.get('content-range');
32
+ const total = range && /\/(\d+)\s*$/.exec(range);
33
+ return { rows: body, rowCount: total ? Number(total[1]) : body.length };
34
+ }
35
+ const b = (body ?? {});
36
+ const rows = (b.rows ?? b.data ?? b.items ?? []);
37
+ const rowCount = Number(b.rowCount ?? b.total ?? b.count ?? rows.length);
38
+ return { rows, rowCount };
39
+ }
40
+ export function createRestDataSource(config) {
41
+ nudgeEnterprise('Studio'); // soft-gate; never blocks
42
+ const doFetch = config.fetch ?? globalThis.fetch;
43
+ const idField = config.idField ?? (config.schema ? resolveIdField(config.schema) : 'id');
44
+ const base = config.url.replace(/\/+$/, '');
45
+ const buildQuery = config.buildQuery ?? defaultBuildQuery;
46
+ const parse = config.parse ?? defaultParse;
47
+ const headers = (extra) => {
48
+ const h = typeof config.headers === 'function' ? config.headers() : (config.headers ?? {});
49
+ return { ...h, ...extra };
50
+ };
51
+ const send = async (url, init) => {
52
+ const res = await doFetch(url, init);
53
+ if (!res.ok)
54
+ throw new Error(`REST ${init?.method ?? 'GET'} ${url} -> ${res.status} ${res.statusText}`);
55
+ const parsed = res.status === 204 ? undefined : await res.json().catch(() => undefined);
56
+ return { body: parsed, res };
57
+ };
58
+ return {
59
+ async getRows(request) {
60
+ // Static `query` params first; the built paging/sort/filter params win on conflict.
61
+ const qs = new URLSearchParams({ ...config.query, ...buildQuery(request) }).toString();
62
+ const url = qs ? `${base}?${qs}` : base;
63
+ const { body, res } = (await send(url, { headers: headers() }));
64
+ return parse(body, res);
65
+ },
66
+ async createRow(input) {
67
+ const { body } = (await send(base, {
68
+ method: 'POST',
69
+ headers: headers({ 'content-type': 'application/json' }),
70
+ body: JSON.stringify(input),
71
+ }));
72
+ return (body ?? input);
73
+ },
74
+ async updateRow(id, patch) {
75
+ const { body } = (await send(`${base}/${encodeURIComponent(id)}`, {
76
+ method: 'PATCH',
77
+ headers: headers({ 'content-type': 'application/json' }),
78
+ body: JSON.stringify(patch),
79
+ }));
80
+ return (body ?? { ...patch, [idField]: id });
81
+ },
82
+ async deleteRow(id) {
83
+ await send(`${base}/${encodeURIComponent(id)}`, { method: 'DELETE', headers: headers() });
84
+ },
85
+ };
86
+ }