@svgrid/enterprise 2.5.3 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (624) hide show
  1. package/dist/SvAlertRuleEditor.svelte.d.ts +13 -0
  2. package/dist/SvAlertsManager.svelte.d.ts +14 -0
  3. package/dist/SvAlertsPanel.svelte.d.ts +9 -0
  4. package/dist/SvAuthGate.svelte.d.ts +22 -0
  5. package/dist/SvBoard.svelte.d.ts +35 -0
  6. package/dist/SvExportMenu.svelte.d.ts +61 -0
  7. package/{src → dist}/SvExpressionEditor.svelte +4 -1
  8. package/dist/SvExpressionEditor.svelte.d.ts +12 -0
  9. package/dist/SvFileInput.svelte.d.ts +20 -0
  10. package/dist/SvGridAlerts.svelte.d.ts +77 -0
  11. package/dist/SvGridBoard.svelte.d.ts +30 -0
  12. package/{src → dist}/SvGridEditPanel.svelte +173 -28
  13. package/dist/SvGridEditPanel.svelte.d.ts +75 -0
  14. package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
  15. package/dist/SvGridScheduler.svelte.d.ts +30 -0
  16. package/dist/SvImportDialog.svelte.d.ts +88 -0
  17. package/dist/SvLookupInput.svelte.d.ts +21 -0
  18. package/dist/SvPivotDesigner.svelte.d.ts +176 -0
  19. package/dist/SvRecordDetail.svelte.d.ts +58 -0
  20. package/dist/SvSchedule.svelte.d.ts +29 -0
  21. package/dist/SvSchemaChart.svelte.d.ts +61 -0
  22. package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
  23. package/dist/alerts/alert-engine-attach.d.ts +79 -0
  24. package/dist/alerts/alert-engine-attach.js +106 -0
  25. package/dist/alerts/alert-engine.d.ts +42 -0
  26. package/dist/alerts/alert-engine.js +196 -0
  27. package/dist/alerts/alert-formats.d.ts +26 -0
  28. package/dist/alerts/alert-formats.js +58 -0
  29. package/dist/alerts/alert-observer.d.ts +54 -0
  30. package/dist/alerts/alert-observer.js +156 -0
  31. package/dist/alerts/alert-scheduler.d.ts +30 -0
  32. package/dist/alerts/alert-scheduler.js +54 -0
  33. package/dist/alerts/alert-storage.d.ts +31 -0
  34. package/dist/alerts/alert-storage.js +92 -0
  35. package/dist/alerts/alert-store.svelte.d.ts +24 -0
  36. package/dist/alerts/alert-store.svelte.js +69 -0
  37. package/dist/alerts/alert-types.d.ts +86 -0
  38. package/dist/alerts/alert-types.js +1 -0
  39. package/dist/alerts.d.ts +2 -0
  40. package/{src/alerts.ts → dist/alerts.js} +9 -9
  41. package/dist/board.d.ts +7 -0
  42. package/{src/board.ts → dist/board.js} +13 -14
  43. package/dist/cdn/svgrid-enterprise.svelte-external.js +3220 -2607
  44. package/dist/designer/assets/index-BfzoL904.css +1 -0
  45. package/dist/designer/assets/{index-CBYU-KNn.js → index-CKdwDseq.js} +139 -139
  46. package/dist/designer/assets/src-DCKhP5Xy.css +1 -0
  47. package/dist/designer/assets/{src-i309BeJb.js → src-DLsSdh3J.js} +213 -193
  48. package/dist/designer/index.html +4 -4
  49. package/dist/edit-panel.d.ts +105 -0
  50. package/dist/edit-panel.js +350 -0
  51. package/dist/export-conditional.d.ts +31 -0
  52. package/dist/export-conditional.js +65 -0
  53. package/dist/export-ooxml.d.ts +93 -0
  54. package/dist/export-ooxml.js +385 -0
  55. package/dist/export-pdf.d.ts +107 -0
  56. package/dist/export-pdf.js +144 -0
  57. package/dist/export-print.d.ts +55 -0
  58. package/dist/export-print.js +91 -0
  59. package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
  60. package/dist/export-serialize.js +11 -0
  61. package/dist/export-xls.d.ts +26 -0
  62. package/dist/export-xls.js +157 -0
  63. package/dist/export.d.ts +323 -0
  64. package/dist/export.js +1021 -0
  65. package/dist/expressions/evaluate.d.ts +17 -0
  66. package/dist/expressions/evaluate.js +214 -0
  67. package/dist/expressions/expression-columns.d.ts +61 -0
  68. package/dist/expressions/expression-columns.js +72 -0
  69. package/dist/expressions/expression-types.d.ts +125 -0
  70. package/dist/expressions/expression-types.js +1 -0
  71. package/dist/expressions/parse.d.ts +25 -0
  72. package/dist/expressions/parse.js +537 -0
  73. package/dist/import.d.ts +232 -0
  74. package/dist/import.js +846 -0
  75. package/dist/index.d.ts +66 -0
  76. package/dist/index.js +91 -0
  77. package/dist/install.d.ts +70 -0
  78. package/dist/install.js +61 -0
  79. package/dist/license-core.d.ts +37 -0
  80. package/dist/license-core.js +81 -0
  81. package/dist/license.d.ts +30 -0
  82. package/dist/license.js +139 -0
  83. package/dist/master-detail.d.ts +23 -0
  84. package/dist/master-detail.js +35 -0
  85. package/dist/node/studio.js +683 -13
  86. package/dist/pivot-chart.d.ts +28 -0
  87. package/dist/pivot-chart.js +71 -0
  88. package/dist/pivot-designer.d.ts +69 -0
  89. package/dist/pivot-designer.js +38 -0
  90. package/dist/pivot-enable.d.ts +6 -0
  91. package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
  92. package/dist/pivot.d.ts +111 -0
  93. package/dist/pivot.js +353 -0
  94. package/dist/print.d.ts +33 -0
  95. package/dist/print.js +61 -0
  96. package/dist/revoked.d.ts +1 -0
  97. package/{src/revoked.ts → dist/revoked.js} +5 -6
  98. package/dist/scheduler-assignments.d.ts +64 -0
  99. package/dist/scheduler-assignments.js +92 -0
  100. package/dist/scheduler-axis.d.ts +81 -0
  101. package/dist/scheduler-axis.js +180 -0
  102. package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
  103. package/dist/scheduler-booking.js +50 -0
  104. package/dist/scheduler-config.d.ts +177 -0
  105. package/dist/scheduler-config.js +1 -0
  106. package/dist/scheduler-dependencies.d.ts +89 -0
  107. package/dist/scheduler-dependencies.js +179 -0
  108. package/dist/scheduler-freebusy.d.ts +19 -0
  109. package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
  110. package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
  111. package/dist/scheduler-heatmap.js +41 -0
  112. package/dist/scheduler-resource-tree.d.ts +48 -0
  113. package/dist/scheduler-resource-tree.js +78 -0
  114. package/dist/scheduler-slots.d.ts +37 -0
  115. package/dist/scheduler-slots.js +80 -0
  116. package/dist/scheduler-summary.d.ts +41 -0
  117. package/dist/scheduler-summary.js +54 -0
  118. package/dist/scheduler.d.ts +7 -0
  119. package/{src/scheduler.ts → dist/scheduler.js} +13 -14
  120. package/dist/scheduling.d.ts +132 -0
  121. package/dist/scheduling.js +228 -0
  122. package/dist/schema-designer.d.ts +42 -0
  123. package/dist/schema-designer.js +117 -0
  124. package/dist/schema.d.ts +408 -0
  125. package/dist/schema.js +225 -0
  126. package/dist/smart-shim.d.ts +62 -0
  127. package/dist/smart-shim.js +34 -0
  128. package/dist/sources/aggregate.d.ts +43 -0
  129. package/dist/sources/aggregate.js +60 -0
  130. package/dist/sources/auth-supabase.d.ts +69 -0
  131. package/dist/sources/auth-supabase.js +39 -0
  132. package/dist/sources/dashboard.d.ts +65 -0
  133. package/dist/sources/dashboard.js +95 -0
  134. package/dist/sources/field-inference.d.ts +23 -0
  135. package/dist/sources/field-inference.js +52 -0
  136. package/dist/sources/filters.d.ts +35 -0
  137. package/dist/sources/filters.js +52 -0
  138. package/dist/sources/index.d.ts +18 -0
  139. package/dist/sources/index.js +18 -0
  140. package/dist/sources/introspect-supabase.d.ts +30 -0
  141. package/dist/sources/introspect-supabase.js +134 -0
  142. package/dist/sources/realtime-supabase.d.ts +37 -0
  143. package/dist/sources/realtime-supabase.js +52 -0
  144. package/dist/sources/relation-lookup.d.ts +50 -0
  145. package/dist/sources/relation-lookup.js +77 -0
  146. package/dist/sources/rest-adapters.d.ts +48 -0
  147. package/dist/sources/rest-adapters.js +85 -0
  148. package/dist/sources/rest.d.ts +38 -0
  149. package/dist/sources/rest.js +86 -0
  150. package/dist/sources/schema-from-columns.d.ts +37 -0
  151. package/dist/sources/schema-from-columns.js +48 -0
  152. package/dist/sources/supabase.d.ts +33 -0
  153. package/dist/sources/supabase.js +74 -0
  154. package/dist/sources/with-entity-rules.d.ts +25 -0
  155. package/dist/sources/with-entity-rules.js +47 -0
  156. package/dist/sources/with-relation-labels.d.ts +26 -0
  157. package/dist/sources/with-relation-labels.js +38 -0
  158. package/dist/staged-editing.d.ts +85 -0
  159. package/dist/staged-editing.js +0 -0
  160. package/dist/studio/bug-report.d.ts +61 -0
  161. package/dist/studio/bug-report.js +126 -0
  162. package/dist/studio/cli.d.ts +56 -0
  163. package/dist/studio/cli.js +70 -0
  164. package/dist/studio/copilot-core.d.ts +22 -0
  165. package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
  166. package/dist/studio/csv.d.ts +36 -0
  167. package/dist/studio/csv.js +173 -0
  168. package/dist/studio/db-connect-string.d.ts +45 -0
  169. package/dist/studio/db-connect-string.js +113 -0
  170. package/dist/studio/deploy-cli.d.ts +35 -0
  171. package/dist/studio/deploy-cli.js +81 -0
  172. package/dist/studio/emit-project.d.ts +77 -0
  173. package/dist/studio/emit-project.js +5463 -0
  174. package/dist/studio/emit-schema.d.ts +110 -0
  175. package/dist/studio/emit-schema.js +1128 -0
  176. package/dist/studio/index.d.ts +35 -0
  177. package/dist/studio/index.js +41 -0
  178. package/dist/studio/init-flow.d.ts +58 -0
  179. package/dist/studio/init-flow.js +451 -0
  180. package/dist/studio/introspect-db.d.ts +47 -0
  181. package/dist/studio/introspect-db.js +255 -0
  182. package/dist/studio/introspect-openapi.d.ts +19 -0
  183. package/dist/studio/introspect-openapi.js +244 -0
  184. package/dist/studio/introspect-prisma.d.ts +25 -0
  185. package/dist/studio/introspect-prisma.js +164 -0
  186. package/dist/studio/introspect.d.ts +35 -0
  187. package/dist/studio/introspect.js +306 -0
  188. package/dist/studio/project.d.ts +1448 -0
  189. package/dist/studio/project.js +2187 -0
  190. package/dist/studio/sample-data.d.ts +19 -0
  191. package/dist/studio/sample-data.js +207 -0
  192. package/dist/studio/samples/ats.d.ts +2 -0
  193. package/dist/studio/samples/ats.js +194 -0
  194. package/dist/studio/samples/clinic.d.ts +2 -0
  195. package/dist/studio/samples/clinic.js +171 -0
  196. package/dist/studio/samples/crm.d.ts +2 -0
  197. package/dist/studio/samples/crm.js +280 -0
  198. package/dist/studio/samples/datasets.d.ts +38 -0
  199. package/dist/studio/samples/datasets.js +296 -0
  200. package/dist/studio/samples/ecommerce.d.ts +2 -0
  201. package/dist/studio/samples/ecommerce.js +178 -0
  202. package/dist/studio/samples/events.d.ts +2 -0
  203. package/dist/studio/samples/events.js +192 -0
  204. package/dist/studio/samples/fleet.d.ts +2 -0
  205. package/dist/studio/samples/fleet.js +203 -0
  206. package/dist/studio/samples/gym.d.ts +2 -0
  207. package/dist/studio/samples/gym.js +205 -0
  208. package/dist/studio/samples/hr.d.ts +2 -0
  209. package/dist/studio/samples/hr.js +186 -0
  210. package/dist/studio/samples/index.d.ts +13 -0
  211. package/dist/studio/samples/index.js +44 -0
  212. package/dist/studio/samples/insurance.d.ts +2 -0
  213. package/dist/studio/samples/insurance.js +220 -0
  214. package/dist/studio/samples/inventory.d.ts +2 -0
  215. package/dist/studio/samples/inventory.js +204 -0
  216. package/dist/studio/samples/invoicing.d.ts +2 -0
  217. package/dist/studio/samples/invoicing.js +154 -0
  218. package/dist/studio/samples/library.d.ts +2 -0
  219. package/dist/studio/samples/library.js +171 -0
  220. package/dist/studio/samples/live-data.d.ts +5 -0
  221. package/dist/studio/samples/live-data.js +261 -0
  222. package/dist/studio/samples/projects.d.ts +2 -0
  223. package/dist/studio/samples/projects.js +203 -0
  224. package/dist/studio/samples/realestate.d.ts +2 -0
  225. package/dist/studio/samples/realestate.js +187 -0
  226. package/dist/studio/samples/restaurant.d.ts +2 -0
  227. package/dist/studio/samples/restaurant.js +180 -0
  228. package/dist/studio/samples/school.d.ts +2 -0
  229. package/dist/studio/samples/school.js +188 -0
  230. package/dist/studio/samples/shared.d.ts +142 -0
  231. package/dist/studio/samples/shared.js +164 -0
  232. package/dist/studio/samples/starter.d.ts +4 -0
  233. package/dist/studio/samples/starter.js +237 -0
  234. package/dist/studio/samples/subscriptions.d.ts +2 -0
  235. package/dist/studio/samples/subscriptions.js +175 -0
  236. package/dist/studio/samples/support.d.ts +2 -0
  237. package/dist/studio/samples/support.js +209 -0
  238. package/dist/studio/scaffold-app.d.ts +22 -0
  239. package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
  240. package/dist/studio/scaffold.d.ts +63 -0
  241. package/dist/studio/scaffold.js +346 -0
  242. package/dist/studio/screen-suites.d.ts +193 -0
  243. package/dist/studio/screen-suites.js +297 -0
  244. package/dist/studio/themes.d.ts +34 -0
  245. package/dist/studio/themes.js +41 -0
  246. package/dist/studio/ui-components.d.ts +89 -0
  247. package/dist/studio/ui-components.generated.d.ts +29 -0
  248. package/dist/studio/ui-components.generated.js +7319 -0
  249. package/dist/studio/ui-components.js +673 -0
  250. package/dist/studio/user-error.d.ts +23 -0
  251. package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
  252. package/dist/studio/verify.d.ts +34 -0
  253. package/dist/studio/verify.js +47 -0
  254. package/dist/sveltekit/in-memory.d.ts +14 -0
  255. package/dist/sveltekit/in-memory.js +113 -0
  256. package/dist/sveltekit/index.d.ts +6 -0
  257. package/dist/sveltekit/index.js +5 -0
  258. package/dist/sveltekit/query-plan.d.ts +44 -0
  259. package/dist/sveltekit/query-plan.js +76 -0
  260. package/dist/sveltekit/sql-source.d.ts +47 -0
  261. package/dist/sveltekit/sql-source.js +106 -0
  262. package/dist/sveltekit/sql.d.ts +48 -0
  263. package/dist/sveltekit/sql.js +73 -0
  264. package/dist/sveltekit/transport.d.ts +209 -0
  265. package/dist/sveltekit/transport.js +219 -0
  266. package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
  267. package/dist/sveltekit/types.js +1 -0
  268. package/dist/upgrade-prompt.d.ts +16 -0
  269. package/dist/upgrade-prompt.js +141 -0
  270. package/dist/version.d.ts +13 -0
  271. package/{src/version.ts → dist/version.js} +1 -1
  272. package/dist/watermark.d.ts +2 -0
  273. package/dist/watermark.js +146 -0
  274. package/package.json +28 -26
  275. package/dist/designer/assets/index-oYok52zd.css +0 -1
  276. package/dist/designer/assets/src-D-O2F805.css +0 -1
  277. package/src/SvBoard.dom.test.ts +0 -67
  278. package/src/SvGridAlerts.dom.test.ts +0 -113
  279. package/src/SvGridEditPanel.dom.test.ts +0 -320
  280. package/src/SvRecordDetail.dom.test.ts +0 -137
  281. package/src/SvSchedule.dom.test.ts +0 -57
  282. package/src/ai-export-pdf.dom.test.ts +0 -77
  283. package/src/ai-export-xlsx.dom.test.ts +0 -90
  284. package/src/ai-export.dom.test.ts +0 -114
  285. package/src/alerts/alert-engine-attach.ts +0 -165
  286. package/src/alerts/alert-engine.test.ts +0 -135
  287. package/src/alerts/alert-engine.ts +0 -260
  288. package/src/alerts/alert-formats.test.ts +0 -87
  289. package/src/alerts/alert-formats.ts +0 -77
  290. package/src/alerts/alert-observer.test.ts +0 -189
  291. package/src/alerts/alert-observer.ts +0 -208
  292. package/src/alerts/alert-scheduler.ts +0 -96
  293. package/src/alerts/alert-storage.test.ts +0 -54
  294. package/src/alerts/alert-storage.ts +0 -116
  295. package/src/alerts/alert-store.svelte.ts +0 -80
  296. package/src/alerts/alert-types.ts +0 -94
  297. package/src/board.dom.test.ts +0 -941
  298. package/src/edit-panel.test.ts +0 -322
  299. package/src/edit-panel.ts +0 -379
  300. package/src/export-conditional.test.ts +0 -60
  301. package/src/export-conditional.ts +0 -94
  302. package/src/export-ooxml.test.ts +0 -152
  303. package/src/export-ooxml.ts +0 -489
  304. package/src/export-pdf.test.ts +0 -138
  305. package/src/export-pdf.ts +0 -245
  306. package/src/export-print.test.ts +0 -66
  307. package/src/export-print.ts +0 -132
  308. package/src/export-serialize.test.ts +0 -56
  309. package/src/export-xls.ts +0 -199
  310. package/src/export-xlsx-roundtrip.test.ts +0 -120
  311. package/src/export-xlsx.test.ts +0 -150
  312. package/src/export.test.ts +0 -349
  313. package/src/export.ts +0 -1464
  314. package/src/expressions/evaluate.test.ts +0 -111
  315. package/src/expressions/evaluate.ts +0 -237
  316. package/src/expressions/expression-columns.ts +0 -133
  317. package/src/expressions/expression-types.ts +0 -84
  318. package/src/expressions/parse.test.ts +0 -106
  319. package/src/expressions/parse.ts +0 -610
  320. package/src/import-automap.test.ts +0 -131
  321. package/src/import-hardening.test.ts +0 -158
  322. package/src/import.test.ts +0 -415
  323. package/src/import.ts +0 -1044
  324. package/src/index.ts +0 -569
  325. package/src/install.ts +0 -154
  326. package/src/license-core.test.ts +0 -23
  327. package/src/license-core.ts +0 -107
  328. package/src/license-expiry.test.ts +0 -144
  329. package/src/license.ts +0 -157
  330. package/src/master-detail.test.ts +0 -61
  331. package/src/master-detail.ts +0 -42
  332. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  333. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
  334. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
  335. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
  336. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
  337. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
  338. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
  339. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
  340. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
  341. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
  342. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
  343. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
  344. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
  345. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
  346. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
  347. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  348. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  349. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  350. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  351. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  352. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  353. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  354. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  355. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  356. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  357. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  358. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  359. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  360. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  361. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  362. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  363. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  364. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  365. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  366. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  367. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  368. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  369. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  370. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  371. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  372. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  373. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  374. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  375. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  376. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  377. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  378. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  379. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  380. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  381. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  382. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
  383. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
  384. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
  385. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
  386. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
  387. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
  388. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
  389. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
  390. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
  391. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
  392. package/src/pivot-chart.test.ts +0 -86
  393. package/src/pivot-chart.ts +0 -112
  394. package/src/pivot-designer.ts +0 -101
  395. package/src/pivot.test.ts +0 -335
  396. package/src/pivot.ts +0 -578
  397. package/src/print.ts +0 -107
  398. package/src/scheduler-assignments.test.ts +0 -97
  399. package/src/scheduler-assignments.ts +0 -134
  400. package/src/scheduler-axis.test.ts +0 -108
  401. package/src/scheduler-axis.ts +0 -238
  402. package/src/scheduler-booking.test.ts +0 -57
  403. package/src/scheduler-config.ts +0 -179
  404. package/src/scheduler-dependencies.test.ts +0 -155
  405. package/src/scheduler-dependencies.ts +0 -223
  406. package/src/scheduler-freebusy.test.ts +0 -41
  407. package/src/scheduler-heatmap.test.ts +0 -39
  408. package/src/scheduler-resource-tree.test.ts +0 -84
  409. package/src/scheduler-resource-tree.ts +0 -107
  410. package/src/scheduler-slots.test.ts +0 -53
  411. package/src/scheduler-slots.ts +0 -94
  412. package/src/scheduler-summary.test.ts +0 -47
  413. package/src/scheduler-summary.ts +0 -81
  414. package/src/scheduling.test.ts +0 -194
  415. package/src/scheduling.ts +0 -293
  416. package/src/schema-designer.test.ts +0 -121
  417. package/src/schema-designer.ts +0 -142
  418. package/src/schema.test.ts +0 -268
  419. package/src/schema.ts +0 -562
  420. package/src/smart-shim.ts +0 -107
  421. package/src/sources/aggregate.test.ts +0 -79
  422. package/src/sources/aggregate.ts +0 -102
  423. package/src/sources/auth-supabase.test.ts +0 -80
  424. package/src/sources/auth-supabase.ts +0 -87
  425. package/src/sources/dashboard.kpi.test.ts +0 -50
  426. package/src/sources/dashboard.test.ts +0 -61
  427. package/src/sources/dashboard.ts +0 -136
  428. package/src/sources/field-inference.test.ts +0 -60
  429. package/src/sources/field-inference.ts +0 -63
  430. package/src/sources/filters.test.ts +0 -58
  431. package/src/sources/filters.ts +0 -70
  432. package/src/sources/index.ts +0 -67
  433. package/src/sources/introspect-supabase.test.ts +0 -112
  434. package/src/sources/introspect-supabase.ts +0 -139
  435. package/src/sources/realtime-supabase.test.ts +0 -93
  436. package/src/sources/realtime-supabase.ts +0 -99
  437. package/src/sources/relation-lookup.test.ts +0 -99
  438. package/src/sources/relation-lookup.ts +0 -128
  439. package/src/sources/rest-adapters.test.ts +0 -95
  440. package/src/sources/rest-adapters.ts +0 -120
  441. package/src/sources/rest.test.ts +0 -104
  442. package/src/sources/rest.ts +0 -129
  443. package/src/sources/schema-from-columns.test.ts +0 -106
  444. package/src/sources/schema-from-columns.ts +0 -88
  445. package/src/sources/supabase.test.ts +0 -110
  446. package/src/sources/supabase.ts +0 -99
  447. package/src/sources/with-entity-rules.test.ts +0 -104
  448. package/src/sources/with-entity-rules.ts +0 -78
  449. package/src/sources/with-relation-labels.test.ts +0 -75
  450. package/src/sources/with-relation-labels.ts +0 -73
  451. package/src/staged-editing.ts +0 -0
  452. package/src/studio/bug-report.test.ts +0 -101
  453. package/src/studio/bug-report.ts +0 -165
  454. package/src/studio/cli.test.ts +0 -187
  455. package/src/studio/cli.ts +0 -117
  456. package/src/studio/copilot-core.test.ts +0 -45
  457. package/src/studio/csv.test.ts +0 -90
  458. package/src/studio/csv.ts +0 -165
  459. package/src/studio/db-connect-string.test.ts +0 -94
  460. package/src/studio/db-connect-string.ts +0 -128
  461. package/src/studio/deploy-cli.test.ts +0 -56
  462. package/src/studio/deploy-cli.ts +0 -100
  463. package/src/studio/emit-project.test.ts +0 -3324
  464. package/src/studio/emit-project.ts +0 -5377
  465. package/src/studio/emit-schema.test.ts +0 -111
  466. package/src/studio/emit-schema.ts +0 -1181
  467. package/src/studio/index.ts +0 -380
  468. package/src/studio/init-flow.test.ts +0 -514
  469. package/src/studio/init-flow.ts +0 -556
  470. package/src/studio/introspect-db.test.ts +0 -186
  471. package/src/studio/introspect-db.ts +0 -312
  472. package/src/studio/introspect-openapi.test.ts +0 -84
  473. package/src/studio/introspect-openapi.ts +0 -252
  474. package/src/studio/introspect-prisma.test.ts +0 -99
  475. package/src/studio/introspect-prisma.ts +0 -175
  476. package/src/studio/introspect.test.ts +0 -172
  477. package/src/studio/introspect.ts +0 -310
  478. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  479. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  480. package/src/studio/pipeline.test.ts +0 -42
  481. package/src/studio/project-robust.test.ts +0 -157
  482. package/src/studio/project.test.ts +0 -929
  483. package/src/studio/project.ts +0 -2394
  484. package/src/studio/sample-data.test.ts +0 -58
  485. package/src/studio/sample-data.ts +0 -203
  486. package/src/studio/samples/ats.ts +0 -202
  487. package/src/studio/samples/clinic.ts +0 -179
  488. package/src/studio/samples/crm.ts +0 -291
  489. package/src/studio/samples/datasets.test.ts +0 -84
  490. package/src/studio/samples/datasets.ts +0 -340
  491. package/src/studio/samples/ecommerce.ts +0 -187
  492. package/src/studio/samples/events.ts +0 -201
  493. package/src/studio/samples/fleet.ts +0 -213
  494. package/src/studio/samples/gym.ts +0 -215
  495. package/src/studio/samples/hr.ts +0 -195
  496. package/src/studio/samples/index.ts +0 -55
  497. package/src/studio/samples/insurance.ts +0 -229
  498. package/src/studio/samples/inventory.ts +0 -213
  499. package/src/studio/samples/invoicing.ts +0 -162
  500. package/src/studio/samples/library.ts +0 -180
  501. package/src/studio/samples/live-data.test.ts +0 -99
  502. package/src/studio/samples/live-data.ts +0 -306
  503. package/src/studio/samples/projects.ts +0 -212
  504. package/src/studio/samples/realestate.ts +0 -196
  505. package/src/studio/samples/restaurant.ts +0 -189
  506. package/src/studio/samples/samples.test.ts +0 -304
  507. package/src/studio/samples/school.ts +0 -197
  508. package/src/studio/samples/seed-floor.test.ts +0 -25
  509. package/src/studio/samples/shared.ts +0 -237
  510. package/src/studio/samples/starter.ts +0 -251
  511. package/src/studio/samples/subscriptions.ts +0 -183
  512. package/src/studio/samples/support.ts +0 -216
  513. package/src/studio/scaffold-app.test.ts +0 -91
  514. package/src/studio/scaffold.test.ts +0 -192
  515. package/src/studio/scaffold.ts +0 -390
  516. package/src/studio/screen-suites.test.ts +0 -269
  517. package/src/studio/screen-suites.ts +0 -448
  518. package/src/studio/themes.ts +0 -62
  519. package/src/studio/ui-components-surface.test.ts +0 -185
  520. package/src/studio/ui-components.generated.ts +0 -7154
  521. package/src/studio/ui-components.ts +0 -742
  522. package/src/studio/verify.test.ts +0 -47
  523. package/src/studio/verify.ts +0 -79
  524. package/src/sveltekit/in-memory.test.ts +0 -104
  525. package/src/sveltekit/in-memory.ts +0 -129
  526. package/src/sveltekit/index.ts +0 -24
  527. package/src/sveltekit/query-plan.test.ts +0 -109
  528. package/src/sveltekit/query-plan.ts +0 -125
  529. package/src/sveltekit/sql-source.test.ts +0 -198
  530. package/src/sveltekit/sql-source.ts +0 -171
  531. package/src/sveltekit/sql.test.ts +0 -80
  532. package/src/sveltekit/sql.ts +0 -131
  533. package/src/sveltekit/transport-scope.test.ts +0 -125
  534. package/src/sveltekit/transport.test.ts +0 -201
  535. package/src/sveltekit/transport.ts +0 -373
  536. package/src/upgrade-prompt.test.ts +0 -71
  537. package/src/upgrade-prompt.ts +0 -162
  538. package/src/version.test.ts +0 -17
  539. package/src/watermark.test.ts +0 -97
  540. package/src/watermark.ts +0 -156
  541. /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
  542. /package/{src → dist}/SvAlertsManager.svelte +0 -0
  543. /package/{src → dist}/SvAlertsPanel.svelte +0 -0
  544. /package/{src → dist}/SvAuthGate.svelte +0 -0
  545. /package/{src → dist}/SvBoard.svelte +0 -0
  546. /package/{src → dist}/SvExportMenu.svelte +0 -0
  547. /package/{src → dist}/SvFileInput.svelte +0 -0
  548. /package/{src → dist}/SvGridAlerts.svelte +0 -0
  549. /package/{src → dist}/SvGridBoard.svelte +0 -0
  550. /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
  551. /package/{src → dist}/SvGridScheduler.svelte +0 -0
  552. /package/{src → dist}/SvImportDialog.svelte +0 -0
  553. /package/{src → dist}/SvLookupInput.svelte +0 -0
  554. /package/{src → dist}/SvPivotDesigner.svelte +0 -0
  555. /package/{src → dist}/SvRecordDetail.svelte +0 -0
  556. /package/{src → dist}/SvSchedule.svelte +0 -0
  557. /package/{src → dist}/SvSchemaChart.svelte +0 -0
  558. /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
  559. /package/{src → dist}/pdfmake-shims.d.ts +0 -0
  560. /package/{src → dist}/smart.export.d.ts +0 -0
  561. /package/{src → dist}/smart.export.js +0 -0
  562. /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
  563. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
  564. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
  565. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
  566. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
  567. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
  568. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
  569. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
  570. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
  571. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
  572. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
  573. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
  574. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
  575. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
  576. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
  577. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
  578. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
  579. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
  580. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
  581. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
  582. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
  583. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
  584. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
  585. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
  586. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
  587. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
  588. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
  589. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
  590. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
  591. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
  592. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
  593. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
  594. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
  595. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
  596. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
  597. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
  598. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
  599. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
  600. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
  601. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
  602. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
  603. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
  604. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
  605. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
  606. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
  607. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
  608. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
  609. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
  610. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
  611. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
  612. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
  613. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
  614. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
  615. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
  616. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
  617. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
  618. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
  619. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
  620. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
  621. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
  622. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
  623. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
  624. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -0
