From a73674ea90480ce8ff3085a0449f2a7a9bc5526e Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Wed, 14 May 2025 08:26:09 -0700 Subject: [PATCH 01/24] chore: scaffold svelte app --- packages/svelte-db/.gitignore | 24 + packages/svelte-db/README.md | 58 +++ packages/svelte-db/package.json | 50 ++ packages/svelte-db/src/app.d.ts | 13 + packages/svelte-db/src/app.html | 12 + packages/svelte-db/src/lib/index.ts | 1 + packages/svelte-db/src/routes/+page.svelte | 3 + packages/svelte-db/static/favicon.png | Bin 0 -> 1571 bytes packages/svelte-db/svelte.config.js | 18 + packages/svelte-db/tsconfig.json | 15 + packages/svelte-db/vite.config.ts | 6 + pnpm-lock.yaml | 574 ++++++++++++++++++--- 12 files changed, 715 insertions(+), 59 deletions(-) create mode 100644 packages/svelte-db/.gitignore create mode 100644 packages/svelte-db/README.md create mode 100644 packages/svelte-db/package.json create mode 100644 packages/svelte-db/src/app.d.ts create mode 100644 packages/svelte-db/src/app.html create mode 100644 packages/svelte-db/src/lib/index.ts create mode 100644 packages/svelte-db/src/routes/+page.svelte create mode 100644 packages/svelte-db/static/favicon.png create mode 100644 packages/svelte-db/svelte.config.js create mode 100644 packages/svelte-db/tsconfig.json create mode 100644 packages/svelte-db/vite.config.ts diff --git a/packages/svelte-db/.gitignore b/packages/svelte-db/.gitignore new file mode 100644 index 00000000..294b3857 --- /dev/null +++ b/packages/svelte-db/.gitignore @@ -0,0 +1,24 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build +/dist + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/packages/svelte-db/README.md b/packages/svelte-db/README.md new file mode 100644 index 00000000..9410ac82 --- /dev/null +++ b/packages/svelte-db/README.md @@ -0,0 +1,58 @@ +# Svelte library + +Everything you need to build a Svelte library, powered by [`sv`](https://npmjs.com/package/sv). + +Read more about creating a library [in the docs](https://svelte.dev/docs/kit/packaging). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```bash +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```bash +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +Everything inside `src/lib` is part of your library, everything inside `src/routes` can be used as a showcase or preview app. + +## Building + +To build your library: + +```bash +npm run package +``` + +To create a production version of your showcase app: + +```bash +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. + +## Publishing + +Go into the `package.json` and give your package the desired name through the `"name"` option. Also consider adding a `"license"` field and point it to a `LICENSE` file which you can create from a template (one popular option is the [MIT license](https://opensource.org/license/mit/)). + +To publish your library to [npm](https://www.npmjs.com): + +```bash +npm publish +``` diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json new file mode 100644 index 00000000..399b5d66 --- /dev/null +++ b/packages/svelte-db/package.json @@ -0,0 +1,50 @@ +{ + "name": "@tanstack/svelte-db", + "description": "Svelte integration for @tanstack/db", + "version": "0.0.0", + "scripts": { + "dev": "vite dev", + "build": "vite build && npm run prepack", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "prepack": "svelte-kit sync && svelte-package && publint", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + }, + "files": [ + "dist", + "!dist/**/*.test.*", + "!dist/**/*.spec.*" + ], + "sideEffects": [ + "**/*.css" + ], + "svelte": "./dist/index.js", + "types": "./dist/index.d.ts", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "svelte": "./dist/index.js" + } + }, + "peerDependencies": { + "svelte": "^5.0.0" + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^6.0.0", + "@sveltejs/kit": "^2.16.0", + "@sveltejs/package": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "publint": "^0.3.2", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "^5.0.0", + "vite": "^6.2.6" + }, + "keywords": [ + "optimistic", + "svelte", + "typescript" + ] +} diff --git a/packages/svelte-db/src/app.d.ts b/packages/svelte-db/src/app.d.ts new file mode 100644 index 00000000..c0c08168 --- /dev/null +++ b/packages/svelte-db/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {} diff --git a/packages/svelte-db/src/app.html b/packages/svelte-db/src/app.html new file mode 100644 index 00000000..f22aeaad --- /dev/null +++ b/packages/svelte-db/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/packages/svelte-db/src/lib/index.ts b/packages/svelte-db/src/lib/index.ts new file mode 100644 index 00000000..47d3c46f --- /dev/null +++ b/packages/svelte-db/src/lib/index.ts @@ -0,0 +1 @@ +// Reexport your entry components here diff --git a/packages/svelte-db/src/routes/+page.svelte b/packages/svelte-db/src/routes/+page.svelte new file mode 100644 index 00000000..9c42926f --- /dev/null +++ b/packages/svelte-db/src/routes/+page.svelte @@ -0,0 +1,3 @@ +

Welcome to your library project

+

Create your package using @sveltejs/package and preview/showcase your work with SvelteKit

+

Visit svelte.dev/docs/kit to read the documentation

