@svgrid/enterprise 2.5.2 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (620) hide show
  1. package/dist/SvAlertRuleEditor.svelte.d.ts +13 -0
  2. package/dist/SvAlertsManager.svelte.d.ts +14 -0
  3. package/dist/SvAlertsPanel.svelte.d.ts +9 -0
  4. package/dist/SvAuthGate.svelte.d.ts +22 -0
  5. package/dist/SvBoard.svelte.d.ts +35 -0
  6. package/dist/SvExportMenu.svelte.d.ts +61 -0
  7. package/dist/SvExpressionEditor.svelte.d.ts +12 -0
  8. package/dist/SvFileInput.svelte.d.ts +20 -0
  9. package/dist/SvGridAlerts.svelte.d.ts +77 -0
  10. package/dist/SvGridBoard.svelte.d.ts +30 -0
  11. package/dist/SvGridEditPanel.svelte.d.ts +73 -0
  12. package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
  13. package/dist/SvGridScheduler.svelte.d.ts +30 -0
  14. package/dist/SvImportDialog.svelte.d.ts +88 -0
  15. package/dist/SvLookupInput.svelte.d.ts +21 -0
  16. package/dist/SvPivotDesigner.svelte.d.ts +176 -0
  17. package/dist/SvRecordDetail.svelte.d.ts +58 -0
  18. package/dist/SvSchedule.svelte.d.ts +29 -0
  19. package/dist/SvSchemaChart.svelte.d.ts +61 -0
  20. package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
  21. package/dist/alerts/alert-engine-attach.d.ts +79 -0
  22. package/dist/alerts/alert-engine-attach.js +106 -0
  23. package/dist/alerts/alert-engine.d.ts +42 -0
  24. package/dist/alerts/alert-engine.js +196 -0
  25. package/dist/alerts/alert-formats.d.ts +26 -0
  26. package/dist/alerts/alert-formats.js +58 -0
  27. package/dist/alerts/alert-observer.d.ts +54 -0
  28. package/dist/alerts/alert-observer.js +156 -0
  29. package/dist/alerts/alert-scheduler.d.ts +30 -0
  30. package/dist/alerts/alert-scheduler.js +54 -0
  31. package/dist/alerts/alert-storage.d.ts +31 -0
  32. package/dist/alerts/alert-storage.js +92 -0
  33. package/dist/alerts/alert-store.svelte.d.ts +24 -0
  34. package/dist/alerts/alert-store.svelte.js +69 -0
  35. package/dist/alerts/alert-types.d.ts +86 -0
  36. package/dist/alerts/alert-types.js +1 -0
  37. package/dist/alerts.d.ts +2 -0
  38. package/{src/alerts.ts → dist/alerts.js} +9 -9
  39. package/dist/board.d.ts +7 -0
  40. package/{src/board.ts → dist/board.js} +13 -14
  41. package/dist/cdn/svgrid-enterprise.svelte-external.js +2987 -2981
  42. package/dist/designer/assets/{index-CM5xvaOy.js → index-BF0UH638.js} +3 -3
  43. package/dist/designer/assets/{src-D-ET9Mmo.js → src-BPJruwB9.js} +184 -184
  44. package/dist/designer/index.html +2 -2
  45. package/dist/edit-panel.d.ts +105 -0
  46. package/dist/edit-panel.js +350 -0
  47. package/dist/export-conditional.d.ts +31 -0
  48. package/dist/export-conditional.js +65 -0
  49. package/dist/export-ooxml.d.ts +93 -0
  50. package/dist/export-ooxml.js +385 -0
  51. package/dist/export-pdf.d.ts +107 -0
  52. package/dist/export-pdf.js +144 -0
  53. package/dist/export-print.d.ts +55 -0
  54. package/dist/export-print.js +91 -0
  55. package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
  56. package/dist/export-serialize.js +11 -0
  57. package/dist/export-xls.d.ts +26 -0
  58. package/dist/export-xls.js +157 -0
  59. package/dist/export.d.ts +323 -0
  60. package/dist/export.js +1021 -0
  61. package/dist/expressions/evaluate.d.ts +17 -0
  62. package/dist/expressions/evaluate.js +214 -0
  63. package/dist/expressions/expression-columns.d.ts +61 -0
  64. package/dist/expressions/expression-columns.js +72 -0
  65. package/dist/expressions/expression-types.d.ts +125 -0
  66. package/dist/expressions/expression-types.js +1 -0
  67. package/dist/expressions/parse.d.ts +25 -0
  68. package/dist/expressions/parse.js +537 -0
  69. package/dist/import.d.ts +232 -0
  70. package/dist/import.js +846 -0
  71. package/dist/index.d.ts +66 -0
  72. package/dist/index.js +91 -0
  73. package/dist/install.d.ts +70 -0
  74. package/dist/install.js +61 -0
  75. package/dist/license-core.d.ts +37 -0
  76. package/dist/license-core.js +81 -0
  77. package/dist/license.d.ts +30 -0
  78. package/dist/license.js +139 -0
  79. package/dist/master-detail.d.ts +23 -0
  80. package/dist/master-detail.js +35 -0
  81. package/dist/node/studio.js +1 -1
  82. package/dist/pivot-chart.d.ts +28 -0
  83. package/dist/pivot-chart.js +71 -0
  84. package/dist/pivot-designer.d.ts +69 -0
  85. package/dist/pivot-designer.js +38 -0
  86. package/dist/pivot-enable.d.ts +6 -0
  87. package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
  88. package/dist/pivot.d.ts +111 -0
  89. package/dist/pivot.js +353 -0
  90. package/dist/print.d.ts +33 -0
  91. package/dist/print.js +61 -0
  92. package/dist/revoked.d.ts +1 -0
  93. package/{src/revoked.ts → dist/revoked.js} +5 -6
  94. package/dist/scheduler-assignments.d.ts +64 -0
  95. package/dist/scheduler-assignments.js +92 -0
  96. package/dist/scheduler-axis.d.ts +81 -0
  97. package/dist/scheduler-axis.js +180 -0
  98. package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
  99. package/dist/scheduler-booking.js +50 -0
  100. package/dist/scheduler-config.d.ts +177 -0
  101. package/dist/scheduler-config.js +1 -0
  102. package/dist/scheduler-dependencies.d.ts +89 -0
  103. package/dist/scheduler-dependencies.js +179 -0
  104. package/dist/scheduler-freebusy.d.ts +19 -0
  105. package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
  106. package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
  107. package/dist/scheduler-heatmap.js +41 -0
  108. package/dist/scheduler-resource-tree.d.ts +48 -0
  109. package/dist/scheduler-resource-tree.js +78 -0
  110. package/dist/scheduler-slots.d.ts +37 -0
  111. package/dist/scheduler-slots.js +80 -0
  112. package/dist/scheduler-summary.d.ts +41 -0
  113. package/dist/scheduler-summary.js +54 -0
  114. package/dist/scheduler.d.ts +7 -0
  115. package/{src/scheduler.ts → dist/scheduler.js} +13 -14
  116. package/dist/scheduling.d.ts +132 -0
  117. package/dist/scheduling.js +228 -0
  118. package/dist/schema-designer.d.ts +42 -0
  119. package/dist/schema-designer.js +117 -0
  120. package/dist/schema.d.ts +369 -0
  121. package/dist/schema.js +216 -0
  122. package/dist/smart-shim.d.ts +62 -0
  123. package/dist/smart-shim.js +34 -0
  124. package/dist/sources/aggregate.d.ts +43 -0
  125. package/dist/sources/aggregate.js +60 -0
  126. package/dist/sources/auth-supabase.d.ts +69 -0
  127. package/dist/sources/auth-supabase.js +39 -0
  128. package/dist/sources/dashboard.d.ts +65 -0
  129. package/dist/sources/dashboard.js +95 -0
  130. package/dist/sources/field-inference.d.ts +23 -0
  131. package/dist/sources/field-inference.js +52 -0
  132. package/dist/sources/filters.d.ts +35 -0
  133. package/dist/sources/filters.js +52 -0
  134. package/dist/sources/index.d.ts +18 -0
  135. package/dist/sources/index.js +18 -0
  136. package/dist/sources/introspect-supabase.d.ts +30 -0
  137. package/dist/sources/introspect-supabase.js +134 -0
  138. package/dist/sources/realtime-supabase.d.ts +37 -0
  139. package/dist/sources/realtime-supabase.js +52 -0
  140. package/dist/sources/relation-lookup.d.ts +50 -0
  141. package/dist/sources/relation-lookup.js +77 -0
  142. package/dist/sources/rest-adapters.d.ts +48 -0
  143. package/dist/sources/rest-adapters.js +85 -0
  144. package/dist/sources/rest.d.ts +38 -0
  145. package/dist/sources/rest.js +86 -0
  146. package/dist/sources/schema-from-columns.d.ts +37 -0
  147. package/dist/sources/schema-from-columns.js +48 -0
  148. package/dist/sources/supabase.d.ts +33 -0
  149. package/dist/sources/supabase.js +74 -0
  150. package/dist/sources/with-entity-rules.d.ts +25 -0
  151. package/dist/sources/with-entity-rules.js +47 -0
  152. package/dist/sources/with-relation-labels.d.ts +26 -0
  153. package/dist/sources/with-relation-labels.js +38 -0
  154. package/dist/staged-editing.d.ts +85 -0
  155. package/dist/staged-editing.js +0 -0
  156. package/dist/studio/bug-report.d.ts +61 -0
  157. package/dist/studio/bug-report.js +126 -0
  158. package/dist/studio/cli.d.ts +56 -0
  159. package/dist/studio/cli.js +70 -0
  160. package/dist/studio/copilot-core.d.ts +22 -0
  161. package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
  162. package/dist/studio/csv.d.ts +36 -0
  163. package/dist/studio/csv.js +173 -0
  164. package/dist/studio/db-connect-string.d.ts +45 -0
  165. package/dist/studio/db-connect-string.js +113 -0
  166. package/dist/studio/deploy-cli.d.ts +35 -0
  167. package/dist/studio/deploy-cli.js +81 -0
  168. package/dist/studio/emit-project.d.ts +77 -0
  169. package/dist/studio/emit-project.js +5389 -0
  170. package/dist/studio/emit-schema.d.ts +110 -0
  171. package/dist/studio/emit-schema.js +1128 -0
  172. package/dist/studio/index.d.ts +35 -0
  173. package/dist/studio/index.js +38 -0
  174. package/dist/studio/init-flow.d.ts +58 -0
  175. package/dist/studio/init-flow.js +451 -0
  176. package/dist/studio/introspect-db.d.ts +47 -0
  177. package/dist/studio/introspect-db.js +255 -0
  178. package/dist/studio/introspect-openapi.d.ts +19 -0
  179. package/dist/studio/introspect-openapi.js +244 -0
  180. package/dist/studio/introspect-prisma.d.ts +25 -0
  181. package/dist/studio/introspect-prisma.js +164 -0
  182. package/dist/studio/introspect.d.ts +35 -0
  183. package/dist/studio/introspect.js +306 -0
  184. package/dist/studio/project.d.ts +1327 -0
  185. package/dist/studio/project.js +1798 -0
  186. package/dist/studio/sample-data.d.ts +19 -0
  187. package/dist/studio/sample-data.js +207 -0
  188. package/dist/studio/samples/ats.d.ts +2 -0
  189. package/dist/studio/samples/ats.js +194 -0
  190. package/dist/studio/samples/clinic.d.ts +2 -0
  191. package/dist/studio/samples/clinic.js +171 -0
  192. package/dist/studio/samples/crm.d.ts +2 -0
  193. package/dist/studio/samples/crm.js +280 -0
  194. package/dist/studio/samples/datasets.d.ts +38 -0
  195. package/dist/studio/samples/datasets.js +296 -0
  196. package/dist/studio/samples/ecommerce.d.ts +2 -0
  197. package/dist/studio/samples/ecommerce.js +178 -0
  198. package/dist/studio/samples/events.d.ts +2 -0
  199. package/dist/studio/samples/events.js +192 -0
  200. package/dist/studio/samples/fleet.d.ts +2 -0
  201. package/dist/studio/samples/fleet.js +203 -0
  202. package/dist/studio/samples/gym.d.ts +2 -0
  203. package/dist/studio/samples/gym.js +205 -0
  204. package/dist/studio/samples/hr.d.ts +2 -0
  205. package/dist/studio/samples/hr.js +186 -0
  206. package/dist/studio/samples/index.d.ts +13 -0
  207. package/dist/studio/samples/index.js +44 -0
  208. package/dist/studio/samples/insurance.d.ts +2 -0
  209. package/dist/studio/samples/insurance.js +220 -0
  210. package/dist/studio/samples/inventory.d.ts +2 -0
  211. package/dist/studio/samples/inventory.js +204 -0
  212. package/dist/studio/samples/invoicing.d.ts +2 -0
  213. package/dist/studio/samples/invoicing.js +154 -0
  214. package/dist/studio/samples/library.d.ts +2 -0
  215. package/dist/studio/samples/library.js +171 -0
  216. package/dist/studio/samples/live-data.d.ts +5 -0
  217. package/dist/studio/samples/live-data.js +261 -0
  218. package/dist/studio/samples/projects.d.ts +2 -0
  219. package/dist/studio/samples/projects.js +203 -0
  220. package/dist/studio/samples/realestate.d.ts +2 -0
  221. package/dist/studio/samples/realestate.js +187 -0
  222. package/dist/studio/samples/restaurant.d.ts +2 -0
  223. package/dist/studio/samples/restaurant.js +180 -0
  224. package/dist/studio/samples/school.d.ts +2 -0
  225. package/dist/studio/samples/school.js +188 -0
  226. package/dist/studio/samples/shared.d.ts +142 -0
  227. package/dist/studio/samples/shared.js +164 -0
  228. package/dist/studio/samples/starter.d.ts +4 -0
  229. package/dist/studio/samples/starter.js +237 -0
  230. package/dist/studio/samples/subscriptions.d.ts +2 -0
  231. package/dist/studio/samples/subscriptions.js +175 -0
  232. package/dist/studio/samples/support.d.ts +2 -0
  233. package/dist/studio/samples/support.js +209 -0
  234. package/dist/studio/scaffold-app.d.ts +22 -0
  235. package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
  236. package/dist/studio/scaffold.d.ts +63 -0
  237. package/dist/studio/scaffold.js +346 -0
  238. package/dist/studio/screen-suites.d.ts +193 -0
  239. package/dist/studio/screen-suites.js +297 -0
  240. package/dist/studio/themes.d.ts +34 -0
  241. package/dist/studio/themes.js +41 -0
  242. package/dist/studio/ui-components.d.ts +89 -0
  243. package/dist/studio/ui-components.generated.d.ts +29 -0
  244. package/dist/studio/ui-components.generated.js +7139 -0
  245. package/dist/studio/ui-components.js +673 -0
  246. package/dist/studio/user-error.d.ts +23 -0
  247. package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
  248. package/dist/studio/verify.d.ts +34 -0
  249. package/dist/studio/verify.js +47 -0
  250. package/dist/sveltekit/in-memory.d.ts +14 -0
  251. package/dist/sveltekit/in-memory.js +113 -0
  252. package/dist/sveltekit/index.d.ts +6 -0
  253. package/dist/sveltekit/index.js +5 -0
  254. package/dist/sveltekit/query-plan.d.ts +44 -0
  255. package/dist/sveltekit/query-plan.js +76 -0
  256. package/dist/sveltekit/sql-source.d.ts +47 -0
  257. package/dist/sveltekit/sql-source.js +106 -0
  258. package/dist/sveltekit/sql.d.ts +48 -0
  259. package/dist/sveltekit/sql.js +73 -0
  260. package/dist/sveltekit/transport.d.ts +209 -0
  261. package/dist/sveltekit/transport.js +219 -0
  262. package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
  263. package/dist/sveltekit/types.js +1 -0
  264. package/dist/upgrade-prompt.d.ts +16 -0
  265. package/dist/upgrade-prompt.js +141 -0
  266. package/dist/version.d.ts +13 -0
  267. package/{src/version.ts → dist/version.js} +1 -1
  268. package/dist/watermark.d.ts +2 -0
  269. package/dist/watermark.js +146 -0
  270. package/package.json +26 -24
  271. package/src/SvBoard.dom.test.ts +0 -67
  272. package/src/SvGridAlerts.dom.test.ts +0 -113
  273. package/src/SvGridEditPanel.dom.test.ts +0 -320
  274. package/src/SvRecordDetail.dom.test.ts +0 -137
  275. package/src/SvSchedule.dom.test.ts +0 -57
  276. package/src/ai-export-pdf.dom.test.ts +0 -77
  277. package/src/ai-export-xlsx.dom.test.ts +0 -90
  278. package/src/ai-export.dom.test.ts +0 -114
  279. package/src/alerts/alert-engine-attach.ts +0 -165
  280. package/src/alerts/alert-engine.test.ts +0 -135
  281. package/src/alerts/alert-engine.ts +0 -260
  282. package/src/alerts/alert-formats.test.ts +0 -87
  283. package/src/alerts/alert-formats.ts +0 -77
  284. package/src/alerts/alert-observer.test.ts +0 -189
  285. package/src/alerts/alert-observer.ts +0 -208
  286. package/src/alerts/alert-scheduler.ts +0 -96
  287. package/src/alerts/alert-storage.test.ts +0 -54
  288. package/src/alerts/alert-storage.ts +0 -116
  289. package/src/alerts/alert-store.svelte.ts +0 -80
  290. package/src/alerts/alert-types.ts +0 -94
  291. package/src/board.dom.test.ts +0 -941
  292. package/src/edit-panel.test.ts +0 -322
  293. package/src/edit-panel.ts +0 -379
  294. package/src/export-conditional.test.ts +0 -60
  295. package/src/export-conditional.ts +0 -94
  296. package/src/export-ooxml.test.ts +0 -152
  297. package/src/export-ooxml.ts +0 -489
  298. package/src/export-pdf.test.ts +0 -138
  299. package/src/export-pdf.ts +0 -245
  300. package/src/export-print.test.ts +0 -66
  301. package/src/export-print.ts +0 -132
  302. package/src/export-serialize.test.ts +0 -56
  303. package/src/export-xls.ts +0 -199
  304. package/src/export-xlsx-roundtrip.test.ts +0 -120
  305. package/src/export-xlsx.test.ts +0 -150
  306. package/src/export.test.ts +0 -349
  307. package/src/export.ts +0 -1464
  308. package/src/expressions/evaluate.test.ts +0 -111
  309. package/src/expressions/evaluate.ts +0 -237
  310. package/src/expressions/expression-columns.ts +0 -133
  311. package/src/expressions/expression-types.ts +0 -84
  312. package/src/expressions/parse.test.ts +0 -106
  313. package/src/expressions/parse.ts +0 -610
  314. package/src/import-automap.test.ts +0 -131
  315. package/src/import-hardening.test.ts +0 -158
  316. package/src/import.test.ts +0 -415
  317. package/src/import.ts +0 -1044
  318. package/src/index.ts +0 -569
  319. package/src/install.ts +0 -154
  320. package/src/license-core.test.ts +0 -23
  321. package/src/license-core.ts +0 -107
  322. package/src/license-expiry.test.ts +0 -127
  323. package/src/license.ts +0 -137
  324. package/src/master-detail.test.ts +0 -61
  325. package/src/master-detail.ts +0 -42
  326. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  327. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
  328. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
  329. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
  330. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
  331. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
  332. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
  333. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
  334. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
  335. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
  336. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
  337. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
  338. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
  339. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
  340. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
  341. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  342. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  343. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  344. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  345. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  346. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  347. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  348. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  349. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  350. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  351. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  352. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  353. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  354. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  355. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  356. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  357. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  358. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  359. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  360. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  361. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  362. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  363. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  364. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  365. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  366. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  367. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  368. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  369. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  370. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  371. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  372. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  373. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  374. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  375. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  376. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
  377. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
  378. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
  379. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
  380. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
  381. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
  382. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
  383. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
  384. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
  385. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
  386. package/src/pivot-chart.test.ts +0 -86
  387. package/src/pivot-chart.ts +0 -112
  388. package/src/pivot-designer.ts +0 -101
  389. package/src/pivot.test.ts +0 -335
  390. package/src/pivot.ts +0 -578
  391. package/src/print.ts +0 -107
  392. package/src/scheduler-assignments.test.ts +0 -97
  393. package/src/scheduler-assignments.ts +0 -134
  394. package/src/scheduler-axis.test.ts +0 -108
  395. package/src/scheduler-axis.ts +0 -238
  396. package/src/scheduler-booking.test.ts +0 -57
  397. package/src/scheduler-config.ts +0 -179
  398. package/src/scheduler-dependencies.test.ts +0 -155
  399. package/src/scheduler-dependencies.ts +0 -223
  400. package/src/scheduler-freebusy.test.ts +0 -41
  401. package/src/scheduler-heatmap.test.ts +0 -39
  402. package/src/scheduler-resource-tree.test.ts +0 -84
  403. package/src/scheduler-resource-tree.ts +0 -107
  404. package/src/scheduler-slots.test.ts +0 -53
  405. package/src/scheduler-slots.ts +0 -94
  406. package/src/scheduler-summary.test.ts +0 -47
  407. package/src/scheduler-summary.ts +0 -81
  408. package/src/scheduling.test.ts +0 -194
  409. package/src/scheduling.ts +0 -293
  410. package/src/schema-designer.test.ts +0 -121
  411. package/src/schema-designer.ts +0 -142
  412. package/src/schema.test.ts +0 -268
  413. package/src/schema.ts +0 -562
  414. package/src/smart-shim.ts +0 -107
  415. package/src/sources/aggregate.test.ts +0 -79
  416. package/src/sources/aggregate.ts +0 -102
  417. package/src/sources/auth-supabase.test.ts +0 -80
  418. package/src/sources/auth-supabase.ts +0 -87
  419. package/src/sources/dashboard.kpi.test.ts +0 -50
  420. package/src/sources/dashboard.test.ts +0 -61
  421. package/src/sources/dashboard.ts +0 -136
  422. package/src/sources/field-inference.test.ts +0 -60
  423. package/src/sources/field-inference.ts +0 -63
  424. package/src/sources/filters.test.ts +0 -58
  425. package/src/sources/filters.ts +0 -70
  426. package/src/sources/index.ts +0 -67
  427. package/src/sources/introspect-supabase.test.ts +0 -112
  428. package/src/sources/introspect-supabase.ts +0 -139
  429. package/src/sources/realtime-supabase.test.ts +0 -93
  430. package/src/sources/realtime-supabase.ts +0 -99
  431. package/src/sources/relation-lookup.test.ts +0 -99
  432. package/src/sources/relation-lookup.ts +0 -128
  433. package/src/sources/rest-adapters.test.ts +0 -95
  434. package/src/sources/rest-adapters.ts +0 -120
  435. package/src/sources/rest.test.ts +0 -104
  436. package/src/sources/rest.ts +0 -129
  437. package/src/sources/schema-from-columns.test.ts +0 -106
  438. package/src/sources/schema-from-columns.ts +0 -88
  439. package/src/sources/supabase.test.ts +0 -110
  440. package/src/sources/supabase.ts +0 -99
  441. package/src/sources/with-entity-rules.test.ts +0 -104
  442. package/src/sources/with-entity-rules.ts +0 -78
  443. package/src/sources/with-relation-labels.test.ts +0 -75
  444. package/src/sources/with-relation-labels.ts +0 -73
  445. package/src/staged-editing.ts +0 -0
  446. package/src/studio/bug-report.test.ts +0 -101
  447. package/src/studio/bug-report.ts +0 -165
  448. package/src/studio/cli.test.ts +0 -187
  449. package/src/studio/cli.ts +0 -117
  450. package/src/studio/copilot-core.test.ts +0 -45
  451. package/src/studio/csv.test.ts +0 -90
  452. package/src/studio/csv.ts +0 -165
  453. package/src/studio/db-connect-string.test.ts +0 -94
  454. package/src/studio/db-connect-string.ts +0 -128
  455. package/src/studio/deploy-cli.test.ts +0 -56
  456. package/src/studio/deploy-cli.ts +0 -100
  457. package/src/studio/emit-project.test.ts +0 -3324
  458. package/src/studio/emit-project.ts +0 -5377
  459. package/src/studio/emit-schema.test.ts +0 -111
  460. package/src/studio/emit-schema.ts +0 -1181
  461. package/src/studio/index.ts +0 -380
  462. package/src/studio/init-flow.test.ts +0 -514
  463. package/src/studio/init-flow.ts +0 -556
  464. package/src/studio/introspect-db.test.ts +0 -186
  465. package/src/studio/introspect-db.ts +0 -312
  466. package/src/studio/introspect-openapi.test.ts +0 -84
  467. package/src/studio/introspect-openapi.ts +0 -252
  468. package/src/studio/introspect-prisma.test.ts +0 -99
  469. package/src/studio/introspect-prisma.ts +0 -175
  470. package/src/studio/introspect.test.ts +0 -172
  471. package/src/studio/introspect.ts +0 -310
  472. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  473. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  474. package/src/studio/pipeline.test.ts +0 -42
  475. package/src/studio/project-robust.test.ts +0 -157
  476. package/src/studio/project.test.ts +0 -929
  477. package/src/studio/project.ts +0 -2394
  478. package/src/studio/sample-data.test.ts +0 -58
  479. package/src/studio/sample-data.ts +0 -203
  480. package/src/studio/samples/ats.ts +0 -202
  481. package/src/studio/samples/clinic.ts +0 -179
  482. package/src/studio/samples/crm.ts +0 -291
  483. package/src/studio/samples/datasets.test.ts +0 -84
  484. package/src/studio/samples/datasets.ts +0 -340
  485. package/src/studio/samples/ecommerce.ts +0 -187
  486. package/src/studio/samples/events.ts +0 -201
  487. package/src/studio/samples/fleet.ts +0 -213
  488. package/src/studio/samples/gym.ts +0 -215
  489. package/src/studio/samples/hr.ts +0 -195
  490. package/src/studio/samples/index.ts +0 -55
  491. package/src/studio/samples/insurance.ts +0 -229
  492. package/src/studio/samples/inventory.ts +0 -213
  493. package/src/studio/samples/invoicing.ts +0 -162
  494. package/src/studio/samples/library.ts +0 -180
  495. package/src/studio/samples/live-data.test.ts +0 -99
  496. package/src/studio/samples/live-data.ts +0 -306
  497. package/src/studio/samples/projects.ts +0 -212
  498. package/src/studio/samples/realestate.ts +0 -196
  499. package/src/studio/samples/restaurant.ts +0 -189
  500. package/src/studio/samples/samples.test.ts +0 -304
  501. package/src/studio/samples/school.ts +0 -197
  502. package/src/studio/samples/seed-floor.test.ts +0 -25
  503. package/src/studio/samples/shared.ts +0 -237
  504. package/src/studio/samples/starter.ts +0 -251
  505. package/src/studio/samples/subscriptions.ts +0 -183
  506. package/src/studio/samples/support.ts +0 -216
  507. package/src/studio/scaffold-app.test.ts +0 -91
  508. package/src/studio/scaffold.test.ts +0 -192
  509. package/src/studio/scaffold.ts +0 -390
  510. package/src/studio/screen-suites.test.ts +0 -269
  511. package/src/studio/screen-suites.ts +0 -448
  512. package/src/studio/themes.ts +0 -62
  513. package/src/studio/ui-components-surface.test.ts +0 -185
  514. package/src/studio/ui-components.generated.ts +0 -7154
  515. package/src/studio/ui-components.ts +0 -742
  516. package/src/studio/verify.test.ts +0 -47
  517. package/src/studio/verify.ts +0 -79
  518. package/src/sveltekit/in-memory.test.ts +0 -104
  519. package/src/sveltekit/in-memory.ts +0 -129
  520. package/src/sveltekit/index.ts +0 -24
  521. package/src/sveltekit/query-plan.test.ts +0 -109
  522. package/src/sveltekit/query-plan.ts +0 -125
  523. package/src/sveltekit/sql-source.test.ts +0 -198
  524. package/src/sveltekit/sql-source.ts +0 -171
  525. package/src/sveltekit/sql.test.ts +0 -80
  526. package/src/sveltekit/sql.ts +0 -131
  527. package/src/sveltekit/transport-scope.test.ts +0 -125
  528. package/src/sveltekit/transport.test.ts +0 -201
  529. package/src/sveltekit/transport.ts +0 -373
  530. package/src/upgrade-prompt.test.ts +0 -71
  531. package/src/upgrade-prompt.ts +0 -162
  532. package/src/version.test.ts +0 -17
  533. package/src/watermark.test.ts +0 -97
  534. package/src/watermark.ts +0 -156
  535. /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
  536. /package/{src → dist}/SvAlertsManager.svelte +0 -0
  537. /package/{src → dist}/SvAlertsPanel.svelte +0 -0
  538. /package/{src → dist}/SvAuthGate.svelte +0 -0
  539. /package/{src → dist}/SvBoard.svelte +0 -0
  540. /package/{src → dist}/SvExportMenu.svelte +0 -0
  541. /package/{src → dist}/SvExpressionEditor.svelte +0 -0
  542. /package/{src → dist}/SvFileInput.svelte +0 -0
  543. /package/{src → dist}/SvGridAlerts.svelte +0 -0
  544. /package/{src → dist}/SvGridBoard.svelte +0 -0
  545. /package/{src → dist}/SvGridEditPanel.svelte +0 -0
  546. /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
  547. /package/{src → dist}/SvGridScheduler.svelte +0 -0
  548. /package/{src → dist}/SvImportDialog.svelte +0 -0
  549. /package/{src → dist}/SvLookupInput.svelte +0 -0
  550. /package/{src → dist}/SvPivotDesigner.svelte +0 -0
  551. /package/{src → dist}/SvRecordDetail.svelte +0 -0
  552. /package/{src → dist}/SvSchedule.svelte +0 -0
  553. /package/{src → dist}/SvSchemaChart.svelte +0 -0
  554. /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
  555. /package/{src → dist}/pdfmake-shims.d.ts +0 -0
  556. /package/{src → dist}/smart.export.d.ts +0 -0
  557. /package/{src → dist}/smart.export.js +0 -0
  558. /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
  559. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
  560. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
  561. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
  562. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
  563. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
  564. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
  565. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
  566. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
  567. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
  568. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
  569. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
  570. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
  571. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
  572. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
  573. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
  574. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
  575. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
  576. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
  577. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
  578. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
  579. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
  580. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
  581. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
  582. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
  583. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
  584. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
  585. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
  586. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
  587. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
  588. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
  589. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
  590. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
  591. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
  592. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
  593. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
  594. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
  595. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
  596. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
  597. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
  598. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
  599. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
  600. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
  601. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
  602. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
  603. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
  604. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
  605. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
  606. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
  607. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
  608. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
  609. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
  610. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
  611. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
  612. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
  613. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
  614. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
  615. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
  616. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
  617. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
  618. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
  619. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
  620. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -0
@@ -0,0 +1,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
+ }