@@ -1,84 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
- import { buildResourceRows, visibleResourceIds, type SchedulerResourceGroup } from './scheduler-resource-tree'
3
-
4
- type Res = { id: string; title?: string; group?: string }
5
- const groupOf = (r: Res) => r.group
6
-
7
- const groups: SchedulerResourceGroup[] = [
8
- { id: 'clinic', title: 'Clinic' },
9
- { id: 'cardio', title: 'Cardiology', parentId: 'clinic' },
10
- { id: 'derm', title: 'Dermatology', parentId: 'clinic' },
11
- ]
12
- const resources: Res[] = [
13
- { id: 'dr-a', title: 'Dr A', group: 'cardio' },
14
- { id: 'dr-b', title: 'Dr B', group: 'cardio' },
15
- { id: 'dr-c', title: 'Dr C', group: 'derm' },
16
- ]
17
-
18
- describe('buildResourceRows', () => {
19
- it('nests groups and interleaves resources in tree order', () => {
20
- const rows = buildResourceRows(resources, groups, groupOf)
21
- expect(rows.map((r) => `${r.kind}:${r.id}@${r.depth}`)).toEqual([
22
- 'group:clinic@0',
23
- 'group:cardio@1',
24
- 'resource:dr-a@2',
25
- 'resource:dr-b@2',
26
- 'group:derm@1',
27
- 'resource:dr-c@2',
28
- ])
29
- })
30
-
31
- it('computes childResourceIds (roll-up) for each group subtree', () => {
32
- const rows = buildResourceRows(resources, groups, groupOf)
33
- const byId = Object.fromEntries(rows.filter((r) => r.kind === 'group').map((r) => [r.id, r.childResourceIds]))
34
- expect(byId.clinic).toEqual(['dr-a', 'dr-b', 'dr-c'])
35
- expect(byId.cardio).toEqual(['dr-a', 'dr-b'])
36
- expect(byId.derm).toEqual(['dr-c'])
37
- })
38
-
39
- it('collapsing a group hides its subtree but keeps the header', () => {
40
- const rows = buildResourceRows(resources, groups, groupOf, new Set(['cardio']))
41
- expect(rows.map((r) => `${r.kind}:${r.id}`)).toEqual([
42
- 'group:clinic',
43
- 'group:cardio', // header stays
44
- // dr-a, dr-b hidden
45
- 'group:derm',
46
- 'resource:dr-c',
47
- ])
48
- expect(rows.find((r) => r.id === 'cardio')?.collapsed).toBe(true)
49
- })
50
-
51
- it('collapsing an ancestor hides all descendants', () => {
52
- const rows = buildResourceRows(resources, groups, groupOf, new Set(['clinic']))
53
- expect(rows.map((r) => r.id)).toEqual(['clinic'])
54
- })
55
-
56
- it('puts ungrouped / unknown-group resources in a trailing section (no header)', () => {
57
- const res: Res[] = [{ id: 'x', group: 'cardio' }, { id: 'y' }, { id: 'z', group: 'nope' }]
58
- const rows = buildResourceRows(res, groups, groupOf)
59
- const last2 = rows.slice(-2).map((r) => `${r.kind}:${r.id}@${r.depth}`)
60
- expect(last2).toEqual(['resource:y@0', 'resource:z@0'])
61
- })
62
-
63
- it('treats a group with an unknown parent as a root', () => {
64
- const g: SchedulerResourceGroup[] = [{ id: 'a', title: 'A', parentId: 'ghost' }]
65
- const rows = buildResourceRows([{ id: 'r', group: 'a' }], g, groupOf)
66
- expect(rows[0]).toMatchObject({ kind: 'group', id: 'a', depth: 0 })
67
- })
68
-
69
- it('does not loop on a cyclic parent chain', () => {
70
- const g: SchedulerResourceGroup[] = [
71
- { id: 'a', title: 'A', parentId: 'b' },
72
- { id: 'b', title: 'B', parentId: 'a' },
73
- ]
74
- const rows = buildResourceRows([{ id: 'r', group: 'a' }], g, groupOf)
75
- // Should terminate; both groups appear at most once.
76
- expect(rows.filter((r) => r.id === 'a').length).toBeLessThanOrEqual(1)
77
- expect(rows.filter((r) => r.id === 'b').length).toBeLessThanOrEqual(1)
78
- })
79
-
80
- it('visibleResourceIds returns leaf resources in order', () => {
81
- const rows = buildResourceRows(resources, groups, groupOf)
82
- expect(visibleResourceIds(rows)).toEqual(['dr-a', 'dr-b', 'dr-c'])
83
- })
84
- })
@@ -1,107 +0,0 @@
1
- /**
2
- * scheduler-resource-tree - the pure core behind Scheduler Pro *grouped / tree
3
- * resources*. No Svelte, no DOM. Resources are flat in the base grid; this builds
4
- * a hierarchy of collapsible GROUP header rows (departments -> teams -> people)
5
- * interleaved with the resource rows, so the timeline gutter can render a tree.
6
- *
7
- * Groups nest via `parentId`; each resource is mapped to a group by a `groupOf`
8
- * accessor. Resources whose group is unknown / unset fall into a trailing
9
- * "ungrouped" section (rendered without a header). Collapsing a group drops its
10
- * whole subtree from the output (the header stays).
11
- */
12
-
13
- /** A group node in the resource tree. `parentId` nests it under another group. */
14
- export type SchedulerResourceGroup = {
15
- id: string
16
- title: string
17
- parentId?: string
18
- color?: string
19
- }
20
-
21
- /** One rendered row: a group header, or a leaf resource. */
22
- export type ResourceRow<R = unknown> = {
23
- kind: 'group' | 'resource'
24
- id: string
25
- title: string
26
- /** Indent depth (0 = top level). */
27
- depth: number
28
- color?: string
29
- /** Present for `kind: 'resource'`. */
30
- resource?: R
31
- /** Present for `kind: 'group'`: whether it is collapsed. */
32
- collapsed?: boolean
33
- /** Present for `kind: 'group'`: every leaf resource id in its subtree (for roll-ups). */
34
- childResourceIds?: string[]
35
- }
36
-
37
- type MinResource = { id: string; title?: string; color?: string }
38
-
39
- /**
40
- * Build the ordered tree rows. `groups` define the hierarchy; `groupOf(resource)`
41
- * returns the group id a resource belongs to (or undefined = ungrouped). `collapsed`
42
- * is the set of collapsed group ids. Order: for each group, its child groups
43
- * (recursively) then its direct resources; ungrouped resources trail at the end.
44
- */
45
- export function buildResourceRows<R extends MinResource>(
46
- resources: ReadonlyArray<R>,
47
- groups: ReadonlyArray<SchedulerResourceGroup>,
48
- groupOf: (r: R) => string | undefined,
49
- collapsed: ReadonlySet<string> = new Set(),
50
- ): ResourceRow<R>[] {
51
- const groupById = new Map<string, SchedulerResourceGroup>()
52
- for (const g of groups) if (g && g.id) groupById.set(g.id, g)
53
-
54
- // parentId -> child groups (root groups keyed under '' ). A parentId that is not
55
- // a known group is treated as a root.
56
- const childGroups = new Map<string, SchedulerResourceGroup[]>()
57
- for (const g of groupById.values()) {
58
- const p = g.parentId && groupById.has(g.parentId) ? g.parentId : ''
59
- ;(childGroups.get(p) ?? childGroups.set(p, []).get(p)!).push(g)
60
- }
61
-
62
- // group id -> resources ('' = ungrouped / unknown group).
63
- const resByGroup = new Map<string, R[]>()
64
- for (const r of resources) {
65
- const gid = groupOf(r)
66
- const key = gid && groupById.has(gid) ? gid : ''
67
- ;(resByGroup.get(key) ?? resByGroup.set(key, []).get(key)!).push(r)
68
- }
69
-
70
- // Every leaf resource id under a group's subtree (recursive), for roll-ups.
71
- const leafSeen = new Set<string>()
72
- const leafIds = (gid: string): string[] => {
73
- if (leafSeen.has(gid)) return [] // cycle guard
74
- leafSeen.add(gid)
75
- const ids: string[] = []
76
- for (const r of resByGroup.get(gid) ?? []) ids.push(r.id)
77
- for (const cg of childGroups.get(gid) ?? []) ids.push(...leafIds(cg.id))
78
- leafSeen.delete(gid)
79
- return ids
80
- }
81
-
82
- const out: ResourceRow<R>[] = []
83
- const walked = new Set<string>()
84
- const walk = (g: SchedulerResourceGroup, depth: number): void => {
85
- if (walked.has(g.id)) return // cycle guard
86
- walked.add(g.id)
87
- const isCollapsed = collapsed.has(g.id)
88
- out.push({ kind: 'group', id: g.id, title: g.title, depth, color: g.color, collapsed: isCollapsed, childResourceIds: leafIds(g.id) })
89
- if (isCollapsed) return
90
- for (const cg of childGroups.get(g.id) ?? []) walk(cg, depth + 1)
91
- for (const r of resByGroup.get(g.id) ?? []) {
92
- out.push({ kind: 'resource', id: r.id, title: r.title ?? r.id, depth: depth + 1, color: r.color, resource: r })
93
- }
94
- }
95
-
96
- for (const g of childGroups.get('') ?? []) walk(g, 0)
97
- // Ungrouped resources trail at the end (no header).
98
- for (const r of resByGroup.get('') ?? []) {
99
- out.push({ kind: 'resource', id: r.id, title: r.title ?? r.id, depth: 0, color: r.color, resource: r })
100
- }
101
- return out
102
- }
103
-
104
- /** The leaf resource ids actually visible (resource rows only) in tree order. */
105
- export function visibleResourceIds<R extends MinResource>(rows: ReadonlyArray<ResourceRow<R>>): string[] {
106
- return rows.filter((r) => r.kind === 'resource').map((r) => r.id)
107
- }
@@ -1,53 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
- import { availableSlots, mergeIntervals, subtractIntervals, type Interval } from './scheduler-slots'
3
-
4
- const D = (h: number, m = 0) => new Date(2026, 0, 5, h, m, 0, 0)
5
- const iv = (sh: number, sm: number, eh: number, em: number): Interval => ({ start: D(sh, sm), end: D(eh, em) })
6
- const hhmm = (d: Date) => `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`
7
- const show = (slots: { start: Date; end: Date }[]) => slots.map((s) => `${hhmm(s.start)}-${hhmm(s.end)}`)
8
-
9
- describe('mergeIntervals', () => {
10
- it('merges overlapping and touching intervals', () => {
11
- expect(show(mergeIntervals([iv(9, 0, 10, 0), iv(9, 30, 11, 0), iv(11, 0, 12, 0)]))).toEqual(['09:00-12:00'])
12
- })
13
- })
14
-
15
- describe('subtractIntervals', () => {
16
- it('cuts occupied blocks out of a base window', () => {
17
- const free = subtractIntervals(iv(9, 0, 17, 0), [iv(12, 0, 13, 0)])
18
- expect(show(free)).toEqual(['09:00-12:00', '13:00-17:00'])
19
- })
20
- })
21
-
22
- describe('availableSlots', () => {
23
- it('fills an empty working window with back-to-back slots', () => {
24
- const slots = availableSlots({ working: [iv(9, 0, 12, 0)], busy: [], durationMin: 60 })
25
- expect(show(slots)).toEqual(['09:00-10:00', '10:00-11:00', '11:00-12:00'])
26
- })
27
-
28
- it('removes slots that hit a busy booking', () => {
29
- const slots = availableSlots({ working: [iv(9, 0, 12, 0)], busy: [iv(10, 0, 11, 0)], durationMin: 60 })
30
- expect(show(slots)).toEqual(['09:00-10:00', '11:00-12:00'])
31
- })
32
-
33
- it('buffers widen what a booking blocks', () => {
34
- // busy 10:00-11:00 with a 15-min buffer blocks 09:45-11:15, so the 09:00 slot
35
- // (ends 10:00 > 09:45) is gone and only 11:15+ is free (no 60-min slot fits before 12:00).
36
- const slots = availableSlots({ working: [iv(9, 0, 12, 0)], busy: [iv(10, 0, 11, 0)], durationMin: 60, bufferBeforeMin: 15, bufferAfterMin: 15 })
37
- expect(show(slots)).toEqual([]) // 09:00-09:45 too short for 60m; 11:15-12:00 too short
38
- })
39
-
40
- it('honours a smaller step (overlapping start times)', () => {
41
- const slots = availableSlots({ working: [iv(9, 0, 10, 30)], busy: [], durationMin: 60, stepMin: 30 })
42
- expect(show(slots)).toEqual(['09:00-10:00', '09:30-10:30'])
43
- })
44
-
45
- it('drops slots before minStart (lead time)', () => {
46
- const slots = availableSlots({ working: [iv(9, 0, 12, 0)], busy: [], durationMin: 60, minStart: D(10, 0) })
47
- expect(show(slots)).toEqual(['10:00-11:00', '11:00-12:00'])
48
- })
49
-
50
- it('returns nothing when the duration cannot fit', () => {
51
- expect(availableSlots({ working: [iv(9, 0, 9, 45)], busy: [], durationMin: 60 })).toEqual([])
52
- })
53
- })
@@ -1,94 +0,0 @@
1
- /**
2
- * scheduler-slots - the pure core behind Scheduler Pro's *bookable slots /
3
- * find-a-time* (Calendly-style). No Svelte, no DOM. Given a resource's working
4
- * windows and its busy intervals, it produces the open, bookable slots of a fixed
5
- * duration - subtracting busy time (widened by buffers) and anything before a
6
- * minimum start (now + lead). Deterministic: the caller supplies all dates.
7
- */
8
-
9
- export type Interval = { start: Date; end: Date }
10
- export type Slot = { start: Date; end: Date }
11
-
12
- const MS_MIN = 60_000
13
-
14
- /** Merge overlapping / touching intervals into a sorted, disjoint list. */
15
- export function mergeIntervals(intervals: ReadonlyArray<Interval>): Interval[] {
16
- const sorted = [...intervals]
17
- .filter((i) => i.end.getTime() > i.start.getTime())
18
- .sort((a, b) => a.start.getTime() - b.start.getTime())
19
- const out: Interval[] = []
20
- for (const iv of sorted) {
21
- const last = out[out.length - 1]
22
- if (last && iv.start.getTime() <= last.end.getTime()) {
23
- if (iv.end.getTime() > last.end.getTime()) last.end = iv.end
24
- } else out.push({ start: iv.start, end: iv.end })
25
- }
26
- return out
27
- }
28
-
29
- /** The parts of `[base]` not covered by any of the (merged) `occupied` intervals. */
30
- export function subtractIntervals(base: Interval, occupied: ReadonlyArray<Interval>): Interval[] {
31
- const occ = mergeIntervals(occupied)
32
- const out: Interval[] = []
33
- let cursor = base.start.getTime()
34
- const end = base.end.getTime()
35
- for (const o of occ) {
36
- const os = o.start.getTime()
37
- const oe = o.end.getTime()
38
- if (oe <= cursor || os >= end) continue // outside base
39
- if (os > cursor) out.push({ start: new Date(cursor), end: new Date(Math.min(os, end)) })
40
- cursor = Math.max(cursor, oe)
41
- if (cursor >= end) break
42
- }
43
- if (cursor < end) out.push({ start: new Date(cursor), end: new Date(end) })
44
- return out
45
- }
46
-
47
- export type SlotOptions = {
48
- working: ReadonlyArray<Interval>
49
- busy: ReadonlyArray<Interval>
50
- durationMin: number
51
- /** Slot start granularity (minutes). Default = `durationMin` (back-to-back slots). */
52
- stepMin?: number
53
- /** Clear minutes required before / after a busy booking (widens what it blocks). */
54
- bufferBeforeMin?: number
55
- bufferAfterMin?: number
56
- /** Earliest allowed slot start (e.g. now + lead time). Slots before it are dropped. */
57
- minStart?: Date
58
- }
59
-
60
- /**
61
- * The bookable slots. For each working window, subtract busy time (each busy
62
- * interval widened by the buffers) and anything before `minStart`, then step
63
- * through the remaining free space emitting `durationMin` slots every `stepMin`.
64
- */
65
- export function availableSlots(opts: SlotOptions): Slot[] {
66
- const durMs = Math.max(1, opts.durationMin) * MS_MIN
67
- const stepMs = Math.max(1, opts.stepMin ?? opts.durationMin) * MS_MIN
68
- const bufB = (opts.bufferBeforeMin ?? 0) * MS_MIN
69
- const bufA = (opts.bufferAfterMin ?? 0) * MS_MIN
70
- const floor = opts.minStart ? opts.minStart.getTime() : -Infinity
71
-
72
- const occupied: Interval[] = opts.busy.map((b) => ({
73
- start: new Date(b.start.getTime() - bufB),
74
- end: new Date(b.end.getTime() + bufA),
75
- }))
76
-
77
- const out: Slot[] = []
78
- for (const w of mergeIntervals(opts.working)) {
79
- // Clip the window to `minStart` before subtracting busy.
80
- const wStart = Math.max(w.start.getTime(), floor)
81
- if (wStart >= w.end.getTime()) continue
82
- const free = subtractIntervals({ start: new Date(wStart), end: w.end }, occupied)
83
- for (const gap of free) {
84
- let s = gap.start.getTime()
85
- const gEnd = gap.end.getTime()
86
- let guard = 0
87
- while (s + durMs <= gEnd && guard++ < 5000) {
88
- out.push({ start: new Date(s), end: new Date(s + durMs) })
89
- s += stepMs
90
- }
91
- }
92
- }
93
- return out
94
- }
@@ -1,47 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
- import { busyMinutesReducer, columnSummaries, sumReducer } from './scheduler-summary'
3
-
4
- type Row = { id: string; amount: number }
5
- type Ev = { row: Row; start: Date; end: Date }
6
- const D = (h: number) => new Date(2026, 0, 5, h, 0, 0, 0)
7
- const ev = (id: string, s: number, e: number, amount: number): Ev => ({ row: { id, amount }, start: D(s), end: D(e) })
8
-
9
- const opts = { startOf: (e: Ev) => e.start, endOf: (e: Ev) => e.end, rowOf: (e: Ev) => e.row }
10
- const cols = [
11
- { start: D(9), end: D(10) },
12
- { start: D(10), end: D(11) },
13
- { start: D(11), end: D(12) },
14
- ]
15
-
16
- describe('columnSummaries', () => {
17
- it('counts events overlapping each column', () => {
18
- const events = [ev('a', 9, 11, 5), ev('b', 10, 12, 3)] // a in cols 0,1; b in cols 1,2
19
- expect(columnSummaries(events, cols, 'count', opts)).toEqual([1, 2, 1])
20
- })
21
-
22
- it('sums a numeric field per column', () => {
23
- const events = [ev('a', 9, 11, 5), ev('b', 10, 12, 3)]
24
- expect(columnSummaries(events, cols, sumReducer<Row>('amount'), opts)).toEqual([5, 8, 3])
25
- })
26
-
27
- it('yields 0 for empty columns', () => {
28
- expect(columnSummaries([], cols, 'count', opts)).toEqual([0, 0, 0])
29
- expect(columnSummaries([], cols, sumReducer<Row>('amount'), opts)).toEqual([0, 0, 0])
30
- })
31
-
32
- it('clips events to the column for a busy-minutes reducer', () => {
33
- const events = [ev('a', 9, 12, 0)] // spans all three hours
34
- // Each column is 1h; the event contributes 60 clipped minutes to each.
35
- expect(columnSummaries(events, cols, busyMinutesReducer<Row>(), opts)).toEqual([60, 60, 60])
36
- })
37
-
38
- it('passes column-clipped items to a custom reducer', () => {
39
- const events = [ev('a', 9, 12, 0)]
40
- const seen: number[] = []
41
- columnSummaries(events, cols, (items) => {
42
- seen.push(items.length ? (items[0]!.end.getTime() - items[0]!.start.getTime()) / 60000 : 0)
43
- return items.length
44
- }, opts)
45
- expect(seen).toEqual([60, 60, 60]) // clipped to each 1h column
46
- })
47
- })
@@ -1,81 +0,0 @@
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
-
8
- const MS_MIN = 60_000
9
-
10
- /** One event clipped to a column: its row plus the clipped [start, end). */
11
- export type SummaryItem<TData> = { row: TData; start: Date; end: Date }
12
-
13
- /**
14
- * How a column's overlapping events roll up to one cell value:
15
- * - `'count'` - number of events touching the column
16
- * - `{ sum }` - sum of a numeric row field over those events
17
- * - function - custom, receives the column-clipped items
18
- */
19
- export type ColumnReducer<TData> =
20
- | 'count'
21
- | { sum: keyof TData & string }
22
- | ((items: SummaryItem<TData>[]) => string | number)
23
-
24
- export type SummaryOptions<E, TData> = {
25
- startOf: (e: E) => Date
26
- endOf: (e: E) => Date
27
- rowOf: (e: E) => TData
28
- }
29
-
30
- function overlaps(aStart: Date, aEnd: Date, bStart: Date, bEnd: Date): boolean {
31
- return aStart.getTime() < bEnd.getTime() && aEnd.getTime() > bStart.getTime()
32
- }
33
-
34
- /**
35
- * One summary value per column. For each column, collect the events overlapping
36
- * it, clip each to the column bounds, then apply `reducer`. Empty columns yield
37
- * `0` for `count` / `sum` and `reducer([])` for the function form.
38
- */
39
- export function columnSummaries<E, TData>(
40
- events: ReadonlyArray<E>,
41
- columns: ReadonlyArray<{ start: Date; end: Date }>,
42
- reducer: ColumnReducer<TData>,
43
- opts: SummaryOptions<E, TData>,
44
- ): Array<string | number> {
45
- return columns.map((col) => {
46
- const items: SummaryItem<TData>[] = []
47
- for (const e of events) {
48
- const s = opts.startOf(e)
49
- const en = opts.endOf(e)
50
- if (!overlaps(s, en, col.start, col.end)) continue
51
- items.push({
52
- row: opts.rowOf(e),
53
- start: new Date(Math.max(s.getTime(), col.start.getTime())),
54
- end: new Date(Math.min(en.getTime(), col.end.getTime())),
55
- })
56
- }
57
- if (reducer === 'count') return items.length
58
- if (typeof reducer === 'function') return reducer(items)
59
- // { sum: field }
60
- const field = reducer.sum
61
- let total = 0
62
- for (const it of items) {
63
- const v = (it.row as Record<string, unknown>)[field as string]
64
- if (typeof v === 'number' && Number.isFinite(v)) total += v
65
- }
66
- return total
67
- })
68
- }
69
-
70
- /** Built-in reducer: sum a numeric row field. */
71
- export function sumReducer<TData>(field: keyof TData & string): ColumnReducer<TData> {
72
- return { sum: field }
73
- }
74
-
75
- /** Built-in reducer: count events. */
76
- export const countReducer = 'count' as const
77
-
78
- /** Built-in reducer: total column-clipped busy minutes across the column's events. */
79
- export function busyMinutesReducer<TData>(): (items: SummaryItem<TData>[]) => number {
80
- return (items) => items.reduce((sum, it) => sum + (it.end.getTime() - it.start.getTime()) / MS_MIN, 0)
81
- }
@@ -1,194 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest'
2
- import {
3
- parseCron,
4
- cronMatches,
5
- isScheduleDue,
6
- nextRun,
7
- createScheduler,
8
- CRON_PRESETS,
9
- type Schedule,
10
- } from './scheduling'
11
-
12
- // A fixed reference instant: Monday 2026-07-27, 17:30 local time.
13
- // (2026-07-27 is a Monday; getDay() === 1.)
14
- const MON_1730 = new Date(2026, 6, 27, 17, 30, 0)
15
-
16
- describe('parseCron', () => {
17
- it('rejects the wrong field count', () => {
18
- expect(() => parseCron('* * * *')).toThrow(/5 fields/)
19
- expect(() => parseCron('0 9 * * * *')).toThrow(/5 fields/)
20
- })
21
-
22
- it('rejects an unparseable step', () => {
23
- expect(() => parseCron('*/0 * * * *')).toThrow(/step/)
24
- })
25
- })
26
-
27
- describe('cronMatches', () => {
28
- it('matches an exact minute/hour', () => {
29
- expect(cronMatches('30 17 * * *', MON_1730)).toBe(true)
30
- expect(cronMatches('31 17 * * *', MON_1730)).toBe(false)
31
- expect(cronMatches('30 16 * * *', MON_1730)).toBe(false)
32
- })
33
-
34
- it('matches weekday ranges (1-5 = Mon-Fri)', () => {
35
- expect(cronMatches('30 17 * * 1-5', MON_1730)).toBe(true)
36
- const sun = new Date(2026, 6, 26, 17, 30) // Sunday
37
- expect(cronMatches('30 17 * * 1-5', sun)).toBe(false)
38
- })
39
-
40
- it('accepts 7 as an alias for Sunday', () => {
41
- const sun = new Date(2026, 6, 26, 9, 0)
42
- expect(cronMatches('0 9 * * 7', sun)).toBe(true)
43
- expect(cronMatches('0 9 * * 0', sun)).toBe(true)
44
- })
45
-
46
- it('honors step values (*/15)', () => {
47
- expect(cronMatches('*/15 * * * *', new Date(2026, 6, 27, 10, 0))).toBe(true)
48
- expect(cronMatches('*/15 * * * *', new Date(2026, 6, 27, 10, 15))).toBe(true)
49
- expect(cronMatches('*/15 * * * *', new Date(2026, 6, 27, 10, 7))).toBe(false)
50
- })
51
-
52
- it('honors lists (0,30)', () => {
53
- expect(cronMatches('0,30 * * * *', new Date(2026, 6, 27, 10, 0))).toBe(true)
54
- expect(cronMatches('0,30 * * * *', new Date(2026, 6, 27, 10, 30))).toBe(true)
55
- expect(cronMatches('0,30 * * * *', new Date(2026, 6, 27, 10, 15))).toBe(false)
56
- })
57
-
58
- it('uses UNION semantics when both day-of-month and day-of-week are set', () => {
59
- // Fires on the 1st OR on any Monday. 2026-07-27 is a Monday (not the 1st).
60
- expect(cronMatches('0 9 1 * 1', new Date(2026, 6, 27, 9, 0))).toBe(true)
61
- // 2026-07-15 is a Wednesday and not the 1st -> neither matches.
62
- expect(cronMatches('0 9 1 * 1', new Date(2026, 6, 15, 9, 0))).toBe(false)
63
- // The 1st of the month, a Wednesday -> dom matches.
64
- expect(cronMatches('0 9 1 * 1', new Date(2026, 6, 1, 9, 0))).toBe(true)
65
- })
66
-
67
- it('every preset parses and matches at least one time this year', () => {
68
- for (const p of CRON_PRESETS) {
69
- expect(() => parseCron(p.cron)).not.toThrow()
70
- expect(nextRun({ id: p.label, cron: p.cron }, MON_1730)).toBeInstanceOf(Date)
71
- }
72
- })
73
- })
74
-
75
- describe('isScheduleDue', () => {
76
- it('is false when disabled', () => {
77
- expect(isScheduleDue({ id: 'a', cron: '30 17 * * *', enabled: false }, MON_1730)).toBe(false)
78
- })
79
-
80
- it('fires a one-off in its exact minute only', () => {
81
- const s: Schedule = { id: 'once', runAt: MON_1730.toISOString() }
82
- expect(isScheduleDue(s, MON_1730)).toBe(true)
83
- expect(isScheduleDue(s, new Date(2026, 6, 27, 17, 31))).toBe(false)
84
- })
85
-
86
- it('prefers runAt over cron when both are present', () => {
87
- const s: Schedule = { id: 'both', runAt: MON_1730.toISOString(), cron: '0 0 * * *' }
88
- expect(isScheduleDue(s, MON_1730)).toBe(true)
89
- expect(isScheduleDue(s, new Date(2026, 6, 27, 0, 0))).toBe(false)
90
- })
91
- })
92
-
93
- describe('nextRun', () => {
94
- it('finds the next cron occurrence', () => {
95
- const from = new Date(2026, 6, 27, 17, 31) // just after 17:30
96
- const next = nextRun({ id: 'eod', cron: '30 17 * * 1-5' }, from)
97
- // Next weekday 17:30 is Tuesday the 28th.
98
- expect(next).toEqual(new Date(2026, 6, 28, 17, 30))
99
- })
100
-
101
- it('returns null for a one-off already in the past', () => {
102
- const past = new Date(2020, 0, 1, 0, 0).toISOString()
103
- expect(nextRun({ id: 'old', runAt: past }, MON_1730)).toBeNull()
104
- })
105
-
106
- it('returns the one-off instant when still in the future', () => {
107
- const future = new Date(2026, 6, 27, 18, 0)
108
- expect(nextRun({ id: 'soon', runAt: future.toISOString() }, MON_1730)).toEqual(future)
109
- })
110
- })
111
-
112
- describe('createScheduler', () => {
113
- it('fires a due schedule exactly once per minute across repeated ticks', () => {
114
- const onFire = vi.fn()
115
- let clock = MON_1730
116
- const scheduler = createScheduler({
117
- schedules: [{ id: 'eod', cron: '30 17 * * 1-5' }],
118
- onFire,
119
- now: () => clock,
120
- })
121
- // Two ticks in the same minute (the 30s interval fires twice a minute).
122
- scheduler.tick()
123
- scheduler.tick()
124
- expect(onFire).toHaveBeenCalledTimes(1)
125
- expect(onFire).toHaveBeenCalledWith(expect.objectContaining({ id: 'eod' }), clock)
126
-
127
- // Advance a minute past the match: no new fire.
128
- clock = new Date(2026, 6, 27, 17, 31)
129
- scheduler.tick()
130
- expect(onFire).toHaveBeenCalledTimes(1)
131
- })
132
-
133
- it('fires a one-off only once, ever', () => {
134
- const onFire = vi.fn()
135
- let clock = MON_1730
136
- const scheduler = createScheduler({
137
- schedules: [{ id: 'once', runAt: MON_1730.toISOString() }],
138
- onFire,
139
- now: () => clock,
140
- })
141
- scheduler.tick()
142
- // Same minute again, and a later matching-looking minute: still once.
143
- scheduler.tick()
144
- clock = new Date(MON_1730.getTime() + 60_000)
145
- scheduler.tick()
146
- expect(onFire).toHaveBeenCalledTimes(1)
147
- })
148
-
149
- it('skips disabled schedules', () => {
150
- const onFire = vi.fn()
151
- const scheduler = createScheduler({
152
- schedules: [{ id: 'x', cron: '30 17 * * *', enabled: false }],
153
- onFire,
154
- now: () => MON_1730,
155
- })
156
- scheduler.tick()
157
- expect(onFire).not.toHaveBeenCalled()
158
- })
159
-
160
- it('start()/stop() drive ticks on the interval', () => {
161
- vi.useFakeTimers()
162
- try {
163
- const onFire = vi.fn()
164
- const scheduler = createScheduler({
165
- schedules: [{ id: 'min', cron: '* * * * *' }],
166
- onFire,
167
- now: () => new Date(2026, 6, 27, 17, 30, 0),
168
- intervalMs: 30_000,
169
- })
170
- scheduler.start()
171
- vi.advanceTimersByTime(30_000)
172
- expect(onFire).toHaveBeenCalledTimes(1) // once per minute despite 2 ticks
173
- scheduler.stop()
174
- vi.advanceTimersByTime(120_000)
175
- expect(onFire).toHaveBeenCalledTimes(1) // stopped: no more fires
176
- } finally {
177
- vi.useRealTimers()
178
- }
179
- })
180
-
181
- it('upcoming() reports the next run per schedule', () => {
182
- const scheduler = createScheduler({
183
- schedules: [
184
- { id: 'eod', cron: '30 17 * * 1-5' },
185
- { id: 'old', runAt: new Date(2020, 0, 1).toISOString() },
186
- ],
187
- onFire: () => {},
188
- now: () => new Date(2026, 6, 27, 17, 31),
189
- })
190
- const up = scheduler.upcoming()
191
- expect(up.find((u) => u.id === 'eod')?.at).toEqual(new Date(2026, 6, 28, 17, 30))
192
- expect(up.find((u) => u.id === 'old')?.at).toBeNull()
193
- })
194
- })