diff --git a/packages/svelte-db/static/favicon.png b/packages/svelte-db/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..825b9e65af7c104cfb07089bb28659393b4f2097 GIT binary patch literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} @@ -375,6 +413,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-transform-react-jsx-self@7.25.9': resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} @@ -411,6 +454,10 @@ packages: resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} engines: {node: '>=6.9.0'} + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + engines: {node: '>=6.9.0'} + '@changesets/apply-release-plan@7.0.10': resolution: {integrity: sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw==} @@ -1254,6 +1301,9 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@publint/pack@0.1.2': resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} engines: {node: '>=18'} @@ -1522,6 +1572,47 @@ packages: peerDependencies: eslint: '>=9.0.0' + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-auto@6.0.1': + resolution: {integrity: sha512-mcWud3pYGPWM2Pphdj8G9Qiq24nZ8L4LB7coCUckUEy5Y7wOWGJ/enaZ4AtJTcSm5dNK1rIkBRoqt+ae4zlxcQ==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/kit@2.21.0': + resolution: {integrity: sha512-kvu4h9qXduiPk1Q1oqFKDLFGu/7mslEYbVaqpbBcBxjlRJnvNCFwEvEwKt0Mx9TtSi8J77xRelvJobrGlst4nQ==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 + + '@sveltejs/package@2.3.11': + resolution: {integrity: sha512-DSMt2U0XNAdoQBYksrmgQi5dKy7jUTVDJLiagS/iXF7AShjAmTbGJQKruBuT/FfYAWvNxfQTSjkXU8eAIjVeNg==} + engines: {node: ^16.14 || >=18} + hasBin: true + peerDependencies: + svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@5.0.3': + resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + '@svitejs/changesets-changelog-github-compact@1.2.0': resolution: {integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} @@ -1698,6 +1789,9 @@ packages: '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/cors@2.8.17': resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} @@ -1921,14 +2015,20 @@ packages: '@vue/compiler-core@3.5.13': resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.14': + resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==} + '@vue/compiler-dom@3.5.13': resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-sfc@3.5.13': - resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + '@vue/compiler-dom@3.5.14': + resolution: {integrity: sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==} + + '@vue/compiler-sfc@3.5.14': + resolution: {integrity: sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==} - '@vue/compiler-ssr@3.5.13': - resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + '@vue/compiler-ssr@3.5.14': + resolution: {integrity: sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -1941,23 +2041,26 @@ packages: typescript: optional: true - '@vue/reactivity@3.5.13': - resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + '@vue/reactivity@3.5.14': + resolution: {integrity: sha512-7cK1Hp343Fu/SUCCO52vCabjvsYu7ZkOqyYu7bXV9P2yyfjUMUXHZafEbq244sP7gf+EZEz+77QixBTuEqkQQw==} - '@vue/runtime-core@3.5.13': - resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + '@vue/runtime-core@3.5.14': + resolution: {integrity: sha512-w9JWEANwHXNgieAhxPpEpJa+0V5G0hz3NmjAZwlOebtfKyp2hKxKF0+qSh0Xs6/PhfGihuSdqMprMVcQU/E6ag==} - '@vue/runtime-dom@3.5.13': - resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + '@vue/runtime-dom@3.5.14': + resolution: {integrity: sha512-lCfR++IakeI35TVR80QgOelsUIdcKjd65rWAMfdSlCYnaEY5t3hYwru7vvcWaqmrK+LpI7ZDDYiGU5V3xjMacw==} - '@vue/server-renderer@3.5.13': - resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + '@vue/server-renderer@3.5.14': + resolution: {integrity: sha512-Rf/ISLqokIvcySIYnv3tNWq40PLpNLDLSJwwVWzG6MNtyIhfbcrAxo5ZL9nARJhqjZyWWa40oRb2IDuejeuv6w==} peerDependencies: - vue: 3.5.13 + vue: 3.5.14 '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.14': + resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -2102,6 +2205,10 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2207,6 +2314,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2276,6 +2387,10 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} @@ -2352,6 +2467,9 @@ packages: decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -2359,6 +2477,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -2391,6 +2513,9 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + diff@7.0.0: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} @@ -2734,6 +2859,9 @@ packages: jiti: optional: true + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2751,6 +2879,9 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} + esrap@1.4.6: + resolution: {integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -2826,6 +2957,14 @@ packages: picomatch: optional: true + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -3182,6 +3321,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -3345,6 +3487,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -3447,6 +3593,9 @@ packages: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -3478,6 +3627,9 @@ packages: loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -3594,6 +3746,10 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -3621,6 +3777,9 @@ packages: nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -3754,6 +3913,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -4159,6 +4321,9 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -4233,6 +4398,10 @@ packages: simple-git@3.27.0: resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + engines: {node: '>=18'} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -4363,6 +4532,24 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte-check@4.2.0: + resolution: {integrity: sha512-79ozTLjGBQ2R5PvZ7enSYBsMyY1fy3pwQ/N1BtuTVXtQRH9Vc10eV66LePV52t1ZlflZBTkIGz79cStPnCUEEQ==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte2tsx@0.7.37: + resolution: {integrity: sha512-uQCWibXwUNPGQBGTZP1axIpFGFHTXXN30/ppodLVXCnX23U1nzEhqiVtFSEQjtUK3pFVxPhdnfyxD6ikxMCzPQ==} + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 + + svelte@5.28.6: + resolution: {integrity: sha512-9qqr7mw8YR9PAnxGFfzCK6PUlNGtns7wVavrhnxyf3fpB1mP/Ol55Z2UnIapsSzNNl3k9qw7cZ22PdE8+xT/jQ==} + engines: {node: '>=18'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -4412,6 +4599,10 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4443,6 +4634,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + tough-cookie@5.1.1: resolution: {integrity: sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==} engines: {node: '>=16'} @@ -4681,6 +4876,54 @@ packages: yaml: optional: true + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.0.6: + resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest@3.0.9: resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -4729,8 +4972,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - vue@3.5.13: - resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + vue@3.5.14: + resolution: {integrity: sha512-LbOm50/vZFG6Mhy6KscQYXZMQ0LMCC/y40HDJPPvGFQ+i/lUH+PJHR6C3assgOQiXdl6tAfsXHbXYVBZZu65ew==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4877,6 +5120,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + zod@3.24.2: resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} @@ -4961,8 +5207,12 @@ snapshots: '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} '@babel/helpers@7.26.9': @@ -4978,6 +5228,10 @@ snapshots: dependencies: '@babel/types': 7.26.9 + '@babel/parser@7.27.2': + dependencies: + '@babel/types': 7.27.1 + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 @@ -5024,6 +5278,11 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.27.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@changesets/apply-release-plan@7.0.10': dependencies: '@changesets/config': 3.1.1 @@ -5731,6 +5990,8 @@ snapshots: '@pkgr/core@0.1.1': {} + '@polka/url@1.0.0-next.29': {} + '@publint/pack@0.1.2': {} '@rollup/pluginutils@5.1.4(rollup@4.36.0)': @@ -5953,6 +6214,65 @@ snapshots: - supports-color - typescript + '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': + dependencies: + acorn: 8.14.1 + + '@sveltejs/adapter-auto@6.0.1(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))': + dependencies: + '@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + + '@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': + dependencies: + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + '@types/cookie': 0.6.0 + acorn: 8.14.1 + cookie: 0.6.0 + devalue: 5.1.1 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.17 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.1 + sirv: 3.0.1 + svelte: 5.28.6 + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + + '@sveltejs/package@2.3.11(svelte@5.28.6)(typescript@5.8.2)': + dependencies: + chokidar: 4.0.3 + kleur: 4.1.5 + sade: 1.8.1 + semver: 7.7.1 + svelte: 5.28.6 + svelte2tsx: 0.7.37(svelte@5.28.6)(typescript@5.8.2) + transitivePeerDependencies: + - typescript + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + debug: 4.4.0 + svelte: 5.28.6 + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + debug: 4.4.0 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.17 + svelte: 5.28.6 + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vitefu: 1.0.6(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + transitivePeerDependencies: + - supports-color + '@svitejs/changesets-changelog-github-compact@1.2.0': dependencies: '@changesets/get-github-info': 0.6.0 @@ -6090,11 +6410,11 @@ snapshots: - typescript - vite - '@tanstack/vue-store@0.7.0(vue@3.5.13(typescript@5.8.2))': + '@tanstack/vue-store@0.7.0(vue@3.5.14(typescript@5.8.2))': dependencies: '@tanstack/store': 0.7.0 - vue: 3.5.13(typescript@5.8.2) - vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + vue: 3.5.14(typescript@5.8.2) + vue-demi: 0.14.10(vue@3.5.14(typescript@5.8.2)) '@testing-library/dom@10.4.0': dependencies: @@ -6170,6 +6490,8 @@ snapshots: dependencies: '@types/node': 22.13.10 + '@types/cookie@0.6.0': {} + '@types/cors@2.8.17': dependencies: '@types/node': 22.13.10 @@ -6364,10 +6686,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))': + '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2))': dependencies: - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) - vue: 3.5.13(typescript@5.8.2) + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vue: 3.5.14(typescript@5.8.2) '@vitest/coverage-istanbul@3.0.9(vitest@3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': dependencies: @@ -6392,13 +6714,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.9(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': + '@vitest/mocker@3.0.9(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) '@vitest/pretty-format@3.0.9': dependencies: @@ -6445,27 +6767,40 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.14': + dependencies: + '@babel/parser': 7.27.2 + '@vue/shared': 3.5.14 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-dom@3.5.13': dependencies: '@vue/compiler-core': 3.5.13 '@vue/shared': 3.5.13 - '@vue/compiler-sfc@3.5.13': + '@vue/compiler-dom@3.5.14': dependencies: - '@babel/parser': 7.26.10 - '@vue/compiler-core': 3.5.13 - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-core': 3.5.14 + '@vue/shared': 3.5.14 + + '@vue/compiler-sfc@3.5.14': + dependencies: + '@babel/parser': 7.27.2 + '@vue/compiler-core': 3.5.14 + '@vue/compiler-dom': 3.5.14 + '@vue/compiler-ssr': 3.5.14 + '@vue/shared': 3.5.14 estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.3 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.13': + '@vue/compiler-ssr@3.5.14': dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.14 + '@vue/shared': 3.5.14 '@vue/compiler-vue2@2.7.16': dependencies: @@ -6485,30 +6820,32 @@ snapshots: optionalDependencies: typescript: 5.8.2 - '@vue/reactivity@3.5.13': + '@vue/reactivity@3.5.14': dependencies: - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.14 - '@vue/runtime-core@3.5.13': + '@vue/runtime-core@3.5.14': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.14 + '@vue/shared': 3.5.14 - '@vue/runtime-dom@3.5.13': + '@vue/runtime-dom@3.5.14': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/runtime-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.14 + '@vue/runtime-core': 3.5.14 + '@vue/shared': 3.5.14 csstype: 3.1.3 - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.2))': + '@vue/server-renderer@3.5.14(vue@3.5.14(typescript@5.8.2))': dependencies: - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - vue: 3.5.13(typescript@5.8.2) + '@vue/compiler-ssr': 3.5.14 + '@vue/shared': 3.5.14 + vue: 3.5.14(typescript@5.8.2) '@vue/shared@3.5.13': {} + '@vue/shared@3.5.14': {} + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -6659,6 +6996,8 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + axobject-query@4.1.0: {} + balanced-match@1.0.2: {} better-path-resolve@1.0.0: @@ -6779,6 +7118,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -6841,6 +7182,8 @@ snapshots: cookie-signature@1.0.6: {} + cookie@0.6.0: {} + cookie@0.7.1: {} cors@2.8.5: @@ -6912,10 +7255,14 @@ snapshots: decimal.js@10.5.0: {} + dedent-js@1.0.1: {} + deep-eql@5.0.2: {} deep-is@0.1.4: {} + deepmerge@4.3.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -6940,6 +7287,8 @@ snapshots: detect-libc@2.0.3: {} + devalue@5.1.1: {} + diff@7.0.0: {} dir-glob@3.0.1: @@ -7398,6 +7747,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm-env@1.2.2: {} + espree@10.3.0: dependencies: acorn: 8.14.1 @@ -7416,6 +7767,10 @@ snapshots: dependencies: estraverse: 5.3.0 + esrap@1.4.6: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -7526,6 +7881,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -7893,6 +8252,10 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.6 + is-regex@1.2.1: dependencies: call-bound: 1.0.3 @@ -8078,6 +8441,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kleur@4.1.5: {} + kolorist@1.8.0: {} kysely@0.27.6: @@ -8172,6 +8537,8 @@ snapshots: mlly: 1.7.4 pkg-types: 1.3.1 + locate-character@3.0.0: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -8202,6 +8569,10 @@ snapshots: loupe@3.1.3: {} + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -8301,6 +8672,8 @@ snapshots: mri@1.2.0: {} + mrmime@2.0.1: {} + ms@2.0.0: {} ms@2.1.3: {} @@ -8321,6 +8694,11 @@ snapshots: nice-try@1.0.5: {} + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -8451,6 +8829,11 @@ snapshots: parseurl@1.3.3: {} + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -8876,6 +9259,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-cookie-parser@2.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -8968,6 +9353,12 @@ snapshots: transitivePeerDependencies: - supports-color + sirv@3.0.1: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + slash@3.0.0: {} slice-ansi@5.0.0: @@ -9114,6 +9505,42 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte-check@4.2.0(picomatch@4.0.2)(svelte@5.28.6)(typescript@5.8.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 4.0.3 + fdir: 6.4.4(picomatch@4.0.2) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.28.6 + typescript: 5.8.2 + transitivePeerDependencies: + - picomatch + + svelte2tsx@0.7.37(svelte@5.28.6)(typescript@5.8.2): + dependencies: + dedent-js: 1.0.1 + pascal-case: 3.1.2 + svelte: 5.28.6 + typescript: 5.8.2 + + svelte@5.28.6: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) + '@types/estree': 1.0.6 + acorn: 8.14.1 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 1.4.6 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.17 + zimmerframe: 1.1.2 + symbol-tree@3.2.4: {} synckit@0.9.2: @@ -9156,6 +9583,11 @@ snapshots: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@1.0.2: {} tinyrainbow@2.0.0: {} @@ -9178,6 +9610,8 @@ snapshots: toidentifier@1.0.1: {} + totalist@3.0.1: {} + tough-cookie@5.1.1: dependencies: tldts: 6.1.78 @@ -9358,7 +9792,7 @@ snapshots: debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -9420,10 +9854,30 @@ snapshots: tsx: 4.19.3 yaml: 2.7.0 + vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0): + dependencies: + esbuild: 0.25.1 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.36.0 + tinyglobby: 0.2.13 + optionalDependencies: + '@types/node': 22.13.10 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.2 + tsx: 4.19.3 + yaml: 2.7.0 + + vitefu@1.0.6(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)): + optionalDependencies: + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vitest@3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + '@vitest/mocker': 3.0.9(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -9439,7 +9893,7 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) vite-node: 3.0.9(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: @@ -9462,9 +9916,9 @@ snapshots: vscode-uri@3.1.0: {} - vue-demi@0.14.10(vue@3.5.13(typescript@5.8.2)): + vue-demi@0.14.10(vue@3.5.14(typescript@5.8.2)): dependencies: - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) vue-eslint-parser@9.4.3(eslint@9.22.0(jiti@2.4.2)): dependencies: @@ -9479,13 +9933,13 @@ snapshots: transitivePeerDependencies: - supports-color - vue@3.5.13(typescript@5.8.2): + vue@3.5.14(typescript@5.8.2): dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-sfc': 3.5.13 - '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.2)) - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.14 + '@vue/compiler-sfc': 3.5.14 + '@vue/runtime-dom': 3.5.14 + '@vue/server-renderer': 3.5.14(vue@3.5.14(typescript@5.8.2)) + '@vue/shared': 3.5.14 optionalDependencies: typescript: 5.8.2 @@ -9633,4 +10087,6 @@ snapshots: yocto-queue@0.1.0: {} + zimmerframe@1.1.2: {} + zod@3.24.2: {} From a7303792c09c8ae1e4451de535ac8b21f9839457 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Wed, 14 May 2025 21:41:14 -0700 Subject: [PATCH 02/24] feat: add Svelte support --- packages/svelte-db/README.md | 59 +- packages/svelte-db/package.json | 24 +- packages/svelte-db/src/lib/index.ts | 11 +- .../svelte-db/src/lib/useLiveQuery.svelte.ts | 69 ++ .../src/lib/useOptimisticMutation.ts | 15 + .../tests/useLiveQuery.svelte.test.ts | 852 ++++++++++++++++++ packages/svelte-db/vite.config.ts | 18 +- pnpm-lock.yaml | 65 +- 8 files changed, 1032 insertions(+), 81 deletions(-) create mode 100644 packages/svelte-db/src/lib/useLiveQuery.svelte.ts create mode 100644 packages/svelte-db/src/lib/useOptimisticMutation.ts create mode 100644 packages/svelte-db/tests/useLiveQuery.svelte.test.ts diff --git a/packages/svelte-db/README.md b/packages/svelte-db/README.md index 9410ac82..1d5b5744 100644 --- a/packages/svelte-db/README.md +++ b/packages/svelte-db/README.md @@ -1,58 +1,3 @@ -# Svelte library +# @tanstack/react-db -Everything you need to build a Svelte library, powered by [`sv`](https://npmjs.com/package/sv). - -Read more about creating a library [in the docs](https://svelte.dev/docs/kit/packaging). - -## Creating a project - -If you're seeing this, you've probably already done this step. Congrats! - -```bash -# create a new project in the current directory -npx sv create - -# create a new project in my-app -npx sv create my-app -``` - -## Developing - -Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: - -```bash -npm run dev - -# or start the server and open the app in a new browser tab -npm run dev -- --open -``` - -Everything inside `src/lib` is part of your library, everything inside `src/routes` can be used as a showcase or preview app. - -## Building - -To build your library: - -```bash -npm run package -``` - -To create a production version of your showcase app: - -```bash -npm run build -``` - -You can preview the production build with `npm run preview`. - -> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. - -## Publishing - -Go into the `package.json` and give your package the desired name through the `"name"` option. Also consider adding a `"license"` field and point it to a `LICENSE` file which you can create from a template (one popular option is the [MIT license](https://opensource.org/license/mit/)). - -To publish your library to [npm](https://www.npmjs.com): - -```bash -npm publish -``` +Svelte hooks for TanStack DB. See [TanStack/db](https://github.com/TanStack/db) for more details. diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index 399b5d66..411a7075 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -9,7 +9,8 @@ "prepare": "svelte-kit sync || echo ''", "prepack": "svelte-kit sync && svelte-package && publint", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "test": "npx vitest --run" }, "files": [ "dist", @@ -28,19 +29,24 @@ "svelte": "./dist/index.js" } }, + "dependencies": { + "@tanstack/db": "workspace:*", + "@tanstack/svelte-store": "^0.7.0" + }, "peerDependencies": { "svelte": "^5.0.0" }, "devDependencies": { - "@sveltejs/adapter-auto": "^6.0.0", - "@sveltejs/kit": "^2.16.0", - "@sveltejs/package": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/svelte": "^5.2.4", + "@sveltejs/adapter-auto": "^6.0.1", + "@sveltejs/kit": "^2.21.0", + "@sveltejs/package": "^2.3.11", + "@vitest/coverage-istanbul": "^3.0.9", + "@sveltejs/vite-plugin-svelte": "^5.0.3", "publint": "^0.3.2", - "svelte": "^5.0.0", - "svelte-check": "^4.0.0", - "typescript": "^5.0.0", - "vite": "^6.2.6" + "svelte": "^5.28.6", + "svelte-check": "^4.2.0" }, "keywords": [ "optimistic", diff --git a/packages/svelte-db/src/lib/index.ts b/packages/svelte-db/src/lib/index.ts index 47d3c46f..ed5cd00d 100644 --- a/packages/svelte-db/src/lib/index.ts +++ b/packages/svelte-db/src/lib/index.ts @@ -1 +1,10 @@ -// Reexport your entry components here +// Re-export all public APIs +export * from "./useOptimisticMutation.js" +export * from "./useLiveQuery.svelte.js" + +// Re-export everything from @tanstack/db +export * from "@tanstack/db" + +// Re-export some stuff explicitly to ensure the type & value is exported +export { Collection } from "@tanstack/db" +export { createTransaction } from "@tanstack/db" diff --git a/packages/svelte-db/src/lib/useLiveQuery.svelte.ts b/packages/svelte-db/src/lib/useLiveQuery.svelte.ts new file mode 100644 index 00000000..091fc8e4 --- /dev/null +++ b/packages/svelte-db/src/lib/useLiveQuery.svelte.ts @@ -0,0 +1,69 @@ +import { useStore } from "@tanstack/svelte-store" +import { compileQuery, queryBuilder } from "@tanstack/db" +import type { + Collection, + Context, + InitialQueryBuilder, + QueryBuilder, + ResultsFromContext, + Schema, +} from "@tanstack/db" + +type ComputedRef = { + get current(): T +} + +type Getter = () => T + +function toValue() {} + +export interface UseLiveQueryReturn { + state: Map + data: Array + collection: Collection +} + +export function useLiveQuery< + TResultContext extends Context = Context, +>( + queryFn: ( + q: InitialQueryBuilder> + ) => QueryBuilder, + deps: Array> = [] +): UseLiveQueryReturn> { + const compiledQuery = $derived.by(() => { + // Just reference deps to make derived reactive to them + // deps.forEach((dep) => toValue(dep)) + + const query = queryFn(queryBuilder()) + const compiled = compileQuery(query) + compiled.start() + return compiled + }) + + const state = $derived(useStore(compiledQuery.results.derivedState).current) + const data = $derived(useStore(compiledQuery.results.derivedArray).current) + const collection = $derived(compiledQuery.results) + + $effect(() => { + if (compiledQuery.state === `stopped`) { + compiledQuery.start() + } + + return () => { + compiledQuery.stop() + } + }) + + return { + get state() { + return state + }, + get data() { + return data + }, + get collection() { + return collection as any + }, + } +} diff --git a/packages/svelte-db/src/lib/useOptimisticMutation.ts b/packages/svelte-db/src/lib/useOptimisticMutation.ts new file mode 100644 index 00000000..c8b1b84f --- /dev/null +++ b/packages/svelte-db/src/lib/useOptimisticMutation.ts @@ -0,0 +1,15 @@ +import { createTransaction } from "@tanstack/db" +import type { Transaction, TransactionConfig } from "@tanstack/db" + +export function useOptimisticMutation(config: TransactionConfig) { + return { + mutate: (callback: () => void): Transaction => { + const transaction = createTransaction(config) + transaction.mutate(callback) + return transaction + }, + createTransaction: (): Transaction => { + return createTransaction({ ...config, autoCommit: false }) + }, + } +} diff --git a/packages/svelte-db/tests/useLiveQuery.svelte.test.ts b/packages/svelte-db/tests/useLiveQuery.svelte.test.ts new file mode 100644 index 00000000..1d196fc6 --- /dev/null +++ b/packages/svelte-db/tests/useLiveQuery.svelte.test.ts @@ -0,0 +1,852 @@ +import { afterEach, describe, expect, it, test, vi } from "vitest" +import mitt from "mitt" +import { Collection, createTransaction } from "@tanstack/db" +import { act } from "@testing-library/svelte" +import { flushSync } from "svelte" +import type { + Context, + InitialQueryBuilder, + PendingMutation, + Schema, +} from "@tanstack/db" +import { useLiveQuery } from "$lib/useLiveQuery.svelte.js" + +type Person = { + id: string + name: string + age: number + email: string + isActive: boolean + team: string +} + +type Issue = { + id: string + title: string + description: string + userId: string +} + +const initialPersons: Array = [ + { + id: `1`, + name: `John Doe`, + age: 30, + email: `john.doe@example.com`, + isActive: true, + team: `team1`, + }, + { + id: `2`, + name: `Jane Doe`, + age: 25, + email: `jane.doe@example.com`, + isActive: true, + team: `team2`, + }, + { + id: `3`, + name: `John Smith`, + age: 35, + email: `john.smith@example.com`, + isActive: true, + team: `team1`, + }, +] + +const initialIssues: Array = [ + { + id: `1`, + title: `Issue 1`, + description: `Issue 1 description`, + userId: `1`, + }, + { + id: `2`, + title: `Issue 2`, + description: `Issue 2 description`, + userId: `2`, + }, + { + id: `3`, + title: `Issue 3`, + description: `Issue 3 description`, + userId: `1`, + }, +] + +describe(`Query Collections`, () => { + let cleanup: (() => void) | null = null + + afterEach(() => { + cleanup?.() + }) + + it(`should be able to query a collection`, () => { + cleanup = $effect.root(() => { + const emitter = mitt() + + // Create collection with mutation capability + const collection = new Collection({ + id: `optimistic-changes-test`, + sync: { + sync: ({ begin, write, commit }) => { + // Listen for sync events + emitter.on(`*`, (_, changes) => { + begin() + ;(changes as Array).forEach((change) => { + write({ + key: change.key, + type: change.type, + value: change.changes as Person, + }) + }) + commit() + }) + }, + }, + }) + + // Sync from initial state + act(() => { + emitter.emit( + `sync`, + initialPersons.map((person) => ({ + key: person.id, + type: `insert`, + changes: person, + })) + ) + }) + + const result = useLiveQuery((q) => + q + .from({ collection }) + .where(`@age`, `>`, 30) + .keyBy(`@id`) + .select(`@id`, `@name`) + .orderBy({ "@id": `asc` }) + ) + + expect(result.state.size).toBe(1) + expect(result.state.get(`3`)).toEqual({ + _orderByIndex: 0, + id: `3`, + name: `John Smith`, + }) + + expect(result.data.length).toBe(1) + expect(result.data[0]).toEqual({ + _orderByIndex: 0, + id: `3`, + name: `John Smith`, + }) + + // Insert a new person + act(() => { + emitter.emit(`sync`, [ + { + key: `4`, + type: `insert`, + changes: { + id: `4`, + name: `Kyle Doe`, + age: 40, + email: `kyle.doe@example.com`, + isActive: true, + }, + }, + ]) + }) + + flushSync() + + expect(result.state.size).toBe(2) + expect(result.state.get(`3`)).toEqual({ + _orderByIndex: 0, + id: `3`, + name: `John Smith`, + }) + expect(result.state.get(`4`)).toEqual({ + _orderByIndex: 1, + id: `4`, + name: `Kyle Doe`, + }) + + expect(result.data.length).toBe(2) + expect(result.data).toContainEqual({ + _orderByIndex: 0, + id: `3`, + name: `John Smith`, + }) + expect(result.data).toContainEqual({ + _orderByIndex: 1, + id: `4`, + name: `Kyle Doe`, + }) + + // Update the person + emitter.emit(`sync`, [ + { + key: `4`, + type: `update`, + changes: { + name: `Kyle Doe 2`, + }, + }, + ]) + + flushSync() + + expect(result.state.size).toBe(2) + expect(result.state.get(`4`)).toEqual({ + _orderByIndex: 1, + id: `4`, + name: `Kyle Doe 2`, + }) + + expect(result.data.length).toBe(2) + expect(result.data).toContainEqual({ + _orderByIndex: 1, + id: `4`, + name: `Kyle Doe 2`, + }) + + // Delete the person + emitter.emit(`sync`, [ + { + key: `4`, + type: `delete`, + }, + ]) + + flushSync() + + expect(result.state.size).toBe(1) + expect(result.state.get(`4`)).toBeUndefined() + + expect(result.data.length).toBe(1) + expect(result.data).toContainEqual({ + _orderByIndex: 0, + id: `3`, + name: `John Smith`, + }) + }) + }) + + it.skip(`should join collections and return combined results`, () => { + const cleanup = $effect.root(() => { + const emitter = mitt() + + // Create person collection + const personCollection = new Collection({ + id: `person-collection-test`, + sync: { + sync: ({ begin, write, commit }) => { + emitter.on(`sync-person`, (changes) => { + begin() + ;(changes as Array).forEach((change) => { + write({ + key: change.key, + type: change.type, + value: change.changes as Person, + }) + }) + commit() + }) + }, + }, + }) + + // Create issue collection + const issueCollection = new Collection({ + id: `issue-collection-test`, + sync: { + sync: ({ begin, write, commit }) => { + emitter.on(`sync-issue`, (changes) => { + begin() + ;(changes as Array).forEach((change) => { + write({ + key: change.key, + type: change.type, + value: change.changes as Issue, + }) + }) + commit() + }) + }, + }, + }) + + // Sync initial person data + emitter.emit( + `sync-person`, + initialPersons.map((person) => ({ + key: person.id, + type: `insert`, + changes: person, + })) + ) + + // Sync initial issue data + emitter.emit( + `sync-issue`, + initialIssues.map((issue) => ({ + key: issue.id, + type: `insert`, + changes: issue, + })) + ) + + const result = useLiveQuery((q) => + q + .from({ issues: issueCollection }) + .join({ + type: `inner`, + from: { persons: personCollection }, + on: [`@persons.id`, `=`, `@issues.userId`], + }) + .select(`@issues.id`, `@issues.title`, `@persons.name`) + .keyBy(`@id`) + ) + + flushSync() + + // Verify that we have the expected joined results + expect(result.state.size).toBe(3) + + expect(result.state.get(`1`)).toEqual({ + id: `1`, + name: `John Doe`, + title: `Issue 1`, + }) + + expect(result.state.get(`2`)).toEqual({ + id: `2`, + name: `Jane Doe`, + title: `Issue 2`, + }) + + expect(result.state.get(`3`)).toEqual({ + id: `3`, + name: `John Doe`, + title: `Issue 3`, + }) + + // Add a new issue for user 1 + emitter.emit(`sync-issue`, [ + { + key: `4`, + type: `insert`, + changes: { + id: `4`, + title: `Issue 4`, + description: `Issue 4 description`, + userId: `2`, + }, + }, + ]) + + flushSync() + + expect(result.state.size).toBe(4) + expect(result.state.get(`4`)).toEqual({ + id: `4`, + name: `Jane Doe`, + title: `Issue 4`, + }) + + // Update an issue we're already joined with + emitter.emit(`sync-issue`, [ + { + key: `2`, + type: `update`, + changes: { + title: `Updated Issue 2`, + }, + }, + ]) + + flushSync() + + // The updated title should be reflected in the joined results + expect(result.state.get(`2`)).toEqual({ + id: `2`, + name: `Jane Doe`, + title: `Updated Issue 2`, + }) + + // Delete an issue + emitter.emit(`sync-issue`, [ + { + key: `3`, + type: `delete`, + }, + ]) + + flushSync() + + // After deletion, user 3 should no longer have a joined result + expect(result.state.get(`3`)).toBeUndefined() + }) + + cleanup() + }) + + it.skip(`should recompile query when parameters change and change results`, () => { + const cleanup = $effect.root(() => { + const emitter = mitt() + + // Create collection with mutation capability + const collection = new Collection({ + id: `params-change-test`, + sync: { + sync: ({ begin, write, commit }) => { + // Listen for sync events + emitter.on(`sync`, (changes) => { + begin() + ;(changes as Array).forEach((change) => { + write({ + key: change.key, + type: change.type, + value: change.changes as Person, + }) + }) + commit() + }) + }, + }, + }) + + // Sync from initial state + emitter.emit( + `sync`, + initialPersons.map((person) => ({ + key: person.id, + type: `insert`, + changes: person, + })) + ) + + let minAge = $state(30) + + const result = useLiveQuery((q) => { + return q + .from({ collection }) + .where(`@age`, `>`, minAge) + .keyBy(`@id`) + .select(`@id`, `@name`, `@age`) + }) + + // Initially should return only people older than 30 + expect(result.state.size).toBe(1) + expect(result.state.get(`3`)).toEqual({ + id: `3`, + name: `John Smith`, + age: 35, + }) + + // Change the parameter to include more people + minAge = 20 + + flushSync() + + // Now should return all people as they're all older than 20 + expect(result.state.size).toBe(3) + expect(result.state.get(`1`)).toEqual({ + id: `1`, + name: `John Doe`, + age: 30, + }) + expect(result.state.get(`2`)).toEqual({ + id: `2`, + name: `Jane Doe`, + age: 25, + }) + expect(result.state.get(`3`)).toEqual({ + id: `3`, + name: `John Smith`, + age: 35, + }) + + // Change to exclude everyone + minAge = 50 + + flushSync() + + // Should now be empty + expect(result.state.size).toBe(0) + }) + }) + + // it(`should stop old query when parameters change`, async () => { + // const emitter = mitt() + + // // Create collection with mutation capability + // const collection = new Collection({ + // id: `stop-query-test`, + // sync: { + // sync: ({ begin, write, commit }) => { + // emitter.on(`sync`, (changes) => { + // begin() + // ;(changes as Array).forEach((change) => { + // write({ + // key: change.key, + // type: change.type, + // value: change.changes as Person, + // }) + // }) + // commit() + // }) + // }, + // }, + // }) + + // // Mock console.log to track when compiledQuery.stop() is called + // let logCalls: Array = [] + // const originalConsoleLog = console.log + // console.log = vi.fn((...args) => { + // logCalls.push(args.join(` `)) + // originalConsoleLog(...args) + // }) + + // // Add a custom hook that wraps useLiveQuery to log when queries are created and stopped + // function useTrackedLiveQuery( + // queryFn: (q: InitialQueryBuilder>) => any, + // deps: Array> + // ): T { + // const result = useLiveQuery(queryFn, deps) + + // watch( + // () => deps.map((dep) => dep.value).join(`,`), + // (updatedDeps, _, fn) => { + // console.log(`Creating new query with deps`, updatedDeps) + // fn(() => console.log(`Stopping query with deps`, updatedDeps)) + // }, + // { immediate: true } + // ) + + // return result as T + // } + + // // Sync initial state + // emitter.emit( + // `sync`, + // initialPersons.map((person) => ({ + // key: person.id, + // type: `insert`, + // changes: person, + // })) + // ) + + // const minAge = ref(30) + // useTrackedLiveQuery( + // (q) => + // q + // .from({ collection }) + // .where(`@age`, `>`, minAge.value) + // .keyBy(`@id`) + // .select(`@id`, `@name`), + // [minAge] + // ) + + // // Initial query should be created + // expect( + // logCalls.some((call) => call.includes(`Creating new query with deps 30`)) + // ).toBe(true) + + // // Clear log calls + // logCalls = [] + + // // Change the parameter + // minAge.value = 25 + + // flushSync() + + // // Old query should be stopped and new query created + // expect( + // logCalls.some((call) => call.includes(`Stopping query with deps 30`)) + // ).toBe(true) + // expect( + // logCalls.some((call) => call.includes(`Creating new query with deps 25`)) + // ).toBe(true) + + // // Restore console.log + // console.log = originalConsoleLog + // }) + + // it(`should be able to query a result collection`, async () => { + // const emitter = mitt() + + // // Create collection with mutation capability + // const collection = new Collection({ + // id: `optimistic-changes-test`, + // sync: { + // sync: ({ begin, write, commit }) => { + // // Listen for sync events + // emitter.on(`*`, (_, changes) => { + // begin() + // ;(changes as Array).forEach((change) => { + // write({ + // key: change.key, + // type: change.type, + // value: change.changes as Person, + // }) + // }) + // commit() + // }) + // }, + // }, + // }) + + // // Sync from initial state + // emitter.emit( + // `sync`, + // initialPersons.map((person) => ({ + // key: person.id, + // type: `insert`, + // changes: person, + // })) + // ) + + // // Initial query + // const result = useLiveQuery((q) => + // q + // .from({ collection }) + // .where(`@age`, `>`, 30) + // .keyBy(`@id`) + // .select(`@id`, `@name`, `@team`) + // .orderBy({ "@id": `asc` }) + // ) + + // // Grouped query derived from initial query + // const groupedResult = useLiveQuery((q) => + // q + // .from({ queryResult: result.collection.value }) + // .groupBy(`@team`) + // .keyBy(`@team`) + // .select(`@team`, { count: { COUNT: `@id` } }) + // ) + + // // Verify initial grouped results + // expect(groupedResult.result.state.size).toBe(1) + // expect(groupedResult.result.state.get(`team1`)).toEqual({ + // team: `team1`, + // count: 1, + // }) + + // // Insert two new users in different teams + // emitter.emit(`sync`, [ + // { + // key: `5`, + // type: `insert`, + // changes: { + // id: `5`, + // name: `Sarah Jones`, + // age: 32, + // email: `sarah.jones@example.com`, + // isActive: true, + // team: `team1`, + // }, + // }, + // { + // key: `6`, + // type: `insert`, + // changes: { + // id: `6`, + // name: `Mike Wilson`, + // age: 38, + // email: `mike.wilson@example.com`, + // isActive: true, + // team: `team2`, + // }, + // }, + // ]) + + // flushSync() + + // // Verify the grouped results include the new team members + // expect(groupedResult.result.state.size).toBe(2) + // expect(groupedResult.result.state.get(`team1`)).toEqual({ + // team: `team1`, + // count: 2, + // }) + // expect(groupedResult.result.state.get(`team2`)).toEqual({ + // team: `team2`, + // count: 1, + // }) + // }) + + it.skip(`optimistic state is dropped after commit`, () => { + const cleanup = $effect.root(() => { + const emitter = mitt() + // Track renders and states + const renderStates: Array<{ + stateSize: number + hasTempKey: boolean + hasPermKey: boolean + timestamp: number + }> = [] + + // Create person collection + const personCollection = new Collection({ + id: `person-collection-test-bug`, + sync: { + sync: ({ begin, write, commit }) => { + // @ts-expect-error Mitt typing doesn't match our usage + emitter.on(`sync-person`, (changes: Array) => { + begin() + changes.forEach((change) => { + write({ + key: change.key, + type: change.type, + value: change.changes as Person, + }) + }) + commit() + }) + }, + }, + }) + + // Create issue collection + const issueCollection = new Collection({ + id: `issue-collection-test-bug`, + sync: { + sync: ({ begin, write, commit }) => { + // @ts-expect-error Mitt typing doesn't match our usage + emitter.on(`sync-issue`, (changes: Array) => { + begin() + changes.forEach((change) => { + write({ + key: change.key, + type: change.type, + value: change.changes as Issue, + }) + }) + commit() + }) + }, + }, + }) + + // Sync initial person data + emitter.emit( + `sync-person`, + initialPersons.map((person) => ({ + key: person.id, + type: `insert`, + changes: person, + })) + ) + + // Sync initial issue data + emitter.emit( + `sync-issue`, + initialIssues.map((issue) => ({ + key: issue.id, + type: `insert`, + changes: issue, + })) + ) + + // Render the hook with a query that joins persons and issues + const result = useLiveQuery((q) => + q + .from({ issues: issueCollection }) + .join({ + type: `inner`, + from: { persons: personCollection }, + on: [`@persons.id`, `=`, `@issues.userId`], + }) + .select(`@issues.id`, `@issues.title`, `@persons.name`) + .keyBy(`@id`) + ) + + // Track each render state + $effect(() => { + renderStates.push({ + stateSize: result.state.size, + hasTempKey: result.state.has(`temp-key`), + hasPermKey: result.state.has(`4`), + timestamp: Date.now(), + }) + }) + + flushSync() + + // Verify initial state + expect(result.state.size).toBe(3) + + // Reset render states array for clarity in the remaining test + renderStates.length = 0 + + // Create a transaction to perform an optimistic mutation + const tx = createTransaction({ + mutationFn: async () => { + emitter.emit(`sync-issue`, [ + { + key: `4`, + type: `insert`, + changes: { + id: `4`, + title: `New Issue`, + description: `New Issue Description`, + userId: `1`, + }, + }, + ]) + return Promise.resolve() + }, + }) + + // Perform optimistic insert of a new issue + tx.mutate(() => + issueCollection.insert( + { + id: `temp-key`, + title: `New Issue`, + description: `New Issue Description`, + userId: `1`, + }, + { key: `temp-key` } + ) + ) + + // Verify optimistic state is immediately reflected + expect(result.state.size).toBe(4) + expect(result.state.get(`temp-key`)).toEqual({ + id: `temp-key`, + name: `John Doe`, + title: `New Issue`, + }) + + // Wait for the transaction to be committed + tx.isPersisted.promise.then(() => {}) + flushSync() + + // Check if we had any render where the temp key was removed but the permanent key wasn't added yet + const hadFlicker = renderStates.some( + (state) => + !state.hasTempKey && !state.hasPermKey && state.stateSize === 3 + ) + + expect(hadFlicker).toBe(false) + + // Verify the temporary key is replaced by the permanent one + expect(result.state.size).toBe(4) + expect(result.state.get(`temp-key`)).toBeUndefined() + expect(result.state.get(`4`)).toEqual({ + id: `4`, + name: `John Doe`, + title: `New Issue`, + }) + }) + + cleanup() + }) +}) + +async function waitForChanges(ms = 0) { + await new Promise((resolve) => setTimeout(resolve, ms)) +} diff --git a/packages/svelte-db/vite.config.ts b/packages/svelte-db/vite.config.ts index 5b29b3a1..4c87e64f 100644 --- a/packages/svelte-db/vite.config.ts +++ b/packages/svelte-db/vite.config.ts @@ -1,6 +1,20 @@ +import { svelteTesting } from "@testing-library/svelte/vite" import { sveltekit } from "@sveltejs/kit/vite" -import { defineConfig } from "vite" +import { defineConfig } from "vitest/config" +import packageJson from "./package.json" with { type: "json" } export default defineConfig({ - plugins: [sveltekit()], + plugins: [sveltekit(), svelteTesting()], + test: { + name: packageJson.name, + dir: `./tests`, + watch: false, + environment: `jsdom`, + // coverage: { + // enabled: true, + // provider: `istanbul`, + // include: [`src/lib/**/*`], + // }, + typecheck: { enabled: true }, + }, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8bef0b4..8c300099 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -282,34 +282,44 @@ importers: version: 19.0.0(react@19.0.0) packages/svelte-db: + dependencies: + '@tanstack/db': + specifier: workspace:* + version: link:../db + '@tanstack/svelte-store': + specifier: ^0.7.0 + version: 0.7.0(svelte@5.28.6) devDependencies: '@sveltejs/adapter-auto': - specifier: ^6.0.0 + specifier: ^6.0.1 version: 6.0.1(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))) '@sveltejs/kit': - specifier: ^2.16.0 + specifier: ^2.21.0 version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) '@sveltejs/package': - specifier: ^2.0.0 + specifier: ^2.3.11 version: 2.3.11(svelte@5.28.6)(typescript@5.8.2) '@sveltejs/vite-plugin-svelte': - specifier: ^5.0.0 + specifier: ^5.0.3 version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + '@testing-library/jest-dom': + specifier: ^6.6.3 + version: 6.6.3 + '@testing-library/svelte': + specifier: ^5.2.4 + version: 5.2.7(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + '@vitest/coverage-istanbul': + specifier: ^3.0.9 + version: 3.0.9(vitest@3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) publint: specifier: ^0.3.2 version: 0.3.9 svelte: - specifier: ^5.0.0 + specifier: ^5.28.6 version: 5.28.6 svelte-check: - specifier: ^4.0.0 + specifier: ^4.2.0 version: 4.2.0(picomatch@4.0.2)(svelte@5.28.6)(typescript@5.8.2) - typescript: - specifier: ^5.0.0 - version: 5.8.2 - vite: - specifier: ^6.2.6 - version: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) packages/vue-db: dependencies: @@ -1719,6 +1729,11 @@ packages: '@tanstack/store@0.7.0': resolution: {integrity: sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==} + '@tanstack/svelte-store@0.7.0': + resolution: {integrity: sha512-FVuPuCLkGV/YcsJImIiJAZRh3s8DqI8C9jQMNXymELwsrpe538Vmb81fxHHNZx9MCtzsFcHfYOkImFB4r4QcfA==} + peerDependencies: + svelte: ^5.0.0 + '@tanstack/typedoc-config@0.1.0': resolution: {integrity: sha512-WaeDXvt9Dyds53SCOCZKGmwHdS6LGwNH7LyDeTtsmPW7zn7ApOaNyAPWlqjkEHGVd0ykvR+XA8CI8RPfLGGxmw==} engines: {node: '>=18'} @@ -1759,6 +1774,19 @@ packages: '@types/react-dom': optional: true + '@testing-library/svelte@5.2.7': + resolution: {integrity: sha512-aGhUaFmEXEVost4QOsbHUUbHLwi7ZZRRxAHFDO2Cmr0BZD3/3+XvaYEPq70Rdw0NRNjdqZHdARBEcrCOkPuAqw==} + engines: {node: '>= 10'} + peerDependencies: + svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 + vite: '*' + vitest: '*' + peerDependenciesMeta: + vite: + optional: true + vitest: + optional: true + '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -6389,6 +6417,11 @@ snapshots: '@tanstack/store@0.7.0': {} + '@tanstack/svelte-store@0.7.0(svelte@5.28.6)': + dependencies: + '@tanstack/store': 0.7.0 + svelte: 5.28.6 + '@tanstack/typedoc-config@0.1.0(typescript@5.8.2)': dependencies: typedoc: 0.27.9(typescript@5.8.2) @@ -6447,6 +6480,14 @@ snapshots: '@types/react': 19.0.12 '@types/react-dom': 19.0.4(@types/react@19.0.12) + '@testing-library/svelte@5.2.7(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': + dependencies: + '@testing-library/dom': 10.4.0 + svelte: 5.28.6 + optionalDependencies: + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vitest: 3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 From 3ca1f6d61175cb0862a926bf0304e668296f5757 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 05:34:20 -0700 Subject: [PATCH 03/24] chore: fix tests --- packages/svelte-db/package.json | 15 +- packages/svelte-db/src/app.d.ts | 13 - packages/svelte-db/src/app.html | 12 - packages/svelte-db/src/{lib => }/index.ts | 0 packages/svelte-db/src/routes/+page.svelte | 3 - .../src/{lib => }/useLiveQuery.svelte.ts | 29 +- .../src/{lib => }/useOptimisticMutation.ts | 0 packages/svelte-db/static/favicon.png | Bin 1571 -> 0 bytes packages/svelte-db/svelte.config.js | 19 +- .../tests/useLiveQuery.svelte.test.ts | 523 +++++++++--------- packages/svelte-db/tsconfig.json | 28 +- packages/svelte-db/vite.config.ts | 15 +- 12 files changed, 310 insertions(+), 347 deletions(-) delete mode 100644 packages/svelte-db/src/app.d.ts delete mode 100644 packages/svelte-db/src/app.html rename packages/svelte-db/src/{lib => }/index.ts (100%) delete mode 100644 packages/svelte-db/src/routes/+page.svelte rename packages/svelte-db/src/{lib => }/useLiveQuery.svelte.ts (65%) rename packages/svelte-db/src/{lib => }/useOptimisticMutation.ts (100%) delete mode 100644 packages/svelte-db/static/favicon.png diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index 411a7075..b8faf8e7 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -3,14 +3,13 @@ "description": "Svelte integration for @tanstack/db", "version": "0.0.0", "scripts": { - "dev": "vite dev", - "build": "vite build && npm run prepack", - "preview": "vite preview", - "prepare": "svelte-kit sync || echo ''", - "prepack": "svelte-kit sync && svelte-package && publint", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "test": "npx vitest --run" + "test:types": "svelte-check --tsconfig ./tsconfig.json", + "test:eslint": "eslint ./src ./tests", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch", + "test:build": "publint --strict", + "test": "npx vitest --run", + "build": "svelte-package --input ./src --output ./dist" }, "files": [ "dist", diff --git a/packages/svelte-db/src/app.d.ts b/packages/svelte-db/src/app.d.ts deleted file mode 100644 index c0c08168..00000000 --- a/packages/svelte-db/src/app.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -// See https://svelte.dev/docs/kit/types#app.d.ts -// for information about these interfaces -declare global { - namespace App { - // interface Error {} - // interface Locals {} - // interface PageData {} - // interface PageState {} - // interface Platform {} - } -} - -export {} diff --git a/packages/svelte-db/src/app.html b/packages/svelte-db/src/app.html deleted file mode 100644 index f22aeaad..00000000 --- a/packages/svelte-db/src/app.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - %sveltekit.head% - - -
%sveltekit.body%
- - diff --git a/packages/svelte-db/src/lib/index.ts b/packages/svelte-db/src/index.ts similarity index 100% rename from packages/svelte-db/src/lib/index.ts rename to packages/svelte-db/src/index.ts diff --git a/packages/svelte-db/src/routes/+page.svelte b/packages/svelte-db/src/routes/+page.svelte deleted file mode 100644 index 9c42926f..00000000 --- a/packages/svelte-db/src/routes/+page.svelte +++ /dev/null @@ -1,3 +0,0 @@ -

