@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,111 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
- import { evaluatePredicate, evaluateScalar, evaluateChange } from './evaluate'
3
- import type { ChangeExpr, EvalContext, PredicateExpr, ScalarExpr } from './expression-types'
4
-
5
- type Row = { price: number; qty: number; name: string; region: string }
6
-
7
- const row: Row = { price: 120, qty: 3, name: 'Widget', region: 'EU' }
8
- const ctx = (r: Row, extra: Partial<EvalContext<Row>> = {}): EvalContext<Row> => ({ row: r, ...extra })
9
-
10
- describe('evaluateScalar', () => {
11
- it('reads columns, literals and arithmetic', () => {
12
- const total: ScalarExpr = { kind: 'bin', op: '*', left: { kind: 'col', id: 'price' }, right: { kind: 'col', id: 'qty' } }
13
- expect(evaluateScalar(total, ctx(row))).toBe(360)
14
- expect(evaluateScalar({ kind: 'lit', value: 5 }, ctx(row))).toBe(5)
15
- expect(evaluateScalar({ kind: 'neg', expr: { kind: 'col', id: 'price' } }, ctx(row))).toBe(-120)
16
- })
17
-
18
- it('concatenates strings with +', () => {
19
- const e: ScalarExpr = { kind: 'bin', op: '+', left: { kind: 'col', id: 'name' }, right: { kind: 'lit', value: '!' } }
20
- expect(evaluateScalar(e, ctx(row))).toBe('Widget!')
21
- })
22
-
23
- it('guards divide by zero', () => {
24
- const e: ScalarExpr = { kind: 'bin', op: '/', left: { kind: 'lit', value: 10 }, right: { kind: 'lit', value: 0 } }
25
- expect(Number.isNaN(evaluateScalar(e, ctx(row)) as number)).toBe(true)
26
- })
27
-
28
- it('runs built-in functions', () => {
29
- expect(evaluateScalar({ kind: 'func', name: 'ABS', args: [{ kind: 'lit', value: -7 }] }, ctx(row))).toBe(7)
30
- expect(evaluateScalar({ kind: 'func', name: 'ROUND', args: [{ kind: 'lit', value: 3.14159 }, { kind: 'lit', value: 2 }] }, ctx(row))).toBe(3.14)
31
- })
32
-
33
- it('aggregates over the row set in scope', () => {
34
- const rows: Row[] = [row, { ...row, price: 80 }, { ...row, price: 40 }]
35
- const sum: ScalarExpr = { kind: 'agg', fn: 'sum', column: 'price' }
36
- expect(evaluateScalar(sum, ctx(row, { rows }))).toBe(240)
37
- expect(evaluateScalar({ kind: 'agg', fn: 'avg', column: 'price' }, ctx(row, { rows }))).toBe(80)
38
- expect(evaluateScalar({ kind: 'agg', fn: 'count', column: 'price' }, ctx(row, { rows }))).toBe(3)
39
- })
40
- })
41
-
42
- describe('evaluatePredicate', () => {
43
- it('cmp delegates to applyExcelFilter semantics', () => {
44
- const gt: PredicateExpr = { kind: 'cmp', column: 'price', op: 'greaterThan', value: 100 }
45
- expect(evaluatePredicate(gt, ctx(row))).toBe(true)
46
- expect(evaluatePredicate(gt, ctx({ ...row, price: 50 }))).toBe(false)
47
-
48
- const contains: PredicateExpr = { kind: 'cmp', column: 'name', op: 'contains', value: 'idge' }
49
- expect(evaluatePredicate(contains, ctx(row))).toBe(true)
50
-
51
- const inSet: PredicateExpr = { kind: 'cmp', column: 'region', op: 'in', value: ['EU', 'US'] }
52
- expect(evaluatePredicate(inSet, ctx(row))).toBe(true)
53
- expect(evaluatePredicate(inSet, ctx({ ...row, region: 'APAC' }))).toBe(false)
54
- })
55
-
56
- it('combines with and/or/not', () => {
57
- const expr: PredicateExpr = {
58
- kind: 'and',
59
- parts: [
60
- { kind: 'cmp', column: 'price', op: 'greaterThan', value: 100 },
61
- { kind: 'not', expr: { kind: 'cmp', column: 'region', op: 'equals', value: 'US' } },
62
- ],
63
- }
64
- expect(evaluatePredicate(expr, ctx(row))).toBe(true)
65
- expect(evaluatePredicate(expr, ctx({ ...row, region: 'US' }))).toBe(false)
66
- })
67
-
68
- it('scalarCmp compares cross-column maths', () => {
69
- // price / qty >= 40 -> 120/3 = 40 -> true
70
- const expr: PredicateExpr = {
71
- kind: 'scalarCmp',
72
- left: { kind: 'bin', op: '/', left: { kind: 'col', id: 'price' }, right: { kind: 'col', id: 'qty' } },
73
- op: '>=',
74
- right: { kind: 'lit', value: 40 },
75
- }
76
- expect(evaluatePredicate(expr, ctx(row))).toBe(true)
77
- expect(evaluatePredicate(expr, ctx({ ...row, qty: 4 }))).toBe(false)
78
- })
79
- })
80
-
81
- describe('evaluateChange', () => {
82
- const change = (e: ChangeExpr, prev: Row, next: Row) => evaluateChange(e, ctx(next, { prev }))
83
-
84
- it('detects a bare change', () => {
85
- expect(change({ kind: 'changed', column: 'price' }, row, { ...row, price: 121 })).toBe(true)
86
- expect(change({ kind: 'changed', column: 'price' }, row, { ...row })).toBe(false)
87
- })
88
-
89
- it('returns false with no prior snapshot', () => {
90
- expect(evaluateChange({ kind: 'changed', column: 'price' }, ctx(row))).toBe(false)
91
- })
92
-
93
- it('tests absolute delta', () => {
94
- const e: ChangeExpr = { kind: 'delta', column: 'price', op: '>', value: 10, abs: true }
95
- expect(change(e, row, { ...row, price: 140 })).toBe(true)
96
- expect(change(e, row, { ...row, price: 100 })).toBe(true) // abs of -20
97
- expect(change(e, row, { ...row, price: 125 })).toBe(false)
98
- })
99
-
100
- it('tests percent change', () => {
101
- const e: ChangeExpr = { kind: 'percentChange', column: 'price', op: '>', value: 5, abs: true }
102
- expect(change(e, row, { ...row, price: 132 })).toBe(true) // +10%
103
- expect(change(e, row, { ...row, price: 123 })).toBe(false) // +2.5%
104
- })
105
-
106
- it('detects threshold crossing', () => {
107
- const above: ChangeExpr = { kind: 'crossed', column: 'price', threshold: 130, direction: 'above' }
108
- expect(change(above, row, { ...row, price: 135 })).toBe(true)
109
- expect(change(above, { ...row, price: 131 }, { ...row, price: 140 })).toBe(false) // already above
110
- })
111
- })
@@ -1,237 +0,0 @@
1
- /**
2
- * Expression evaluators - pure functions, no DOM. Predicate leaves delegate to
3
- * the grid's `applyExcelFilter` so operator semantics match the filter row
4
- * exactly; scalar maths and change detection are handled here.
5
- */
6
- import { applyExcelFilter } from '@svgrid/grid/filtering'
7
- import type {
8
- ChangeExpr,
9
- ComparisonOp,
10
- EvalContext,
11
- ExprRow,
12
- PredicateExpr,
13
- ScalarExpr,
14
- } from './expression-types.js'
15
-
16
- type Scalar = number | string | boolean | null
17
-
18
- function readValue<TData>(ctx: EvalContext<TData>, row: TData, columnId: string): unknown {
19
- if (ctx.getValue) return ctx.getValue(row, columnId)
20
- return (row as Record<string, unknown>)?.[columnId]
21
- }
22
-
23
- /** Number coercion that returns NaN for blanks/non-numerics (never 0). */
24
- function num(v: unknown): number {
25
- if (v == null || v === '') return NaN
26
- if (typeof v === 'boolean') return v ? 1 : 0
27
- return Number(v)
28
- }
29
-
30
- /** Loose value equality used by `changed` and `=` on non-numeric operands. */
31
- function looseEqual(a: unknown, b: unknown): boolean {
32
- if (a == null && b == null) return true
33
- const na = num(a)
34
- const nb = num(b)
35
- if (Number.isFinite(na) && Number.isFinite(nb)) return na === nb
36
- return String(a ?? '') === String(b ?? '')
37
- }
38
-
39
- const BUILTINS: Record<string, (args: Scalar[]) => Scalar> = {
40
- ABS: (a) => Math.abs(num(a[0])),
41
- ROUND: (a) => {
42
- const n = num(a[0])
43
- const d = a.length > 1 ? num(a[1]) : 0
44
- const f = 10 ** (Number.isFinite(d) ? d : 0)
45
- return Math.round(n * f) / f
46
- },
47
- FLOOR: (a) => Math.floor(num(a[0])),
48
- CEIL: (a) => Math.ceil(num(a[0])),
49
- MIN: (a) => Math.min(...a.map(num)),
50
- MAX: (a) => Math.max(...a.map(num)),
51
- IF: (a) => (truthy(a[0] ?? null) ? (a[1] ?? null) : (a[2] ?? null)),
52
- COALESCE: (a) => a.find((v) => v != null && v !== '') ?? null,
53
- CONCAT: (a) => a.map((v) => (v == null ? '' : String(v))).join(''),
54
- LOWER: (a) => String(a[0] ?? '').toLowerCase(),
55
- UPPER: (a) => String(a[0] ?? '').toUpperCase(),
56
- LEN: (a) => String(a[0] ?? '').length,
57
- }
58
-
59
- /** Names of the built-in scalar functions (for editor validation/autocomplete). */
60
- export const BUILTIN_FUNCTION_NAMES: ReadonlyArray<string> = Object.keys(BUILTINS)
61
-
62
- /** Whether `name` (any case) is a known built-in scalar function. */
63
- export function isBuiltinFunction(name: string): boolean {
64
- return name.toUpperCase() in BUILTINS
65
- }
66
-
67
- function truthy(v: Scalar): boolean {
68
- if (typeof v === 'boolean') return v
69
- if (v == null || v === '') return false
70
- const n = num(v)
71
- return Number.isFinite(n) ? n !== 0 : true
72
- }
73
-
74
- /** Evaluate a scalar expression to a single value. */
75
- export function evaluateScalar<TData = ExprRow>(
76
- expr: ScalarExpr,
77
- ctx: EvalContext<TData>,
78
- ): Scalar {
79
- switch (expr.kind) {
80
- case 'lit':
81
- return expr.value
82
- case 'col':
83
- return (readValue(ctx, ctx.row, expr.id) ?? null) as Scalar
84
- case 'neg':
85
- return -num(evaluateScalar(expr.expr, ctx))
86
- case 'bin': {
87
- const l = evaluateScalar(expr.left, ctx)
88
- const r = evaluateScalar(expr.right, ctx)
89
- if (expr.op === '+') {
90
- const ln = num(l)
91
- const rn = num(r)
92
- if (Number.isFinite(ln) && Number.isFinite(rn)) return ln + rn
93
- return String(l ?? '') + String(r ?? '')
94
- }
95
- const a = num(l)
96
- const b = num(r)
97
- switch (expr.op) {
98
- case '-':
99
- return a - b
100
- case '*':
101
- return a * b
102
- case '/':
103
- return b === 0 ? NaN : a / b
104
- case '%':
105
- return b === 0 ? NaN : a % b
106
- // Rules are authored at runtime, so an operator outside the union can
107
- // arrive from parsed JSON. Without this the switch falls out of its
108
- // case and into `case 'agg'`, reading agg fields off a binary node.
109
- default:
110
- return null
111
- }
112
- }
113
- case 'agg': {
114
- const rows = ctx.rows ?? [ctx.row]
115
- if (expr.fn === 'count') return rows.length
116
- const nums: number[] = []
117
- for (const row of rows) {
118
- const n = num(readValue(ctx, row, expr.column))
119
- if (Number.isFinite(n)) nums.push(n)
120
- }
121
- if (nums.length === 0) return expr.fn === 'sum' ? 0 : null
122
- switch (expr.fn) {
123
- case 'sum':
124
- return nums.reduce((s, n) => s + n, 0)
125
- case 'avg':
126
- return nums.reduce((s, n) => s + n, 0) / nums.length
127
- case 'min':
128
- return Math.min(...nums)
129
- case 'max':
130
- return Math.max(...nums)
131
- // Same here: falling through to `case 'func'` would call
132
- // `expr.name.toUpperCase()` on an agg node and throw.
133
- default:
134
- return null
135
- }
136
- }
137
- case 'func': {
138
- const name = expr.name.toUpperCase()
139
- const args = expr.args.map((a) => evaluateScalar(a, ctx))
140
- const fn = ctx.functions?.[name] ?? BUILTINS[name]
141
- return fn ? fn(args) : null
142
- }
143
- }
144
- }
145
-
146
- function compareScalar(a: Scalar, op: ComparisonOp, b: Scalar): boolean {
147
- switch (op) {
148
- case '=':
149
- return looseEqual(a, b)
150
- case '!=':
151
- return !looseEqual(a, b)
152
- }
153
- const na = num(a)
154
- const nb = num(b)
155
- const numeric = Number.isFinite(na) && Number.isFinite(nb)
156
- const x: number | string = numeric ? na : String(a ?? '')
157
- const y: number | string = numeric ? nb : String(b ?? '')
158
- switch (op) {
159
- case '>':
160
- return x > y
161
- case '<':
162
- return x < y
163
- case '>=':
164
- return x >= y
165
- case '<=':
166
- return x <= y
167
- }
168
- }
169
-
170
- /** Evaluate a predicate expression to a boolean for the context's row. */
171
- export function evaluatePredicate<TData = ExprRow>(
172
- expr: PredicateExpr,
173
- ctx: EvalContext<TData>,
174
- ): boolean {
175
- switch (expr.kind) {
176
- case 'const':
177
- return expr.value
178
- case 'and':
179
- return expr.parts.every((p) => evaluatePredicate(p, ctx))
180
- case 'or':
181
- return expr.parts.some((p) => evaluatePredicate(p, ctx))
182
- case 'not':
183
- return !evaluatePredicate(expr.expr, ctx)
184
- case 'cmp':
185
- return applyExcelFilter(
186
- readValue(ctx, ctx.row, expr.column),
187
- { id: expr.column, operator: expr.op, value: expr.value, valueTo: expr.valueTo },
188
- { locale: ctx.locale },
189
- ) as boolean
190
- case 'scalarCmp':
191
- return compareScalar(
192
- evaluateScalar(expr.left, ctx),
193
- expr.op,
194
- evaluateScalar(expr.right, ctx),
195
- )
196
- }
197
- }
198
-
199
- /**
200
- * Evaluate a change expression - true when the value moved between `ctx.prev`
201
- * and `ctx.row` in the way the expression describes. Returns false when there
202
- * is no prior snapshot (nothing has changed yet).
203
- */
204
- export function evaluateChange<TData = ExprRow>(
205
- expr: ChangeExpr,
206
- ctx: EvalContext<TData>,
207
- ): boolean {
208
- if (ctx.prev == null) return false
209
- const next = readValue(ctx, ctx.row, expr.column)
210
- const prev = readValue(ctx, ctx.prev, expr.column)
211
- switch (expr.kind) {
212
- case 'changed':
213
- return !looseEqual(prev, next)
214
- case 'delta': {
215
- const p = num(prev)
216
- const n = num(next)
217
- if (!Number.isFinite(p) || !Number.isFinite(n)) return false
218
- const d = expr.abs ? Math.abs(n - p) : n - p
219
- return compareScalar(d, expr.op, expr.value)
220
- }
221
- case 'percentChange': {
222
- const p = num(prev)
223
- const n = num(next)
224
- if (!Number.isFinite(p) || !Number.isFinite(n) || p === 0) return false
225
- const pc = ((n - p) / Math.abs(p)) * 100
226
- return compareScalar(expr.abs ? Math.abs(pc) : pc, expr.op, expr.value)
227
- }
228
- case 'crossed': {
229
- const p = num(prev)
230
- const n = num(next)
231
- if (!Number.isFinite(p) || !Number.isFinite(n)) return false
232
- return expr.direction === 'above'
233
- ? p < expr.threshold && n >= expr.threshold
234
- : p > expr.threshold && n <= expr.threshold
235
- }
236
- }
237
- }
@@ -1,133 +0,0 @@
1
- /**
2
- * Column metadata for the expression layer - the small, self-contained operator
3
- * catalogue the editor draws from, plus name <-> id resolution for the
4
- * `[Bracketed Name]` reference syntax.
5
- *
6
- * The operator set mirrors the grid's own filter row (text / number / date),
7
- * so an expression's operators line up with what a user already knows from the
8
- * column menu. We keep a local copy rather than importing the grid's internal
9
- * `filter-operators` module (which is not part of the public surface).
10
- */
11
- import type { ExcelFilterOperator } from '@svgrid/grid'
12
-
13
- /** Coarse value type used to decide which operators a column offers. */
14
- export type ExprColumnType = 'text' | 'number' | 'date' | 'datetime' | 'boolean'
15
-
16
- /** A column as the expression layer sees it. */
17
- export type ExprColumn = {
18
- /** Canonical id (the field key stored in the AST). */
19
- id: string
20
- /** Human label; also the token used inside `[Bracketed Name]` references. */
21
- name?: string
22
- type?: ExprColumnType
23
- }
24
-
25
- /** One operator entry: its label and which column types it applies to. */
26
- export type OperatorMeta = {
27
- value: ExcelFilterOperator
28
- label: string
29
- types: ReadonlyArray<ExprColumnType>
30
- /** No value input (acts on emptiness alone). */
31
- valueless?: boolean
32
- /** Multi-value set membership (renders a token/chip input). */
33
- set?: boolean
34
- /** Needs a second value (`valueTo`). */
35
- range?: boolean
36
- }
37
-
38
- const TEXT: ExprColumnType[] = ['text']
39
- const NUM: ExprColumnType[] = ['number']
40
- const DATES: ExprColumnType[] = ['date', 'datetime']
41
- const ALL: ExprColumnType[] = ['text', 'number', 'date', 'datetime', 'boolean']
42
-
43
- /** The full operator catalogue, ordered as the editor should present it. */
44
- export const OPERATORS: ReadonlyArray<OperatorMeta> = [
45
- { value: 'equals', label: 'Equals', types: ALL },
46
- { value: 'notEquals', label: 'Not equals', types: ALL },
47
- { value: 'contains', label: 'Contains', types: TEXT },
48
- { value: 'notContains', label: 'Not contains', types: TEXT },
49
- { value: 'startsWith', label: 'Starts with', types: TEXT },
50
- { value: 'endsWith', label: 'Ends with', types: TEXT },
51
- { value: 'regex', label: 'Matches regex', types: TEXT },
52
- { value: 'greaterThan', label: 'Greater than', types: [...NUM, ...DATES] },
53
- { value: 'lessThan', label: 'Less than', types: [...NUM, ...DATES] },
54
- { value: 'between', label: 'Between', types: [...NUM, ...DATES], range: true },
55
- { value: 'in', label: 'In', types: ['text', 'number'], set: true },
56
- { value: 'notIn', label: 'Not in', types: ['text', 'number'], set: true },
57
- { value: 'isBlank', label: 'Is blank', types: ALL, valueless: true },
58
- { value: 'isNotBlank', label: 'Is not blank', types: ALL, valueless: true },
59
- ]
60
-
61
- const BY_VALUE = new Map<ExcelFilterOperator, OperatorMeta>(
62
- OPERATORS.map((op) => [op.value, op]),
63
- )
64
-
65
- /** Metadata for one operator (falls back to a plain `equals`). */
66
- export function operatorMeta(op: ExcelFilterOperator): OperatorMeta {
67
- return BY_VALUE.get(op) ?? { value: 'equals', label: 'Equals', types: ALL }
68
- }
69
-
70
- /** Operators valid for a column type (defaults to the text set). */
71
- export function operatorsForType(type: ExprColumnType | undefined): OperatorMeta[] {
72
- const t = type ?? 'text'
73
- return OPERATORS.filter((op) => op.types.includes(t))
74
- }
75
-
76
- /** Whether an operator needs no value input. */
77
- export function isValueless(op: ExcelFilterOperator): boolean {
78
- return operatorMeta(op).valueless === true
79
- }
80
-
81
- /** Whether an operator takes a multi-value token list. */
82
- export function isSetOperator(op: ExcelFilterOperator): boolean {
83
- return operatorMeta(op).set === true
84
- }
85
-
86
- /** Whether an operator needs a second (`valueTo`) value. */
87
- export function isRangeOperator(op: ExcelFilterOperator): boolean {
88
- return operatorMeta(op).range === true
89
- }
90
-
91
- /** Look a column up by its canonical id. */
92
- export function columnById(
93
- columns: ReadonlyArray<ExprColumn>,
94
- id: string,
95
- ): ExprColumn | undefined {
96
- return columns.find((c) => c.id === id)
97
- }
98
-
99
- /**
100
- * Resolve a reference (as written in an expression) to a column id. A reference
101
- * matches a column id first, then a column name (case-insensitive) - so both
102
- * `price` and `[Unit Price]` resolve. Returns the raw ref unchanged when
103
- * nothing matches, leaving `validateExpression` to flag it.
104
- */
105
- export function resolveColumnRef(
106
- columns: ReadonlyArray<ExprColumn>,
107
- ref: string,
108
- ): string {
109
- if (columnById(columns, ref)) return ref
110
- const lc = ref.toLowerCase()
111
- const byName = columns.find((c) => (c.name ?? '').toLowerCase() === lc)
112
- return byName ? byName.id : ref
113
- }
114
-
115
- /** The display label for a column id (its name, or the id itself). */
116
- export function columnLabel(
117
- columns: ReadonlyArray<ExprColumn>,
118
- id: string,
119
- ): string {
120
- return columnById(columns, id)?.name ?? id
121
- }
122
-
123
- /**
124
- * How a column id should be written inside an expression: `[Name]` when the
125
- * label has spaces or non-word characters, otherwise the bare id.
126
- */
127
- export function columnRefText(
128
- columns: ReadonlyArray<ExprColumn>,
129
- id: string,
130
- ): string {
131
- const label = columnLabel(columns, id)
132
- return /^[A-Za-z_$][\w$]*$/.test(label) ? label : `[${label}]`
133
- }
@@ -1,84 +0,0 @@
1
- /**
2
- * Expression / query language - the model layer.
3
- *
4
- * A tiny, dependency-free expression language that end users author through the
5
- * grid UI. It is the connective tissue behind the Alert Rules engine (and, in
6
- * time, styled columns and calculated columns): one predicate/scalar/change
7
- * model, evaluated the same way everywhere.
8
- *
9
- * The canonical, persisted form is a JSON AST (the types below) - no parser on
10
- * the hot path. A light tokenizer/parser (`parse.ts`) is offered only for the
11
- * editor's free-text mode; the structured builder writes the AST directly.
12
- *
13
- * Leaf comparisons delegate to the grid's own `applyExcelFilter`, so a rule's
14
- * "greater than" is byte-for-byte the grid filter's "greater than".
15
- */
16
- import type { ExcelFilterOperator } from '@svgrid/grid'
17
-
18
- /** Symbolic comparison operators used by `scalarCmp` (general value compare). */
19
- export type ComparisonOp = '=' | '!=' | '>' | '<' | '>=' | '<='
20
-
21
- /** Arithmetic operators for `bin` scalar nodes. */
22
- export type ArithmeticOp = '+' | '-' | '*' | '/' | '%'
23
-
24
- /** Column aggregate reducers (evaluated over the row set in scope). */
25
- export type AggFn = 'sum' | 'avg' | 'min' | 'max' | 'count'
26
-
27
- /**
28
- * A scalar expression - evaluates to a single value (number / string /
29
- * boolean / null) for a given row (and, for aggregates, the row set).
30
- */
31
- export type ScalarExpr =
32
- | { kind: 'col'; id: string }
33
- | { kind: 'lit'; value: string | number | boolean | null }
34
- | { kind: 'neg'; expr: ScalarExpr }
35
- | { kind: 'bin'; op: ArithmeticOp; left: ScalarExpr; right: ScalarExpr }
36
- | { kind: 'agg'; fn: AggFn; column: string }
37
- | { kind: 'func'; name: string; args: ScalarExpr[] }
38
-
39
- /**
40
- * A boolean (predicate) expression - the thing an alert rule / filter needs.
41
- *
42
- * - `cmp` maps straight onto the grid's `applyExcelFilter` (text/set/range ops).
43
- * - `scalarCmp` compares two scalar expressions with a symbolic operator, so
44
- * cross-column maths (`[filled] / [target] >= 0.9`) is expressible.
45
- */
46
- export type PredicateExpr =
47
- | { kind: 'and'; parts: PredicateExpr[] }
48
- | { kind: 'or'; parts: PredicateExpr[] }
49
- | { kind: 'not'; expr: PredicateExpr }
50
- | { kind: 'cmp'; column: string; op: ExcelFilterOperator; value?: unknown; valueTo?: unknown }
51
- | { kind: 'scalarCmp'; left: ScalarExpr; op: ComparisonOp; right: ScalarExpr }
52
- | { kind: 'const'; value: boolean }
53
-
54
- /**
55
- * A change (observable) expression - true when a value moves between the
56
- * previous and current snapshot of a row. Powers "relative change" alerts.
57
- */
58
- export type ChangeExpr =
59
- | { kind: 'changed'; column: string }
60
- | { kind: 'delta'; column: string; op: ComparisonOp; value: number; abs?: boolean }
61
- | { kind: 'percentChange'; column: string; op: ComparisonOp; value: number; abs?: boolean }
62
- | { kind: 'crossed'; column: string; threshold: number; direction: 'above' | 'below' }
63
-
64
- /** The shape the evaluator reads rows as (a plain field bag by default). */
65
- export type ExprRow = Record<string, unknown>
66
-
67
- /**
68
- * Everything the evaluator needs for one evaluation. `getValue` lets a caller
69
- * resolve a column id to a value when it is not a plain `row[id]` field;
70
- * `functions` injects extra scalar functions (e.g. delegate to HyperFormula).
71
- */
72
- export type EvalContext<TData = ExprRow> = {
73
- row: TData
74
- /** Prior snapshot of the same row - required by `ChangeExpr`. */
75
- prev?: TData
76
- /** The row set in scope - required by aggregates. Defaults to `[row]`. */
77
- rows?: ReadonlyArray<TData>
78
- /** Resolve a column id to its cell value. Defaults to `row[id]`. */
79
- getValue?: (row: TData, columnId: string) => unknown
80
- /** BCP-47 locale(s) threaded into `applyExcelFilter` for text folding. */
81
- locale?: string | ReadonlyArray<string>
82
- /** Extra scalar functions by upper-case name, merged over the builtins. */
83
- functions?: Record<string, (args: Array<number | string | boolean | null>) => number | string | boolean | null>
84
- }
@@ -1,106 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
- import {
3
- ExpressionParseError,
4
- collectColumnRefs,
5
- parsePredicate,
6
- stringifyPredicate,
7
- validateExpression,
8
- } from './parse'
9
- import { evaluatePredicate } from './evaluate'
10
- import type { ExprColumn } from './expression-columns'
11
- import type { PredicateExpr } from './expression-types'
12
-
13
- const columns: ExprColumn[] = [
14
- { id: 'price', name: 'Unit Price', type: 'number' },
15
- { id: 'qty', name: 'Qty', type: 'number' },
16
- { id: 'name', name: 'Name', type: 'text' },
17
- { id: 'region', name: 'Region', type: 'text' },
18
- ]
19
-
20
- describe('parsePredicate', () => {
21
- it('parses a col-vs-literal comparison into a cmp node (grid-filter semantics)', () => {
22
- const e = parsePredicate('price > 100', columns)
23
- expect(e).toEqual({ kind: 'cmp', column: 'price', op: 'greaterThan', value: 100 })
24
- })
25
-
26
- it('resolves [Bracketed Name] references to ids', () => {
27
- const e = parsePredicate('[Unit Price] >= 50', columns) as Extract<PredicateExpr, { kind: 'scalarCmp' }>
28
- // >= has no cmp equivalent, so it becomes a scalarCmp over the resolved column id
29
- expect(e.kind).toBe('scalarCmp')
30
- expect(e.left).toEqual({ kind: 'col', id: 'price' })
31
- })
32
-
33
- it('parses keyword text/set/range operators', () => {
34
- expect(parsePredicate('name CONTAINS "wid"', columns)).toEqual({ kind: 'cmp', column: 'name', op: 'contains', value: 'wid' })
35
- expect(parsePredicate('region IN ("EU", "US")', columns)).toEqual({ kind: 'cmp', column: 'region', op: 'in', value: ['EU', 'US'] })
36
- expect(parsePredicate('price BETWEEN 10 AND 20', columns)).toEqual({ kind: 'cmp', column: 'price', op: 'between', value: 10, valueTo: 20 })
37
- expect(parsePredicate('name ISBLANK', columns)).toEqual({ kind: 'cmp', column: 'name', op: 'isBlank' })
38
- })
39
-
40
- it('honours AND/OR/NOT precedence and grouping', () => {
41
- const e = parsePredicate('price > 100 AND (region = "EU" OR region = "US")', columns) as Extract<PredicateExpr, { kind: 'and' }>
42
- expect(e.kind).toBe('and')
43
- expect(e.parts[1]!.kind).toBe('or')
44
- })
45
-
46
- it('parses cross-column scalar maths', () => {
47
- const e = parsePredicate('price / qty >= 40', columns) as Extract<PredicateExpr, { kind: 'scalarCmp' }>
48
- expect(e.kind).toBe('scalarCmp')
49
- expect(e.op).toBe('>=')
50
- expect(e.left).toEqual({ kind: 'bin', op: '/', left: { kind: 'col', id: 'price' }, right: { kind: 'col', id: 'qty' } })
51
- })
52
-
53
- it('throws a positioned error on a syntax problem', () => {
54
- expect(() => parsePredicate('price >', columns)).toThrow(ExpressionParseError)
55
- try {
56
- parsePredicate('price @ 5', columns)
57
- } catch (err) {
58
- expect(err).toBeInstanceOf(ExpressionParseError)
59
- expect((err as ExpressionParseError).pos).toBeGreaterThan(0)
60
- }
61
- })
62
-
63
- it('parsed expressions evaluate correctly end to end', () => {
64
- const e = parsePredicate('price > 100 AND region = "EU"', columns)
65
- expect(evaluatePredicate(e, { row: { price: 120, region: 'EU' } })).toBe(true)
66
- expect(evaluatePredicate(e, { row: { price: 120, region: 'US' } })).toBe(false)
67
- })
68
- })
69
-
70
- describe('stringifyPredicate', () => {
71
- it('round-trips through parse for the common forms', () => {
72
- for (const src of [
73
- 'price > 100',
74
- 'name CONTAINS "wid"',
75
- 'region IN ("EU", "US")',
76
- 'price BETWEEN 10 AND 20',
77
- 'name ISBLANK',
78
- ]) {
79
- const ast = parsePredicate(src, columns)
80
- const back = stringifyPredicate(ast, columns)
81
- expect(stringifyPredicate(parsePredicate(back, columns), columns)).toBe(back)
82
- }
83
- })
84
-
85
- it('writes [bracketed] names when a label has spaces', () => {
86
- const ast = parsePredicate('price > 100', columns)
87
- expect(stringifyPredicate(ast, columns)).toBe('[Unit Price] > 100')
88
- })
89
- })
90
-
91
- describe('validateExpression + collectColumnRefs', () => {
92
- it('collects every referenced column id', () => {
93
- const ast = parsePredicate('price / qty >= 40 AND region = "EU"', columns)
94
- expect(collectColumnRefs(ast).sort()).toEqual(['price', 'qty', 'region'])
95
- })
96
-
97
- it('flags unknown columns and functions', () => {
98
- const ast = parsePredicate('bogus > 5', columns)
99
- expect(validateExpression(ast, columns)).toContain('Unknown column "bogus"')
100
- })
101
-
102
- it('passes a sound expression', () => {
103
- const ast = parsePredicate('price > 100', columns)
104
- expect(validateExpression(ast, columns)).toEqual([])
105
- })
106
- })