@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,54 @@
1
+ /**
2
+ * scheduler-summary - the pure core behind Scheduler Pro's *per-time-column
3
+ * summary* strip (counts / sums / a custom roll-up aligned to the timeline axis).
4
+ * No Svelte, no DOM. Each event is clipped to the column it falls in before the
5
+ * reducer runs, so duration-based reducers (busy minutes) are per-column.
6
+ */
7
+ const MS_MIN = 60000;
8
+ function overlaps(aStart, aEnd, bStart, bEnd) {
9
+ return aStart.getTime() < bEnd.getTime() && aEnd.getTime() > bStart.getTime();
10
+ }
11
+ /**
12
+ * One summary value per column. For each column, collect the events overlapping
13
+ * it, clip each to the column bounds, then apply `reducer`. Empty columns yield
14
+ * `0` for `count` / `sum` and `reducer([])` for the function form.
15
+ */
16
+ export function columnSummaries(events, columns, reducer, opts) {
17
+ return columns.map((col) => {
18
+ const items = [];
19
+ for (const e of events) {
20
+ const s = opts.startOf(e);
21
+ const en = opts.endOf(e);
22
+ if (!overlaps(s, en, col.start, col.end))
23
+ continue;
24
+ items.push({
25
+ row: opts.rowOf(e),
26
+ start: new Date(Math.max(s.getTime(), col.start.getTime())),
27
+ end: new Date(Math.min(en.getTime(), col.end.getTime())),
28
+ });
29
+ }
30
+ if (reducer === 'count')
31
+ return items.length;
32
+ if (typeof reducer === 'function')
33
+ return reducer(items);
34
+ // { sum: field }
35
+ const field = reducer.sum;
36
+ let total = 0;
37
+ for (const it of items) {
38
+ const v = it.row[field];
39
+ if (typeof v === 'number' && Number.isFinite(v))
40
+ total += v;
41
+ }
42
+ return total;
43
+ });
44
+ }
45
+ /** Built-in reducer: sum a numeric row field. */
46
+ export function sumReducer(field) {
47
+ return { sum: field };
48
+ }
49
+ /** Built-in reducer: count events. */
50
+ export const countReducer = 'count';
51
+ /** Built-in reducer: total column-clipped busy minutes across the column's events. */
52
+ export function busyMinutesReducer() {
53
+ return (items) => items.reduce((sum, it) => sum + (it.end.getTime() - it.start.getTime()) / MS_MIN, 0);
54
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Register the Enterprise scheduler view. Idempotent - safe to call from every
3
+ * component that uses `scheduler`, or once at app start. Also invoked by
4
+ * {@link installEnterprise} so wiring the Pro API turns the view on too.
5
+ */
6
+ export declare function enableSchedulerView(): void;
7
+ export { default as SvGridScheduler } from './SvGridScheduler.svelte';
@@ -15,23 +15,22 @@
15
15
  * // then: <SvGrid {data} {columns} scheduler={{ startField: 'start', endField: 'end' }} />
16
16
  * ```
17
17
  */
18
- import { registerSchedulerView } from '@svgrid/grid'
19
- import { isLicenseKeySet } from './license'
20
- import { emitUnlicensedNudge } from './watermark'
21
- import SvGridScheduler from './SvGridScheduler.svelte'
22
-
23
- let enabled = false
24
-
18
+ import { registerSchedulerView } from '@svgrid/grid';
19
+ import { isLicenseKeySet } from './license';
20
+ import { emitUnlicensedNudge } from './watermark';
21
+ import SvGridScheduler from './SvGridScheduler.svelte';
22
+ let enabled = false;
25
23
  /**
26
24
  * Register the Enterprise scheduler view. Idempotent - safe to call from every
27
25
  * component that uses `scheduler`, or once at app start. Also invoked by
28
26
  * {@link installEnterprise} so wiring the Pro API turns the view on too.
29
27
  */
30
- export function enableSchedulerView(): void {
31
- if (enabled) return
32
- enabled = true
33
- registerSchedulerView(SvGridScheduler as never)
34
- if (!isLicenseKeySet()) emitUnlicensedNudge()
28
+ export function enableSchedulerView() {
29
+ if (enabled)
30
+ return;
31
+ enabled = true;
32
+ registerSchedulerView(SvGridScheduler);
33
+ if (!isLicenseKeySet())
34
+ emitUnlicensedNudge();
35
35
  }
36
-
37
- export { default as SvGridScheduler } from './SvGridScheduler.svelte'
36
+ export { default as SvGridScheduler } from './SvGridScheduler.svelte';
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Scheduling - client-side, cron-driven automation for grid actions.
3
+ *
4
+ * Two everyday jobs that normally need a backend job runner - "email me this
5
+ * report every weekday at 17:30" and "remind the desk at 09:00 to reconcile" -
6
+ * are, in a long-lived data app, just a timer plus an action you already have:
7
+ * an export (`api.exportCsv` / `@svgrid/enterprise` Excel/PDF) or an alert
8
+ * (`toast`). This module supplies the missing middle: a pure cron matcher and a
9
+ * small runtime that fires your callback when a schedule comes due.
10
+ *
11
+ * Everything here is pure and injectable (`now`), so the matching logic is
12
+ * unit-testable without wall-clock flakiness, and the render/app layer just
13
+ * wires `onFire` to whatever action it wants.
14
+ *
15
+ * ```ts
16
+ * import { createScheduler } from '@svgrid/enterprise'
17
+ * import { toast } from '@svgrid/grid'
18
+ *
19
+ * const scheduler = createScheduler({
20
+ * schedules: [
21
+ * { id: 'eod', name: 'End-of-day CSV', cron: '30 17 * * 1-5' },
22
+ * { id: 'standup', name: 'Stand-up reminder', cron: '0 9 * * *' },
23
+ * ],
24
+ * onFire(schedule) {
25
+ * if (schedule.id === 'eod') api.exportCsv({ filename: 'eod' })
26
+ * else toast.info(`${schedule.name}`)
27
+ * },
28
+ * })
29
+ * scheduler.start() // stop() on teardown
30
+ * ```
31
+ *
32
+ * Caveat, by design: schedules run entirely in the browser tab, so the app has
33
+ * to be open when a schedule is due. Pair with a server job for guaranteed
34
+ * delivery; use this for the far more common "the dashboard is always up on the
35
+ * wall" case where a backend cron is overkill.
36
+ */
37
+ /** A field in the range [min, max] that a parsed cron sub-expression matches. */
38
+ type CronField = {
39
+ min: number;
40
+ max: number;
41
+ match: (n: number) => boolean;
42
+ };
43
+ export type Schedule = {
44
+ /** Stable id - used to dedupe fires and to key your `onFire` switch. */
45
+ id: string;
46
+ /** Human label shown in a schedules panel / toast. */
47
+ name?: string;
48
+ /**
49
+ * Recurring trigger: a standard 5-field cron expression
50
+ * `"minute hour day-of-month month day-of-week"`. Ignored when `runAt` is set.
51
+ * Supports `*`, lists (`1,15`), ranges (`1-5`), and steps (`*​/15`, `9-17/2`).
52
+ * Day-of-week is `0-6` with Sunday `0` (`7` also accepted for Sunday).
53
+ */
54
+ cron?: string;
55
+ /**
56
+ * One-off trigger: an ISO datetime string. Fires a single time when the
57
+ * wall clock reaches that minute, then never again. Takes precedence over
58
+ * `cron` when both are present.
59
+ */
60
+ runAt?: string;
61
+ /** Set `false` to keep the definition but stop it firing. Default `true`. */
62
+ enabled?: boolean;
63
+ };
64
+ type ParsedCron = {
65
+ minute: CronField;
66
+ hour: CronField;
67
+ dom: CronField;
68
+ month: CronField;
69
+ dow: CronField;
70
+ /** True when BOTH day-of-month and day-of-week are restricted (not `*`). */
71
+ domAndDowRestricted: boolean;
72
+ };
73
+ /**
74
+ * Parse a 5-field cron expression. Throws on the wrong field count or an
75
+ * unparseable field, so a bad schedule surfaces at setup, not silently at 3am.
76
+ */
77
+ export declare function parseCron(expr: string): ParsedCron;
78
+ /** Whether a parsed cron matches a specific `Date` to the minute. */
79
+ export declare function cronMatchesParsed(parsed: ParsedCron, date: Date): boolean;
80
+ /** Whether a cron expression matches a `Date` to the minute. */
81
+ export declare function cronMatches(expr: string, date: Date): boolean;
82
+ /** Whether a schedule is due to fire during the minute containing `date`. */
83
+ export declare function isScheduleDue(schedule: Schedule, date: Date): boolean;
84
+ /**
85
+ * The next `Date` (to the minute) at or after `from` that `schedule` fires,
86
+ * or `null` if it never will again (past one-off, or no match within a year).
87
+ * Handy for a "next run" column in a schedules panel.
88
+ */
89
+ export declare function nextRun(schedule: Schedule, from: Date): Date | null;
90
+ export type SchedulerOptions = {
91
+ /** The schedules to run. Read once per tick, so you may mutate the array. */
92
+ schedules: ReadonlyArray<Schedule>;
93
+ /** Called when a schedule comes due. Receives the schedule + the fire time. */
94
+ onFire: (schedule: Schedule, firedAt: Date) => void;
95
+ /**
96
+ * Clock source, injectable for tests. Default `() => new Date()`.
97
+ */
98
+ now?: () => Date;
99
+ /**
100
+ * How often to check, in ms. Default 30_000 (twice a minute) so a fire is
101
+ * never more than ~30s late; per-minute dedupe keeps it firing once.
102
+ */
103
+ intervalMs?: number;
104
+ };
105
+ export type Scheduler = {
106
+ /** Begin ticking. No-op if already started. */
107
+ start: () => void;
108
+ /** Stop ticking and clear the timer. */
109
+ stop: () => void;
110
+ /**
111
+ * Run one check against `at` (default now) and fire anything due. Exposed for
112
+ * tests and for a "run due now" button; the internal tick calls this too.
113
+ */
114
+ tick: (at?: Date) => void;
115
+ /** Upcoming fire time per schedule id, from `at` (default now). */
116
+ upcoming: (at?: Date) => Array<{
117
+ id: string;
118
+ at: Date | null;
119
+ }>;
120
+ };
121
+ /**
122
+ * A client-side scheduler: ticks on an interval, fires `onFire` for every
123
+ * schedule due in the current minute, and guarantees at most one fire per
124
+ * schedule per minute (and exactly one, ever, for a one-off).
125
+ */
126
+ export declare function createScheduler(options: SchedulerOptions): Scheduler;
127
+ /** A few common cron expressions, for docs, presets, and pickers. */
128
+ export declare const CRON_PRESETS: ReadonlyArray<{
129
+ label: string;
130
+ cron: string;
131
+ }>;
132
+ export {};
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Scheduling - client-side, cron-driven automation for grid actions.
3
+ *
4
+ * Two everyday jobs that normally need a backend job runner - "email me this
5
+ * report every weekday at 17:30" and "remind the desk at 09:00 to reconcile" -
6
+ * are, in a long-lived data app, just a timer plus an action you already have:
7
+ * an export (`api.exportCsv` / `@svgrid/enterprise` Excel/PDF) or an alert
8
+ * (`toast`). This module supplies the missing middle: a pure cron matcher and a
9
+ * small runtime that fires your callback when a schedule comes due.
10
+ *
11
+ * Everything here is pure and injectable (`now`), so the matching logic is
12
+ * unit-testable without wall-clock flakiness, and the render/app layer just
13
+ * wires `onFire` to whatever action it wants.
14
+ *
15
+ * ```ts
16
+ * import { createScheduler } from '@svgrid/enterprise'
17
+ * import { toast } from '@svgrid/grid'
18
+ *
19
+ * const scheduler = createScheduler({
20
+ * schedules: [
21
+ * { id: 'eod', name: 'End-of-day CSV', cron: '30 17 * * 1-5' },
22
+ * { id: 'standup', name: 'Stand-up reminder', cron: '0 9 * * *' },
23
+ * ],
24
+ * onFire(schedule) {
25
+ * if (schedule.id === 'eod') api.exportCsv({ filename: 'eod' })
26
+ * else toast.info(`${schedule.name}`)
27
+ * },
28
+ * })
29
+ * scheduler.start() // stop() on teardown
30
+ * ```
31
+ *
32
+ * Caveat, by design: schedules run entirely in the browser tab, so the app has
33
+ * to be open when a schedule is due. Pair with a server job for guaranteed
34
+ * delivery; use this for the far more common "the dashboard is always up on the
35
+ * wall" case where a backend cron is overkill.
36
+ */
37
+ const RANGES = {
38
+ minute: [0, 59],
39
+ hour: [0, 23],
40
+ dom: [1, 31],
41
+ month: [1, 12],
42
+ dow: [0, 6],
43
+ };
44
+ /** Parse one cron field (e.g. `*​/15`, `1-5`, `0,30`) into a matcher. */
45
+ function parseField(raw, min, max) {
46
+ const allowed = new Set();
47
+ for (const part of raw.split(',')) {
48
+ const [rangePart, stepPart] = part.split('/');
49
+ const step = stepPart ? parseInt(stepPart, 10) : 1;
50
+ if (!Number.isFinite(step) || step < 1) {
51
+ throw new Error(`Invalid cron step in "${raw}"`);
52
+ }
53
+ let lo;
54
+ let hi;
55
+ if (rangePart === '*' || rangePart === '') {
56
+ lo = min;
57
+ hi = max;
58
+ }
59
+ else if (rangePart.includes('-')) {
60
+ const [a, b] = rangePart.split('-');
61
+ lo = parseInt(a, 10);
62
+ hi = parseInt(b, 10);
63
+ }
64
+ else {
65
+ lo = parseInt(rangePart, 10);
66
+ hi = lo;
67
+ }
68
+ if (!Number.isFinite(lo) || !Number.isFinite(hi)) {
69
+ throw new Error(`Invalid cron field "${raw}"`);
70
+ }
71
+ for (let n = lo; n <= hi; n += step) {
72
+ if (n >= min && n <= max)
73
+ allowed.add(n);
74
+ }
75
+ }
76
+ return { min, max, match: (n) => allowed.has(n) };
77
+ }
78
+ /**
79
+ * Parse a 5-field cron expression. Throws on the wrong field count or an
80
+ * unparseable field, so a bad schedule surfaces at setup, not silently at 3am.
81
+ */
82
+ export function parseCron(expr) {
83
+ const fields = expr.trim().split(/\s+/);
84
+ if (fields.length !== 5) {
85
+ throw new Error(`Cron needs 5 fields "min hour dom month dow", got ${fields.length}: "${expr}"`);
86
+ }
87
+ const [min, hour, dom, month, dow] = fields;
88
+ // Day-of-week 7 is an alias for Sunday (0); normalize before parsing.
89
+ const dowNorm = dow.replace(/7/g, '0');
90
+ return {
91
+ minute: parseField(min, ...RANGES.minute),
92
+ hour: parseField(hour, ...RANGES.hour),
93
+ dom: parseField(dom, ...RANGES.dom),
94
+ month: parseField(month, ...RANGES.month),
95
+ dow: parseField(dowNorm, ...RANGES.dow),
96
+ domAndDowRestricted: dom !== '*' && dow !== '*',
97
+ };
98
+ }
99
+ /** Whether a parsed cron matches a specific `Date` to the minute. */
100
+ export function cronMatchesParsed(parsed, date) {
101
+ if (!parsed.minute.match(date.getMinutes()))
102
+ return false;
103
+ if (!parsed.hour.match(date.getHours()))
104
+ return false;
105
+ if (!parsed.month.match(date.getMonth() + 1))
106
+ return false;
107
+ const domOk = parsed.dom.match(date.getDate());
108
+ const dowOk = parsed.dow.match(date.getDay());
109
+ // Standard cron semantics: when both day fields are restricted the match is
110
+ // the UNION (fires if either matches); otherwise plain AND.
111
+ return parsed.domAndDowRestricted ? domOk || dowOk : domOk && dowOk;
112
+ }
113
+ /** Whether a cron expression matches a `Date` to the minute. */
114
+ export function cronMatches(expr, date) {
115
+ return cronMatchesParsed(parseCron(expr), date);
116
+ }
117
+ /** Two dates fall in the same wall-clock minute. */
118
+ function sameMinute(a, b) {
119
+ return (a.getFullYear() === b.getFullYear() &&
120
+ a.getMonth() === b.getMonth() &&
121
+ a.getDate() === b.getDate() &&
122
+ a.getHours() === b.getHours() &&
123
+ a.getMinutes() === b.getMinutes());
124
+ }
125
+ /** Whether a schedule is due to fire during the minute containing `date`. */
126
+ export function isScheduleDue(schedule, date) {
127
+ if (schedule.enabled === false)
128
+ return false;
129
+ if (schedule.runAt) {
130
+ const at = new Date(schedule.runAt);
131
+ return !Number.isNaN(at.getTime()) && sameMinute(at, date);
132
+ }
133
+ if (schedule.cron)
134
+ return cronMatches(schedule.cron, date);
135
+ return false;
136
+ }
137
+ /**
138
+ * The next `Date` (to the minute) at or after `from` that `schedule` fires,
139
+ * or `null` if it never will again (past one-off, or no match within a year).
140
+ * Handy for a "next run" column in a schedules panel.
141
+ */
142
+ export function nextRun(schedule, from) {
143
+ if (schedule.enabled === false)
144
+ return null;
145
+ if (schedule.runAt) {
146
+ const at = new Date(schedule.runAt);
147
+ if (Number.isNaN(at.getTime()))
148
+ return null;
149
+ // Compare at minute granularity - a runAt in the current minute is "now".
150
+ const floor = new Date(from);
151
+ floor.setSeconds(0, 0);
152
+ return at.getTime() >= floor.getTime() ? at : null;
153
+ }
154
+ if (!schedule.cron)
155
+ return null;
156
+ const parsed = parseCron(schedule.cron);
157
+ const cursor = new Date(from);
158
+ cursor.setSeconds(0, 0);
159
+ // Scan minute-by-minute for up to ~366 days (527040 minutes).
160
+ for (let i = 0; i < 527040; i += 1) {
161
+ if (cronMatchesParsed(parsed, cursor))
162
+ return new Date(cursor);
163
+ cursor.setMinutes(cursor.getMinutes() + 1);
164
+ }
165
+ return null;
166
+ }
167
+ /**
168
+ * A client-side scheduler: ticks on an interval, fires `onFire` for every
169
+ * schedule due in the current minute, and guarantees at most one fire per
170
+ * schedule per minute (and exactly one, ever, for a one-off).
171
+ */
172
+ export function createScheduler(options) {
173
+ const now = options.now ?? (() => new Date());
174
+ const intervalMs = options.intervalMs ?? 30000;
175
+ // Per-schedule guard: the minute-key we last fired, so a twice-a-minute tick
176
+ // (or a manual tick) never double-fires the same minute. One-offs are marked
177
+ // done so they never fire again even across minutes.
178
+ const lastFiredKey = new Map();
179
+ const oneOffDone = new Set();
180
+ let timer = null;
181
+ const minuteKey = (d) => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}-${d.getHours()}-${d.getMinutes()}`;
182
+ function tick(at = now()) {
183
+ const key = minuteKey(at);
184
+ for (const schedule of options.schedules) {
185
+ if (schedule.enabled === false)
186
+ continue;
187
+ const oneOff = !!schedule.runAt;
188
+ if (oneOff && oneOffDone.has(schedule.id))
189
+ continue;
190
+ if (lastFiredKey.get(schedule.id) === key)
191
+ continue;
192
+ if (!isScheduleDue(schedule, at))
193
+ continue;
194
+ lastFiredKey.set(schedule.id, key);
195
+ if (oneOff)
196
+ oneOffDone.add(schedule.id);
197
+ options.onFire(schedule, at);
198
+ }
199
+ }
200
+ return {
201
+ start() {
202
+ if (timer != null)
203
+ return;
204
+ timer = setInterval(() => tick(), intervalMs);
205
+ },
206
+ stop() {
207
+ if (timer != null) {
208
+ clearInterval(timer);
209
+ timer = null;
210
+ }
211
+ },
212
+ tick,
213
+ upcoming(at = now()) {
214
+ return options.schedules.map((s) => ({ id: s.id, at: nextRun(s, at) }));
215
+ },
216
+ };
217
+ }
218
+ /** A few common cron expressions, for docs, presets, and pickers. */
219
+ export const CRON_PRESETS = [
220
+ { label: 'Every minute', cron: '* * * * *' },
221
+ { label: 'Every 15 minutes', cron: '*/15 * * * *' },
222
+ { label: 'Hourly, on the hour', cron: '0 * * * *' },
223
+ { label: 'Every weekday at 09:00', cron: '0 9 * * 1-5' },
224
+ { label: 'Weekdays at 17:30', cron: '30 17 * * 1-5' },
225
+ { label: 'Daily at midnight', cron: '0 0 * * *' },
226
+ { label: 'Monday mornings at 08:00', cron: '0 8 * * 1' },
227
+ { label: 'First of the month at 06:00', cron: '0 6 1 * *' },
228
+ ];
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Schema-designer logic. The testable core behind `SvSchemaDesigner.svelte`:
3
+ * immutable operations that edit an `EntitySchema` (add / remove / reorder /
4
+ * retype fields, set the primary key), validation of the schema being designed,
5
+ * and sample-row generation for the live grid preview.
6
+ *
7
+ * Pure (no Svelte, no DOM), mirroring the pivot-designer / edit-panel split.
8
+ * Every mutation returns a NEW schema so Svelte reactivity and undo stay simple.
9
+ */
10
+ import type { EntityField, EntityFieldType, EntitySchema } from './schema';
11
+ /** All field types the designer offers, in menu order. */
12
+ export declare const FIELD_TYPES: ReadonlyArray<EntityFieldType>;
13
+ /** A fresh field with a name unique within the schema. */
14
+ export declare function blankField(schema: EntitySchema): EntityField;
15
+ /** Append a field (a blank one when none is given). */
16
+ export declare function addField(schema: EntitySchema, field?: EntityField): EntitySchema;
17
+ /** Remove a field by name. Clears `idField` if it pointed at the removed field. */
18
+ export declare function removeField(schema: EntitySchema, fieldName: string): EntitySchema;
19
+ /**
20
+ * Patch a field by name. Setting `primaryKey: true` clears it on every other
21
+ * field (a schema has at most one). Switching `type` drops now-irrelevant
22
+ * `options` (leaving enum) / `relation` (leaving relation).
23
+ */
24
+ export declare function updateField(schema: EntitySchema, fieldName: string, patch: Partial<EntityField>): EntitySchema;
25
+ /** Move a field one slot up (`-1`) or down (`+1`). No-op at the ends. */
26
+ export declare function moveField(schema: EntitySchema, fieldName: string, dir: -1 | 1): EntitySchema;
27
+ export type SchemaIssueLevel = 'error' | 'warning';
28
+ export type SchemaIssue = {
29
+ level: SchemaIssueLevel;
30
+ message: string;
31
+ field?: string;
32
+ };
33
+ /**
34
+ * Validate the schema under construction. Errors block code generation;
35
+ * warnings are advisory. Covers: at least one field, unique field names, a
36
+ * resolvable primary key, enums with options, and complete relations.
37
+ */
38
+ export declare function validateSchema(schema: EntitySchema): SchemaIssue[];
39
+ /** True when the schema has no error-level issues (warnings are allowed). */
40
+ export declare function isSchemaValid(schema: EntitySchema): boolean;
41
+ /** Deterministic, realistic sample rows for the designer's grid preview. */
42
+ export declare function sampleRows(schema: EntitySchema, count?: number): Array<Record<string, unknown>>;
@@ -0,0 +1,117 @@
1
+ import { resolveIdField } from './schema';
2
+ import { generateRows } from './studio/sample-data';
3
+ /** All field types the designer offers, in menu order. */
4
+ export const FIELD_TYPES = [
5
+ 'text',
6
+ 'number',
7
+ 'boolean',
8
+ 'date',
9
+ 'dateString',
10
+ 'datetime',
11
+ 'enum',
12
+ 'relation',
13
+ 'json',
14
+ ];
15
+ /** A fresh field with a name unique within the schema. */
16
+ export function blankField(schema) {
17
+ const taken = new Set(schema.fields.map((f) => f.field));
18
+ let n = schema.fields.length + 1;
19
+ let name = `field${n}`;
20
+ while (taken.has(name))
21
+ name = `field${++n}`;
22
+ return { field: name, type: 'text' };
23
+ }
24
+ /** Append a field (a blank one when none is given). */
25
+ export function addField(schema, field) {
26
+ return { ...schema, fields: [...schema.fields, field ?? blankField(schema)] };
27
+ }
28
+ /** Remove a field by name. Clears `idField` if it pointed at the removed field. */
29
+ export function removeField(schema, fieldName) {
30
+ const fields = schema.fields.filter((f) => f.field !== fieldName);
31
+ const idField = schema.idField === fieldName ? undefined : schema.idField;
32
+ return { ...schema, fields, idField };
33
+ }
34
+ /**
35
+ * Patch a field by name. Setting `primaryKey: true` clears it on every other
36
+ * field (a schema has at most one). Switching `type` drops now-irrelevant
37
+ * `options` (leaving enum) / `relation` (leaving relation).
38
+ */
39
+ export function updateField(schema, fieldName, patch) {
40
+ const makesPrimary = patch.primaryKey === true;
41
+ const fields = schema.fields.map((f) => {
42
+ if (f.field !== fieldName) {
43
+ return makesPrimary && f.primaryKey ? { ...f, primaryKey: false } : f;
44
+ }
45
+ const next = { ...f, ...patch };
46
+ if (patch.type && patch.type !== f.type) {
47
+ if (patch.type !== 'enum')
48
+ delete next.options;
49
+ if (patch.type !== 'relation')
50
+ delete next.relation;
51
+ }
52
+ return next;
53
+ });
54
+ return { ...schema, fields };
55
+ }
56
+ /** Move a field one slot up (`-1`) or down (`+1`). No-op at the ends. */
57
+ export function moveField(schema, fieldName, dir) {
58
+ const i = schema.fields.findIndex((f) => f.field === fieldName);
59
+ const j = i + dir;
60
+ if (i < 0 || j < 0 || j >= schema.fields.length)
61
+ return schema;
62
+ const fields = [...schema.fields];
63
+ const a = fields[i];
64
+ const b = fields[j];
65
+ fields[i] = b;
66
+ fields[j] = a;
67
+ return { ...schema, fields };
68
+ }
69
+ /**
70
+ * Validate the schema under construction. Errors block code generation;
71
+ * warnings are advisory. Covers: at least one field, unique field names, a
72
+ * resolvable primary key, enums with options, and complete relations.
73
+ */
74
+ export function validateSchema(schema) {
75
+ const issues = [];
76
+ if (schema.fields.length === 0) {
77
+ issues.push({ level: 'error', message: 'Add at least one field.' });
78
+ }
79
+ const seen = new Set();
80
+ for (const f of schema.fields) {
81
+ if (!f.field.trim()) {
82
+ issues.push({ level: 'error', message: 'A field has an empty name.' });
83
+ }
84
+ else if (seen.has(f.field)) {
85
+ issues.push({ level: 'error', message: `Duplicate field name "${f.field}".`, field: f.field });
86
+ }
87
+ seen.add(f.field);
88
+ if (f.type === 'enum' && (!f.options || f.options.length === 0)) {
89
+ issues.push({ level: 'warning', message: `Enum "${f.field}" has no options.`, field: f.field });
90
+ }
91
+ if (f.type === 'relation' && (!f.relation?.entity || !f.relation?.labelField)) {
92
+ issues.push({
93
+ level: 'warning',
94
+ message: `Relation "${f.field}" needs a related entity and label field.`,
95
+ field: f.field,
96
+ });
97
+ }
98
+ }
99
+ try {
100
+ resolveIdField(schema);
101
+ }
102
+ catch {
103
+ issues.push({
104
+ level: 'error',
105
+ message: 'No primary key: flag a field as primary key, set idField, or name a field "id".',
106
+ });
107
+ }
108
+ return issues;
109
+ }
110
+ /** True when the schema has no error-level issues (warnings are allowed). */
111
+ export function isSchemaValid(schema) {
112
+ return !validateSchema(schema).some((i) => i.level === 'error');
113
+ }
114
+ /** Deterministic, realistic sample rows for the designer's grid preview. */
115
+ export function sampleRows(schema, count = 3) {
116
+ return generateRows(schema.fields, count);
117
+ }