Welcome to your library project

-

Create your package using @sveltejs/package and preview/showcase your work with SvelteKit

-

Visit svelte.dev/docs/kit to read the documentation

diff --git a/packages/svelte-db/src/lib/useLiveQuery.svelte.ts b/packages/svelte-db/src/useLiveQuery.svelte.ts similarity index 65% rename from packages/svelte-db/src/lib/useLiveQuery.svelte.ts rename to packages/svelte-db/src/useLiveQuery.svelte.ts index 091fc8e4..74db8943 100644 --- a/packages/svelte-db/src/lib/useLiveQuery.svelte.ts +++ b/packages/svelte-db/src/useLiveQuery.svelte.ts @@ -9,14 +9,6 @@ import type { Schema, } from "@tanstack/db" -type ComputedRef = { - get current(): T -} - -type Getter = () => T - -function toValue() {} - export interface UseLiveQueryReturn { state: Map data: Array @@ -29,11 +21,11 @@ export function useLiveQuery< queryFn: ( q: InitialQueryBuilder> ) => QueryBuilder, - deps: Array> = [] + deps: Array<() => unknown> = [] ): UseLiveQueryReturn> { const compiledQuery = $derived.by(() => { // Just reference deps to make derived reactive to them - // deps.forEach((dep) => toValue(dep)) + deps.forEach((dep) => dep()) const query = queryFn(queryBuilder()) const compiled = compileQuery(query) @@ -41,15 +33,10 @@ export function useLiveQuery< return compiled }) - const state = $derived(useStore(compiledQuery.results.derivedState).current) - const data = $derived(useStore(compiledQuery.results.derivedArray).current) - const collection = $derived(compiledQuery.results) + const state = () => useStore(compiledQuery.results.derivedState).current + const data = () => useStore(compiledQuery.results.derivedArray).current $effect(() => { - if (compiledQuery.state === `stopped`) { - compiledQuery.start() - } - return () => { compiledQuery.stop() } @@ -57,13 +44,15 @@ export function useLiveQuery< return { get state() { - return state + return state() }, get data() { - return data + return data() }, get collection() { - return collection as any + return compiledQuery.results as unknown as Collection< + ResultsFromContext + > }, } } diff --git a/packages/svelte-db/src/lib/useOptimisticMutation.ts b/packages/svelte-db/src/useOptimisticMutation.ts similarity index 100% rename from packages/svelte-db/src/lib/useOptimisticMutation.ts rename to packages/svelte-db/src/useOptimisticMutation.ts diff --git a/packages/svelte-db/static/favicon.png b/packages/svelte-db/static/favicon.png deleted file mode 100644 index 825b9e65af7c104cfb07089bb28659393b4f2097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH { }) // Sync from initial state - act(() => { - emitter.emit( - `sync`, - initialPersons.map((person) => ({ - key: person.id, - type: `insert`, - changes: person, - })) - ) - }) + emitter.emit( + `sync`, + initialPersons.map((person) => ({ + key: person.id, + type: `insert`, + changes: person, + })) + ) const result = useLiveQuery((q) => q @@ -143,21 +140,19 @@ describe(`Query Collections`, () => { }) // Insert a new person - act(() => { - emitter.emit(`sync`, [ - { - key: `4`, - type: `insert`, - changes: { - id: `4`, - name: `Kyle Doe`, - age: 40, - email: `kyle.doe@example.com`, - isActive: true, - }, + emitter.emit(`sync`, [ + { + key: `4`, + type: `insert`, + changes: { + id: `4`, + name: `Kyle Doe`, + age: 40, + email: `kyle.doe@example.com`, + isActive: true, }, - ]) - }) + }, + ]) flushSync() @@ -234,8 +229,8 @@ describe(`Query Collections`, () => { }) }) - it.skip(`should join collections and return combined results`, () => { - const cleanup = $effect.root(() => { + it(`should join collections and return combined results`, () => { + cleanup = $effect.root(() => { const emitter = mitt() // Create person collection @@ -288,6 +283,8 @@ describe(`Query Collections`, () => { })) ) + flushSync() + // Sync initial issue data emitter.emit( `sync-issue`, @@ -389,12 +386,10 @@ describe(`Query Collections`, () => { // After deletion, user 3 should no longer have a joined result expect(result.state.get(`3`)).toBeUndefined() }) - - cleanup() }) - it.skip(`should recompile query when parameters change and change results`, () => { - const cleanup = $effect.root(() => { + it(`should recompile query when parameters change and change results`, () => { + cleanup = $effect.root(() => { const emitter = mitt() // Create collection with mutation capability @@ -428,6 +423,8 @@ describe(`Query Collections`, () => { })) ) + flushSync() + let minAge = $state(30) const result = useLiveQuery((q) => { @@ -479,206 +476,218 @@ describe(`Query Collections`, () => { }) }) - // it(`should stop old query when parameters change`, async () => { - // const emitter = mitt() - - // // Create collection with mutation capability - // const collection = new Collection({ - // id: `stop-query-test`, - // sync: { - // sync: ({ begin, write, commit }) => { - // emitter.on(`sync`, (changes) => { - // begin() - // ;(changes as Array).forEach((change) => { - // write({ - // key: change.key, - // type: change.type, - // value: change.changes as Person, - // }) - // }) - // commit() - // }) - // }, - // }, - // }) - - // // Mock console.log to track when compiledQuery.stop() is called - // let logCalls: Array = [] - // const originalConsoleLog = console.log - // console.log = vi.fn((...args) => { - // logCalls.push(args.join(` `)) - // originalConsoleLog(...args) - // }) - - // // Add a custom hook that wraps useLiveQuery to log when queries are created and stopped - // function useTrackedLiveQuery( - // queryFn: (q: InitialQueryBuilder>) => any, - // deps: Array> - // ): T { - // const result = useLiveQuery(queryFn, deps) - - // watch( - // () => deps.map((dep) => dep.value).join(`,`), - // (updatedDeps, _, fn) => { - // console.log(`Creating new query with deps`, updatedDeps) - // fn(() => console.log(`Stopping query with deps`, updatedDeps)) - // }, - // { immediate: true } - // ) - - // return result as T - // } - - // // Sync initial state - // emitter.emit( - // `sync`, - // initialPersons.map((person) => ({ - // key: person.id, - // type: `insert`, - // changes: person, - // })) - // ) - - // const minAge = ref(30) - // useTrackedLiveQuery( - // (q) => - // q - // .from({ collection }) - // .where(`@age`, `>`, minAge.value) - // .keyBy(`@id`) - // .select(`@id`, `@name`), - // [minAge] - // ) - - // // Initial query should be created - // expect( - // logCalls.some((call) => call.includes(`Creating new query with deps 30`)) - // ).toBe(true) - - // // Clear log calls - // logCalls = [] - - // // Change the parameter - // minAge.value = 25 - - // flushSync() - - // // Old query should be stopped and new query created - // expect( - // logCalls.some((call) => call.includes(`Stopping query with deps 30`)) - // ).toBe(true) - // expect( - // logCalls.some((call) => call.includes(`Creating new query with deps 25`)) - // ).toBe(true) - - // // Restore console.log - // console.log = originalConsoleLog - // }) - - // it(`should be able to query a result collection`, async () => { - // const emitter = mitt() - - // // Create collection with mutation capability - // const collection = new Collection({ - // id: `optimistic-changes-test`, - // sync: { - // sync: ({ begin, write, commit }) => { - // // Listen for sync events - // emitter.on(`*`, (_, changes) => { - // begin() - // ;(changes as Array).forEach((change) => { - // write({ - // key: change.key, - // type: change.type, - // value: change.changes as Person, - // }) - // }) - // commit() - // }) - // }, - // }, - // }) - - // // Sync from initial state - // emitter.emit( - // `sync`, - // initialPersons.map((person) => ({ - // key: person.id, - // type: `insert`, - // changes: person, - // })) - // ) - - // // Initial query - // const result = useLiveQuery((q) => - // q - // .from({ collection }) - // .where(`@age`, `>`, 30) - // .keyBy(`@id`) - // .select(`@id`, `@name`, `@team`) - // .orderBy({ "@id": `asc` }) - // ) - - // // Grouped query derived from initial query - // const groupedResult = useLiveQuery((q) => - // q - // .from({ queryResult: result.collection.value }) - // .groupBy(`@team`) - // .keyBy(`@team`) - // .select(`@team`, { count: { COUNT: `@id` } }) - // ) - - // // Verify initial grouped results - // expect(groupedResult.result.state.size).toBe(1) - // expect(groupedResult.result.state.get(`team1`)).toEqual({ - // team: `team1`, - // count: 1, - // }) - - // // Insert two new users in different teams - // emitter.emit(`sync`, [ - // { - // key: `5`, - // type: `insert`, - // changes: { - // id: `5`, - // name: `Sarah Jones`, - // age: 32, - // email: `sarah.jones@example.com`, - // isActive: true, - // team: `team1`, - // }, - // }, - // { - // key: `6`, - // type: `insert`, - // changes: { - // id: `6`, - // name: `Mike Wilson`, - // age: 38, - // email: `mike.wilson@example.com`, - // isActive: true, - // team: `team2`, - // }, - // }, - // ]) - - // flushSync() - - // // Verify the grouped results include the new team members - // expect(groupedResult.result.state.size).toBe(2) - // expect(groupedResult.result.state.get(`team1`)).toEqual({ - // team: `team1`, - // count: 2, - // }) - // expect(groupedResult.result.state.get(`team2`)).toEqual({ - // team: `team2`, - // count: 1, - // }) - // }) - - it.skip(`optimistic state is dropped after commit`, () => { - const cleanup = $effect.root(() => { + it(`should stop old query when parameters change`, () => { + cleanup = $effect.root(() => { + const emitter = mitt() + + // Create collection with mutation capability + const collection = new Collection({ + id: `stop-query-test`, + sync: { + sync: ({ begin, write, commit }) => { + emitter.on(`sync`, (changes) => { + begin() + ;(changes as Array).forEach((change) => { + write({ + key: change.key, + type: change.type, + value: change.changes as Person, + }) + }) + commit() + }) + }, + }, + }) + + // Mock console.log to track when compiledQuery.stop() is called + let logCalls: Array = [] + const originalConsoleLog = console.log + console.log = vi.fn((...args) => { + logCalls.push(args.join(` `)) + originalConsoleLog(...args) + }) + + // Add a custom hook that wraps useLiveQuery to log when queries are created and stopped + function useTrackedLiveQuery( + queryFn: (q: InitialQueryBuilder>) => any, + deps: Array<() => unknown> + ): T { + const result = useLiveQuery(queryFn) + const derivedDeps = () => deps.map((dep) => dep()).join(`,`) + + $effect(() => { + console.log(`Creating new query with deps`, derivedDeps()) + + return () => { + console.log(`Stopping query with deps`, derivedDeps()) + } + }) + + return result as T + } + + // Sync initial state + emitter.emit( + `sync`, + initialPersons.map((person) => ({ + key: person.id, + type: `insert`, + changes: person, + })) + ) + + let minAge = $state(30) + useTrackedLiveQuery( + (q) => + q + .from({ collection }) + .where(`@age`, `>`, minAge) + .keyBy(`@id`) + .select(`@id`, `@name`), + [() => minAge] + ) + + flushSync() + + // Initial query should be created + expect( + logCalls.some((call) => { + return call.includes(`Creating new query with deps 30`) + }) + ).toBe(true) + + // Clear log calls + logCalls = [] + + // Change the parameter + minAge = 25 + + flushSync() + + // Old query should be stopped and new query created + expect( + logCalls.some((call) => call.includes(`Stopping query with deps 30`)) + ).toBe(true) + expect( + logCalls.some((call) => + call.includes(`Creating new query with deps 25`) + ) + ).toBe(true) + + // Restore console.log + console.log = originalConsoleLog + }) + }) + + it(`should be able to query a result collection`, () => { + cleanup = $effect.root(() => { + const emitter = mitt() + + // Create collection with mutation capability + const collection = new Collection({ + id: `optimistic-changes-test`, + sync: { + sync: ({ begin, write, commit }) => { + // Listen for sync events + emitter.on(`*`, (_, changes) => { + begin() + ;(changes as Array).forEach((change) => { + write({ + key: change.key, + type: change.type, + value: change.changes as Person, + }) + }) + commit() + }) + }, + }, + }) + + // Sync from initial state + emitter.emit( + `sync`, + initialPersons.map((person) => ({ + key: person.id, + type: `insert`, + changes: person, + })) + ) + + flushSync() + + // Initial query + const result = useLiveQuery((q) => + q + .from({ collection }) + .where(`@age`, `>`, 30) + .keyBy(`@id`) + .select(`@id`, `@name`, `@team`) + .orderBy({ "@id": `asc` }) + ) + + // Grouped query derived from initial query + const groupedResult = useLiveQuery((q) => + q + .from({ queryResult: result.collection }) + .groupBy(`@team`) + .keyBy(`@team`) + .select(`@team`, { count: { COUNT: `@id` } }) + ) + + // Verify initial grouped results + expect(groupedResult.state.size).toBe(1) + expect(groupedResult.state.get(`team1`)).toEqual({ + team: `team1`, + count: 1, + }) + + // Insert two new users in different teams + emitter.emit(`sync`, [ + { + key: `5`, + type: `insert`, + changes: { + id: `5`, + name: `Sarah Jones`, + age: 32, + email: `sarah.jones@example.com`, + isActive: true, + team: `team1`, + }, + }, + { + key: `6`, + type: `insert`, + changes: { + id: `6`, + name: `Mike Wilson`, + age: 38, + email: `mike.wilson@example.com`, + isActive: true, + team: `team2`, + }, + }, + ]) + + flushSync() + + // Verify the grouped results include the new team members + expect(groupedResult.state.size).toBe(2) + expect(groupedResult.state.get(`team1`)).toEqual({ + team: `team1`, + count: 2, + }) + expect(groupedResult.state.get(`team2`)).toEqual({ + team: `team2`, + count: 1, + }) + }) + }) + + it(`optimistic state is dropped after commit`, () => { + cleanup = $effect.root(() => { const emitter = mitt() // Track renders and states const renderStates: Array<{ @@ -740,6 +749,8 @@ describe(`Query Collections`, () => { })) ) + flushSync() + // Sync initial issue data emitter.emit( `sync-issue`, @@ -750,6 +761,8 @@ describe(`Query Collections`, () => { })) ) + flushSync() + // Render the hook with a query that joins persons and issues const result = useLiveQuery((q) => q @@ -822,31 +835,25 @@ describe(`Query Collections`, () => { }) // Wait for the transaction to be committed - tx.isPersisted.promise.then(() => {}) - flushSync() - - // Check if we had any render where the temp key was removed but the permanent key wasn't added yet - const hadFlicker = renderStates.some( - (state) => - !state.hasTempKey && !state.hasPermKey && state.stateSize === 3 - ) - - expect(hadFlicker).toBe(false) - - // Verify the temporary key is replaced by the permanent one - expect(result.state.size).toBe(4) - expect(result.state.get(`temp-key`)).toBeUndefined() - expect(result.state.get(`4`)).toEqual({ - id: `4`, - name: `John Doe`, - title: `New Issue`, - }) + // await tx.isPersisted.promise + // flushSync() + + // // Check if we had any render where the temp key was removed but the permanent key wasn't added yet + // const hadFlicker = renderStates.some( + // (state) => + // !state.hasTempKey && !state.hasPermKey && state.stateSize === 3 + // ) + + // expect(hadFlicker).toBe(false) + + // // Verify the temporary key is replaced by the permanent one + // expect(result.state.size).toBe(4) + // expect(result.state.get(`temp-key`)).toBeUndefined() + // expect(result.state.get(`4`)).toEqual({ + // id: `4`, + // name: `John Doe`, + // title: `New Issue`, + // }) }) - - cleanup() }) }) - -async function waitForChanges(ms = 0) { - await new Promise((resolve) => setTimeout(resolve, ms)) -} diff --git a/packages/svelte-db/tsconfig.json b/packages/svelte-db/tsconfig.json index 6f788f16..83265e3a 100644 --- a/packages/svelte-db/tsconfig.json +++ b/packages/svelte-db/tsconfig.json @@ -1,15 +1,17 @@ { - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "module": "NodeNext", - "moduleResolution": "NodeNext" - } + "extends": "../../tsconfig.json", + "compilerOptions": { + "types": ["svelte"], + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "Bundler", + "declaration": true, + "outDir": "dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + }, + "include": ["src/**/*", "tests", "vite.config.ts"], + "exclude": ["node_modules", "dist"] } diff --git a/packages/svelte-db/vite.config.ts b/packages/svelte-db/vite.config.ts index 4c87e64f..3946d91e 100644 --- a/packages/svelte-db/vite.config.ts +++ b/packages/svelte-db/vite.config.ts @@ -10,11 +10,16 @@ export default defineConfig({ dir: `./tests`, watch: false, environment: `jsdom`, - // coverage: { - // enabled: true, - // provider: `istanbul`, - // include: [`src/lib/**/*`], - // }, + coverage: { + enabled: false, + provider: `istanbul`, + include: [`src/**/*`], + }, typecheck: { enabled: true }, + alias: { + // This is needed for svelte-5 support + // https://github.com/testing-library/svelte-testing-library?tab=readme-ov-file#svelte-5-support + "@testing-library/svelte": `@testing-library/svelte/svelte5`, + }, }, }) From 7900bf1db7ccd1ef66af3e7e31af60ab64af3e22 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 06:17:56 -0700 Subject: [PATCH 04/24] chore: adjust effect roots --- .../tests/useLiveQuery.svelte.test.ts | 176 ++++++++++-------- 1 file changed, 95 insertions(+), 81 deletions(-) diff --git a/packages/svelte-db/tests/useLiveQuery.svelte.test.ts b/packages/svelte-db/tests/useLiveQuery.svelte.test.ts index 5b655d1b..7d1d5762 100644 --- a/packages/svelte-db/tests/useLiveQuery.svelte.test.ts +++ b/packages/svelte-db/tests/useLiveQuery.svelte.test.ts @@ -686,59 +686,78 @@ describe(`Query Collections`, () => { }) }) - it(`optimistic state is dropped after commit`, () => { - cleanup = $effect.root(() => { - const emitter = mitt() - // Track renders and states - const renderStates: Array<{ - stateSize: number - hasTempKey: boolean - hasPermKey: boolean - timestamp: number - }> = [] - - // Create person collection - const personCollection = new Collection({ - id: `person-collection-test-bug`, - sync: { - sync: ({ begin, write, commit }) => { - // @ts-expect-error Mitt typing doesn't match our usage - emitter.on(`sync-person`, (changes: Array) => { - begin() - changes.forEach((change) => { - write({ - key: change.key, - type: change.type, - value: change.changes as Person, - }) + it(`optimistic state is dropped after commit`, async () => { + const emitter = mitt() + // Track renders and states + const renderStates: Array<{ + stateSize: number + hasTempKey: boolean + hasPermKey: boolean + timestamp: number + }> = [] + + // Create person collection + const personCollection = new Collection({ + id: `person-collection-test-bug`, + sync: { + sync: ({ begin, write, commit }) => { + // @ts-expect-error Mitt typing doesn't match our usage + emitter.on(`sync-person`, (changes: Array) => { + begin() + changes.forEach((change) => { + write({ + key: change.key, + type: change.type, + value: change.changes as Person, }) - commit() }) - }, + commit() + }) }, - }) + }, + }) - // Create issue collection - const issueCollection = new Collection({ - id: `issue-collection-test-bug`, - sync: { - sync: ({ begin, write, commit }) => { - // @ts-expect-error Mitt typing doesn't match our usage - emitter.on(`sync-issue`, (changes: Array) => { - begin() - changes.forEach((change) => { - write({ - key: change.key, - type: change.type, - value: change.changes as Issue, - }) + // Create issue collection + const issueCollection = new Collection({ + id: `issue-collection-test-bug`, + sync: { + sync: ({ begin, write, commit }) => { + // @ts-expect-error Mitt typing doesn't match our usage + emitter.on(`sync-issue`, (changes: Array) => { + begin() + changes.forEach((change) => { + write({ + key: change.key, + type: change.type, + value: change.changes as Issue, }) - commit() }) - }, + commit() + }) }, - }) + }, + }) + + // Create a transaction to perform an optimistic mutation + const tx = createTransaction({ + mutationFn: async () => { + emitter.emit(`sync-issue`, [ + { + key: `4`, + type: `insert`, + changes: { + id: `4`, + title: `New Issue`, + description: `New Issue Description`, + userId: `1`, + }, + }, + ]) + return Promise.resolve() + }, + }) + cleanup = $effect.root(() => { // Sync initial person data emitter.emit( `sync-person`, @@ -794,25 +813,6 @@ describe(`Query Collections`, () => { // Reset render states array for clarity in the remaining test renderStates.length = 0 - // Create a transaction to perform an optimistic mutation - const tx = createTransaction({ - mutationFn: async () => { - emitter.emit(`sync-issue`, [ - { - key: `4`, - type: `insert`, - changes: { - id: `4`, - title: `New Issue`, - description: `New Issue Description`, - userId: `1`, - }, - }, - ]) - return Promise.resolve() - }, - }) - // Perform optimistic insert of a new issue tx.mutate(() => issueCollection.insert( @@ -833,27 +833,41 @@ describe(`Query Collections`, () => { name: `John Doe`, title: `New Issue`, }) + }) - // Wait for the transaction to be committed - // await tx.isPersisted.promise - // flushSync() + // Wait for the transaction to be committed + await tx.isPersisted.promise + flushSync() - // // Check if we had any render where the temp key was removed but the permanent key wasn't added yet - // const hadFlicker = renderStates.some( - // (state) => - // !state.hasTempKey && !state.hasPermKey && state.stateSize === 3 - // ) + $effect.root(() => { + const result = useLiveQuery((q) => + q + .from({ issues: issueCollection }) + .join({ + type: `inner`, + from: { persons: personCollection }, + on: [`@persons.id`, `=`, `@issues.userId`], + }) + .select(`@issues.id`, `@issues.title`, `@persons.name`) + .keyBy(`@id`) + ) - // expect(hadFlicker).toBe(false) + // Check if we had any render where the temp key was removed but the permanent key wasn't added yet + const hadFlicker = renderStates.some( + (state) => + !state.hasTempKey && !state.hasPermKey && state.stateSize === 3 + ) - // // Verify the temporary key is replaced by the permanent one - // expect(result.state.size).toBe(4) - // expect(result.state.get(`temp-key`)).toBeUndefined() - // expect(result.state.get(`4`)).toEqual({ - // id: `4`, - // name: `John Doe`, - // title: `New Issue`, - // }) + expect(hadFlicker).toBe(false) + + // Verify the temporary key is replaced by the permanent one + expect(result.state.size).toBe(4) + expect(result.state.get(`temp-key`)).toBeUndefined() + expect(result.state.get(`4`)).toEqual({ + id: `4`, + name: `John Doe`, + title: `New Issue`, + }) }) }) }) From 558af77b9911ac0e39559245a595748a6e556095 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 06:30:35 -0700 Subject: [PATCH 05/24] chore: remove unused packages --- packages/svelte-db/package.json | 2 -- packages/svelte-db/vite.config.ts | 13 ++++++------- pnpm-lock.yaml | 27 --------------------------- 3 files changed, 6 insertions(+), 36 deletions(-) diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index b8faf8e7..e35ec686 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -36,8 +36,6 @@ "svelte": "^5.0.0" }, "devDependencies": { - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/svelte": "^5.2.4", "@sveltejs/adapter-auto": "^6.0.1", "@sveltejs/kit": "^2.21.0", "@sveltejs/package": "^2.3.11", diff --git a/packages/svelte-db/vite.config.ts b/packages/svelte-db/vite.config.ts index 3946d91e..851a0c5c 100644 --- a/packages/svelte-db/vite.config.ts +++ b/packages/svelte-db/vite.config.ts @@ -1,10 +1,9 @@ -import { svelteTesting } from "@testing-library/svelte/vite" import { sveltekit } from "@sveltejs/kit/vite" import { defineConfig } from "vitest/config" import packageJson from "./package.json" with { type: "json" } export default defineConfig({ - plugins: [sveltekit(), svelteTesting()], + plugins: [sveltekit()], test: { name: packageJson.name, dir: `./tests`, @@ -16,10 +15,10 @@ export default defineConfig({ include: [`src/**/*`], }, typecheck: { enabled: true }, - alias: { - // This is needed for svelte-5 support - // https://github.com/testing-library/svelte-testing-library?tab=readme-ov-file#svelte-5-support - "@testing-library/svelte": `@testing-library/svelte/svelte5`, - }, }, + resolve: process.env.VITEST + ? { + conditions: [`browser`], + } + : undefined, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c300099..979af4e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -302,12 +302,6 @@ importers: '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) - '@testing-library/jest-dom': - specifier: ^6.6.3 - version: 6.6.3 - '@testing-library/svelte': - specifier: ^5.2.4 - version: 5.2.7(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) '@vitest/coverage-istanbul': specifier: ^3.0.9 version: 3.0.9(vitest@3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) @@ -1774,19 +1768,6 @@ packages: '@types/react-dom': optional: true - '@testing-library/svelte@5.2.7': - resolution: {integrity: sha512-aGhUaFmEXEVost4QOsbHUUbHLwi7ZZRRxAHFDO2Cmr0BZD3/3+XvaYEPq70Rdw0NRNjdqZHdARBEcrCOkPuAqw==} - engines: {node: '>= 10'} - peerDependencies: - svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 - vite: '*' - vitest: '*' - peerDependenciesMeta: - vite: - optional: true - vitest: - optional: true - '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -6480,14 +6461,6 @@ snapshots: '@types/react': 19.0.12 '@types/react-dom': 19.0.4(@types/react@19.0.12) - '@testing-library/svelte@5.2.7(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': - dependencies: - '@testing-library/dom': 10.4.0 - svelte: 5.28.6 - optionalDependencies: - vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) - vitest: 3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) - '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 From f555db5a515a322f47399b04e34bdf6a46afc2da Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 06:33:19 -0700 Subject: [PATCH 06/24] chore: run dedupe --- pnpm-lock.yaml | 698 ++++--------------------------------------------- 1 file changed, 52 insertions(+), 646 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 979af4e6..5a89f87d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,7 +26,7 @@ importers: version: 1.2.0 '@tanstack/config': specifier: ^0.17.1 - version: 0.17.1(@types/node@22.13.10)(eslint@9.22.0(jiti@2.4.2))(rollup@4.36.0)(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + version: 0.17.1(@types/node@22.13.10)(eslint@9.22.0(jiti@2.4.2))(rollup@4.36.0)(typescript@5.8.2)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 @@ -50,7 +50,7 @@ importers: version: 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + version: 4.3.4(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) eslint: specifier: ^9.22.0 version: 9.22.0(jiti@2.4.2) @@ -92,7 +92,7 @@ importers: version: 5.8.2 vite: specifier: ^6.2.2 - version: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + version: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) vitest: specifier: ^3.0.9 version: 3.0.9(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) @@ -144,7 +144,7 @@ importers: version: 9.22.0 '@tailwindcss/vite': specifier: ^4.0.0-alpha.8 - version: 4.0.14(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + version: 4.0.14(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) '@types/cors': specifier: ^2.8.17 version: 2.8.17 @@ -171,7 +171,7 @@ importers: version: 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + version: 4.3.4(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) concurrently: specifier: ^9.1.2 version: 9.1.2 @@ -201,7 +201,7 @@ importers: version: 5.8.2 vite: specifier: ^6.2.2 - version: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + version: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) packages/db: dependencies: @@ -383,18 +383,10 @@ packages: resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} @@ -407,16 +399,6 @@ packages: resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.10': - resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.26.9': - resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.27.2': resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} engines: {node: '>=6.0.0'} @@ -438,10 +420,6 @@ packages: resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.26.9': - resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} - engines: {node: '>=6.9.0'} - '@babel/template@7.26.9': resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} @@ -450,14 +428,6 @@ packages: resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.10': - resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.9': - resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} - engines: {node: '>=6.9.0'} - '@babel/types@7.27.1': resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} @@ -596,12 +566,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.0': - resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.1': resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} engines: {node: '>=18'} @@ -620,12 +584,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.0': - resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.1': resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} engines: {node: '>=18'} @@ -644,12 +602,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.0': - resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.1': resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} engines: {node: '>=18'} @@ -668,12 +620,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.0': - resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.1': resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} engines: {node: '>=18'} @@ -692,12 +638,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.0': - resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.1': resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} engines: {node: '>=18'} @@ -716,12 +656,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.0': - resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.1': resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} engines: {node: '>=18'} @@ -740,12 +674,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.0': - resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.1': resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} engines: {node: '>=18'} @@ -764,12 +692,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.0': - resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} engines: {node: '>=18'} @@ -788,12 +710,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.0': - resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.1': resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} engines: {node: '>=18'} @@ -812,12 +728,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.0': - resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.1': resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} engines: {node: '>=18'} @@ -836,12 +746,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.0': - resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.1': resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} engines: {node: '>=18'} @@ -860,12 +764,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.0': - resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.1': resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} engines: {node: '>=18'} @@ -884,12 +782,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.0': - resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.1': resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} engines: {node: '>=18'} @@ -908,12 +800,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.0': - resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.1': resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} engines: {node: '>=18'} @@ -932,12 +818,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.0': - resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.1': resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} engines: {node: '>=18'} @@ -956,12 +836,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.0': - resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.1': resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} engines: {node: '>=18'} @@ -980,24 +854,12 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.0': - resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.1': resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.0': - resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.25.1': resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} engines: {node: '>=18'} @@ -1016,24 +878,12 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.0': - resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.0': - resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.1': resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} engines: {node: '>=18'} @@ -1052,12 +902,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.0': - resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} engines: {node: '>=18'} @@ -1076,12 +920,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.0': - resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.1': resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} engines: {node: '>=18'} @@ -1100,12 +938,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.0': - resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.1': resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} engines: {node: '>=18'} @@ -1124,12 +956,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.0': - resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.1': resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} engines: {node: '>=18'} @@ -1148,12 +974,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.0': - resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.1': resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} engines: {node: '>=18'} @@ -1321,191 +1141,96 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.34.8': - resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.36.0': resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.8': - resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.36.0': resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.8': - resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.36.0': resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.8': - resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.36.0': resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.8': - resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.36.0': resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.8': - resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.36.0': resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.34.8': - resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.36.0': resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.8': - resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.36.0': resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.8': - resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.36.0': resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.8': - resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.36.0': resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.8': - resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.36.0': resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': - resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.8': - resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.36.0': resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.8': - resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.36.0': resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.8': - resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.36.0': resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.8': - resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.36.0': resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.8': - resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.36.0': resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.8': - resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.36.0': resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.8': - resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.36.0': resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} cpu: [x64] @@ -2021,15 +1746,9 @@ packages: '@volar/typescript@2.4.12': resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} - '@vue/compiler-core@3.5.13': - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} - '@vue/compiler-core@3.5.14': resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==} - '@vue/compiler-dom@3.5.13': - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-dom@3.5.14': resolution: {integrity: sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==} @@ -2064,9 +1783,6 @@ packages: peerDependencies: vue: 3.5.14 - '@vue/shared@3.5.13': - resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - '@vue/shared@3.5.14': resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} @@ -2757,11 +2473,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.0: - resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.1: resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} engines: {node: '>=18'} @@ -2958,14 +2669,6 @@ packages: fastq@1.19.0: resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - fdir@6.4.4: resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: @@ -4252,11 +3955,6 @@ packages: peerDependencies: rollup: 2.x || 3.x || 4.x - rollup@4.34.8: - resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.36.0: resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4604,10 +4302,6 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} @@ -4845,46 +4539,6 @@ packages: vite: optional: true - vite@6.2.2: - resolution: {integrity: sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@6.3.5: resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -5154,7 +4808,7 @@ snapshots: '@babel/code-frame@7.26.2': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -5168,10 +4822,10 @@ snapshots: '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) '@babel/helpers': 7.26.9 - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.2 '@babel/template': 7.26.9 '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -5182,8 +4836,8 @@ snapshots: '@babel/generator@7.26.9': dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 @@ -5199,7 +4853,7 @@ snapshots: '@babel/helper-module-imports@7.25.9': dependencies: '@babel/traverse': 7.26.9 - '@babel/types': 7.26.10 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -5207,19 +4861,15 @@ snapshots: dependencies: '@babel/core': 7.26.9 '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-identifier@7.27.1': {} '@babel/helper-validator-option@7.25.9': {} @@ -5227,15 +4877,7 @@ snapshots: '@babel/helpers@7.26.9': dependencies: '@babel/template': 7.26.9 - '@babel/types': 7.26.9 - - '@babel/parser@7.26.10': - dependencies: - '@babel/types': 7.26.10 - - '@babel/parser@7.26.9': - dependencies: - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 '@babel/parser@7.27.2': dependencies: @@ -5255,38 +4897,24 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/runtime@7.26.9': - dependencies: - regenerator-runtime: 0.14.1 - '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@babel/traverse@7.26.9': dependencies: '@babel/code-frame': 7.26.2 '@babel/generator': 7.26.9 - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.2 '@babel/template': 7.26.9 - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.10': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@babel/types@7.26.9': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/types@7.27.1': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -5513,9 +5141,6 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true - '@esbuild/aix-ppc64@0.25.0': - optional: true - '@esbuild/aix-ppc64@0.25.1': optional: true @@ -5525,9 +5150,6 @@ snapshots: '@esbuild/android-arm64@0.19.12': optional: true - '@esbuild/android-arm64@0.25.0': - optional: true - '@esbuild/android-arm64@0.25.1': optional: true @@ -5537,9 +5159,6 @@ snapshots: '@esbuild/android-arm@0.19.12': optional: true - '@esbuild/android-arm@0.25.0': - optional: true - '@esbuild/android-arm@0.25.1': optional: true @@ -5549,9 +5168,6 @@ snapshots: '@esbuild/android-x64@0.19.12': optional: true - '@esbuild/android-x64@0.25.0': - optional: true - '@esbuild/android-x64@0.25.1': optional: true @@ -5561,9 +5177,6 @@ snapshots: '@esbuild/darwin-arm64@0.19.12': optional: true - '@esbuild/darwin-arm64@0.25.0': - optional: true - '@esbuild/darwin-arm64@0.25.1': optional: true @@ -5573,9 +5186,6 @@ snapshots: '@esbuild/darwin-x64@0.19.12': optional: true - '@esbuild/darwin-x64@0.25.0': - optional: true - '@esbuild/darwin-x64@0.25.1': optional: true @@ -5585,9 +5195,6 @@ snapshots: '@esbuild/freebsd-arm64@0.19.12': optional: true - '@esbuild/freebsd-arm64@0.25.0': - optional: true - '@esbuild/freebsd-arm64@0.25.1': optional: true @@ -5597,9 +5204,6 @@ snapshots: '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.25.0': - optional: true - '@esbuild/freebsd-x64@0.25.1': optional: true @@ -5609,9 +5213,6 @@ snapshots: '@esbuild/linux-arm64@0.19.12': optional: true - '@esbuild/linux-arm64@0.25.0': - optional: true - '@esbuild/linux-arm64@0.25.1': optional: true @@ -5621,9 +5222,6 @@ snapshots: '@esbuild/linux-arm@0.19.12': optional: true - '@esbuild/linux-arm@0.25.0': - optional: true - '@esbuild/linux-arm@0.25.1': optional: true @@ -5633,9 +5231,6 @@ snapshots: '@esbuild/linux-ia32@0.19.12': optional: true - '@esbuild/linux-ia32@0.25.0': - optional: true - '@esbuild/linux-ia32@0.25.1': optional: true @@ -5645,9 +5240,6 @@ snapshots: '@esbuild/linux-loong64@0.19.12': optional: true - '@esbuild/linux-loong64@0.25.0': - optional: true - '@esbuild/linux-loong64@0.25.1': optional: true @@ -5657,9 +5249,6 @@ snapshots: '@esbuild/linux-mips64el@0.19.12': optional: true - '@esbuild/linux-mips64el@0.25.0': - optional: true - '@esbuild/linux-mips64el@0.25.1': optional: true @@ -5669,9 +5258,6 @@ snapshots: '@esbuild/linux-ppc64@0.19.12': optional: true - '@esbuild/linux-ppc64@0.25.0': - optional: true - '@esbuild/linux-ppc64@0.25.1': optional: true @@ -5681,9 +5267,6 @@ snapshots: '@esbuild/linux-riscv64@0.19.12': optional: true - '@esbuild/linux-riscv64@0.25.0': - optional: true - '@esbuild/linux-riscv64@0.25.1': optional: true @@ -5693,9 +5276,6 @@ snapshots: '@esbuild/linux-s390x@0.19.12': optional: true - '@esbuild/linux-s390x@0.25.0': - optional: true - '@esbuild/linux-s390x@0.25.1': optional: true @@ -5705,15 +5285,9 @@ snapshots: '@esbuild/linux-x64@0.19.12': optional: true - '@esbuild/linux-x64@0.25.0': - optional: true - '@esbuild/linux-x64@0.25.1': optional: true - '@esbuild/netbsd-arm64@0.25.0': - optional: true - '@esbuild/netbsd-arm64@0.25.1': optional: true @@ -5723,15 +5297,9 @@ snapshots: '@esbuild/netbsd-x64@0.19.12': optional: true - '@esbuild/netbsd-x64@0.25.0': - optional: true - '@esbuild/netbsd-x64@0.25.1': optional: true - '@esbuild/openbsd-arm64@0.25.0': - optional: true - '@esbuild/openbsd-arm64@0.25.1': optional: true @@ -5741,9 +5309,6 @@ snapshots: '@esbuild/openbsd-x64@0.19.12': optional: true - '@esbuild/openbsd-x64@0.25.0': - optional: true - '@esbuild/openbsd-x64@0.25.1': optional: true @@ -5753,9 +5318,6 @@ snapshots: '@esbuild/sunos-x64@0.19.12': optional: true - '@esbuild/sunos-x64@0.25.0': - optional: true - '@esbuild/sunos-x64@0.25.1': optional: true @@ -5765,9 +5327,6 @@ snapshots: '@esbuild/win32-arm64@0.19.12': optional: true - '@esbuild/win32-arm64@0.25.0': - optional: true - '@esbuild/win32-arm64@0.25.1': optional: true @@ -5777,9 +5336,6 @@ snapshots: '@esbuild/win32-ia32@0.19.12': optional: true - '@esbuild/win32-ia32@0.25.0': - optional: true - '@esbuild/win32-ia32@0.25.1': optional: true @@ -5789,9 +5345,6 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true - '@esbuild/win32-x64@0.25.0': - optional: true - '@esbuild/win32-x64@0.25.1': optional: true @@ -5903,7 +5456,7 @@ snapshots: '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.10 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -6011,117 +5564,60 @@ snapshots: optionalDependencies: rollup: 4.36.0 - '@rollup/rollup-android-arm-eabi@4.34.8': - optional: true - '@rollup/rollup-android-arm-eabi@4.36.0': optional: true - '@rollup/rollup-android-arm64@4.34.8': - optional: true - '@rollup/rollup-android-arm64@4.36.0': optional: true - '@rollup/rollup-darwin-arm64@4.34.8': - optional: true - '@rollup/rollup-darwin-arm64@4.36.0': optional: true - '@rollup/rollup-darwin-x64@4.34.8': - optional: true - '@rollup/rollup-darwin-x64@4.36.0': optional: true - '@rollup/rollup-freebsd-arm64@4.34.8': - optional: true - '@rollup/rollup-freebsd-arm64@4.36.0': optional: true - '@rollup/rollup-freebsd-x64@4.34.8': - optional: true - '@rollup/rollup-freebsd-x64@4.36.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.8': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.36.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.8': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.36.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.8': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.36.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.8': - optional: true - '@rollup/rollup-linux-arm64-musl@4.36.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.8': - optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.36.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': - optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.8': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.36.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.8': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.36.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.8': - optional: true - '@rollup/rollup-linux-x64-gnu@4.36.0': optional: true - '@rollup/rollup-linux-x64-musl@4.34.8': - optional: true - '@rollup/rollup-linux-x64-musl@4.36.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.8': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.36.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.8': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.36.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.8': - optional: true - '@rollup/rollup-win32-x64-msvc@4.36.0': optional: true @@ -6342,20 +5838,20 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.0.14 '@tailwindcss/oxide-win32-x64-msvc': 4.0.14 - '@tailwindcss/vite@4.0.14(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': + '@tailwindcss/vite@4.0.14(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@tailwindcss/node': 4.0.14 '@tailwindcss/oxide': 4.0.14 lightningcss: 1.29.2 tailwindcss: 4.0.14 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) - '@tanstack/config@0.17.1(@types/node@22.13.10)(eslint@9.22.0(jiti@2.4.2))(rollup@4.36.0)(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': + '@tanstack/config@0.17.1(@types/node@22.13.10)(eslint@9.22.0(jiti@2.4.2))(rollup@4.36.0)(typescript@5.8.2)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@tanstack/eslint-config': 0.1.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) '@tanstack/publish-config': 0.1.0 '@tanstack/typedoc-config': 0.1.0(typescript@5.8.2) - '@tanstack/vite-config': 0.1.0(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + '@tanstack/vite-config': 0.1.0(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) transitivePeerDependencies: - '@types/node' - eslint @@ -6411,12 +5907,12 @@ snapshots: transitivePeerDependencies: - typescript - '@tanstack/vite-config@0.1.0(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': + '@tanstack/vite-config@0.1.0(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.36.0) - vite-plugin-dts: 4.2.3(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) - vite-plugin-externalize-deps: 0.9.0(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) - vite-tsconfig-paths: 5.1.4(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + vite-plugin-dts: 4.2.3(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + vite-plugin-externalize-deps: 0.9.0(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) + vite-tsconfig-paths: 5.1.4(typescript@5.8.2)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) transitivePeerDependencies: - '@types/node' - rollup @@ -6472,24 +5968,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.26.9 + '@babel/types': 7.27.1 '@types/body-parser@1.19.5': dependencies: @@ -6689,14 +6185,14 @@ snapshots: '@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2': optional: true - '@vitejs/plugin-react@4.3.4(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': + '@vitejs/plugin-react@4.3.4(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.9 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -6773,14 +6269,6 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.13': - dependencies: - '@babel/parser': 7.26.10 - '@vue/shared': 3.5.13 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - '@vue/compiler-core@3.5.14': dependencies: '@babel/parser': 7.27.2 @@ -6789,11 +6277,6 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.13': - dependencies: - '@vue/compiler-core': 3.5.13 - '@vue/shared': 3.5.13 - '@vue/compiler-dom@3.5.14': dependencies: '@vue/compiler-core': 3.5.14 @@ -6824,9 +6307,9 @@ snapshots: '@vue/language-core@2.1.6(typescript@5.8.2)': dependencies: '@volar/language-core': 2.4.12 - '@vue/compiler-dom': 3.5.13 + '@vue/compiler-dom': 3.5.14 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.14 computeds: 0.0.1 minimatch: 9.0.5 muggle-string: 0.4.1 @@ -6856,8 +6339,6 @@ snapshots: '@vue/shared': 3.5.14 vue: 3.5.14(typescript@5.8.2) - '@vue/shared@3.5.13': {} - '@vue/shared@3.5.14': {} JSONStream@1.3.5: @@ -7057,9 +6538,9 @@ snapshots: buffer-from@1.1.2: {} - bundle-require@5.1.0(esbuild@0.25.0): + bundle-require@5.1.0(esbuild@0.25.1): dependencies: - esbuild: 0.25.0 + esbuild: 0.25.1 load-tsconfig: 0.2.5 bytes@3.1.2: {} @@ -7550,34 +7031,6 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - esbuild@0.25.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.0 - '@esbuild/android-arm': 0.25.0 - '@esbuild/android-arm64': 0.25.0 - '@esbuild/android-x64': 0.25.0 - '@esbuild/darwin-arm64': 0.25.0 - '@esbuild/darwin-x64': 0.25.0 - '@esbuild/freebsd-arm64': 0.25.0 - '@esbuild/freebsd-x64': 0.25.0 - '@esbuild/linux-arm': 0.25.0 - '@esbuild/linux-arm64': 0.25.0 - '@esbuild/linux-ia32': 0.25.0 - '@esbuild/linux-loong64': 0.25.0 - '@esbuild/linux-mips64el': 0.25.0 - '@esbuild/linux-ppc64': 0.25.0 - '@esbuild/linux-riscv64': 0.25.0 - '@esbuild/linux-s390x': 0.25.0 - '@esbuild/linux-x64': 0.25.0 - '@esbuild/netbsd-arm64': 0.25.0 - '@esbuild/netbsd-x64': 0.25.0 - '@esbuild/openbsd-arm64': 0.25.0 - '@esbuild/openbsd-x64': 0.25.0 - '@esbuild/sunos-x64': 0.25.0 - '@esbuild/win32-arm64': 0.25.0 - '@esbuild/win32-ia32': 0.25.0 - '@esbuild/win32-x64': 0.25.0 - esbuild@0.25.1: optionalDependencies: '@esbuild/aix-ppc64': 0.25.1 @@ -7891,10 +7344,6 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.4.3(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -8334,7 +7783,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.26.9 - '@babel/parser': 7.26.10 + '@babel/parser': 7.27.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.1 @@ -8607,8 +8056,8 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.26.10 - '@babel/types': 7.26.10 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 source-map-js: 1.2.1 make-dir@4.0.0: @@ -9129,31 +8578,6 @@ snapshots: magic-string: 0.30.17 rollup: 4.36.0 - rollup@4.34.8: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.8 - '@rollup/rollup-android-arm64': 4.34.8 - '@rollup/rollup-darwin-arm64': 4.34.8 - '@rollup/rollup-darwin-x64': 4.34.8 - '@rollup/rollup-freebsd-arm64': 4.34.8 - '@rollup/rollup-freebsd-x64': 4.34.8 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 - '@rollup/rollup-linux-arm-musleabihf': 4.34.8 - '@rollup/rollup-linux-arm64-gnu': 4.34.8 - '@rollup/rollup-linux-arm64-musl': 4.34.8 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 - '@rollup/rollup-linux-riscv64-gnu': 4.34.8 - '@rollup/rollup-linux-s390x-gnu': 4.34.8 - '@rollup/rollup-linux-x64-gnu': 4.34.8 - '@rollup/rollup-linux-x64-musl': 4.34.8 - '@rollup/rollup-win32-arm64-msvc': 4.34.8 - '@rollup/rollup-win32-ia32-msvc': 4.34.8 - '@rollup/rollup-win32-x64-msvc': 4.34.8 - fsevents: 2.3.3 - rollup@4.36.0: dependencies: '@types/estree': 1.0.6 @@ -9592,11 +9016,6 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.12: - dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 - tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -9656,21 +9075,21 @@ snapshots: tsup@8.4.0(@microsoft/api-extractor@7.52.1(@types/node@22.13.10))(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0): dependencies: - bundle-require: 5.1.0(esbuild@0.25.0) + bundle-require: 5.1.0(esbuild@0.25.1) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.0 debug: 4.4.0 - esbuild: 0.25.0 + esbuild: 0.25.1 joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(yaml@2.7.0) resolve-from: 5.0.0 - rollup: 4.34.8 + rollup: 4.36.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.12 + tinyglobby: 0.2.13 tree-kill: 1.2.2 optionalDependencies: '@microsoft/api-extractor': 7.52.1(@types/node@22.13.10) @@ -9821,7 +9240,7 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)): + vite-plugin-dts@4.2.3(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@22.13.10) '@rollup/pluginutils': 5.1.4(rollup@4.36.0) @@ -9834,40 +9253,27 @@ snapshots: magic-string: 0.30.17 typescript: 5.8.2 optionalDependencies: - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)): + vite-plugin-externalize-deps@0.9.0(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)): dependencies: - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) - vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.2) optionalDependencies: - vite: 6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - supports-color - typescript - vite@6.2.2(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0): - dependencies: - esbuild: 0.25.1 - postcss: 8.5.3 - rollup: 4.36.0 - optionalDependencies: - '@types/node': 22.13.10 - fsevents: 2.3.3 - jiti: 2.4.2 - lightningcss: 1.29.2 - tsx: 4.19.3 - yaml: 2.7.0 - vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0): dependencies: esbuild: 0.25.1 From 1d7c2ddf2ab38571f9afe4da36de1d6cec6d6979 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 06:42:36 -0700 Subject: [PATCH 07/24] chore: update scripts --- packages/svelte-db/package.json | 10 +++------- packages/svelte-db/svelte.config.js | 2 +- packages/svelte-db/tsconfig.json | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index e35ec686..b85fc856 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -3,13 +3,9 @@ "description": "Svelte integration for @tanstack/db", "version": "0.0.0", "scripts": { - "test:types": "svelte-check --tsconfig ./tsconfig.json", - "test:eslint": "eslint ./src ./tests", - "test:lib": "vitest", - "test:lib:dev": "pnpm run test:lib --watch", - "test:build": "publint --strict", - "test": "npx vitest --run", - "build": "svelte-package --input ./src --output ./dist" + "build": "svelte-package --input ./src --output ./dist", + "test": "npx vitest --run", + "lint": "eslint . --fix" }, "files": [ "dist", diff --git a/packages/svelte-db/svelte.config.js b/packages/svelte-db/svelte.config.js index 94ca454a..af7d74ea 100644 --- a/packages/svelte-db/svelte.config.js +++ b/packages/svelte-db/svelte.config.js @@ -1,4 +1,4 @@ -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte" const config = { preprocess: vitePreprocess(), diff --git a/packages/svelte-db/tsconfig.json b/packages/svelte-db/tsconfig.json index 83265e3a..17dd3f22 100644 --- a/packages/svelte-db/tsconfig.json +++ b/packages/svelte-db/tsconfig.json @@ -12,6 +12,6 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, }, - "include": ["src/**/*", "tests", "vite.config.ts"], + "include": ["src/**/*", "tests", "vite.config.ts", "svelte.config.js"], "exclude": ["node_modules", "dist"] } From 4be68d651b34c16cf010a699018d244b92b77e1f Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 06:46:07 -0700 Subject: [PATCH 08/24] chore: remove unused packages --- packages/svelte-db/package.json | 2 - packages/svelte-db/vite.config.ts | 4 +- pnpm-lock.yaml | 90 ------------------------------- 3 files changed, 2 insertions(+), 94 deletions(-) diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index b85fc856..cc437856 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -32,8 +32,6 @@ "svelte": "^5.0.0" }, "devDependencies": { - "@sveltejs/adapter-auto": "^6.0.1", - "@sveltejs/kit": "^2.21.0", "@sveltejs/package": "^2.3.11", "@vitest/coverage-istanbul": "^3.0.9", "@sveltejs/vite-plugin-svelte": "^5.0.3", diff --git a/packages/svelte-db/vite.config.ts b/packages/svelte-db/vite.config.ts index 851a0c5c..3a6ce2a6 100644 --- a/packages/svelte-db/vite.config.ts +++ b/packages/svelte-db/vite.config.ts @@ -1,9 +1,9 @@ -import { sveltekit } from "@sveltejs/kit/vite" +import { svelte } from "@sveltejs/vite-plugin-svelte" import { defineConfig } from "vitest/config" import packageJson from "./package.json" with { type: "json" } export default defineConfig({ - plugins: [sveltekit()], + plugins: [svelte()], test: { name: packageJson.name, dir: `./tests`, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a89f87d..ab23091f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -290,12 +290,6 @@ importers: specifier: ^0.7.0 version: 0.7.0(svelte@5.28.6) devDependencies: - '@sveltejs/adapter-auto': - specifier: ^6.0.1 - version: 6.0.1(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))) - '@sveltejs/kit': - specifier: ^2.21.0 - version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) '@sveltejs/package': specifier: ^2.3.11 version: 2.3.11(svelte@5.28.6)(typescript@5.8.2) @@ -1125,9 +1119,6 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@polka/url@1.0.0-next.29': - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@publint/pack@0.1.2': resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} engines: {node: '>=18'} @@ -1306,20 +1297,6 @@ packages: peerDependencies: acorn: ^8.9.0 - '@sveltejs/adapter-auto@6.0.1': - resolution: {integrity: sha512-mcWud3pYGPWM2Pphdj8G9Qiq24nZ8L4LB7coCUckUEy5Y7wOWGJ/enaZ4AtJTcSm5dNK1rIkBRoqt+ae4zlxcQ==} - peerDependencies: - '@sveltejs/kit': ^2.0.0 - - '@sveltejs/kit@2.21.0': - resolution: {integrity: sha512-kvu4h9qXduiPk1Q1oqFKDLFGu/7mslEYbVaqpbBcBxjlRJnvNCFwEvEwKt0Mx9TtSi8J77xRelvJobrGlst4nQ==} - engines: {node: '>=18.13'} - hasBin: true - peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.3 || ^6.0.0 - '@sveltejs/package@2.3.11': resolution: {integrity: sha512-DSMt2U0XNAdoQBYksrmgQi5dKy7jUTVDJLiagS/iXF7AShjAmTbGJQKruBuT/FfYAWvNxfQTSjkXU8eAIjVeNg==} engines: {node: ^16.14 || >=18} @@ -1523,9 +1500,6 @@ packages: '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/cors@2.8.17': resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} @@ -2112,10 +2086,6 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} @@ -2238,9 +2208,6 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - devalue@5.1.1: - resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} - diff@7.0.0: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} @@ -3458,10 +3425,6 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} - mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} - ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -4028,9 +3991,6 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} - set-cookie-parser@2.7.1: - resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -4105,10 +4065,6 @@ packages: simple-git@3.27.0: resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} - sirv@3.0.1: - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} - engines: {node: '>=18'} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -4337,10 +4293,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} - tough-cookie@5.1.1: resolution: {integrity: sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==} engines: {node: '>=16'} @@ -5552,8 +5504,6 @@ snapshots: '@pkgr/core@0.1.1': {} - '@polka/url@1.0.0-next.29': {} - '@publint/pack@0.1.2': {} '@rollup/pluginutils@5.1.4(rollup@4.36.0)': @@ -5723,28 +5673,6 @@ snapshots: dependencies: acorn: 8.14.1 - '@sveltejs/adapter-auto@6.0.1(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))': - dependencies: - '@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) - - '@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0))': - dependencies: - '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0)) - '@types/cookie': 0.6.0 - acorn: 8.14.1 - cookie: 0.6.0 - devalue: 5.1.1 - esm-env: 1.2.2 - kleur: 4.1.5 - magic-string: 0.30.17 - mrmime: 2.0.1 - sade: 1.8.1 - set-cookie-parser: 2.7.1 - sirv: 3.0.1 - svelte: 5.28.6 - vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)(yaml@2.7.0) - '@sveltejs/package@2.3.11(svelte@5.28.6)(typescript@5.8.2)': dependencies: chokidar: 4.0.3 @@ -6000,8 +5928,6 @@ snapshots: dependencies: '@types/node': 22.13.10 - '@types/cookie@0.6.0': {} - '@types/cors@2.8.17': dependencies: '@types/node': 22.13.10 @@ -6677,8 +6603,6 @@ snapshots: cookie-signature@1.0.6: {} - cookie@0.6.0: {} - cookie@0.7.1: {} cors@2.8.5: @@ -6782,8 +6706,6 @@ snapshots: detect-libc@2.0.3: {} - devalue@5.1.1: {} - diff@7.0.0: {} dir-glob@3.0.1: @@ -8135,8 +8057,6 @@ snapshots: mri@1.2.0: {} - mrmime@2.0.1: {} - ms@2.0.0: {} ms@2.1.3: {} @@ -8697,8 +8617,6 @@ snapshots: transitivePeerDependencies: - supports-color - set-cookie-parser@2.7.1: {} - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -8791,12 +8709,6 @@ snapshots: transitivePeerDependencies: - supports-color - sirv@3.0.1: - dependencies: - '@polka/url': 1.0.0-next.29 - mrmime: 2.0.1 - totalist: 3.0.1 - slash@3.0.0: {} slice-ansi@5.0.0: @@ -9043,8 +8955,6 @@ snapshots: toidentifier@1.0.1: {} - totalist@3.0.1: {} - tough-cookie@5.1.1: dependencies: tldts: 6.1.78 From 013ac2855cc0ffe140d467ac2c3ed0e3a9cbe4d1 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Sat, 17 May 2025 06:47:36 -0700 Subject: [PATCH 09/24] chore: add changeset --- .changeset/khaki-ties-shout.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/khaki-ties-shout.md diff --git a/.changeset/khaki-ties-shout.md b/.changeset/khaki-ties-shout.md new file mode 100644 index 00000000..ea4d4d08 --- /dev/null +++ b/.changeset/khaki-ties-shout.md @@ -0,0 +1,5 @@ +--- +"@tanstack/svelte-db": patch +--- + +Add Svelte support From 546ef4e42e25453e3ba1e6d18a78d598f8857016 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 06:48:47 -0700 Subject: [PATCH 10/24] chore: update readme --- packages/svelte-db/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte-db/README.md b/packages/svelte-db/README.md index 1d5b5744..eae8bf5b 100644 --- a/packages/svelte-db/README.md +++ b/packages/svelte-db/README.md @@ -1,3 +1,3 @@ -# @tanstack/react-db +# @tanstack/svelte-db Svelte hooks for TanStack DB. See [TanStack/db](https://github.com/TanStack/db) for more details. From 8e8804fe1d7e81913e620efe36175468030a25a8 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 06:50:35 -0700 Subject: [PATCH 11/24] chore: prettier fix --- packages/svelte-db/package.json | 80 ++++++++++++++++---------------- packages/svelte-db/tsconfig.json | 2 +- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index cc437856..bc8e279d 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -1,47 +1,47 @@ { "name": "@tanstack/svelte-db", "description": "Svelte integration for @tanstack/db", - "version": "0.0.0", - "scripts": { - "build": "svelte-package --input ./src --output ./dist", - "test": "npx vitest --run", - "lint": "eslint . --fix" - }, - "files": [ - "dist", - "!dist/**/*.test.*", - "!dist/**/*.spec.*" - ], - "sideEffects": [ - "**/*.css" - ], - "svelte": "./dist/index.js", - "types": "./dist/index.d.ts", - "type": "module", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "svelte": "./dist/index.js" - } - }, - "dependencies": { - "@tanstack/db": "workspace:*", + "version": "0.0.0", + "scripts": { + "build": "svelte-package --input ./src --output ./dist", + "test": "npx vitest --run", + "lint": "eslint . --fix" + }, + "files": [ + "dist", + "!dist/**/*.test.*", + "!dist/**/*.spec.*" + ], + "sideEffects": [ + "**/*.css" + ], + "svelte": "./dist/index.js", + "types": "./dist/index.d.ts", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "svelte": "./dist/index.js" + } + }, + "dependencies": { + "@tanstack/db": "workspace:*", "@tanstack/svelte-store": "^0.7.0" - }, - "peerDependencies": { - "svelte": "^5.0.0" - }, - "devDependencies": { - "@sveltejs/package": "^2.3.11", - "@vitest/coverage-istanbul": "^3.0.9", - "@sveltejs/vite-plugin-svelte": "^5.0.3", - "publint": "^0.3.2", - "svelte": "^5.28.6", - "svelte-check": "^4.2.0" - }, - "keywords": [ - "optimistic", + }, + "peerDependencies": { + "svelte": "^5.0.0" + }, + "devDependencies": { + "@sveltejs/package": "^2.3.11", + "@vitest/coverage-istanbul": "^3.0.9", + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "publint": "^0.3.2", + "svelte": "^5.28.6", + "svelte-check": "^4.2.0" + }, + "keywords": [ + "optimistic", "svelte", "typescript" - ] + ] } diff --git a/packages/svelte-db/tsconfig.json b/packages/svelte-db/tsconfig.json index 17dd3f22..3ff4acd6 100644 --- a/packages/svelte-db/tsconfig.json +++ b/packages/svelte-db/tsconfig.json @@ -10,7 +10,7 @@ "strict": true, "esModuleInterop": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, + "forceConsistentCasingInFileNames": true }, "include": ["src/**/*", "tests", "vite.config.ts", "svelte.config.js"], "exclude": ["node_modules", "dist"] From 0aad000725fc0dbdfa33c496b76170c55f4c9cf6 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 06:54:12 -0700 Subject: [PATCH 12/24] chore: update changeset --- .changeset/khaki-ties-shout.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.changeset/khaki-ties-shout.md b/.changeset/khaki-ties-shout.md index ea4d4d08..228ddda8 100644 --- a/.changeset/khaki-ties-shout.md +++ b/.changeset/khaki-ties-shout.md @@ -3,3 +3,19 @@ --- Add Svelte support + +Usage example: + +```svelte + + + + +``` From 248180a8553587d0d99d8b76e54cd726b24f052b Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 06:57:50 -0700 Subject: [PATCH 13/24] chore: update vite config --- packages/svelte-db/vite.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/svelte-db/vite.config.ts b/packages/svelte-db/vite.config.ts index 3a6ce2a6..c8adb39f 100644 --- a/packages/svelte-db/vite.config.ts +++ b/packages/svelte-db/vite.config.ts @@ -16,6 +16,7 @@ export default defineConfig({ }, typecheck: { enabled: true }, }, + // Tell Vitest to use the `browser` entry points in `package.json` files, even though it's running in Node resolve: process.env.VITEST ? { conditions: [`browser`], From e83cd595d6c62582b5f731cab7b30063353172c6 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 10:58:46 -0700 Subject: [PATCH 14/24] chore: remove use of store --- packages/svelte-db/src/useLiveQuery.svelte.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/svelte-db/src/useLiveQuery.svelte.ts b/packages/svelte-db/src/useLiveQuery.svelte.ts index 74db8943..1cf28dd9 100644 --- a/packages/svelte-db/src/useLiveQuery.svelte.ts +++ b/packages/svelte-db/src/useLiveQuery.svelte.ts @@ -1,4 +1,3 @@ -import { useStore } from "@tanstack/svelte-store" import { compileQuery, queryBuilder } from "@tanstack/db" import type { Collection, @@ -33,8 +32,8 @@ export function useLiveQuery< return compiled }) - const state = () => useStore(compiledQuery.results.derivedState).current - const data = () => useStore(compiledQuery.results.derivedArray).current + const state = () => compiledQuery.results.derivedState.state + const data = () => compiledQuery.results.derivedArray.state $effect(() => { return () => { From 284a8070e840e85eb57f9db9292717669b36e0cb Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 11:33:52 -0700 Subject: [PATCH 15/24] chore: remove unused package --- packages/svelte-db/package.json | 3 +-- pnpm-lock.yaml | 13 ------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index bc8e279d..665ad392 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -25,8 +25,7 @@ } }, "dependencies": { - "@tanstack/db": "workspace:*", - "@tanstack/svelte-store": "^0.7.0" + "@tanstack/db": "workspace:*" }, "peerDependencies": { "svelte": "^5.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab23091f..0ad4cdd5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -286,9 +286,6 @@ importers: '@tanstack/db': specifier: workspace:* version: link:../db - '@tanstack/svelte-store': - specifier: ^0.7.0 - version: 0.7.0(svelte@5.28.6) devDependencies: '@sveltejs/package': specifier: ^2.3.11 @@ -1425,11 +1422,6 @@ packages: '@tanstack/store@0.7.0': resolution: {integrity: sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==} - '@tanstack/svelte-store@0.7.0': - resolution: {integrity: sha512-FVuPuCLkGV/YcsJImIiJAZRh3s8DqI8C9jQMNXymELwsrpe538Vmb81fxHHNZx9MCtzsFcHfYOkImFB4r4QcfA==} - peerDependencies: - svelte: ^5.0.0 - '@tanstack/typedoc-config@0.1.0': resolution: {integrity: sha512-WaeDXvt9Dyds53SCOCZKGmwHdS6LGwNH7LyDeTtsmPW7zn7ApOaNyAPWlqjkEHGVd0ykvR+XA8CI8RPfLGGxmw==} engines: {node: '>=18'} @@ -5822,11 +5814,6 @@ snapshots: '@tanstack/store@0.7.0': {} - '@tanstack/svelte-store@0.7.0(svelte@5.28.6)': - dependencies: - '@tanstack/store': 0.7.0 - svelte: 5.28.6 - '@tanstack/typedoc-config@0.1.0(typescript@5.8.2)': dependencies: typedoc: 0.27.9(typescript@5.8.2) From b8444cd02ef00b850515759976fce8696af088b9 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Sat, 17 May 2025 11:44:47 -0700 Subject: [PATCH 16/24] chore: add todo --- packages/svelte-db/src/useLiveQuery.svelte.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/svelte-db/src/useLiveQuery.svelte.ts b/packages/svelte-db/src/useLiveQuery.svelte.ts index 1cf28dd9..814940c6 100644 --- a/packages/svelte-db/src/useLiveQuery.svelte.ts +++ b/packages/svelte-db/src/useLiveQuery.svelte.ts @@ -32,6 +32,9 @@ export function useLiveQuery< return compiled }) + // TODO: Svelte useStore needs to be updated to optionally + // receive a getter to receive updates from compiledQuery. + // For now, doing this should work and be reactive with updates. const state = () => compiledQuery.results.derivedState.state const data = () => compiledQuery.results.derivedArray.state From 7839fd54f2e13eb409273d0685fac6d48e13c2e2 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Mon, 21 Jul 2025 15:55:45 -0700 Subject: [PATCH 17/24] chore: remove extra states --- packages/svelte-db/src/useLiveQuery.svelte.ts | 16 +- pnpm-lock.yaml | 985 ++---------------- 2 files changed, 115 insertions(+), 886 deletions(-) diff --git a/packages/svelte-db/src/useLiveQuery.svelte.ts b/packages/svelte-db/src/useLiveQuery.svelte.ts index 40c70fb1..1a85b0fe 100644 --- a/packages/svelte-db/src/useLiveQuery.svelte.ts +++ b/packages/svelte-db/src/useLiveQuery.svelte.ts @@ -318,12 +318,6 @@ export function useLiveQuery( } }) - const isReady = $derived(status === `ready`) - const isIdle = $derived(status === `idle`) - const isLoading = $derived(status === `loading` || status === `initialCommit`) - const isError = $derived(status === `error`) - const isCleanedUp = $derived(status === `cleaned-up`) - return { get state() { return state @@ -338,19 +332,19 @@ export function useLiveQuery( return status }, get isLoading() { - return isLoading + return status === `loading` || status === `initialCommit` }, get isReady() { - return isReady + return status === `ready` }, get isIdle() { - return isIdle + return status === `idle` }, get isError() { - return isError + return status === `error` }, get isCleanedUp() { - return isCleanedUp + return status === `cleaned-up` }, } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a3222b6..9456767a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,7 +46,7 @@ importers: version: 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) + version: 4.7.0(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) eslint: specifier: ^9.22.0 version: 9.22.0(jiti@2.4.2) @@ -188,7 +188,7 @@ importers: version: 9.2.0 dotenv: specifier: ^16.3.1 - version: 16.4.7 + version: 16.6.1 drizzle-kit: specifier: ^0.30.5 version: 0.30.5 @@ -284,14 +284,14 @@ importers: version: link:../db use-sync-external-store: specifier: ^1.2.0 - version: 1.4.0(react@19.0.0) + version: 1.4.0(react@19.1.0) devDependencies: '@electric-sql/client': specifier: 1.0.0 version: 1.0.0 '@testing-library/react': specifier: ^16.2.0 - version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.4(@types/react@19.0.12))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.4(@types/react@19.0.12))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/react': specifier: ^19.0.12 version: 19.0.12 @@ -306,10 +306,10 @@ importers: version: 3.0.9(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) react: specifier: ^19.0.0 - version: 19.0.0 + version: 19.1.0 react-dom: specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + version: 19.1.0(react@19.1.0) packages/svelte-db: dependencies: @@ -409,26 +409,14 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.0': resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.9': - resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} - engines: {node: '>=6.9.0'} - '@babel/core@7.28.0': resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.9': - resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.28.0': resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} @@ -437,10 +425,6 @@ packages: resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} @@ -459,20 +443,10 @@ packages: resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.27.3': resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} @@ -483,10 +457,6 @@ packages: resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} - engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} @@ -509,27 +479,14 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.26.9': - resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.2': - resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.28.0': resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} engines: {node: '>=6.0.0'} @@ -553,24 +510,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} @@ -593,26 +538,14 @@ packages: resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} - '@babel/template@7.26.9': - resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} - engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.9': - resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.0': resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.1': - resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} - engines: {node: '>=6.9.0'} - '@babel/types@7.28.0': resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} engines: {node: '>=6.9.0'} @@ -762,12 +695,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.5': resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} @@ -792,12 +719,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.5': resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} @@ -822,12 +743,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.5': resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} @@ -852,12 +767,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.5': resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} @@ -882,12 +791,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.5': resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} @@ -912,12 +815,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.5': resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} @@ -942,12 +839,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.5': resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} @@ -972,12 +863,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.5': resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} @@ -1002,12 +887,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.5': resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} @@ -1032,12 +911,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.5': resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} @@ -1062,12 +935,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.5': resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} @@ -1092,12 +959,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.5': resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} @@ -1122,12 +983,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.5': resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} @@ -1152,12 +1007,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.5': resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} @@ -1182,12 +1031,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.5': resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} @@ -1212,12 +1055,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.5': resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} @@ -1242,12 +1079,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.5': resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} @@ -1260,12 +1091,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.25.5': resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} @@ -1290,12 +1115,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.5': resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} @@ -1308,12 +1127,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.5': resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} @@ -1338,12 +1151,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.5': resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} @@ -1374,12 +1181,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.5': resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} @@ -1404,12 +1205,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.5': resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} @@ -1434,12 +1229,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.5': resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} @@ -1464,12 +1253,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.5': resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} @@ -1564,27 +1347,16 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.10': resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} @@ -1879,131 +1651,66 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.36.0': - resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.45.1': resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.36.0': - resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.45.1': resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.36.0': - resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.45.1': resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.36.0': - resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.36.0': - resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.45.1': resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.36.0': - resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.36.0': - resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.36.0': - resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.45.1': resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.36.0': - resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.1': resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.36.0': - resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.1': resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.36.0': - resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': - resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.36.0': - resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} cpu: [riscv64] @@ -2014,61 +1721,31 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.36.0': - resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.1': resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.36.0': - resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.1': resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.36.0': - resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.1': resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.36.0': - resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.45.1': resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.36.0': - resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.36.0': - resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} cpu: [x64] @@ -2474,9 +2151,6 @@ packages: '@types/doctrine@0.0.9': resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -2655,12 +2329,6 @@ packages: engines: {node: '>=18'} hasBin: true - '@vitejs/plugin-react@4.3.4': - resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2803,11 +2471,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -3242,10 +2905,6 @@ packages: confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} - engines: {node: ^14.18.0 || >=16.10.0} - consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -3408,15 +3067,6 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -3583,10 +3233,6 @@ packages: resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} engines: {node: '>=18'} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} - dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -3809,11 +3455,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.5: resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} @@ -4232,10 +3873,6 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -5398,9 +5035,6 @@ packages: parse5-parser-stream@7.1.2: resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} - parse5@7.2.1: - resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} - parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} @@ -5517,10 +5151,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -5706,11 +5336,6 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} - peerDependencies: - react: ^19.0.0 - react-dom@19.1.0: resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: @@ -5722,18 +5347,10 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} - react-refresh@0.17.0: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} - react@19.1.0: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} @@ -5866,11 +5483,6 @@ packages: rollup: optional: true - rollup@4.36.0: - resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.45.1: resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -5922,9 +5534,6 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} - scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} @@ -5944,11 +5553,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} @@ -6142,9 +5746,6 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - std-env@3.8.1: - resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} - std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -6335,10 +5936,6 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} @@ -6521,9 +6118,6 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -7022,8 +6616,8 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 '@ark/schema@0.46.0': dependencies: @@ -7051,31 +6645,9 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} - '@babel/compat-data@7.28.0': {} - '@babel/core@7.26.9': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helpers': 7.26.9 - '@babel/parser': 7.27.2 - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.27.1 - convert-source-map: 2.0.0 - debug: 4.4.1 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.28.0': + '@babel/core@7.28.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 @@ -7095,14 +6667,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.26.9': - dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - '@babel/generator@7.28.0': dependencies: '@babel/parser': 7.28.0 @@ -7115,14 +6679,6 @@ snapshots: dependencies: '@babel/types': 7.28.1 - '@babel/helper-compilation-targets@7.26.5': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 - lru-cache: 5.1.1 - semver: 6.3.1 - '@babel/helper-compilation-targets@7.27.2': dependencies: '@babel/compat-data': 7.28.0 @@ -7149,14 +6705,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.25.9': - dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.27.1 + '@babel/types': 7.28.1 transitivePeerDependencies: - supports-color @@ -7167,15 +6716,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.26.9 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -7187,9 +6727,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.27.1 - - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/types': 7.28.1 '@babel/helper-plugin-utils@7.27.1': {} @@ -7205,7 +6743,7 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.27.1 + '@babel/types': 7.28.1 transitivePeerDependencies: - supports-color @@ -7213,24 +6751,13 @@ snapshots: '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-option@7.25.9': {} - '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.26.9': - dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.27.1 - '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 '@babel/types': 7.28.1 - '@babel/parser@7.27.2': - dependencies: - '@babel/types': 7.27.1 - '@babel/parser@7.28.0': dependencies: '@babel/types': 7.28.1 @@ -7253,21 +6780,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -7299,30 +6816,12 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.26.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 - '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.0 '@babel/types': 7.28.1 - '@babel/traverse@7.26.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/parser': 7.27.2 - '@babel/template': 7.26.9 - '@babel/types': 7.27.1 - debug: 4.4.1 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.28.0': dependencies: '@babel/code-frame': 7.27.1 @@ -7335,11 +6834,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.27.1': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/types@7.28.0': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -7364,7 +6858,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 '@changesets/assemble-release-plan@6.0.6': dependencies: @@ -7373,7 +6867,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.1 + semver: 7.7.2 '@changesets/changelog-git@0.2.1': dependencies: @@ -7406,7 +6900,7 @@ snapshots: package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.7.2 spawndamnit: 3.0.1 term-size: 2.2.1 @@ -7429,7 +6923,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.1 + semver: 7.7.2 '@changesets/get-github-info@0.6.0': dependencies: @@ -7551,7 +7045,7 @@ snapshots: '@electric-sql/client@1.0.0': optionalDependencies: - '@rollup/rollup-darwin-arm64': 4.36.0 + '@rollup/rollup-darwin-arm64': 4.45.1 '@electric-sql/d2mini@0.1.7': dependencies: @@ -7588,9 +7082,6 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true - '@esbuild/aix-ppc64@0.25.1': - optional: true - '@esbuild/aix-ppc64@0.25.5': optional: true @@ -7603,9 +7094,6 @@ snapshots: '@esbuild/android-arm64@0.19.12': optional: true - '@esbuild/android-arm64@0.25.1': - optional: true - '@esbuild/android-arm64@0.25.5': optional: true @@ -7618,9 +7106,6 @@ snapshots: '@esbuild/android-arm@0.19.12': optional: true - '@esbuild/android-arm@0.25.1': - optional: true - '@esbuild/android-arm@0.25.5': optional: true @@ -7633,9 +7118,6 @@ snapshots: '@esbuild/android-x64@0.19.12': optional: true - '@esbuild/android-x64@0.25.1': - optional: true - '@esbuild/android-x64@0.25.5': optional: true @@ -7648,9 +7130,6 @@ snapshots: '@esbuild/darwin-arm64@0.19.12': optional: true - '@esbuild/darwin-arm64@0.25.1': - optional: true - '@esbuild/darwin-arm64@0.25.5': optional: true @@ -7663,9 +7142,6 @@ snapshots: '@esbuild/darwin-x64@0.19.12': optional: true - '@esbuild/darwin-x64@0.25.1': - optional: true - '@esbuild/darwin-x64@0.25.5': optional: true @@ -7678,9 +7154,6 @@ snapshots: '@esbuild/freebsd-arm64@0.19.12': optional: true - '@esbuild/freebsd-arm64@0.25.1': - optional: true - '@esbuild/freebsd-arm64@0.25.5': optional: true @@ -7693,9 +7166,6 @@ snapshots: '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.25.1': - optional: true - '@esbuild/freebsd-x64@0.25.5': optional: true @@ -7708,9 +7178,6 @@ snapshots: '@esbuild/linux-arm64@0.19.12': optional: true - '@esbuild/linux-arm64@0.25.1': - optional: true - '@esbuild/linux-arm64@0.25.5': optional: true @@ -7723,9 +7190,6 @@ snapshots: '@esbuild/linux-arm@0.19.12': optional: true - '@esbuild/linux-arm@0.25.1': - optional: true - '@esbuild/linux-arm@0.25.5': optional: true @@ -7738,9 +7202,6 @@ snapshots: '@esbuild/linux-ia32@0.19.12': optional: true - '@esbuild/linux-ia32@0.25.1': - optional: true - '@esbuild/linux-ia32@0.25.5': optional: true @@ -7753,9 +7214,6 @@ snapshots: '@esbuild/linux-loong64@0.19.12': optional: true - '@esbuild/linux-loong64@0.25.1': - optional: true - '@esbuild/linux-loong64@0.25.5': optional: true @@ -7768,9 +7226,6 @@ snapshots: '@esbuild/linux-mips64el@0.19.12': optional: true - '@esbuild/linux-mips64el@0.25.1': - optional: true - '@esbuild/linux-mips64el@0.25.5': optional: true @@ -7783,9 +7238,6 @@ snapshots: '@esbuild/linux-ppc64@0.19.12': optional: true - '@esbuild/linux-ppc64@0.25.1': - optional: true - '@esbuild/linux-ppc64@0.25.5': optional: true @@ -7798,9 +7250,6 @@ snapshots: '@esbuild/linux-riscv64@0.19.12': optional: true - '@esbuild/linux-riscv64@0.25.1': - optional: true - '@esbuild/linux-riscv64@0.25.5': optional: true @@ -7813,9 +7262,6 @@ snapshots: '@esbuild/linux-s390x@0.19.12': optional: true - '@esbuild/linux-s390x@0.25.1': - optional: true - '@esbuild/linux-s390x@0.25.5': optional: true @@ -7828,18 +7274,12 @@ snapshots: '@esbuild/linux-x64@0.19.12': optional: true - '@esbuild/linux-x64@0.25.1': - optional: true - '@esbuild/linux-x64@0.25.5': optional: true '@esbuild/linux-x64@0.25.8': optional: true - '@esbuild/netbsd-arm64@0.25.1': - optional: true - '@esbuild/netbsd-arm64@0.25.5': optional: true @@ -7852,18 +7292,12 @@ snapshots: '@esbuild/netbsd-x64@0.19.12': optional: true - '@esbuild/netbsd-x64@0.25.1': - optional: true - '@esbuild/netbsd-x64@0.25.5': optional: true '@esbuild/netbsd-x64@0.25.8': optional: true - '@esbuild/openbsd-arm64@0.25.1': - optional: true - '@esbuild/openbsd-arm64@0.25.5': optional: true @@ -7876,9 +7310,6 @@ snapshots: '@esbuild/openbsd-x64@0.19.12': optional: true - '@esbuild/openbsd-x64@0.25.1': - optional: true - '@esbuild/openbsd-x64@0.25.5': optional: true @@ -7894,9 +7325,6 @@ snapshots: '@esbuild/sunos-x64@0.19.12': optional: true - '@esbuild/sunos-x64@0.25.1': - optional: true - '@esbuild/sunos-x64@0.25.5': optional: true @@ -7909,9 +7337,6 @@ snapshots: '@esbuild/win32-arm64@0.19.12': optional: true - '@esbuild/win32-arm64@0.25.1': - optional: true - '@esbuild/win32-arm64@0.25.5': optional: true @@ -7924,9 +7349,6 @@ snapshots: '@esbuild/win32-ia32@0.19.12': optional: true - '@esbuild/win32-ia32@0.25.1': - optional: true - '@esbuild/win32-ia32@0.25.5': optional: true @@ -7939,9 +7361,6 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true - '@esbuild/win32-x64@0.25.1': - optional: true - '@esbuild/win32-x64@0.25.5': optional: true @@ -8035,28 +7454,15 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.10': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -8219,7 +7625,7 @@ snapshots: '@netlify/zip-it-and-ship-it@12.2.1(rollup@4.45.1)': dependencies: - '@babel/parser': 7.27.2 + '@babel/parser': 7.28.0 '@babel/types': 7.28.0 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 2.1.3 @@ -8383,10 +7789,10 @@ snapshots: '@rollup/pluginutils': 5.1.4(rollup@4.45.1) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.4(picomatch@4.0.2) + fdir: 6.4.4(picomatch@4.0.3) is-reference: 1.2.1 magic-string: 0.30.17 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: rollup: 4.45.1 @@ -8431,126 +7837,69 @@ snapshots: '@rollup/pluginutils@5.1.4(rollup@4.45.1)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: rollup: 4.45.1 - '@rollup/rollup-android-arm-eabi@4.36.0': - optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': optional: true - '@rollup/rollup-android-arm64@4.36.0': - optional: true - '@rollup/rollup-android-arm64@4.45.1': optional: true - '@rollup/rollup-darwin-arm64@4.36.0': - optional: true - '@rollup/rollup-darwin-arm64@4.45.1': optional: true - '@rollup/rollup-darwin-x64@4.36.0': - optional: true - '@rollup/rollup-darwin-x64@4.45.1': optional: true - '@rollup/rollup-freebsd-arm64@4.36.0': - optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': optional: true - '@rollup/rollup-freebsd-x64@4.36.0': - optional: true - '@rollup/rollup-freebsd-x64@4.45.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.36.0': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.36.0': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.36.0': - optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': optional: true '@rollup/rollup-linux-riscv64-musl@4.45.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.36.0': - optional: true - '@rollup/rollup-linux-x64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-x64-musl@4.36.0': - optional: true - '@rollup/rollup-linux-x64-musl@4.45.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.36.0': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.36.0': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.36.0': - optional: true - '@rollup/rollup-win32-x64-msvc@4.45.1': optional: true @@ -8653,21 +8002,21 @@ snapshots: eslint-visitor-keys: 4.2.0 espree: 10.3.0 estraverse: 5.3.0 - picomatch: 4.0.2 + picomatch: 4.0.3 transitivePeerDependencies: - supports-color - typescript - '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': dependencies: - acorn: 8.14.1 + acorn: 8.15.0 '@sveltejs/package@2.3.11(svelte@5.28.6)(typescript@5.8.2)': dependencies: chokidar: 4.0.3 kleur: 4.1.5 sade: 1.8.1 - semver: 7.7.1 + semver: 7.7.2 svelte: 5.28.6 svelte2tsx: 0.7.37(svelte@5.28.6)(typescript@5.8.2) transitivePeerDependencies: @@ -8698,7 +8047,7 @@ snapshots: '@svitejs/changesets-changelog-github-compact@1.2.0': dependencies: '@changesets/get-github-info': 0.6.0 - dotenv: 16.4.7 + dotenv: 16.6.1 transitivePeerDependencies: - encoding @@ -8810,7 +8159,7 @@ snapshots: dependencies: '@commitlint/parse': 19.8.0 jsonfile: 6.1.0 - semver: 7.7.1 + semver: 7.7.2 simple-git: 3.27.0 transitivePeerDependencies: - supports-color @@ -9023,8 +8372,8 @@ snapshots: '@tanstack/start-plugin-core@1.129.2(@netlify/blobs@9.1.2)(@tanstack/react-router@1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(drizzle-orm@0.40.1(@types/pg@8.11.11)(gel@2.0.1)(kysely@0.27.6)(pg@8.14.1)(postgres@3.4.7))(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@babel/code-frame': 7.26.2 - '@babel/core': 7.26.9 - '@babel/types': 7.27.1 + '@babel/core': 7.28.0 + '@babel/types': 7.28.1 '@tanstack/router-core': 1.129.2 '@tanstack/router-generator': 1.129.2 '@tanstack/router-plugin': 1.129.2(@tanstack/react-router@1.129.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) @@ -9038,7 +8387,7 @@ snapshots: h3: 1.13.0 nitropack: 2.12.3(@netlify/blobs@9.1.2)(drizzle-orm@0.40.1(@types/pg@8.11.11)(gel@2.0.1)(kysely@0.27.6)(pg@8.14.1)(postgres@3.4.7)) pathe: 2.0.3 - ufo: 1.5.4 + ufo: 1.6.1 vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0) xmlbuilder2: 3.1.1 zod: 3.24.2 @@ -9138,7 +8487,7 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@babel/runtime': 7.26.10 '@types/aria-query': 5.0.4 aria-query: 5.3.0 @@ -9157,12 +8506,12 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.4(@types/react@19.0.12))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.4(@types/react@19.0.12))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@babel/runtime': 7.26.10 '@testing-library/dom': 10.4.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 19.0.12 '@types/react-dom': 19.0.4(@types/react@19.0.12) @@ -9180,24 +8529,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.28.1 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.28.1 '@types/body-parser@1.19.5': dependencies: @@ -9222,8 +8571,6 @@ snapshots: '@types/doctrine@0.0.9': {} - '@types/estree@1.0.6': {} - '@types/estree@1.0.8': {} '@types/express-serve-static-core@4.19.6': @@ -9325,7 +8672,7 @@ snapshots: '@typescript-eslint/types': 8.26.1 '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) '@typescript-eslint/visitor-keys': 8.26.1 - debug: 4.4.0 + debug: 4.4.1 eslint: 9.22.0(jiti@2.4.2) typescript: 5.8.2 transitivePeerDependencies: @@ -9357,7 +8704,7 @@ snapshots: fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.0.1(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: @@ -9418,32 +8765,21 @@ snapshots: dependencies: '@mapbox/node-pre-gyp': 2.0.0 '@rollup/pluginutils': 5.1.4(rollup@4.45.1) - acorn: 8.14.1 - acorn-import-attributes: 1.9.5(acorn@8.14.1) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 glob: 10.4.5 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 - picomatch: 4.0.2 + picomatch: 4.0.3 resolve-from: 5.0.0 transitivePeerDependencies: - encoding - rollup - supports-color - '@vitejs/plugin-react@4.3.4(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0))': - dependencies: - '@babel/core': 7.26.9 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0) - transitivePeerDependencies: - - supports-color - '@vitejs/plugin-react@4.7.0(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@babel/core': 7.28.0 @@ -9531,7 +8867,7 @@ snapshots: '@vue/compiler-core@3.5.14': dependencies: - '@babel/parser': 7.27.2 + '@babel/parser': 7.28.0 '@vue/shared': 3.5.14 entities: 4.5.0 estree-walker: 2.0.2 @@ -9544,7 +8880,7 @@ snapshots: '@vue/compiler-sfc@3.5.14': dependencies: - '@babel/parser': 7.27.2 + '@babel/parser': 7.28.0 '@vue/compiler-core': 3.5.14 '@vue/compiler-dom': 3.5.14 '@vue/compiler-ssr': 3.5.14 @@ -9645,15 +8981,13 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-attributes@1.9.5(acorn@8.14.1): + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 - - acorn@8.14.1: {} + acorn: 8.15.0 acorn@8.15.0: {} @@ -9840,7 +9174,7 @@ snapshots: babel-dead-code-elimination@1.0.10: dependencies: '@babel/core': 7.28.0 - '@babel/parser': 7.27.2 + '@babel/parser': 7.28.0 '@babel/traverse': 7.28.0 '@babel/types': 7.28.1 transitivePeerDependencies: @@ -9915,9 +9249,9 @@ snapshots: builtin-modules@3.3.0: {} - bundle-require@5.1.0(esbuild@0.25.1): + bundle-require@5.1.0(esbuild@0.25.8): dependencies: - esbuild: 0.25.1 + esbuild: 0.25.8 load-tsconfig: 0.2.5 bytes@3.1.2: {} @@ -10142,8 +9476,6 @@ snapshots: confbox@0.2.2: {} - consola@3.4.0: {} - consola@3.4.2: {} content-disposition@0.5.4: @@ -10278,10 +9610,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: - dependencies: - ms: 2.1.3 - debug@4.4.1: dependencies: ms: 2.1.3 @@ -10434,8 +9762,6 @@ snapshots: dependencies: type-fest: 4.41.0 - dotenv@16.4.7: {} - dotenv@16.6.1: {} drizzle-kit@0.30.5: @@ -10674,34 +10000,6 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - esbuild@0.25.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.1 - '@esbuild/android-arm': 0.25.1 - '@esbuild/android-arm64': 0.25.1 - '@esbuild/android-x64': 0.25.1 - '@esbuild/darwin-arm64': 0.25.1 - '@esbuild/darwin-x64': 0.25.1 - '@esbuild/freebsd-arm64': 0.25.1 - '@esbuild/freebsd-x64': 0.25.1 - '@esbuild/linux-arm': 0.25.1 - '@esbuild/linux-arm64': 0.25.1 - '@esbuild/linux-ia32': 0.25.1 - '@esbuild/linux-loong64': 0.25.1 - '@esbuild/linux-mips64el': 0.25.1 - '@esbuild/linux-ppc64': 0.25.1 - '@esbuild/linux-riscv64': 0.25.1 - '@esbuild/linux-s390x': 0.25.1 - '@esbuild/linux-x64': 0.25.1 - '@esbuild/netbsd-arm64': 0.25.1 - '@esbuild/netbsd-x64': 0.25.1 - '@esbuild/openbsd-arm64': 0.25.1 - '@esbuild/openbsd-x64': 0.25.1 - '@esbuild/sunos-x64': 0.25.1 - '@esbuild/win32-arm64': 0.25.1 - '@esbuild/win32-ia32': 0.25.1 - '@esbuild/win32-x64': 0.25.1 - esbuild@0.25.5: optionalDependencies: '@esbuild/aix-ppc64': 0.25.5 @@ -10778,7 +10076,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@9.22.0(jiti@2.4.2)): dependencies: eslint: 9.22.0(jiti@2.4.2) - semver: 7.7.1 + semver: 7.7.2 eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.4.2)): dependencies: @@ -10808,9 +10106,9 @@ snapshots: eslint: 9.22.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.10.0 - picomatch: 4.0.2 + picomatch: 4.0.3 rspack-resolver: 1.2.2 - semver: 7.7.1 + semver: 7.7.2 stable-hash: 0.0.5 tslib: 2.8.1 transitivePeerDependencies: @@ -10827,7 +10125,7 @@ snapshots: globals: 15.15.0 ignore: 5.3.2 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.4.2)))(eslint@9.22.0(jiti@2.4.2))(prettier@3.5.3): dependencies: @@ -10895,12 +10193,12 @@ snapshots: '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -10928,14 +10226,14 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.0 espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -10958,7 +10256,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -11076,10 +10374,6 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.4(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - fdir@6.4.4(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -11210,7 +10504,7 @@ snapshots: '@petamoriken/float16': 3.9.2 debug: 4.4.1 env-paths: 3.0.0 - semver: 7.7.1 + semver: 7.7.2 shell-quote: 1.8.2 which: 4.0.0 transitivePeerDependencies: @@ -11293,8 +10587,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - globals@11.12.0: {} - globals@14.0.0: {} globals@15.15.0: {} @@ -11349,7 +10641,7 @@ snapshots: iron-webcrypto: 1.2.1 ohash: 1.1.6 radix3: 1.1.2 - ufo: 1.5.4 + ufo: 1.6.1 uncrypto: 0.1.3 unenv: 1.10.0 @@ -11605,11 +10897,11 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 is-reference@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 is-regex@1.2.1: dependencies: @@ -11698,11 +10990,11 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.26.9 - '@babel/parser': 7.27.2 + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -11714,7 +11006,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -11770,7 +11062,7 @@ snapshots: https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.16 - parse5: 7.2.1 + parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -11842,7 +11134,7 @@ snapshots: lambda-local@2.2.0: dependencies: commander: 10.0.1 - dotenv: 16.4.7 + dotenv: 16.6.1 winston: 3.17.0 lazystream@1.0.1: @@ -12044,13 +11336,13 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.1 source-map-js: 1.2.1 make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 markdown-it@14.1.0: dependencies: @@ -12142,7 +11434,7 @@ snapshots: mlly@1.7.4: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.1 @@ -12316,7 +11608,7 @@ snapshots: node-source-walk@7.0.1: dependencies: - '@babel/parser': 7.27.2 + '@babel/parser': 7.28.0 nopt@8.1.0: dependencies: @@ -12508,7 +11800,7 @@ snapshots: parse-json@8.3.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 index-to-position: 1.1.0 type-fest: 4.41.0 @@ -12521,10 +11813,6 @@ snapshots: dependencies: parse5: 7.3.0 - parse5@7.2.1: - dependencies: - entities: 4.5.0 - parse5@7.3.0: dependencies: entities: 6.0.1 @@ -12622,8 +11910,6 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} - picomatch@4.0.3: {} pidtree@0.6.0: {} @@ -12791,11 +12077,6 @@ snapshots: defu: 6.1.4 destr: 2.0.5 - react-dom@19.0.0(react@19.0.0): - dependencies: - react: 19.0.0 - scheduler: 0.25.0 - react-dom@19.1.0(react@19.1.0): dependencies: react: 19.1.0 @@ -12805,12 +12086,8 @@ snapshots: react-is@17.0.2: {} - react-refresh@0.14.2: {} - react-refresh@0.17.0: {} - react@19.0.0: {} - react@19.1.0: {} read-package-up@11.0.0: @@ -12957,37 +12234,12 @@ snapshots: rollup-plugin-visualizer@6.0.3(rollup@4.45.1): dependencies: open: 8.4.2 - picomatch: 4.0.2 + picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: rollup: 4.45.1 - rollup@4.36.0: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.36.0 - '@rollup/rollup-android-arm64': 4.36.0 - '@rollup/rollup-darwin-arm64': 4.36.0 - '@rollup/rollup-darwin-x64': 4.36.0 - '@rollup/rollup-freebsd-arm64': 4.36.0 - '@rollup/rollup-freebsd-x64': 4.36.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.36.0 - '@rollup/rollup-linux-arm-musleabihf': 4.36.0 - '@rollup/rollup-linux-arm64-gnu': 4.36.0 - '@rollup/rollup-linux-arm64-musl': 4.36.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.36.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0 - '@rollup/rollup-linux-riscv64-gnu': 4.36.0 - '@rollup/rollup-linux-s390x-gnu': 4.36.0 - '@rollup/rollup-linux-x64-gnu': 4.36.0 - '@rollup/rollup-linux-x64-musl': 4.36.0 - '@rollup/rollup-win32-arm64-msvc': 4.36.0 - '@rollup/rollup-win32-ia32-msvc': 4.36.0 - '@rollup/rollup-win32-x64-msvc': 4.36.0 - fsevents: 2.3.3 - rollup@4.45.1: dependencies: '@types/estree': 1.0.8 @@ -13073,8 +12325,6 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.25.0: {} - scheduler@0.26.0: {} scule@1.3.0: {} @@ -13087,8 +12337,6 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.1: {} - semver@7.7.2: {} send@0.19.0: @@ -13319,8 +12567,6 @@ snapshots: statuses@2.0.1: {} - std-env@3.8.1: {} - std-env@3.9.0: {} streamx@2.22.1: @@ -13428,7 +12674,7 @@ snapshots: sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/gen-mapping': 0.3.12 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -13450,7 +12696,7 @@ snapshots: svelte-check@4.2.0(picomatch@4.0.3)(svelte@5.28.6)(typescript@5.8.2): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 chokidar: 4.0.3 fdir: 6.4.4(picomatch@4.0.3) picocolors: 1.1.1 @@ -13471,9 +12717,9 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 - '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) - '@types/estree': 1.0.6 - acorn: 8.14.1 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 aria-query: 5.3.2 axobject-query: 4.1.0 clsx: 2.1.1 @@ -13519,7 +12765,7 @@ snapshots: terser@5.43.1: dependencies: '@jridgewell/source-map': 0.3.10 - acorn: 8.14.1 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -13555,11 +12801,6 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.13: - dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - tinyglobby@0.2.14: dependencies: fdir: 6.4.4(picomatch@4.0.3) @@ -13632,21 +12873,21 @@ snapshots: tsup@8.4.0(@microsoft/api-extractor@7.52.1(@types/node@22.13.10))(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0): dependencies: - bundle-require: 5.1.0(esbuild@0.25.1) + bundle-require: 5.1.0(esbuild@0.25.8) cac: 6.7.14 chokidar: 4.0.3 - consola: 3.4.0 + consola: 3.4.2 debug: 4.4.1 - esbuild: 0.25.1 + esbuild: 0.25.8 joycon: 3.1.1 picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(yaml@2.7.0) resolve-from: 5.0.0 - rollup: 4.36.0 + rollup: 4.45.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 tree-kill: 1.2.2 optionalDependencies: '@microsoft/api-extractor': 7.52.1(@types/node@22.13.10) @@ -13660,7 +12901,7 @@ snapshots: tsx@4.19.3: dependencies: - esbuild: 0.25.1 + esbuild: 0.25.8 get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 @@ -13743,8 +12984,6 @@ snapshots: uc.micro@2.1.0: {} - ufo@1.5.4: {} - ufo@1.6.1: {} ultrahtml@1.6.0: {} @@ -13760,7 +12999,7 @@ snapshots: unctx@2.4.1: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 estree-walker: 3.0.3 magic-string: 0.30.17 unplugin: 2.3.5 @@ -13771,7 +13010,7 @@ snapshots: unenv@1.10.0: dependencies: - consola: 3.4.0 + consola: 3.4.2 defu: 6.1.4 mime: 3.0.0 node-fetch-native: 1.6.6 @@ -13819,17 +13058,17 @@ snapshots: unplugin-utils@0.2.4: dependencies: pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 unplugin@1.16.1: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 webpack-virtual-modules: 0.6.2 unplugin@2.3.5: dependencies: - acorn: 8.14.1 - picomatch: 4.0.2 + acorn: 8.15.0 + picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 unstorage@1.16.1(@netlify/blobs@9.1.2)(db0@0.3.2(drizzle-orm@0.40.1(@types/pg@8.11.11)(gel@2.0.1)(kysely@0.27.6)(pg@8.14.1)(postgres@3.4.7)))(ioredis@5.6.1): @@ -13886,10 +13125,6 @@ snapshots: urlpattern-polyfill@8.0.2: {} - use-sync-external-store@1.4.0(react@19.0.0): - dependencies: - react: 19.0.0 - use-sync-external-store@1.4.0(react@19.1.0): dependencies: react: 19.1.0 @@ -13964,12 +13199,12 @@ snapshots: vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0): dependencies: - esbuild: 0.25.1 - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 + esbuild: 0.25.8 + fdir: 6.4.4(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.3 - rollup: 4.36.0 - tinyglobby: 0.2.13 + rollup: 4.45.1 + tinyglobby: 0.2.14 optionalDependencies: '@types/node': 22.13.10 fsevents: 2.3.3 @@ -13997,7 +13232,7 @@ snapshots: expect-type: 1.2.0 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.8.1 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinypool: 1.0.2 @@ -14035,7 +13270,7 @@ snapshots: espree: 9.6.1 esquery: 1.6.0 lodash: 4.17.21 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color From e4611bf9c7cd4511244bae9fb3a5fe48771fe180 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Mon, 21 Jul 2025 15:59:40 -0700 Subject: [PATCH 18/24] chore: update JSDoc to use svelte examples --- packages/svelte-db/src/useLiveQuery.svelte.ts | 83 +++++++++++-------- 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/packages/svelte-db/src/useLiveQuery.svelte.ts b/packages/svelte-db/src/useLiveQuery.svelte.ts index 1a85b0fe..73fa9ef8 100644 --- a/packages/svelte-db/src/useLiveQuery.svelte.ts +++ b/packages/svelte-db/src/useLiveQuery.svelte.ts @@ -67,7 +67,7 @@ function toValue(value: MaybeGetter): T { * @returns Reactive object with query data, state, and status information * @example * // Basic query with object syntax - * const { data, isLoading } = useLiveQuery((q) => + * const todosQuery = useLiveQuery((q) => * q.from({ todos: todosCollection }) * .where(({ todos }) => eq(todos.completed, false)) * .select(({ todos }) => ({ id: todos.id, text: todos.text })) @@ -75,16 +75,16 @@ function toValue(value: MaybeGetter): T { * * @example * // With reactive dependencies - * const minPriority = ref(5) - * const { data, state } = useLiveQuery( + * let minPriority = $state(5) + * const todosQuery = useLiveQuery( * (q) => q.from({ todos: todosCollection }) - * .where(({ todos }) => gt(todos.priority, minPriority.value)), - * [minPriority] // Re-run when minPriority changes + * .where(({ todos }) => gt(todos.priority, minPriority)), + * [() => minPriority] // Re-run when minPriority changes * ) * * @example * // Join pattern - * const { data } = useLiveQuery((q) => + * const issuesQuery = useLiveQuery((q) => * q.from({ issues: issueCollection }) * .join({ persons: personCollection }, ({ issues, persons }) => * eq(issues.userId, persons.id) @@ -98,16 +98,22 @@ function toValue(value: MaybeGetter): T { * * @example * // Handle loading and error states in template - * const { data, isLoading, isError, status } = useLiveQuery((q) => + * const todosQuery = useLiveQuery((q) => * q.from({ todos: todoCollection }) * ) * * // In template: - * //
Loading...
- * //
Error: {{ status }}
- * //
    - * //
  • {{ todo.text }}
  • - * //
+ * // {#if todosQuery.isLoading} + * //
Loading...
+ * // {:else if todosQuery.isError} + * //
Error: {todosQuery.status}
+ * // {:else} + * //
    + * // {#each todosQuery.data as todo (todo.id)} + * //
  • {todo.text}
  • + * // {/each} + * //
+ * // {/if} */ // Overload 1: Accept just the query function export function useLiveQuery( @@ -122,30 +128,35 @@ export function useLiveQuery( * @returns Reactive object with query data, state, and status information * @example * // Basic config object usage - * const { data, status } = useLiveQuery({ + * const todosQuery = useLiveQuery({ * query: (q) => q.from({ todos: todosCollection }), * gcTime: 60000 * }) * * @example * // With reactive dependencies - * const filter = ref('active') - * const { data, isReady } = useLiveQuery({ + * let filter = $state('active') + * const todosQuery = useLiveQuery({ * query: (q) => q.from({ todos: todosCollection }) - * .where(({ todos }) => eq(todos.status, filter.value)) - * }, [filter]) + * .where(({ todos }) => eq(todos.status, filter)) + * }, [() => filter]) * * @example * // Handle all states uniformly - * const { data, isLoading, isReady, isError } = useLiveQuery({ + * const itemsQuery = useLiveQuery({ * query: (q) => q.from({ items: itemCollection }) * }) * * // In template: - * //
Loading...
- * //
Something went wrong
- * //
Preparing...
- * //
{{ data.length }} items loaded
+ * // {#if itemsQuery.isLoading} + * //
Loading...
+ * // {:else if itemsQuery.isError} + * //
Something went wrong
+ * // {:else if !itemsQuery.isReady} + * //
Preparing...
+ * // {:else} + * //
{itemsQuery.data.length} items loaded
+ * // {/if} */ // Overload 2: Accept config object export function useLiveQuery( @@ -162,35 +173,39 @@ export function useLiveQuery( * const myLiveQuery = createLiveQueryCollection((q) => * q.from({ todos: todosCollection }).where(({ todos }) => eq(todos.active, true)) * ) - * const { data, collection } = useLiveQuery(myLiveQuery) + * const queryResult = useLiveQuery(myLiveQuery) * * @example * // Reactive query collection reference - * const selectedQuery = ref(todosQuery) - * const { data, collection } = useLiveQuery(selectedQuery) + * let selectedQuery = $state(todosQuery) + * const queryResult = useLiveQuery(() => selectedQuery) * * // Switch queries reactively - * selectedQuery.value = archiveQuery + * selectedQuery = archiveQuery * * @example * // Access query collection methods directly - * const { data, collection, isReady } = useLiveQuery(existingQuery) + * const queryResult = useLiveQuery(existingQuery) * * // Use underlying collection for mutations * const handleToggle = (id) => { - * collection.value.update(id, draft => { draft.completed = !draft.completed }) + * queryResult.collection.update(id, draft => { draft.completed = !draft.completed }) * } * * @example * // Handle states consistently - * const { data, isLoading, isError } = useLiveQuery(sharedQuery) + * const queryResult = useLiveQuery(sharedQuery) * * // In template: - * //
Loading...
- * //
Error loading data
- * //
- * // - * //
+ * // {#if queryResult.isLoading} + * //
Loading...
+ * // {:else if queryResult.isError} + * //
Error loading data
+ * // {:else} + * // {#each queryResult.data as item (item.id)} + * // + * // {/each} + * // {/if} */ // Overload 3: Accept pre-created live query collection (can be reactive) export function useLiveQuery< From 43408cb3bcdb7b84dd96c10d7d74d187515da227 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Mon, 21 Jul 2025 17:23:05 -0700 Subject: [PATCH 19/24] chore: update tests --- packages/svelte-db/src/useLiveQuery.svelte.ts | 52 +- .../tests/useLiveQuery.svelte.test.ts | 1419 ++++++++++------- packages/svelte-db/tsconfig.json | 5 +- 3 files changed, 888 insertions(+), 588 deletions(-) diff --git a/packages/svelte-db/src/useLiveQuery.svelte.ts b/packages/svelte-db/src/useLiveQuery.svelte.ts index 73fa9ef8..700be331 100644 --- a/packages/svelte-db/src/useLiveQuery.svelte.ts +++ b/packages/svelte-db/src/useLiveQuery.svelte.ts @@ -1,3 +1,4 @@ +import { untrack } from "svelte" import { createLiveQueryCollection } from "@tanstack/db" import { SvelteMap } from "svelte/reactivity" import type { @@ -222,7 +223,18 @@ export function useLiveQuery( deps: Array<() => unknown> = [] ): UseLiveQueryReturn | UseLiveQueryReturnWithCollection { const collection = $derived.by(() => { - const unwrappedParam = toValue(configOrQueryOrCollection) + // First check if the original parameter might be a ref/getter + // by seeing if toValue returns something different than the original + let unwrappedParam = configOrQueryOrCollection + try { + const potentiallyUnwrapped = toValue(configOrQueryOrCollection) + if (potentiallyUnwrapped !== configOrQueryOrCollection) { + unwrappedParam = potentiallyUnwrapped + } + } catch { + // If toValue fails, use original parameter + unwrappedParam = configOrQueryOrCollection + } // Check if it's already a collection by checking for specific collection methods const isCollection = @@ -268,8 +280,10 @@ export function useLiveQuery( const syncDataFromCollection = ( currentCollection: Collection ) => { - internalData = [] - internalData.push(...Array.from(currentCollection.values())) + untrack(() => { + internalData = [] + internalData.push(...Array.from(currentCollection.values())) + }) } // Track current unsubscribe function @@ -288,10 +302,12 @@ export function useLiveQuery( } // Initialize state with current collection data - state.clear() - for (const [key, value] of currentCollection.entries()) { - state.set(key, value) - } + untrack(() => { + state.clear() + for (const [key, value] of currentCollection.entries()) { + state.set(key, value) + } + }) // Initialize data array in correct order syncDataFromCollection(currentCollection) @@ -300,17 +316,19 @@ export function useLiveQuery( currentUnsubscribe = currentCollection.subscribeChanges( (changes: Array>) => { // Apply each change individually to the reactive state - for (const change of changes) { - switch (change.type) { - case `insert`: - case `update`: - state.set(change.key, change.value) - break - case `delete`: - state.delete(change.key) - break + untrack(() => { + for (const change of changes) { + switch (change.type) { + case `insert`: + case `update`: + state.set(change.key, change.value) + break + case `delete`: + state.delete(change.key) + break + } } - } + }) // Update the data array to maintain sorted order syncDataFromCollection(currentCollection) diff --git a/packages/svelte-db/tests/useLiveQuery.svelte.test.ts b/packages/svelte-db/tests/useLiveQuery.svelte.test.ts index 7d1d5762..1d1e982f 100644 --- a/packages/svelte-db/tests/useLiveQuery.svelte.test.ts +++ b/packages/svelte-db/tests/useLiveQuery.svelte.test.ts @@ -1,14 +1,14 @@ -import { afterEach, describe, expect, it, vi } from "vitest" -import mitt from "mitt" -import { Collection, createTransaction } from "@tanstack/db" +import { afterEach, describe, expect, it } from "vitest" +import { + count, + createCollection, + createLiveQueryCollection, + eq, + gt, +} from "@tanstack/db" import { flushSync } from "svelte" import { useLiveQuery } from "../src/useLiveQuery.svelte.js" -import type { - Context, - InitialQueryBuilder, - PendingMutation, - Schema, -} from "@tanstack/db" +import { mockSyncCollectionOptions } from "../../db/tests/utls" type Person = { id: string @@ -81,363 +81,336 @@ describe(`Query Collections`, () => { cleanup?.() }) - it(`should be able to query a collection`, () => { + it(`should work with basic collection and select`, () => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `test-persons`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }) + ) + cleanup = $effect.root(() => { - const emitter = mitt() + const query = useLiveQuery((q) => + q + .from({ persons: collection }) + .where(({ persons }) => gt(persons.age, 30)) + .select(({ persons }) => ({ + id: persons.id, + name: persons.name, + age: persons.age, + })) + ) - // Create collection with mutation capability - const collection = new Collection({ - id: `optimistic-changes-test`, - sync: { - sync: ({ begin, write, commit }) => { - // Listen for sync events - emitter.on(`*`, (_, changes) => { - begin() - ;(changes as Array).forEach((change) => { - write({ - key: change.key, - type: change.type, - value: change.changes as Person, - }) - }) - commit() - }) - }, - }, + flushSync() + + expect(query.state.size).toBe(1) // Only John Smith (age 35) + expect(query.data).toHaveLength(1) + + const johnSmith = query.data[0] + expect(johnSmith).toMatchObject({ + id: `3`, + name: `John Smith`, + age: 35, }) + }) + }) - // Sync from initial state - emitter.emit( - `sync`, - initialPersons.map((person) => ({ - key: person.id, - type: `insert`, - changes: person, - })) - ) + it(`should be able to query a collection with live updates`, () => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `test-persons-2`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }) + ) - const result = useLiveQuery((q) => + cleanup = $effect.root(() => { + const query = useLiveQuery((q) => q .from({ collection }) - .where(`@age`, `>`, 30) - .keyBy(`@id`) - .select(`@id`, `@name`) - .orderBy({ "@id": `asc` }) + .where(({ collection: c }) => gt(c.age, 30)) + .select(({ collection: c }) => ({ + id: c.id, + name: c.name, + })) + .orderBy(({ collection: c }) => c.id, `asc`) ) - expect(result.state.size).toBe(1) - expect(result.state.get(`3`)).toEqual({ - _orderByIndex: 0, + // Wait for collection to sync + flushSync() + + expect(query.state.size).toBe(1) + expect(query.state.get(`3`)).toMatchObject({ id: `3`, name: `John Smith`, }) - expect(result.data.length).toBe(1) - expect(result.data[0]).toEqual({ - _orderByIndex: 0, + expect(query.data.length).toBe(1) + expect(query.data[0]).toMatchObject({ id: `3`, name: `John Smith`, }) - // Insert a new person - emitter.emit(`sync`, [ - { - key: `4`, - type: `insert`, - changes: { - id: `4`, - name: `Kyle Doe`, - age: 40, - email: `kyle.doe@example.com`, - isActive: true, - }, + // Insert a new person using the proper utils pattern + collection.utils.begin() + collection.utils.write({ + type: `insert`, + value: { + id: `4`, + name: `Kyle Doe`, + age: 40, + email: `kyle.doe@example.com`, + isActive: true, + team: `team1`, }, - ]) + }) + collection.utils.commit() flushSync() - expect(result.state.size).toBe(2) - expect(result.state.get(`3`)).toEqual({ - _orderByIndex: 0, + expect(query.state.size).toBe(2) + expect(query.state.get(`3`)).toMatchObject({ id: `3`, name: `John Smith`, }) - expect(result.state.get(`4`)).toEqual({ - _orderByIndex: 1, + expect(query.state.get(`4`)).toMatchObject({ id: `4`, name: `Kyle Doe`, }) - expect(result.data.length).toBe(2) - expect(result.data).toContainEqual({ - _orderByIndex: 0, - id: `3`, - name: `John Smith`, - }) - expect(result.data).toContainEqual({ - _orderByIndex: 1, - id: `4`, - name: `Kyle Doe`, - }) + expect(query.data.length).toBe(2) + expect(query.data).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: `3`, + name: `John Smith`, + }), + expect.objectContaining({ + id: `4`, + name: `Kyle Doe`, + }), + ]) + ) // Update the person - emitter.emit(`sync`, [ - { - key: `4`, - type: `update`, - changes: { - name: `Kyle Doe 2`, - }, + collection.utils.begin() + collection.utils.write({ + type: `update`, + value: { + id: `4`, + name: `Kyle Doe 2`, + age: 40, + email: `kyle.doe@example.com`, + isActive: true, + team: `team1`, }, - ]) + }) + collection.utils.commit() flushSync() - expect(result.state.size).toBe(2) - expect(result.state.get(`4`)).toEqual({ - _orderByIndex: 1, + expect(query.state.size).toBe(2) + expect(query.state.get(`4`)).toMatchObject({ id: `4`, name: `Kyle Doe 2`, }) - expect(result.data.length).toBe(2) - expect(result.data).toContainEqual({ - _orderByIndex: 1, - id: `4`, - name: `Kyle Doe 2`, - }) + expect(query.data.length).toBe(2) + expect(query.data).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: `3`, + name: `John Smith`, + }), + expect.objectContaining({ + id: `4`, + name: `Kyle Doe 2`, + }), + ]) + ) // Delete the person - emitter.emit(`sync`, [ - { - key: `4`, - type: `delete`, + collection.utils.begin() + collection.utils.write({ + type: `delete`, + value: { + id: `4`, + name: `Kyle Doe 2`, + age: 40, + email: `kyle.doe@example.com`, + isActive: true, + team: `team1`, }, - ]) + }) + collection.utils.commit() flushSync() - expect(result.state.size).toBe(1) - expect(result.state.get(`4`)).toBeUndefined() + expect(query.state.size).toBe(1) + expect(query.state.get(`4`)).toBeUndefined() - expect(result.data.length).toBe(1) - expect(result.data).toContainEqual({ - _orderByIndex: 0, + expect(query.data.length).toBe(1) + expect(query.data[0]).toMatchObject({ id: `3`, name: `John Smith`, }) }) }) - it(`should join collections and return combined results`, () => { - cleanup = $effect.root(() => { - const emitter = mitt() - - // Create person collection - const personCollection = new Collection({ + it(`should join collections and return combined results with live updates`, () => { + // Create person collection + const personCollection = createCollection( + mockSyncCollectionOptions({ id: `person-collection-test`, - sync: { - sync: ({ begin, write, commit }) => { - emitter.on(`sync-person`, (changes) => { - begin() - ;(changes as Array).forEach((change) => { - write({ - key: change.key, - type: change.type, - value: change.changes as Person, - }) - }) - commit() - }) - }, - }, + getKey: (person: Person) => person.id, + initialData: initialPersons, }) + ) + cleanup = $effect.root(() => { // Create issue collection - const issueCollection = new Collection({ - id: `issue-collection-test`, - sync: { - sync: ({ begin, write, commit }) => { - emitter.on(`sync-issue`, (changes) => { - begin() - ;(changes as Array).forEach((change) => { - write({ - key: change.key, - type: change.type, - value: change.changes as Issue, - }) - }) - commit() - }) - }, - }, - }) - - // Sync initial person data - emitter.emit( - `sync-person`, - initialPersons.map((person) => ({ - key: person.id, - type: `insert`, - changes: person, - })) - ) - - flushSync() - - // Sync initial issue data - emitter.emit( - `sync-issue`, - initialIssues.map((issue) => ({ - key: issue.id, - type: `insert`, - changes: issue, - })) + const issueCollection = createCollection( + mockSyncCollectionOptions({ + id: `issue-collection-test`, + getKey: (issue: Issue) => issue.id, + initialData: initialIssues, + }) ) - const result = useLiveQuery((q) => + const query = useLiveQuery((q) => q .from({ issues: issueCollection }) - .join({ - type: `inner`, - from: { persons: personCollection }, - on: [`@persons.id`, `=`, `@issues.userId`], - }) - .select(`@issues.id`, `@issues.title`, `@persons.name`) - .keyBy(`@id`) + .join({ persons: personCollection }, ({ issues, persons }) => + eq(issues.userId, persons.id) + ) + .select(({ issues, persons }) => ({ + id: issues.id, + title: issues.title, + name: persons.name, + })) ) + // Wait for collections to sync flushSync() // Verify that we have the expected joined results - expect(result.state.size).toBe(3) + expect(query.state.size).toBe(3) - expect(result.state.get(`1`)).toEqual({ + expect(query.state.get(`[1,1]`)).toMatchObject({ id: `1`, name: `John Doe`, title: `Issue 1`, }) - expect(result.state.get(`2`)).toEqual({ + expect(query.state.get(`[2,2]`)).toMatchObject({ id: `2`, name: `Jane Doe`, title: `Issue 2`, }) - expect(result.state.get(`3`)).toEqual({ + expect(query.state.get(`[3,1]`)).toMatchObject({ id: `3`, name: `John Doe`, title: `Issue 3`, }) - // Add a new issue for user 1 - emitter.emit(`sync-issue`, [ - { - key: `4`, - type: `insert`, - changes: { - id: `4`, - title: `Issue 4`, - description: `Issue 4 description`, - userId: `2`, - }, + // Add a new issue for user 2 + issueCollection.utils.begin() + issueCollection.utils.write({ + type: `insert`, + value: { + id: `4`, + title: `Issue 4`, + description: `Issue 4 description`, + userId: `2`, }, - ]) + }) + issueCollection.utils.commit() flushSync() - expect(result.state.size).toBe(4) - expect(result.state.get(`4`)).toEqual({ + expect(query.state.size).toBe(4) + expect(query.state.get(`[4,2]`)).toMatchObject({ id: `4`, name: `Jane Doe`, title: `Issue 4`, }) // Update an issue we're already joined with - emitter.emit(`sync-issue`, [ - { - key: `2`, - type: `update`, - changes: { - title: `Updated Issue 2`, - }, + issueCollection.utils.begin() + issueCollection.utils.write({ + type: `update`, + value: { + id: `2`, + title: `Updated Issue 2`, + description: `Issue 2 description`, + userId: `2`, }, - ]) + }) + issueCollection.utils.commit() flushSync() // The updated title should be reflected in the joined results - expect(result.state.get(`2`)).toEqual({ + expect(query.state.get(`[2,2]`)).toMatchObject({ id: `2`, name: `Jane Doe`, title: `Updated Issue 2`, }) // Delete an issue - emitter.emit(`sync-issue`, [ - { - key: `3`, - type: `delete`, + issueCollection.utils.begin() + issueCollection.utils.write({ + type: `delete`, + value: { + id: `3`, + title: `Issue 3`, + description: `Issue 3 description`, + userId: `1`, }, - ]) + }) + issueCollection.utils.commit() flushSync() - // After deletion, user 3 should no longer have a joined result - expect(result.state.get(`3`)).toBeUndefined() + // After deletion, issue 3 should no longer have a joined result + expect(query.state.get(`[3,1]`)).toBeUndefined() + expect(query.state.size).toBe(3) }) }) it(`should recompile query when parameters change and change results`, () => { - cleanup = $effect.root(() => { - const emitter = mitt() - - // Create collection with mutation capability - const collection = new Collection({ + const collection = createCollection( + mockSyncCollectionOptions({ id: `params-change-test`, - sync: { - sync: ({ begin, write, commit }) => { - // Listen for sync events - emitter.on(`sync`, (changes) => { - begin() - ;(changes as Array).forEach((change) => { - write({ - key: change.key, - type: change.type, - value: change.changes as Person, - }) - }) - commit() - }) - }, - }, + getKey: (person: Person) => person.id, + initialData: initialPersons, }) + ) - // Sync from initial state - emitter.emit( - `sync`, - initialPersons.map((person) => ({ - key: person.id, - type: `insert`, - changes: person, - })) + cleanup = $effect.root(() => { + let minAge = $state(30) + + const query = useLiveQuery( + (q) => + q + .from({ collection }) + .where(({ collection: c }) => gt(c.age, minAge)) + .select(({ collection: c }) => ({ + id: c.id, + name: c.name, + age: c.age, + })), + [() => minAge] ) + // Wait for collection to sync flushSync() - let minAge = $state(30) - - const result = useLiveQuery((q) => { - return q - .from({ collection }) - .where(`@age`, `>`, minAge) - .keyBy(`@id`) - .select(`@id`, `@name`, `@age`) - }) - // Initially should return only people older than 30 - expect(result.state.size).toBe(1) - expect(result.state.get(`3`)).toEqual({ + expect(query.state.size).toBe(1) + expect(query.state.get(`3`)).toMatchObject({ id: `3`, name: `John Smith`, age: 35, @@ -449,18 +422,18 @@ describe(`Query Collections`, () => { flushSync() // Now should return all people as they're all older than 20 - expect(result.state.size).toBe(3) - expect(result.state.get(`1`)).toEqual({ + expect(query.state.size).toBe(3) + expect(query.state.get(`1`)).toMatchObject({ id: `1`, name: `John Doe`, age: 30, }) - expect(result.state.get(`2`)).toEqual({ + expect(query.state.get(`2`)).toMatchObject({ id: `2`, name: `Jane Doe`, age: 25, }) - expect(result.state.get(`3`)).toEqual({ + expect(query.state.get(`3`)).toMatchObject({ id: `3`, name: `John Smith`, age: 35, @@ -472,401 +445,707 @@ describe(`Query Collections`, () => { flushSync() // Should now be empty - expect(result.state.size).toBe(0) + expect(query.state.size).toBe(0) }) }) - it(`should stop old query when parameters change`, () => { + it(`should be able to query a result collection with live updates`, () => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `optimistic-changes-test`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }) + ) + cleanup = $effect.root(() => { - const emitter = mitt() + // Initial query + const query = useLiveQuery((q) => + q + .from({ collection }) + .where(({ collection: c }) => gt(c.age, 30)) + .select(({ collection: c }) => ({ + id: c.id, + name: c.name, + team: c.team, + })) + .orderBy(({ collection: c }) => c.id, `asc`) + ) - // Create collection with mutation capability - const collection = new Collection({ - id: `stop-query-test`, - sync: { - sync: ({ begin, write, commit }) => { - emitter.on(`sync`, (changes) => { - begin() - ;(changes as Array).forEach((change) => { - write({ - key: change.key, - type: change.type, - value: change.changes as Person, - }) - }) - commit() - }) - }, - }, + // Wait for collection to sync + flushSync() + + // Grouped query derived from initial query + const groupedQuery = useLiveQuery((q) => + q + .from({ queryResult: query.collection }) + .groupBy(({ queryResult }) => queryResult.team) + .select(({ queryResult }) => ({ + team: queryResult.team, + count: count(queryResult.id), + })) + ) + + // Wait for grouped query to sync + flushSync() + + // Verify initial grouped results + expect(groupedQuery.state.size).toBe(1) + const teamResult = Array.from(groupedQuery.state.values())[0] + expect(teamResult).toMatchObject({ + team: `team1`, + count: 1, }) - // Mock console.log to track when compiledQuery.stop() is called - let logCalls: Array = [] - const originalConsoleLog = console.log - console.log = vi.fn((...args) => { - logCalls.push(args.join(` `)) - originalConsoleLog(...args) + // Insert two new users in different teams + collection.utils.begin() + collection.utils.write({ + type: `insert`, + value: { + id: `5`, + name: `Sarah Jones`, + age: 32, + email: `sarah.jones@example.com`, + isActive: true, + team: `team1`, + }, }) + collection.utils.write({ + type: `insert`, + value: { + id: `6`, + name: `Mike Wilson`, + age: 38, + email: `mike.wilson@example.com`, + isActive: true, + team: `team2`, + }, + }) + collection.utils.commit() - // Add a custom hook that wraps useLiveQuery to log when queries are created and stopped - function useTrackedLiveQuery( - queryFn: (q: InitialQueryBuilder>) => any, - deps: Array<() => unknown> - ): T { - const result = useLiveQuery(queryFn) - const derivedDeps = () => deps.map((dep) => dep()).join(`,`) + flushSync() - $effect(() => { - console.log(`Creating new query with deps`, derivedDeps()) + // Verify the grouped results include the new team members + expect(groupedQuery.state.size).toBe(2) - return () => { - console.log(`Stopping query with deps`, derivedDeps()) - } - }) + const groupedResults = Array.from(groupedQuery.state.values()) + const team1Result = groupedResults.find((r) => r.team === `team1`) + const team2Result = groupedResults.find((r) => r.team === `team2`) - return result as T - } + expect(team1Result).toMatchObject({ + team: `team1`, + count: 2, // John Smith + Sarah Jones + }) + expect(team2Result).toMatchObject({ + team: `team2`, + count: 1, // Mike Wilson + }) + }) + }) - // Sync initial state - emitter.emit( - `sync`, - initialPersons.map((person) => ({ - key: person.id, - type: `insert`, - changes: person, - })) - ) + it(`optimistic state is dropped after commit`, () => { + // Create person collection + const personCollection = createCollection( + mockSyncCollectionOptions({ + id: `person-collection-test-bug`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }) + ) - let minAge = $state(30) - useTrackedLiveQuery( - (q) => - q - .from({ collection }) - .where(`@age`, `>`, minAge) - .keyBy(`@id`) - .select(`@id`, `@name`), - [() => minAge] + // Create issue collection + const issueCollection = createCollection( + mockSyncCollectionOptions({ + id: `issue-collection-test-bug`, + getKey: (issue: Issue) => issue.id, + initialData: initialIssues, + }) + ) + + cleanup = $effect.root(() => { + // Render the hook with a query that joins persons and issues + const queryResult = useLiveQuery((q) => + q + .from({ issues: issueCollection }) + .join({ persons: personCollection }, ({ issues, persons }) => + eq(issues.userId, persons.id) + ) + .select(({ issues, persons }) => ({ + id: issues.id, + title: issues.title, + name: persons.name, + })) ) + // Wait for collections to sync and verify initial state flushSync() - // Initial query should be created - expect( - logCalls.some((call) => { - return call.includes(`Creating new query with deps 30`) - }) - ).toBe(true) - - // Clear log calls - logCalls = [] - - // Change the parameter - minAge = 25 + expect(queryResult.state.size).toBe(3) + + // Insert a new issue directly to test the query updates + issueCollection.utils.begin() + issueCollection.utils.write({ + type: `insert`, + value: { + id: `4`, + title: `New Issue`, + description: `New Issue Description`, + userId: `1`, + }, + }) + issueCollection.utils.commit() flushSync() - // Old query should be stopped and new query created - expect( - logCalls.some((call) => call.includes(`Stopping query with deps 30`)) - ).toBe(true) - expect( - logCalls.some((call) => - call.includes(`Creating new query with deps 25`) - ) - ).toBe(true) - - // Restore console.log - console.log = originalConsoleLog + // Verify the new issue is reflected in the query + expect(queryResult.state.size).toBe(4) + expect(queryResult.state.get(`[4,1]`)).toMatchObject({ + id: `4`, + name: `John Doe`, + title: `New Issue`, + }) }) }) - it(`should be able to query a result collection`, () => { - cleanup = $effect.root(() => { - const emitter = mitt() + it(`should accept pre-created live query collection`, () => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `pre-created-collection-test-vue`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }) + ) - // Create collection with mutation capability - const collection = new Collection({ - id: `optimistic-changes-test`, - sync: { - sync: ({ begin, write, commit }) => { - // Listen for sync events - emitter.on(`*`, (_, changes) => { - begin() - ;(changes as Array).forEach((change) => { - write({ - key: change.key, - type: change.type, - value: change.changes as Person, - }) - }) - commit() - }) - }, - }, + cleanup = $effect.root(() => { + // Create a live query collection beforehand + const liveQueryCollection = createLiveQueryCollection({ + query: (q) => + q + .from({ persons: collection }) + .where(({ persons }) => gt(persons.age, 30)) + .select(({ persons }) => ({ + id: persons.id, + name: persons.name, + age: persons.age, + })), + startSync: true, }) - // Sync from initial state - emitter.emit( - `sync`, - initialPersons.map((person) => ({ - key: person.id, - type: `insert`, - changes: person, - })) - ) + const queryResult = useLiveQuery(liveQueryCollection) + // Wait for collection to sync and state to update flushSync() - // Initial query - const result = useLiveQuery((q) => - q - .from({ collection }) - .where(`@age`, `>`, 30) - .keyBy(`@id`) - .select(`@id`, `@name`, `@team`) - .orderBy({ "@id": `asc` }) - ) + expect(queryResult.state.size).toBe(1) // Only John Smith (age 35) + expect(queryResult.data).toHaveLength(1) - // Grouped query derived from initial query - const groupedResult = useLiveQuery((q) => - q - .from({ queryResult: result.collection }) - .groupBy(`@team`) - .keyBy(`@team`) - .select(`@team`, { count: { COUNT: `@id` } }) - ) + const johnSmith = queryResult.data[0] + expect(johnSmith).toMatchObject({ + id: `3`, + name: `John Smith`, + age: 35, + }) - // Verify initial grouped results - expect(groupedResult.state.size).toBe(1) - expect(groupedResult.state.get(`team1`)).toEqual({ - team: `team1`, - count: 1, + // Verify that the returned collection is the same instance + expect(queryResult.collection).toBe(liveQueryCollection) + }) + }) + + it(`should switch to a different pre-created live query collection when reactive ref changes`, () => { + const collection1 = createCollection( + mockSyncCollectionOptions({ + id: `collection-1-vue`, + getKey: (person: Person) => person.id, + initialData: initialPersons, }) + ) - // Insert two new users in different teams - emitter.emit(`sync`, [ - { - key: `5`, - type: `insert`, - changes: { - id: `5`, - name: `Sarah Jones`, - age: 32, - email: `sarah.jones@example.com`, + const collection2 = createCollection( + mockSyncCollectionOptions({ + id: `collection-2-vue`, + getKey: (person: Person) => person.id, + initialData: [ + { + id: `4`, + name: `Alice Cooper`, + age: 45, + email: `alice.cooper@example.com`, isActive: true, - team: `team1`, + team: `team3`, }, - }, - { - key: `6`, - type: `insert`, - changes: { - id: `6`, - name: `Mike Wilson`, - age: 38, - email: `mike.wilson@example.com`, + { + id: `5`, + name: `Bob Dylan`, + age: 50, + email: `bob.dylan@example.com`, isActive: true, - team: `team2`, + team: `team3`, }, - }, - ]) + ], + }) + ) + + cleanup = $effect.root(() => { + // Create two different live query collections + const liveQueryCollection1 = createLiveQueryCollection({ + query: (q) => + q + .from({ persons: collection1 }) + .where(({ persons }) => gt(persons.age, 30)) + .select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })), + startSync: true, + }) + const liveQueryCollection2 = createLiveQueryCollection({ + query: (q) => + q + .from({ persons: collection2 }) + .where(({ persons }) => gt(persons.age, 40)) + .select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })), + startSync: true, + }) + + // Use a reactive state that can change - this is the proper Svelte pattern + let currentCollection = $state(liveQueryCollection1) + const queryResult = useLiveQuery(() => currentCollection) + + // Wait for first collection to sync flushSync() - // Verify the grouped results include the new team members - expect(groupedResult.state.size).toBe(2) - expect(groupedResult.state.get(`team1`)).toEqual({ - team: `team1`, - count: 2, + expect(queryResult.state.size).toBe(1) // Only John Smith from collection1 + expect(queryResult.state.get(`3`)).toMatchObject({ + id: `3`, + name: `John Smith`, }) - expect(groupedResult.state.get(`team2`)).toEqual({ - team: `team2`, - count: 1, + expect(queryResult.collection.id).toBe(liveQueryCollection1.id) + + // Switch to the second collection by updating the reactive state + currentCollection = liveQueryCollection2 + + // Wait for the reactive change to propagate + flushSync() + + expect(queryResult.state.size).toBe(2) // Alice and Bob from collection2 + expect(queryResult.state.get(`4`)).toMatchObject({ + id: `4`, + name: `Alice Cooper`, + }) + expect(queryResult.state.get(`5`)).toMatchObject({ + id: `5`, + name: `Bob Dylan`, }) + expect(queryResult.collection.id).toBe(liveQueryCollection2.id) + + // Verify we no longer have data from the first collection + expect(queryResult.state.get(`3`)).toBeUndefined() }) }) - it(`optimistic state is dropped after commit`, async () => { - const emitter = mitt() - // Track renders and states - const renderStates: Array<{ - stateSize: number - hasTempKey: boolean - hasPermKey: boolean - timestamp: number - }> = [] + describe(`isReady property`, () => { + it(`should be false initially and true after collection is ready`, () => { + let beginFn: (() => void) | undefined + let commitFn: (() => void) | undefined - // Create person collection - const personCollection = new Collection({ - id: `person-collection-test-bug`, - sync: { - sync: ({ begin, write, commit }) => { - // @ts-expect-error Mitt typing doesn't match our usage - emitter.on(`sync-person`, (changes: Array) => { - begin() - changes.forEach((change) => { - write({ - key: change.key, - type: change.type, - value: change.changes as Person, - }) - }) - commit() - }) + // Create a collection that doesn't start sync immediately + const collection = createCollection({ + id: `is-ready-test`, + getKey: (person: Person) => person.id, + startSync: false, // Don't start sync immediately + sync: { + sync: ({ begin, commit }) => { + beginFn = begin + commitFn = commit + // Don't call begin/commit immediately + }, }, - }, + onInsert: () => Promise.resolve(), + onUpdate: () => Promise.resolve(), + onDelete: () => Promise.resolve(), + }) + + cleanup = $effect.root(() => { + const queryResult = useLiveQuery((q) => + q + .from({ persons: collection }) + .where(({ persons }) => gt(persons.age, 30)) + .select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })) + ) + + // Initially isReady should be false (collection is in idle state) + expect(queryResult.isReady).toBe(false) + + // Start sync manually + collection.preload() + + // Trigger the first commit to make collection ready + if (beginFn && commitFn) { + beginFn() + commitFn() + } + + // Insert data + collection.insert({ + id: `1`, + name: `John Doe`, + age: 35, + email: `john.doe@example.com`, + isActive: true, + team: `team1`, + }) + + // Wait for the collection to be ready + flushSync() + expect(queryResult.isReady).toBe(true) + }) }) - // Create issue collection - const issueCollection = new Collection({ - id: `issue-collection-test-bug`, - sync: { - sync: ({ begin, write, commit }) => { - // @ts-expect-error Mitt typing doesn't match our usage - emitter.on(`sync-issue`, (changes: Array) => { - begin() - changes.forEach((change) => { - write({ - key: change.key, - type: change.type, - value: change.changes as Issue, - }) - }) - commit() - }) + it(`should be true for pre-created collections that are already syncing`, () => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `pre-created-is-ready-test`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }) + ) + + cleanup = $effect.root(() => { + // Create a live query collection that's already syncing + const liveQueryCollection = createLiveQueryCollection({ + query: (q) => + q + .from({ persons: collection }) + .where(({ persons }) => gt(persons.age, 30)) + .select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })), + startSync: true, + }) + + flushSync() + const queryResult = useLiveQuery(liveQueryCollection) + expect(queryResult.isReady).toBe(true) + }) + }) + + it(`should be false for pre-created collections that are not syncing`, () => { + const collection = createCollection({ + id: `not-syncing-is-ready-test`, + getKey: (person: Person) => person.id, + startSync: false, + sync: { + sync: () => { + // Don't sync immediately + }, }, - }, + onInsert: () => Promise.resolve(), + onUpdate: () => Promise.resolve(), + onDelete: () => Promise.resolve(), + }) + + cleanup = $effect.root(() => { + // Create a live query collection that's NOT syncing + const liveQueryCollection = createLiveQueryCollection({ + query: (q) => + q + .from({ persons: collection }) + .where(({ persons }) => gt(persons.age, 30)) + .select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })), + startSync: false, // Not syncing + }) + + const queryResult = useLiveQuery(liveQueryCollection) + expect(queryResult.isReady).toBe(false) + }) }) - // Create a transaction to perform an optimistic mutation - const tx = createTransaction({ - mutationFn: async () => { - emitter.emit(`sync-issue`, [ - { - key: `4`, - type: `insert`, - changes: { - id: `4`, - title: `New Issue`, - description: `New Issue Description`, - userId: `1`, - }, + it(`should update isReady when collection status changes`, () => { + let beginFn: (() => void) | undefined + let commitFn: (() => void) | undefined + + const collection = createCollection({ + id: `status-change-is-ready-test`, + getKey: (person: Person) => person.id, + startSync: false, + sync: { + sync: ({ begin, commit }) => { + beginFn = begin + commitFn = commit + // Don't sync immediately }, - ]) - return Promise.resolve() - }, + }, + onInsert: () => Promise.resolve(), + onUpdate: () => Promise.resolve(), + onDelete: () => Promise.resolve(), + }) + + cleanup = $effect.root(() => { + const query = useLiveQuery((q) => + q + .from({ persons: collection }) + .where(({ persons }) => gt(persons.age, 30)) + .select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })) + ) + + expect(query.isReady).toBe(false) + collection.preload() + if (beginFn && commitFn) { + beginFn() + commitFn() + } + collection.insert({ + id: `1`, + name: `John Doe`, + age: 35, + email: `john.doe@example.com`, + isActive: true, + team: `team1`, + }) + flushSync() + expect(query.isReady).toBe(true) + }) }) - cleanup = $effect.root(() => { - // Sync initial person data - emitter.emit( - `sync-person`, - initialPersons.map((person) => ({ - key: person.id, - type: `insert`, - changes: person, - })) + it(`should maintain isReady state during live updates`, () => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `live-updates-is-ready-test`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }) ) - flushSync() + cleanup = $effect.root(() => { + const queryResult = useLiveQuery((q) => + q + .from({ persons: collection }) + .where(({ persons }) => gt(persons.age, 30)) + .select(({ persons }) => ({ + id: persons.id, + name: persons.name, + })) + ) - // Sync initial issue data - emitter.emit( - `sync-issue`, - initialIssues.map((issue) => ({ - key: issue.id, + flushSync() + const initialIsReady = queryResult.isReady + collection.utils.begin() + collection.utils.write({ type: `insert`, - changes: issue, - })) - ) + value: { + id: `4`, + name: `Kyle Doe`, + age: 40, + email: `kyle.doe@example.com`, + isActive: true, + team: `team1`, + }, + }) + collection.utils.commit() + flushSync() + expect(queryResult.isReady).toBe(true) + expect(queryResult.isReady).toBe(initialIsReady) + }) + }) - flushSync() + it(`should handle isReady with complex queries including joins`, () => { + let personBeginFn: (() => void) | undefined + let personCommitFn: (() => void) | undefined + let issueBeginFn: (() => void) | undefined + let issueCommitFn: (() => void) | undefined - // Render the hook with a query that joins persons and issues - const result = useLiveQuery((q) => - q - .from({ issues: issueCollection }) - .join({ - type: `inner`, - from: { persons: personCollection }, - on: [`@persons.id`, `=`, `@issues.userId`], - }) - .select(`@issues.id`, `@issues.title`, `@persons.name`) - .keyBy(`@id`) - ) + const personCollection = createCollection({ + id: `join-is-ready-persons`, + getKey: (person: Person) => person.id, + startSync: false, + sync: { + sync: ({ begin, commit }) => { + personBeginFn = begin + personCommitFn = commit + // Don't sync immediately + }, + }, + onInsert: () => Promise.resolve(), + onUpdate: () => Promise.resolve(), + onDelete: () => Promise.resolve(), + }) - // Track each render state - $effect(() => { - renderStates.push({ - stateSize: result.state.size, - hasTempKey: result.state.has(`temp-key`), - hasPermKey: result.state.has(`4`), - timestamp: Date.now(), + cleanup = $effect.root(() => { + const issueCollection = createCollection({ + id: `join-is-ready-issues`, + getKey: (issue: Issue) => issue.id, + startSync: false, + sync: { + sync: ({ begin, commit }) => { + issueBeginFn = begin + issueCommitFn = commit + // Don't sync immediately + }, + }, + onInsert: () => Promise.resolve(), + onUpdate: () => Promise.resolve(), + onDelete: () => Promise.resolve(), }) - }) - flushSync() + const query = useLiveQuery((q) => + q + .from({ issues: issueCollection }) + .join({ persons: personCollection }, ({ issues, persons }) => + eq(issues.userId, persons.id) + ) + .select(({ issues, persons }) => ({ + id: issues.id, + title: issues.title, + name: persons.name, + })) + ) - // Verify initial state - expect(result.state.size).toBe(3) + expect(query.isReady).toBe(false) + personCollection.preload() + issueCollection.preload() + if (personBeginFn && personCommitFn) { + personBeginFn() + personCommitFn() + } + if (issueBeginFn && issueCommitFn) { + issueBeginFn() + issueCommitFn() + } + personCollection.insert({ + id: `1`, + name: `John Doe`, + age: 30, + email: `john.doe@example.com`, + isActive: true, + team: `team1`, + }) + issueCollection.insert({ + id: `1`, + title: `Issue 1`, + description: `Issue 1 description`, + userId: `1`, + }) + flushSync() + expect(query.isReady).toBe(true) + }) + }) - // Reset render states array for clarity in the remaining test - renderStates.length = 0 + it(`should handle isReady with parameterized queries`, async () => { + let beginFn: (() => void) | undefined + let commitFn: (() => void) | undefined - // Perform optimistic insert of a new issue - tx.mutate(() => - issueCollection.insert( - { - id: `temp-key`, - title: `New Issue`, - description: `New Issue Description`, - userId: `1`, + const collection = createCollection({ + id: `params-is-ready-test`, + getKey: (person: Person) => person.id, + startSync: false, + sync: { + sync: ({ begin, commit }) => { + beginFn = begin + commitFn = commit + // Don't sync immediately }, - { key: `temp-key` } + }, + onInsert: () => Promise.resolve(), + onUpdate: () => Promise.resolve(), + onDelete: () => Promise.resolve(), + }) + + cleanup = $effect.root(() => { + let minAge = $state(30) + const query = useLiveQuery( + (q) => + q + .from({ collection }) + .where(({ collection: c }) => gt(c.age, minAge)) + .select(({ collection: c }) => ({ + id: c.id, + name: c.name, + })), + [() => minAge] ) - ) - // Verify optimistic state is immediately reflected - expect(result.state.size).toBe(4) - expect(result.state.get(`temp-key`)).toEqual({ - id: `temp-key`, - name: `John Doe`, - title: `New Issue`, + expect(query.isReady).toBe(false) + collection.preload() + if (beginFn && commitFn) { + beginFn() + commitFn() + } + collection.insert({ + id: `1`, + name: `John Doe`, + age: 35, + email: `john.doe@example.com`, + isActive: true, + team: `team1`, + }) + collection.insert({ + id: `2`, + name: `Jane Doe`, + age: 25, + email: `jane.doe@example.com`, + isActive: true, + team: `team2`, + }) + flushSync() + expect(query.isReady).toBe(true) + minAge = 25 + flushSync() + expect(query.isReady).toBe(true) }) }) + }) - // Wait for the transaction to be committed - await tx.isPersisted.promise - flushSync() + it(`should accept config object with pre-built QueryBuilder instance`, async () => { + const collection = createCollection( + mockSyncCollectionOptions({ + id: `config-querybuilder-test-vue`, + getKey: (person: Person) => person.id, + initialData: initialPersons, + }) + ) - $effect.root(() => { - const result = useLiveQuery((q) => - q - .from({ issues: issueCollection }) - .join({ - type: `inner`, - from: { persons: personCollection }, - on: [`@persons.id`, `=`, `@issues.userId`], - }) - .select(`@issues.id`, `@issues.title`, `@persons.name`) - .keyBy(`@id`) - ) + const { Query } = await import(`@tanstack/db`) - // Check if we had any render where the temp key was removed but the permanent key wasn't added yet - const hadFlicker = renderStates.some( - (state) => - !state.hasTempKey && !state.hasPermKey && state.stateSize === 3 - ) + cleanup = $effect.root(() => { + // Create a pre-built QueryBuilder instance + const queryBuilder = new Query() + .from({ persons: collection }) + .where(({ persons }) => gt(persons.age, 30)) + .select(({ persons }) => ({ + id: persons.id, + name: persons.name, + age: persons.age, + })) - expect(hadFlicker).toBe(false) + const queryResult = useLiveQuery({ + query: queryBuilder, + }) - // Verify the temporary key is replaced by the permanent one - expect(result.state.size).toBe(4) - expect(result.state.get(`temp-key`)).toBeUndefined() - expect(result.state.get(`4`)).toEqual({ - id: `4`, - name: `John Doe`, - title: `New Issue`, + // Wait for collection to sync and state to update + flushSync() + + expect(queryResult.state.size).toBe(1) // Only John Smith (age 35) + expect(queryResult.data).toHaveLength(1) + + const johnSmith = queryResult.data[0] + expect(johnSmith).toMatchObject({ + id: `3`, + name: `John Smith`, + age: 35, }) }) }) diff --git a/packages/svelte-db/tsconfig.json b/packages/svelte-db/tsconfig.json index 3ff4acd6..dd13cec9 100644 --- a/packages/svelte-db/tsconfig.json +++ b/packages/svelte-db/tsconfig.json @@ -10,7 +10,10 @@ "strict": true, "esModuleInterop": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true + "forceConsistentCasingInFileNames": true, + "paths": { + "@tanstack/db": ["../db/src"] + } }, "include": ["src/**/*", "tests", "vite.config.ts", "svelte.config.js"], "exclude": ["node_modules", "dist"] From 85dd1dcaf1fc178540c6f435aa4f3e9ba65d164a Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Mon, 21 Jul 2025 17:35:36 -0700 Subject: [PATCH 20/24] chore: update changeset --- .changeset/khaki-ties-shout.md | 9 ++++++--- packages/svelte-db/src/useLiveQuery.svelte.ts | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.changeset/khaki-ties-shout.md b/.changeset/khaki-ties-shout.md index 228ddda8..a0a8569b 100644 --- a/.changeset/khaki-ties-shout.md +++ b/.changeset/khaki-ties-shout.md @@ -9,13 +9,16 @@ Usage example: ```svelte - + ``` diff --git a/packages/svelte-db/src/useLiveQuery.svelte.ts b/packages/svelte-db/src/useLiveQuery.svelte.ts index 700be331..09e62d68 100644 --- a/packages/svelte-db/src/useLiveQuery.svelte.ts +++ b/packages/svelte-db/src/useLiveQuery.svelte.ts @@ -223,7 +223,7 @@ export function useLiveQuery( deps: Array<() => unknown> = [] ): UseLiveQueryReturn | UseLiveQueryReturnWithCollection { const collection = $derived.by(() => { - // First check if the original parameter might be a ref/getter + // First check if the original parameter might be a getter // by seeing if toValue returns something different than the original let unwrappedParam = configOrQueryOrCollection try { From c38d858a78a85c0c15ed04cad64356cbf1a6b1c5 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Mon, 21 Jul 2025 17:37:39 -0700 Subject: [PATCH 21/24] chore: update readme --- packages/svelte-db/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte-db/README.md b/packages/svelte-db/README.md index eae8bf5b..13ae2725 100644 --- a/packages/svelte-db/README.md +++ b/packages/svelte-db/README.md @@ -1,3 +1,3 @@ # @tanstack/svelte-db -Svelte hooks for TanStack DB. See [TanStack/db](https://github.com/TanStack/db) for more details. +Svelte helpers for TanStack DB. See [TanStack/db](https://github.com/TanStack/db) for more details. From 3a55f3f2636bd9551124eae778a0845d4a1dec8b Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Tue, 22 Jul 2025 08:36:23 -0700 Subject: [PATCH 22/24] chore: add type test script --- packages/svelte-db/package.json | 1 + packages/svelte-db/src/useLiveQuery.svelte.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index 665ad392..1cf400e0 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -5,6 +5,7 @@ "scripts": { "build": "svelte-package --input ./src --output ./dist", "test": "npx vitest --run", + "test:types": "svelte-check --tsconfig ./tsconfig.json", "lint": "eslint . --fix" }, "files": [ diff --git a/packages/svelte-db/src/useLiveQuery.svelte.ts b/packages/svelte-db/src/useLiveQuery.svelte.ts index 09e62d68..44ce34d8 100644 --- a/packages/svelte-db/src/useLiveQuery.svelte.ts +++ b/packages/svelte-db/src/useLiveQuery.svelte.ts @@ -245,7 +245,7 @@ export function useLiveQuery( typeof unwrappedParam.id === `string` if (isCollection) { - // It's already a collection, ensure sync is started for Vue hooks + // It's already a collection, ensure sync is started for Svelte helpers unwrappedParam.startSyncImmediate() return unwrappedParam } @@ -253,7 +253,7 @@ export function useLiveQuery( // Reference deps to make computed reactive to them deps.forEach((dep) => toValue(dep)) - // Ensure we always start sync for Vue hooks + // Ensure we always start sync for Svelte helpers if (typeof unwrappedParam === `function`) { return createLiveQueryCollection({ query: unwrappedParam, From 352ff7327e4dc4e814c5437532d742877d2f3cc9 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Tue, 22 Jul 2025 08:42:28 -0700 Subject: [PATCH 23/24] chore: clean up jsdoc --- packages/svelte-db/src/useLiveQuery.svelte.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/svelte-db/src/useLiveQuery.svelte.ts b/packages/svelte-db/src/useLiveQuery.svelte.ts index 44ce34d8..1d078789 100644 --- a/packages/svelte-db/src/useLiveQuery.svelte.ts +++ b/packages/svelte-db/src/useLiveQuery.svelte.ts @@ -167,7 +167,7 @@ export function useLiveQuery( /** * Subscribe to an existing query collection (can be reactive) - * @param liveQueryCollection - Pre-created query collection to subscribe to (can be a ref) + * @param liveQueryCollection - Pre-created query collection to subscribe to (can be a getter) * @returns Reactive object with query data, state, and status information * @example * // Using pre-created query collection @@ -293,7 +293,7 @@ export function useLiveQuery( $effect(() => { const currentCollection = collection - // Update status ref whenever the effect runs + // Update status state whenever the effect runs status = currentCollection.status // Clean up previous subscription @@ -332,7 +332,7 @@ export function useLiveQuery( // Update the data array to maintain sorted order syncDataFromCollection(currentCollection) - // Update status ref on every change + // Update status state on every change status = currentCollection.status } ) From 04a07bcd3f3f41ed77183d49a588362917319a55 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Tue, 22 Jul 2025 10:25:56 -0700 Subject: [PATCH 24/24] chore: fix build --- packages/svelte-db/package.json | 8 ++-- packages/svelte-db/tsconfig.build.json | 8 ++++ pnpm-lock.yaml | 60 +++++++++++++------------- 3 files changed, 42 insertions(+), 34 deletions(-) create mode 100644 packages/svelte-db/tsconfig.build.json diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index 1cf400e0..3d9b5754 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -3,7 +3,7 @@ "description": "Svelte integration for @tanstack/db", "version": "0.0.0", "scripts": { - "build": "svelte-package --input ./src --output ./dist", + "build": "svelte-package --input ./src --output ./dist --tsconfig ./tsconfig.build.json", "test": "npx vitest --run", "test:types": "svelte-check --tsconfig ./tsconfig.json", "lint": "eslint . --fix" @@ -32,12 +32,12 @@ "svelte": "^5.0.0" }, "devDependencies": { - "@sveltejs/package": "^2.3.11", + "@sveltejs/package": "^2.4.0", "@vitest/coverage-istanbul": "^3.0.9", - "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@sveltejs/vite-plugin-svelte": "^6.1.0", "publint": "^0.3.2", "svelte": "^5.28.6", - "svelte-check": "^4.2.0" + "svelte-check": "^4.3.0" }, "keywords": [ "optimistic", diff --git a/packages/svelte-db/tsconfig.build.json b/packages/svelte-db/tsconfig.build.json new file mode 100644 index 00000000..b3421470 --- /dev/null +++ b/packages/svelte-db/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": {} + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "tests"] +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 250bcd9a..f5adf5e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -318,11 +318,11 @@ importers: version: link:../db devDependencies: '@sveltejs/package': - specifier: ^2.3.11 - version: 2.3.11(svelte@5.28.6)(typescript@5.8.2) + specifier: ^2.4.0 + version: 2.4.0(svelte@5.28.6)(typescript@5.8.2) '@sveltejs/vite-plugin-svelte': - specifier: ^5.0.3 - version: 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) + specifier: ^6.1.0 + version: 6.1.0(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) '@vitest/coverage-istanbul': specifier: ^3.0.9 version: 3.0.9(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@26.0.0)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) @@ -333,8 +333,8 @@ importers: specifier: ^5.28.6 version: 5.28.6 svelte-check: - specifier: ^4.2.0 - version: 4.2.0(picomatch@4.0.3)(svelte@5.28.6)(typescript@5.8.2) + specifier: ^4.3.0 + version: 4.3.0(picomatch@4.0.3)(svelte@5.28.6)(typescript@5.8.2) packages/trailbase-db-collection: dependencies: @@ -1832,27 +1832,27 @@ packages: peerDependencies: acorn: ^8.9.0 - '@sveltejs/package@2.3.11': - resolution: {integrity: sha512-DSMt2U0XNAdoQBYksrmgQi5dKy7jUTVDJLiagS/iXF7AShjAmTbGJQKruBuT/FfYAWvNxfQTSjkXU8eAIjVeNg==} + '@sveltejs/package@2.4.0': + resolution: {integrity: sha512-DZzPhkSkxJDBI2o07FbyrI7pxOMXl0j4RR5AB0aH/RVnoBC5lBl4v4FAW5WFrTRu3IC3H9y00MIia4uZ1buX+w==} engines: {node: ^16.14 || >=18} hasBin: true peerDependencies: svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 - '@sveltejs/vite-plugin-svelte-inspector@4.0.1': - resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22} + '@sveltejs/vite-plugin-svelte-inspector@5.0.0': + resolution: {integrity: sha512-iwQ8Z4ET6ZFSt/gC+tVfcsSBHwsqc6RumSaiLUkAurW3BCpJam65cmHw0oOlDMTO0u+PZi9hilBRYN+LZNHTUQ==} + engines: {node: ^20.19 || ^22.12 || >=24} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^5.0.0 + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 svelte: ^5.0.0 - vite: ^6.0.0 + vite: ^6.3.0 || ^7.0.0 - '@sveltejs/vite-plugin-svelte@5.0.3': - resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22} + '@sveltejs/vite-plugin-svelte@6.1.0': + resolution: {integrity: sha512-+U6lz1wvGEG/BvQyL4z/flyNdQ9xDNv5vrh+vWBWTHaebqT0c9RNggpZTo/XSPoHsSCWBlYaTlRX8pZ9GATXCw==} + engines: {node: ^20.19 || ^22.12 || >=24} peerDependencies: svelte: ^5.0.0 - vite: ^6.0.0 + vite: ^6.3.0 || ^7.0.0 '@svitejs/changesets-changelog-github-compact@1.2.0': resolution: {integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==} @@ -5845,8 +5845,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@4.2.0: - resolution: {integrity: sha512-79ozTLjGBQ2R5PvZ7enSYBsMyY1fy3pwQ/N1BtuTVXtQRH9Vc10eV66LePV52t1ZlflZBTkIGz79cStPnCUEEQ==} + svelte-check@4.3.0: + resolution: {integrity: sha512-Iz8dFXzBNAM7XlEIsUjUGQhbEE+Pvv9odb9+0+ITTgFWZBGeJRRYqHUUglwe2EkLD5LIsQaAc4IUJyvtKuOO5w==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: @@ -6366,10 +6366,10 @@ packages: yaml: optional: true - vitefu@1.0.6: - resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 peerDependenciesMeta: vite: optional: true @@ -8011,7 +8011,7 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/package@2.3.11(svelte@5.28.6)(typescript@5.8.2)': + '@sveltejs/package@2.4.0(svelte@5.28.6)(typescript@5.8.2)': dependencies: chokidar: 4.0.3 kleur: 4.1.5 @@ -8022,25 +8022,25 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte': 6.1.0(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) debug: 4.4.1 svelte: 5.28.6 vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0))': + '@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.28.6)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) debug: 4.4.1 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.28.6 vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0) - vitefu: 1.0.6(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) + vitefu: 1.1.1(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)) transitivePeerDependencies: - supports-color @@ -12694,7 +12694,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.2.0(picomatch@4.0.3)(svelte@5.28.6)(typescript@5.8.2): + svelte-check@4.3.0(picomatch@4.0.3)(svelte@5.28.6)(typescript@5.8.2): dependencies: '@jridgewell/trace-mapping': 0.3.29 chokidar: 4.0.3 @@ -13214,7 +13214,7 @@ snapshots: tsx: 4.19.3 yaml: 2.7.0 - vitefu@1.0.6(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)): + vitefu@1.1.1(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)): optionalDependencies: vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.43.1)(tsx@4.19.3)(yaml@2.7.0)