From 1b1a1961bced88452a594d90ccb13fa2641566ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 17 Feb 2025 00:16:41 +0100 Subject: [PATCH 001/326] Dependencies upgrade --- .npmrc | 1 + bun.lockb | Bin 153528 -> 167960 bytes packages/example/package.json | 32 +++++++++++++------------- packages/example/src/routes/tests.tsx | 18 +++++++-------- packages/reffuse/package.json | 4 ++-- 5 files changed, 28 insertions(+), 27 deletions(-) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..7bd7ffe --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@thilawyn:registry=https://git.valverde.cloud/api/packages/thilawyn/npm/ diff --git a/bun.lockb b/bun.lockb index fa0518b996a55f809b137efb772d51e4a8a05f45..f1328ff7c71c6a2e2778df70f333aec4ab26b55a 100755 GIT binary patch delta 47462 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 diff --git a/packages/example/package.json b/packages/example/package.json index ee4ebd4..b78aa7f 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -11,32 +11,32 @@ "preview": "vite preview" }, "devDependencies": { - "@eslint/js": "^9.18.0", - "@tanstack/react-router": "^1.97.3", - "@tanstack/router-devtools": "^1.97.3", - "@tanstack/router-plugin": "^1.97.3", + "@eslint/js": "^9.20.0", + "@tanstack/react-router": "^1.105.0", + "@tanstack/router-devtools": "^1.105.0", + "@tanstack/router-plugin": "^1.105.0", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.0.7", + "@types/react": "^19.0.9", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", - "effect": "^3.12.5", - "eslint": "^9.18.0", + "effect": "^3.13.1", + "eslint": "^9.20.1", "eslint-plugin-react-hooks": "^5.1.0", - "eslint-plugin-react-refresh": "^0.4.18", - "globals": "^15.14.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", "react": "^19.0.0", "react-dom": "^19.0.0", "reffuse": "workspace:*", - "typescript-eslint": "^8.21.0", - "vite": "^6.0.11" + "typescript-eslint": "^8.24.0", + "vite": "^6.1.0" }, "dependencies": { - "@effect/platform": "^0.74.0", - "@effect/platform-browser": "^0.53.0", - "@radix-ui/themes": "^3.1.6", + "@effect/platform": "^0.77.1", + "@effect/platform-browser": "^0.56.1", + "@radix-ui/themes": "^3.2.0", "@typed/id": "^0.17.1", "@typed/lazy-ref": "^0.3.3", - "lucide-react": "^0.473.0", - "mobx": "^6.13.5" + "lucide-react": "^0.475.0", + "mobx": "^6.13.6" } } diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index a019c4b..28117f0 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -1,6 +1,5 @@ import { R } from "@/reffuse" import { createFileRoute } from "@tanstack/react-router" -import { GetRandomValues, makeUuid4 } from "@typed/id" import { Console, Effect } from "effect" @@ -9,15 +8,16 @@ export const Route = createFileRoute("/tests")({ }) function RouteComponent() { - // R.useMemo(Effect.addFinalizer(() => Console.log("Cleanup!")).pipe( - // Effect.map(() => "test") - // )) + // const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( + // Effect.andThen(makeUuid4), + // Effect.provide(GetRandomValues.CryptoRandom), + // ), []) + // console.log(value) - const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( - Effect.andThen(makeUuid4), - Effect.provide(GetRandomValues.CryptoRandom), - ), []) - console.log(value) + R.useFork(Effect.addFinalizer(() => Console.log("cleanup")).pipe( + Effect.andThen(Console.log("ouient")), + Effect.delay("1 second"), + )) return

Hello "/tests"!
} diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index d729b00..925e4a7 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -30,8 +30,8 @@ }, "devDependencies": { "@typed/lazy-ref": "^0.3.3", - "@types/react": "^19.0.7", - "effect": "^3.12.5", + "@types/react": "^19.0.9", + "effect": "^3.13.1", "react": "^19.0.0" } } -- 2.49.1 From a7a0951b6168e3e03f84e9746b892a1d7d0d5ece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Feb 2025 01:08:26 +0100 Subject: [PATCH 002/326] Dependencies fix --- bun.lock | 803 ++++++++++++++++++ bun.lockb | Bin 167960 -> 0 bytes package.json | 4 +- packages/example/package.json | 19 +- packages/example/src/routes/time.tsx | 4 +- packages/example/src/todos/views/VNewTodo.tsx | 4 +- packages/reffuse/package.json | 5 +- packages/reffuse/src/Reffuse.ts | 41 +- 8 files changed, 839 insertions(+), 41 deletions(-) create mode 100644 bun.lock delete mode 100755 bun.lockb diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..bf4b7fe --- /dev/null +++ b/bun.lock @@ -0,0 +1,803 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "devDependencies": { + "npm-check-updates": "^17.1.14", + "npm-sort": "^0.0.4", + "typescript": "^5.7.3", + }, + }, + "packages/example": { + "name": "@reffuse/example", + "version": "0.0.0", + "dependencies": { + "@effect/platform": "~0.77.1", + "@effect/platform-browser": "~0.56.1", + "@radix-ui/themes": "^3.2.0", + "@typed/id": "^0.17.1", + "@typed/lazy-ref": "^0.3.3", + "effect": "~3.13.1", + "lucide-react": "^0.475.0", + "mobx": "^6.13.6", + "reffuse": "workspace:*", + }, + "devDependencies": { + "@eslint/js": "^9.20.0", + "@tanstack/react-router": "^1.105.0", + "@tanstack/router-devtools": "^1.105.0", + "@tanstack/router-plugin": "^1.105.0", + "@thilawyn/thilaschema": "^0.1.4", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.20.1", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "typescript-eslint": "^8.24.1", + "vite": "^6.1.0", + }, + }, + "packages/reffuse": { + "name": "reffuse", + "version": "0.1.1", + "devDependencies": { + "@types/react": "^19.0.10", + "effect": "~3.13.1", + "react": "^19.0.0", + }, + }, + }, + "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], + + "@babel/compat-data": ["@babel/compat-data@7.26.8", "", {}, "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ=="], + + "@babel/core": ["@babel/core@7.26.9", "", { "dependencies": { "@ampproject/remapping": "^2.2.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/helpers": "^7.26.9", "@babel/parser": "^7.26.9", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.9", "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw=="], + + "@babel/generator": ["@babel/generator@7.26.9", "", { "dependencies": { "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.26.5", "", { "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="], + + "@babel/helpers": ["@babel/helpers@7.26.9", "", { "dependencies": { "@babel/template": "^7.26.9", "@babel/types": "^7.26.9" } }, "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA=="], + + "@babel/parser": ["@babel/parser@7.26.9", "", { "dependencies": { "@babel/types": "^7.26.9" }, "bin": "./bin/babel-parser.js" }, "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg=="], + + "@babel/template": ["@babel/template@7.26.9", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9" } }, "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA=="], + + "@babel/traverse": ["@babel/traverse@7.26.9", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.9", "@babel/parser": "^7.26.9", "@babel/template": "^7.26.9", "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg=="], + + "@babel/types": ["@babel/types@7.26.9", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw=="], + + "@effect/platform": ["@effect/platform@0.77.1", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.13.1" } }, "sha512-3oHbKiOLN7AIjyucZW+kH5ebG1PhEEBrsdd+HWbDQbAG0gVZfgOUmXR9cyM6M9L+9oVPgOW5mIgcEi6RvD02Cw=="], + + "@effect/platform-browser": ["@effect/platform-browser@0.56.1", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.77.1", "effect": "^3.13.1" } }, "sha512-LKuLblMHuHKsv9ZdN8j44zzY4ftQaGh5jsOWqTtoHIDSS8beUOcp2a5JnsRT310N4Ym7e14cKWfqgdAXm+J0dw=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.19.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w=="], + + "@eslint/core": ["@eslint/core@0.11.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.2.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w=="], + + "@eslint/js": ["@eslint/js@9.20.0", "", {}, "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.5", "", { "dependencies": { "@eslint/core": "^0.10.0", "levn": "^0.4.1" } }, "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A=="], + + "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.2", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.1", "", {}, "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@radix-ui/colors": ["@radix-ui/colors@3.0.0", "", {}, "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg=="], + + "@radix-ui/number": ["@radix-ui/number@1.1.0", "", {}, "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="], + + "@radix-ui/react-accessible-icon": ["@radix-ui/react-accessible-icon@1.1.2", "", { "dependencies": { "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+rnMO0SEfzkcHr93RshkQVpOA26MtGOv4pcS9QUnLg4F8+GDmCJ8c2FEPhPz5e7arf31EzbTqJxFbzg3qen14g=="], + + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collapsible": "1.1.3", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A=="], + + "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dialog": "1.1.6", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-p4XnPqgej8sZAAReCAKgz1REYZEBLR8hU9Pg27wFnCWIMc8g1ccCs0FjBcy05V15VTu8pAePw/VDYeOm/uZ6yQ=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg=="], + + "@radix-ui/react-aspect-ratio": ["@radix-ui/react-aspect-ratio@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TaJxYoCpxJ7vfEkv2PTNox/6zzmpKXT6ewvCuf2tTOIVN45/Jahhlld29Yw4pciOXS2Xq91/rSGEdmEnUWZCqA=="], + + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.3", "", { "dependencies": { "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Paen00T4P8L8gd9bNsRMw7Cbaz85oxiv+hzomsRZgFm2byltPFDtfcoqlWJ8GyZlIBWgLssJlzLCnKU0G0302g=="], + + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q=="], + + "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-menu": "2.1.6", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-aUP99QZ3VU84NPsHeaFt4cQUNgJqFsLLOt/RbbWXszZ6MP0DpDyjkFZORr4RpAEx3sUBk+Kc8h13yGtC5Qw8dg=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg=="], + + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-menu": "2.1.6", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA=="], + + "@radix-ui/react-form": ["@radix-ui/react-form@0.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-label": "2.1.2", "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Owj1MjLq6/Rp85bgzYI+zRK5APLiWDtXDM63Z39FW15bNdehrcS+FjQgLGQYswFzipYu4GAA+t5w/VqvvNZ3ag=="], + + "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-E4ozl35jq0VRlrdc4dhHrNSV0JqBb4Jy73WAhBEK7JoYnQ83ED5r0Rb/XdVKw89ReAJN38N492BAPBZQ57VmqQ=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="], + + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw=="], + + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-callback-ref": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg=="], + + "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-menu": "2.1.6", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-FHq7+3DlXwh/7FOM4i0G4bC4vPjiq89VEEvNF4VMLchGnaUuUbE5uKXMUCjdKaOghEEMeiKa5XCa2Pk4kteWmg=="], + + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-myMHHQUZ3ZLTi8W381/Vu43Ia0NqakkQZ2vzynMmTUtQQ9kNkjzhOwkZC9TAM5R07OZUVIQyHC06f/9JZJpvvA=="], + + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.2", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-rect": "1.1.0", "@radix-ui/react-use-size": "1.1.0", "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.2", "", { "dependencies": { "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w=="], + + "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.2", "", { "dependencies": { "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-u1IgJFQ4zNAUTjGdDL5dcl/U8ntOR6jsnhxKb5RKp5Ozwl88xKR9EqRZOe/Mk8tnx0x5tNUe2F+MzsyjqMg0MA=="], + + "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.2.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-xtCsqt8Rp09FK50ItqEqTJ7Sxanz8EM8dnkVIhJrc/wkMMomSmXHvYbhv3E7Zx4oXh98aaLt9W679SUYXg4IDA=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw=="], + + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.3", "", { "dependencies": { "@radix-ui/number": "1.1.0", "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-l7+NNBfBYYJa9tNqVcP2AGvxdE3lmE6kFTBXdvHgUaZuy+4wGCL1Cl2AfaR7RKyimj7lZURGLwFO59k4eBnDJQ=="], + + "@radix-ui/react-select": ["@radix-ui/react-select@2.1.6", "", { "dependencies": { "@radix-ui/number": "1.1.0", "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg=="], + + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ=="], + + "@radix-ui/react-slider": ["@radix-ui/react-slider@1.2.3", "", { "dependencies": { "@radix-ui/number": "1.1.0", "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-nNrLAWLjGESnhqBqcCNW4w2nn7LxudyMzeB6VgdyAnFLC6kfQgnAjSL2v6UkQTnDctJBlxrmxfplWS4iYjdUTw=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ=="], + + "@radix-ui/react-switch": ["@radix-ui/react-switch@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng=="], + + "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gN4dpuIVKEgpLn1z5FhzT9mYRUitbfZq9XqN/7kkBMUgFTzTG8x/KszWJugJXHcwxckY8xcKDZPz7kG3o6DsUA=="], + + "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lntKchNWx3aCHuWKiDY+8WudiegQvBpDRAYL8dKLRvKEH8VOpl0XX6SSU/bUBqIRJbcTy4+MW06Wv8vgp10rzQ=="], + + "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-toggle": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-JBm6s6aVG/nwuY5eadhU2zDi/IwYS0sDM5ZWb4nymv/hn3hZdkw+gENn0LP4iY1yCd7+bgJaCwueMYJIU3vk4A=="], + + "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-separator": "1.1.2", "@radix-ui/react-toggle-group": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wT20eQ7ScFk+kBMDmHp+lMk18cgxhu35b2Bn5deUcPxiVwfn5vuZgi7NGcHu8ocdkinahmp4FaSZysKDyRVPWQ=="], + + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.1.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.0", "", { "dependencies": { "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.0", "", {}, "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg=="], + + "@radix-ui/themes": ["@radix-ui/themes@3.2.0", "", { "dependencies": { "@radix-ui/colors": "^3.0.0", "classnames": "^2.3.2", "radix-ui": "^1.1.2", "react-remove-scroll-bar": "^2.3.8" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-cG/47tfHN9FW1ZoAigd3oUeJaIm591vGtQ97PrhfwS22IJgWhE5h6D0w2m+NVbKRVo8qIWCG+hiWN04MlLoW4A=="], + + "@reffuse/example": ["@reffuse/example@workspace:packages/example"], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.34.8", "", { "os": "android", "cpu": "arm" }, "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.34.8", "", { "os": "android", "cpu": "arm64" }, "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.34.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.34.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.34.8", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.34.8", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.34.8", "", { "os": "linux", "cpu": "arm" }, "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.34.8", "", { "os": "linux", "cpu": "arm" }, "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.34.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.34.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.34.8", "", { "os": "linux", "cpu": "none" }, "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.34.8", "", { "os": "linux", "cpu": "ppc64" }, "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.34.8", "", { "os": "linux", "cpu": "none" }, "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.34.8", "", { "os": "linux", "cpu": "s390x" }, "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.34.8", "", { "os": "linux", "cpu": "x64" }, "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.34.8", "", { "os": "linux", "cpu": "x64" }, "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.34.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.34.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.34.8", "", { "os": "win32", "cpu": "x64" }, "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + + "@tanstack/history": ["@tanstack/history@1.99.13", "", {}, "sha512-JMd7USmnp8zV8BRGIjALqzPxazvKtQ7PGXQC7n39HpbqdsmfV2ePCzieO84IvN+mwsTrXErpbjI4BfKCa+ZNCg=="], + + "@tanstack/react-router": ["@tanstack/react-router@1.105.0", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "^1.104.1", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-k4Umuy7rna/hhfHkmbq9dCmj9Hp8D0V6dPNCrCXceJb0gQWGxl1KWLXFbw8Ywe/sNyzIzPrMwrMit++MXHo8iw=="], + + "@tanstack/react-store": ["@tanstack/react-store@0.7.0", "", { "dependencies": { "@tanstack/store": "0.7.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng=="], + + "@tanstack/router-core": ["@tanstack/router-core@1.104.1", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/store": "^0.7.0" } }, "sha512-8nP/V5paP+S/17rlw+B2F12R2bB9PixU/+qnD2QdCjK1ajnG4qA0pVN3VSTQe2oCKND6GPZpm2ikmQWumwss9Q=="], + + "@tanstack/router-devtools": ["@tanstack/router-devtools@1.105.0", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/react-router": "^1.105.0", "csstype": "^3.0.10", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["csstype"] }, "sha512-X583hyUyhL30g5ax1J/lbgb3DYpgsiSUv0ERaF5Gg0PoxPYJSybmw79xwFbrTBDxXCXxfg4AFCAEcmkAQemPWA=="], + + "@tanstack/router-generator": ["@tanstack/router-generator@1.105.0", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.99.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.1" }, "peerDependencies": { "@tanstack/react-router": "^1.105.0" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-P5e4S7XcaECWKDdR4Zs/FpY4Z127zGv1FcmKEzsFRSGJZm7lHshWayYJIjwkeJ+Ier2IkVN+VRaFWC5GKv0jIg=="], + + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.105.0", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-generator": "^1.105.0", "@tanstack/router-utils": "^1.102.2", "@tanstack/virtual-file-routes": "^1.99.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.9", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.1" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.105.0", "vite": ">=5.0.0 || >=6.0.0", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "webpack"] }, "sha512-iGwKZIyl8+os4PA9v57BlTtKVnQ5mCvxYT4p5TR/Q8zW1KBs4fC5F7EhL1BgH8fY12IL4ByuuJ+porzp+mfmJQ=="], + + "@tanstack/router-utils": ["@tanstack/router-utils@1.102.2", "", { "dependencies": { "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "ansis": "^3.11.0", "diff": "^7.0.0" } }, "sha512-Uwl2nbrxhCzviaHHBLNPhSC/OMpZLdOTxTJndUSsXTzWUP4IoQcVmngaIsxi9iriE3ArC1VXuanUAkfGmimNOQ=="], + + "@tanstack/store": ["@tanstack/store@0.7.0", "", {}, "sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg=="], + + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.99.0", "", {}, "sha512-XvX8bfdo4CYiCW+ItVdBfCorh3PwQFqYqd7ll+XKWiWOJpqUGIG7VlziVavARZpUySiY2VBlHadiUYS7jhgjRg=="], + + "@thilawyn/thilaschema": ["@thilawyn/thilaschema@0.1.4", "https://git.valverde.cloud/api/packages/Thilawyn/npm/%40thilawyn%2Fthilaschema/-/0.1.4/thilaschema-0.1.4.tgz", { "dependencies": { "remeda": "^2.17.0", "type-fest": "^4.26.1" } }, "sha512-o+lFjnRrD8N7kJtToKl+OYvVnOwaCGr1X9yMSX/8Y1n4KopOOGFSA9xqmx+MpMe3okp2Hq3Xu1aGHzFsZWxc2A=="], + + "@typed/id": ["@typed/id@0.17.1", "", { "dependencies": { "effect": "^3.11.9" } }, "sha512-+nypUUw6PJWePD1aF1CHY4995hDF3VA9c8EBtp1M+pTnyLBZQIkgKbOKamimnl4U+ZV5I3qC+3q1Y4hpmxT+zw=="], + + "@typed/lazy-ref": ["@typed/lazy-ref@0.3.3", "", { "dependencies": { "effect": "^3.11.9" } }, "sha512-qJoy01/RFYwWBaWhQBzL3Ow20Q+CPybJ/KJnGNKzyDpRUFcEvd3YSQMqZjRdBZmG2wnEpjedAnlCx9ApvKJIlA=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.6.8", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="], + + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/react": ["@types/react@19.0.10", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g=="], + + "@types/react-dom": ["@types/react-dom@19.0.4", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.24.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.24.1", "@typescript-eslint/type-utils": "8.24.1", "@typescript-eslint/utils": "8.24.1", "@typescript-eslint/visitor-keys": "8.24.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.24.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.24.1", "@typescript-eslint/types": "8.24.1", "@typescript-eslint/typescript-estree": "8.24.1", "@typescript-eslint/visitor-keys": "8.24.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.24.1", "", { "dependencies": { "@typescript-eslint/types": "8.24.1", "@typescript-eslint/visitor-keys": "8.24.1" } }, "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.24.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.24.1", "@typescript-eslint/utils": "8.24.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.24.1", "", {}, "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.24.1", "", { "dependencies": { "@typescript-eslint/types": "8.24.1", "@typescript-eslint/visitor-keys": "8.24.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.24.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.24.1", "@typescript-eslint/types": "8.24.1", "@typescript-eslint/typescript-estree": "8.24.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.24.1", "", { "dependencies": { "@typescript-eslint/types": "8.24.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.3.4", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug=="], + + "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "ansis": ["ansis@3.15.0", "", {}, "sha512-zIcWDJ+Kwqxfdnogx66Gxzr0kVmCcRAdat9nlY2IHsshqTN4fBH6tMeRMPA/2w0rpBayIJvjQAaa2/4RDrNqwg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.4", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A=="], + + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.9", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-JLIhax/xullfInZjtu13UJjaLHDeTzt3vOeomaSUdO/nAMEL/pWC/laKrSvWylXMnVWyL5bpmG9njqBZlUQOdg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001700", "", {}, "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "diff": ["diff@7.0.0", "", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="], + + "effect": ["effect@3.13.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-YbA45m51eZapqy/ptZvIIZi+XBj13fPCzbiDRLgxZTEUhKuf4xLzuuSsKc61Y3SIscMM2o+VPht2ty+bVEQHQQ=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.102", "", {}, "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q=="], + + "esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.20.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.11.0", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "9.20.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.1.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw=="], + + "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.19", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ=="], + + "eslint-scope": ["eslint-scope@8.2.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], + + "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-my-way-ts": ["find-my-way-ts@0.1.5", "", {}, "sha512-4GOTMrpGQVzsCH2ruUn2vmwzV/02zF4q+ybhCIrw/Rkt3L8KWcycdC6aJMctJzwN4fXD4SD5F/4B9Sksh5rE0A=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.2", "", {}, "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + + "goober": ["goober@2.1.16", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "lucide-react": ["lucide-react@0.475.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "mobx": ["mobx@6.13.6", "", {}, "sha512-r19KNV0uBN4b+ER8Z0gA4y+MzDYIQ2SvOmn3fUrqPnWXdQfakd9yfbPBDBF/p5I+bd3N5Rk1fHONIvMay+bJGA=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "multipasta": ["multipasta@0.2.5", "", {}, "sha512-c8eMDb1WwZcE02WVjHoOmUVk7fnKU/RmUcosHACglrWAuPQsEJv+E8430sXj6jNc1jHw0zrS16aCjQh4BcEb4A=="], + + "nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-check-updates": ["npm-check-updates@17.1.14", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA=="], + + "npm-sort": ["npm-sort@0.0.4", "", { "bin": { "npm-sort": "./index.js" } }, "sha512-S5Id/3Jvr7Cf/QnWjRteprngERCBhhEFOM+wMhUrAYP060/HUBC1aL5GoXS3xITlgacJCWaSmP4HQaAt91nNYQ=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "postcss": ["postcss@8.5.2", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.5.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "radix-ui": ["radix-ui@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-accessible-icon": "1.1.2", "@radix-ui/react-accordion": "1.2.3", "@radix-ui/react-alert-dialog": "1.1.6", "@radix-ui/react-aspect-ratio": "1.1.2", "@radix-ui/react-avatar": "1.1.3", "@radix-ui/react-checkbox": "1.1.4", "@radix-ui/react-collapsible": "1.1.3", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-context-menu": "2.2.6", "@radix-ui/react-dialog": "1.1.6", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-dropdown-menu": "2.1.6", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-form": "0.1.2", "@radix-ui/react-hover-card": "1.1.6", "@radix-ui/react-label": "2.1.2", "@radix-ui/react-menu": "2.1.6", "@radix-ui/react-menubar": "1.1.6", "@radix-ui/react-navigation-menu": "1.2.5", "@radix-ui/react-popover": "1.1.6", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-progress": "1.1.2", "@radix-ui/react-radio-group": "1.2.3", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-scroll-area": "1.2.3", "@radix-ui/react-select": "2.1.6", "@radix-ui/react-separator": "1.1.2", "@radix-ui/react-slider": "1.2.3", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-switch": "1.1.3", "@radix-ui/react-tabs": "1.1.3", "@radix-ui/react-toast": "1.2.6", "@radix-ui/react-toggle": "1.1.2", "@radix-ui/react-toggle-group": "1.1.2", "@radix-ui/react-toolbar": "1.1.2", "@radix-ui/react-tooltip": "1.1.8", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-size": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-W8L6soM1vQnIXVvVa31AkQhoZBDPwVoNHhT13R3aB9Qq7ARYIUS9DLaCopRBsbTdZm1NEEPx3rnq659CiNOBDw=="], + + "react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + + "react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], + + "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], + + "react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "reffuse": ["reffuse@workspace:packages/reffuse"], + + "remeda": ["remeda@2.20.2", "", { "dependencies": { "type-fest": "^4.33.0" } }, "sha512-38pfm5aUq6mUkNYbt7TdY2WEk9mSqRVV+6UsoTjabwmbu8obLbh8sYYSX2WQ3W4u6EYp3XxUKqIiwGFZu+OY9g=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "rollup": ["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.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "ts-api-utils": ["ts-api-utils@2.0.1", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tsx": ["tsx@4.19.2", "", { "dependencies": { "esbuild": "~0.23.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-fest": ["type-fest@4.35.0", "", {}, "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A=="], + + "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], + + "typescript-eslint": ["typescript-eslint@8.24.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.24.1", "@typescript-eslint/parser": "8.24.1", "@typescript-eslint/utils": "8.24.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA=="], + + "unplugin": ["unplugin@2.2.0", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], + + "vite": ["vite@6.1.0", "", { "dependencies": { "esbuild": "^0.24.2", "postcss": "^8.5.1", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], + + "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.10.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "tsx/esbuild": ["esbuild@0.23.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.23.1", "@esbuild/android-arm": "0.23.1", "@esbuild/android-arm64": "0.23.1", "@esbuild/android-x64": "0.23.1", "@esbuild/darwin-arm64": "0.23.1", "@esbuild/darwin-x64": "0.23.1", "@esbuild/freebsd-arm64": "0.23.1", "@esbuild/freebsd-x64": "0.23.1", "@esbuild/linux-arm": "0.23.1", "@esbuild/linux-arm64": "0.23.1", "@esbuild/linux-ia32": "0.23.1", "@esbuild/linux-loong64": "0.23.1", "@esbuild/linux-mips64el": "0.23.1", "@esbuild/linux-ppc64": "0.23.1", "@esbuild/linux-riscv64": "0.23.1", "@esbuild/linux-s390x": "0.23.1", "@esbuild/linux-x64": "0.23.1", "@esbuild/netbsd-x64": "0.23.1", "@esbuild/openbsd-arm64": "0.23.1", "@esbuild/openbsd-x64": "0.23.1", "@esbuild/sunos-x64": "0.23.1", "@esbuild/win32-arm64": "0.23.1", "@esbuild/win32-ia32": "0.23.1", "@esbuild/win32-x64": "0.23.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.23.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ=="], + + "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.23.1", "", { "os": "android", "cpu": "arm" }, "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ=="], + + "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.23.1", "", { "os": "android", "cpu": "arm64" }, "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw=="], + + "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.23.1", "", { "os": "android", "cpu": "x64" }, "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg=="], + + "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.23.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q=="], + + "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.23.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw=="], + + "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.23.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA=="], + + "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.23.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g=="], + + "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.23.1", "", { "os": "linux", "cpu": "arm" }, "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ=="], + + "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.23.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g=="], + + "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.23.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ=="], + + "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw=="], + + "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q=="], + + "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.23.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw=="], + + "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA=="], + + "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.23.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw=="], + + "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.23.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ=="], + + "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.23.1", "", { "os": "none", "cpu": "x64" }, "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA=="], + + "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.23.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q=="], + + "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.23.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA=="], + + "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.23.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA=="], + + "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.23.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A=="], + + "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.23.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ=="], + + "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.23.1", "", { "os": "win32", "cpu": "x64" }, "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg=="], + } +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index f1328ff7c71c6a2e2778df70f333aec4ab26b55a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167960 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 Le@)JRi^u;1()8zj diff --git a/package.json b/package.json index 6c1b407..692bb61 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,8 @@ { "private": true, - "workspaces": ["./packages/*"], + "workspaces": [ + "./packages/*" + ], "scripts": { "lint:tsc": "bun run --filter '*' lint:tsc", "clean:cache": "rm -f tsconfig.tsbuildinfo", diff --git a/packages/example/package.json b/packages/example/package.json index b78aa7f..2bb12a0 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -16,27 +16,30 @@ "@tanstack/router-devtools": "^1.105.0", "@tanstack/router-plugin": "^1.105.0", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.0.9", - "@types/react-dom": "^19.0.3", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "effect": "^3.13.1", "eslint": "^9.20.1", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^15.15.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "reffuse": "workspace:*", - "typescript-eslint": "^8.24.0", + "typescript-eslint": "^8.24.1", "vite": "^6.1.0" }, "dependencies": { - "@effect/platform": "^0.77.1", - "@effect/platform-browser": "^0.56.1", + "@effect/platform": "~0.77.1", + "@effect/platform-browser": "~0.56.1", "@radix-ui/themes": "^3.2.0", "@typed/id": "^0.17.1", "@typed/lazy-ref": "^0.3.3", + "effect": "~3.13.1", "lucide-react": "^0.475.0", - "mobx": "^6.13.6" + "mobx": "^6.13.6", + "reffuse": "workspace:*" + }, + "overrides": { + "effect": "~3.13.1" } } diff --git a/packages/example/src/routes/time.tsx b/packages/example/src/routes/time.tsx index 702a5ad..3a60060 100644 --- a/packages/example/src/routes/time.tsx +++ b/packages/example/src/routes/time.tsx @@ -1,6 +1,6 @@ import { R } from "@/reffuse" import { createFileRoute } from "@tanstack/react-router" -import { DateTime, Ref, Schedule, Stream } from "effect" +import { DateTime, Effect, Ref, Schedule, Stream, SubscriptionRef } from "effect" const timeEverySecond = Stream.repeatEffectWithSchedule( @@ -15,7 +15,7 @@ export const Route = createFileRoute("/time")({ function Time() { - const timeRef = R.useRefFromEffect(DateTime.now) + const timeRef = R.useMemo(DateTime.now.pipe(Effect.flatMap(SubscriptionRef.make))) R.useFork(Stream.runForEach(timeEverySecond, v => Ref.set(timeRef, v)), [timeRef]) const [time] = R.useRefState(timeRef) diff --git a/packages/example/src/todos/views/VNewTodo.tsx b/packages/example/src/todos/views/VNewTodo.tsx index fee4f16..eeb20f2 100644 --- a/packages/example/src/todos/views/VNewTodo.tsx +++ b/packages/example/src/todos/views/VNewTodo.tsx @@ -1,6 +1,6 @@ import { Todo } from "@/domain" import { Box, Button, Card, Flex, TextArea } from "@radix-ui/themes" -import { Effect, Option } from "effect" +import { Effect, Option, SubscriptionRef } from "effect" import { R } from "../reffuse" import { TodosState } from "../services" @@ -17,7 +17,7 @@ export function VNewTodo() { }, true)) ) - const todoRef = R.useRefFromEffect(createEmptyTodo) + const todoRef = R.useMemo(createEmptyTodo.pipe(Effect.flatMap(SubscriptionRef.make))) const [todo, setTodo] = R.useRefState(todoRef) diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 925e4a7..8b27899 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -29,9 +29,8 @@ "clean:node": "rm -rf node_modules" }, "devDependencies": { - "@typed/lazy-ref": "^0.3.3", - "@types/react": "^19.0.9", - "effect": "^3.13.1", + "@types/react": "^19.0.10", + "effect": "~3.13.1", "react": "^19.0.0" } } diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 9b1f114..897c5f1 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -1,4 +1,3 @@ -import * as LazyRef from "@typed/lazy-ref" import { Context, Effect, ExecutionStrategy, Exit, Fiber, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import React from "react" import * as ReffuseContext from "./ReffuseContext.js" @@ -115,12 +114,12 @@ export class Reffuse { const [value, setValue] = React.useState(initialValue) React.useEffect(() => { - const closeInitialScope = Scope.close(initialScope, Exit.void).pipe( + const closeInitialScopeIfNeeded = Scope.close(initialScope, Exit.void).pipe( Effect.andThen(Effect.sync(() => { initialScopeClosed.current = true })), Effect.when(() => !initialScopeClosed.current), ) - const [scope, value] = closeInitialScope.pipe( + const [scope, value] = closeInitialScopeIfNeeded.pipe( Effect.andThen(Scope.make(options?.finalizerExecutionStrategy).pipe( Effect.flatMap(scope => effect.pipe( Effect.provideService(Scope.Scope, scope), @@ -332,14 +331,6 @@ export class Reffuse { ) } - useRefFromEffect(effect: Effect.Effect): SubscriptionRef.SubscriptionRef { - return this.useMemo( - effect.pipe(Effect.flatMap(SubscriptionRef.make)), - [], - { doNotReExecuteOnRuntimeOrContextChange: false }, // Do not recreate the ref when the context changes - ) - } - /** * Binds the state of a `SubscriptionRef` to the state of the React component. * @@ -373,24 +364,24 @@ export class Reffuse { * * Note that the rules of React's immutable state still apply: updating a ref with the same value will not trigger a re-render. */ - useLazyRefState(ref: LazyRef.LazyRef): [A, React.Dispatch>] { - const runSync = this.useRunSync() + // useLazyRefState(ref: LazyRef.LazyRef): [A, React.Dispatch>] { + // const runSync = this.useRunSync() - const initialState = React.useMemo(() => runSync(ref), []) - const [reactStateValue, setReactStateValue] = React.useState(initialState) + // const initialState = React.useMemo(() => runSync(ref), []) + // const [reactStateValue, setReactStateValue] = React.useState(initialState) - this.useFork(Stream.runForEach(ref.changes, v => Effect.sync(() => - setReactStateValue(v) - )), [ref]) + // this.useFork(Stream.runForEach(ref.changes, v => Effect.sync(() => + // setReactStateValue(v) + // )), [ref]) - const setValue = React.useCallback((setStateAction: React.SetStateAction) => - runSync(LazyRef.update(ref, prevState => - SetStateAction.value(setStateAction, prevState) - )), - [ref]) + // const setValue = React.useCallback((setStateAction: React.SetStateAction) => + // runSync(LazyRef.update(ref, prevState => + // SetStateAction.value(setStateAction, prevState) + // )), + // [ref]) - return [reactStateValue, setValue] - } + // return [reactStateValue, setValue] + // } } -- 2.49.1 From bebbc1d7de2e3860f0dc7e32c5a594f56d5781ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Feb 2025 02:23:40 +0100 Subject: [PATCH 003/326] Promise tests --- packages/example/src/routes/tests.tsx | 29 ++++++++++++++++--- packages/example/src/todos/views/VNewTodo.tsx | 17 ++++++----- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 28117f0..8282be1 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -1,6 +1,8 @@ import { R } from "@/reffuse" import { createFileRoute } from "@tanstack/react-router" +import { GetRandomValues, makeUuid4 } from "@typed/id" import { Console, Effect } from "effect" +import { useEffect, useState } from "react" export const Route = createFileRoute("/tests")({ @@ -14,10 +16,29 @@ function RouteComponent() { // ), []) // console.log(value) - R.useFork(Effect.addFinalizer(() => Console.log("cleanup")).pipe( - Effect.andThen(Console.log("ouient")), - Effect.delay("1 second"), - )) + // R.useFork(Effect.addFinalizer(() => Console.log("cleanup")).pipe( + // Effect.andThen(Console.log("ouient")), + // Effect.delay("1 second"), + // )) + + const runPromise = R.useRunPromise() + const [promise, setPromise] = useState | null>(null) + const [, setValue] = useState("") + + useEffect(() => { + makeUuid4.pipe( + Effect.provide(GetRandomValues.CryptoRandom), + Effect.tap(id => Effect.sync(() => setValue(id))), + Effect.andThen(Console.log), + Effect.delay("1 second"), + + runPromise, + setPromise, + ) + }, [runPromise]) + + console.log(promise) + return
Hello "/tests"!
} diff --git a/packages/example/src/todos/views/VNewTodo.tsx b/packages/example/src/todos/views/VNewTodo.tsx index eeb20f2..ccb4346 100644 --- a/packages/example/src/todos/views/VNewTodo.tsx +++ b/packages/example/src/todos/views/VNewTodo.tsx @@ -5,18 +5,19 @@ import { R } from "../reffuse" import { TodosState } from "../services" +const createEmptyTodo = Todo.generateUniqueID.pipe( + Effect.map(id => Todo.Todo.make({ + id, + content: "", + completedAt: Option.none(), + }, true)) +) + + export function VNewTodo() { const runSync = R.useRunSync() - const createEmptyTodo = Todo.generateUniqueID.pipe( - Effect.map(id => Todo.Todo.make({ - id, - content: "", - completedAt: Option.none(), - }, true)) - ) - const todoRef = R.useMemo(createEmptyTodo.pipe(Effect.flatMap(SubscriptionRef.make))) const [todo, setTodo] = R.useRefState(todoRef) -- 2.49.1 From e83e86f8f16db6ce589e014ce8f49a816532b9d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Feb 2025 02:56:05 +0100 Subject: [PATCH 004/326] Promise tests --- packages/example/src/routeTree.gen.ts | 29 ++++++++++++++++++++--- packages/example/src/routes/__root.tsx | 1 + packages/example/src/routes/promise.tsx | 31 +++++++++++++++++++++++++ packages/example/src/routes/tests.tsx | 20 +++++++--------- 4 files changed, 66 insertions(+), 15 deletions(-) create mode 100644 packages/example/src/routes/promise.tsx diff --git a/packages/example/src/routeTree.gen.ts b/packages/example/src/routeTree.gen.ts index 92e0a99..b1e3d9c 100644 --- a/packages/example/src/routeTree.gen.ts +++ b/packages/example/src/routeTree.gen.ts @@ -13,6 +13,7 @@ import { Route as rootRoute } from './routes/__root' import { Route as TimeImport } from './routes/time' import { Route as TestsImport } from './routes/tests' +import { Route as PromiseImport } from './routes/promise' import { Route as CountImport } from './routes/count' import { Route as BlankImport } from './routes/blank' import { Route as IndexImport } from './routes/index' @@ -31,6 +32,12 @@ const TestsRoute = TestsImport.update({ getParentRoute: () => rootRoute, } as any) +const PromiseRoute = PromiseImport.update({ + id: '/promise', + path: '/promise', + getParentRoute: () => rootRoute, +} as any) + const CountRoute = CountImport.update({ id: '/count', path: '/count', @@ -74,6 +81,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof CountImport parentRoute: typeof rootRoute } + '/promise': { + id: '/promise' + path: '/promise' + fullPath: '/promise' + preLoaderRoute: typeof PromiseImport + parentRoute: typeof rootRoute + } '/tests': { id: '/tests' path: '/tests' @@ -97,6 +111,7 @@ export interface FileRoutesByFullPath { '/': typeof IndexRoute '/blank': typeof BlankRoute '/count': typeof CountRoute + '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute } @@ -105,6 +120,7 @@ export interface FileRoutesByTo { '/': typeof IndexRoute '/blank': typeof BlankRoute '/count': typeof CountRoute + '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute } @@ -114,16 +130,17 @@ export interface FileRoutesById { '/': typeof IndexRoute '/blank': typeof BlankRoute '/count': typeof CountRoute + '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath - fullPaths: '/' | '/blank' | '/count' | '/tests' | '/time' + fullPaths: '/' | '/blank' | '/count' | '/promise' | '/tests' | '/time' fileRoutesByTo: FileRoutesByTo - to: '/' | '/blank' | '/count' | '/tests' | '/time' - id: '__root__' | '/' | '/blank' | '/count' | '/tests' | '/time' + to: '/' | '/blank' | '/count' | '/promise' | '/tests' | '/time' + id: '__root__' | '/' | '/blank' | '/count' | '/promise' | '/tests' | '/time' fileRoutesById: FileRoutesById } @@ -131,6 +148,7 @@ export interface RootRouteChildren { IndexRoute: typeof IndexRoute BlankRoute: typeof BlankRoute CountRoute: typeof CountRoute + PromiseRoute: typeof PromiseRoute TestsRoute: typeof TestsRoute TimeRoute: typeof TimeRoute } @@ -139,6 +157,7 @@ const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, BlankRoute: BlankRoute, CountRoute: CountRoute, + PromiseRoute: PromiseRoute, TestsRoute: TestsRoute, TimeRoute: TimeRoute, } @@ -156,6 +175,7 @@ export const routeTree = rootRoute "/", "/blank", "/count", + "/promise", "/tests", "/time" ] @@ -169,6 +189,9 @@ export const routeTree = rootRoute "/count": { "filePath": "count.tsx" }, + "/promise": { + "filePath": "promise.tsx" + }, "/tests": { "filePath": "tests.tsx" }, diff --git a/packages/example/src/routes/__root.tsx b/packages/example/src/routes/__root.tsx index b9e5fa0..e5a9b44 100644 --- a/packages/example/src/routes/__root.tsx +++ b/packages/example/src/routes/__root.tsx @@ -19,6 +19,7 @@ function Root() { Time Count Tests + Promise Blank diff --git a/packages/example/src/routes/promise.tsx b/packages/example/src/routes/promise.tsx new file mode 100644 index 0000000..edb3e4f --- /dev/null +++ b/packages/example/src/routes/promise.tsx @@ -0,0 +1,31 @@ +import { R } from "@/reffuse" +import { HttpClient } from "@effect/platform" +import { createFileRoute } from "@tanstack/react-router" +import { Console, Effect } from "effect" +import { use, useMemo } from "react" + + +export const Route = createFileRoute("/promise")({ + component: RouteComponent +}) + +function RouteComponent() { + + const runPromise = R.useRunPromise() + + const promise = useMemo(() => HttpClient.HttpClient.pipe( + Effect.flatMap(client => client.get("https://www.uuidtools.com/api/generate/v4")), + HttpClient.withTracerPropagation(false), + Effect.flatMap(res => res.json), + Effect.tap(Console.log), + + Effect.scoped, + runPromise, + ), [runPromise]) + + const value = use(promise) + + + return
Hello "/tests"!
+ +} diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 8282be1..6961e11 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -2,7 +2,7 @@ import { R } from "@/reffuse" import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" import { Console, Effect } from "effect" -import { useEffect, useState } from "react" +import { useMemo, useState } from "react" export const Route = createFileRoute("/tests")({ @@ -22,20 +22,16 @@ function RouteComponent() { // )) const runPromise = R.useRunPromise() - const [promise, setPromise] = useState | null>(null) const [, setValue] = useState("") - useEffect(() => { - makeUuid4.pipe( - Effect.provide(GetRandomValues.CryptoRandom), - Effect.tap(id => Effect.sync(() => setValue(id))), - Effect.andThen(Console.log), - Effect.delay("1 second"), + const promise = useMemo(() => makeUuid4.pipe( + Effect.provide(GetRandomValues.CryptoRandom), + Effect.tap(id => Effect.sync(() => setValue(id))), + Effect.andThen(Console.log), + Effect.delay("1 second"), - runPromise, - setPromise, - ) - }, [runPromise]) + runPromise, + ), [runPromise]) console.log(promise) -- 2.49.1 From 734c84824c8c2e95e4c91fc6d1d403269b2420a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Feb 2025 04:30:10 +0100 Subject: [PATCH 005/326] Implement Pipeable --- packages/reffuse/src/Reffuse.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 897c5f1..4ec7386 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -1,4 +1,4 @@ -import { Context, Effect, ExecutionStrategy, Exit, Fiber, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { Context, Effect, ExecutionStrategy, Exit, Fiber, Pipeable, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -386,6 +386,13 @@ export class Reffuse { } +export interface Reffuse extends Pipeable.Pipeable {} + +Reffuse.prototype.pipe = function pipe() { + return Pipeable.pipeArguments(this, arguments) +} + + export interface RenderOptions { /** Prevents re-executing the effect when the Effect runtime or context changes. Defaults to `false`. */ readonly doNotReExecuteOnRuntimeOrContextChange?: boolean -- 2.49.1 From 933b061b5d0bbb2654643b60848516bfefa440cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Feb 2025 05:18:34 +0100 Subject: [PATCH 006/326] Promise tests --- packages/example/src/routes/promise.tsx | 34 +++++++++++++++++-------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/packages/example/src/routes/promise.tsx b/packages/example/src/routes/promise.tsx index edb3e4f..9d69d62 100644 --- a/packages/example/src/routes/promise.tsx +++ b/packages/example/src/routes/promise.tsx @@ -1,8 +1,9 @@ import { R } from "@/reffuse" import { HttpClient } from "@effect/platform" +import { Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { Console, Effect } from "effect" -import { use, useMemo } from "react" +import { Suspense, use, useEffect, useMemo } from "react" export const Route = createFileRoute("/promise")({ @@ -10,19 +11,32 @@ export const Route = createFileRoute("/promise")({ }) function RouteComponent() { + return ( + Loading...}> + + + ) +} - const runPromise = R.useRunPromise() +function AsyncComponent() { - const promise = useMemo(() => HttpClient.HttpClient.pipe( - Effect.flatMap(client => client.get("https://www.uuidtools.com/api/generate/v4")), - HttpClient.withTracerPropagation(false), - Effect.flatMap(res => res.json), - Effect.tap(Console.log), + // const runPromise = R.useRunPromise() - Effect.scoped, - runPromise, - ), [runPromise]) + // const promise = useMemo(() => HttpClient.HttpClient.pipe( + // Effect.flatMap(client => client.get("https://www.uuidtools.com/api/generate/v4")), + // HttpClient.withTracerPropagation(false), + // Effect.flatMap(res => res.json), + // Effect.tap(Console.log), + // Effect.scoped, + // runPromise, + // ), [runPromise]) + + const promise = useMemo(() => new Promise((resolve => { + setTimeout(() => { resolve("prout") }, 500) + })), []) + + console.log("React.use invoked with:", promise); const value = use(promise) -- 2.49.1 From bfcc0978824c742ee56481b617564f7a1c2d1825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Feb 2025 15:25:46 +0100 Subject: [PATCH 007/326] usePromise --- packages/example/src/routes/promise.tsx | 46 +++++++-------- packages/reffuse/src/Reffuse.ts | 76 +++++++++++++++---------- 2 files changed, 64 insertions(+), 58 deletions(-) diff --git a/packages/example/src/routes/promise.tsx b/packages/example/src/routes/promise.tsx index 9d69d62..da200db 100644 --- a/packages/example/src/routes/promise.tsx +++ b/packages/example/src/routes/promise.tsx @@ -2,44 +2,36 @@ import { R } from "@/reffuse" import { HttpClient } from "@effect/platform" import { Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" -import { Console, Effect } from "effect" -import { Suspense, use, useEffect, useMemo } from "react" +import { Effect, Schema } from "effect" +import { Suspense, use } from "react" export const Route = createFileRoute("/promise")({ component: RouteComponent }) + +const Result = Schema.Tuple(Schema.String) +type Result = typeof Result.Type + function RouteComponent() { + const promise = R.usePromise(HttpClient.HttpClient.pipe( + Effect.flatMap(client => client.get("https://www.uuidtools.com/api/generate/v4")), + HttpClient.withTracerPropagation(false), + Effect.flatMap(res => res.json), + Effect.flatMap(Schema.decodeUnknown(Result)), + + Effect.scoped, + )) + return ( Loading...}> - + ) } -function AsyncComponent() { - - // const runPromise = R.useRunPromise() - - // const promise = useMemo(() => HttpClient.HttpClient.pipe( - // Effect.flatMap(client => client.get("https://www.uuidtools.com/api/generate/v4")), - // HttpClient.withTracerPropagation(false), - // Effect.flatMap(res => res.json), - // Effect.tap(Console.log), - - // Effect.scoped, - // runPromise, - // ), [runPromise]) - - const promise = useMemo(() => new Promise((resolve => { - setTimeout(() => { resolve("prout") }, 500) - })), []) - - console.log("React.use invoked with:", promise); - const value = use(promise) - - - return
Hello "/tests"!
- +function AsyncComponent({ promise }: { readonly promise: Promise }) { + const [uuid] = use(promise) + return {uuid} } diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 4ec7386..cc1755f 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -284,43 +284,57 @@ export class Reffuse { ]) } - // useSuspense( - // effect: Effect.Effect, - // deps?: React.DependencyList, - // options?: { readonly signal?: AbortSignal } & RenderOptions, - // ): A { - // const runPromise = this.useRunPromise() + usePromise( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: { readonly signal?: AbortSignal } & RenderOptions, + ): Promise
{ + const runPromise = this.useRunPromise() - // const promise = React.useMemo(() => runPromise(effect, options), [ - // ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runPromise], - // ...(deps ?? []), - // ]) - // return React.use(promise) - // } + return React.useMemo(() => runPromise(effect, options), [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runPromise], + ...(deps ?? []), + ]) + } - // useSuspenseScoped( - // effect: Effect.Effect, - // deps?: React.DependencyList, - // options?: { readonly signal?: AbortSignal } & RenderOptions & ScopeOptions, - // ): A { - // const runSync = this.useRunSync() - // const runPromise = this.useRunPromise() + usePromiseScoped( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: { readonly signal?: AbortSignal } & RenderOptions & ScopeOptions, + ): Promise { + const runSync = this.useRunSync() + const runPromise = this.useRunPromise() - // const initialPromise = React.useMemo(() => runPromise(Effect.scoped(effect)), []) - // const [promise, setPromise] = React.useState(initialPromise) + // Calculate an initial version of the value so that it can be accessed during the first render + const initialScope = React.useMemo(() => runSync(Scope.make(options?.finalizerExecutionStrategy)), []) + const initialValue = React.useMemo(() => runPromise(Effect.provideService(effect, Scope.Scope, initialScope), options), []) - // React.useEffect(() => { - // const scope = runSync(Scope.make()) - // setPromise(runPromise(Effect.provideService(effect, Scope.Scope, scope), options)) + // Keep track of the state of the initial scope + const initialScopeClosed = React.useRef(false) - // return () => { runPromise(Scope.close(scope, Exit.void)) } - // }, [ - // ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runPromise], - // ...(deps ?? []), - // ]) + const [value, setValue] = React.useState(initialValue) - // return React.use(promise) - // } + React.useEffect(() => { + const closeInitialScopeIfNeeded = Scope.close(initialScope, Exit.void).pipe( + Effect.andThen(Effect.sync(() => { initialScopeClosed.current = true })), + Effect.when(() => !initialScopeClosed.current), + ) + + const scope = closeInitialScopeIfNeeded.pipe( + Effect.andThen(Scope.make(options?.finalizerExecutionStrategy)), + runSync, + ) + + setValue(runPromise(Effect.provideService(effect, Scope.Scope, initialScope), options)) + + return () => { runSync(Scope.close(scope, Exit.void)) } + }, [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runPromise], + ...(deps ?? []), + ]) + + return value + } useRef(value: A): SubscriptionRef.SubscriptionRef { -- 2.49.1 From e71239b90304664994c1024ae0d35c7130e16af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Feb 2025 22:28:49 +0100 Subject: [PATCH 008/326] usePromiseScoped --- packages/example/src/routes/promise.tsx | 4 +- packages/example/src/routes/tests.tsx | 22 ++------- packages/reffuse/src/Reffuse.ts | 61 +++++++------------------ packages/reffuse/src/ReffuseContext.tsx | 1 + 4 files changed, 21 insertions(+), 67 deletions(-) diff --git a/packages/example/src/routes/promise.tsx b/packages/example/src/routes/promise.tsx index da200db..d5c9b57 100644 --- a/packages/example/src/routes/promise.tsx +++ b/packages/example/src/routes/promise.tsx @@ -15,13 +15,11 @@ const Result = Schema.Tuple(Schema.String) type Result = typeof Result.Type function RouteComponent() { - const promise = R.usePromise(HttpClient.HttpClient.pipe( + const promise = R.usePromiseScoped(HttpClient.HttpClient.pipe( Effect.flatMap(client => client.get("https://www.uuidtools.com/api/generate/v4")), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), Effect.flatMap(Schema.decodeUnknown(Result)), - - Effect.scoped, )) return ( diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 6961e11..82b6919 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -1,8 +1,6 @@ import { R } from "@/reffuse" import { createFileRoute } from "@tanstack/react-router" -import { GetRandomValues, makeUuid4 } from "@typed/id" import { Console, Effect } from "effect" -import { useMemo, useState } from "react" export const Route = createFileRoute("/tests")({ @@ -16,24 +14,10 @@ function RouteComponent() { // ), []) // console.log(value) - // R.useFork(Effect.addFinalizer(() => Console.log("cleanup")).pipe( - // Effect.andThen(Console.log("ouient")), - // Effect.delay("1 second"), - // )) - - const runPromise = R.useRunPromise() - const [, setValue] = useState("") - - const promise = useMemo(() => makeUuid4.pipe( - Effect.provide(GetRandomValues.CryptoRandom), - Effect.tap(id => Effect.sync(() => setValue(id))), - Effect.andThen(Console.log), + R.useFork(Effect.addFinalizer(() => Console.log("cleanup")).pipe( + Effect.andThen(Console.log("ouient")), Effect.delay("1 second"), - - runPromise, - ), [runPromise]) - - console.log(promise) + )) return
Hello "/tests"!
diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index cc1755f..f3d56ec 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -5,6 +5,7 @@ import * as ReffuseRuntime from "./ReffuseRuntime.js" import * as SetStateAction from "./SetStateAction.js" +// MAYBE: make it an Effect and match the R parameter? export class Reffuse { constructor( @@ -305,29 +306,25 @@ export class Reffuse { const runSync = this.useRunSync() const runPromise = this.useRunPromise() - // Calculate an initial version of the value so that it can be accessed during the first render - const initialScope = React.useMemo(() => runSync(Scope.make(options?.finalizerExecutionStrategy)), []) - const initialValue = React.useMemo(() => runPromise(Effect.provideService(effect, Scope.Scope, initialScope), options), []) - - // Keep track of the state of the initial scope - const initialScopeClosed = React.useRef(false) - - const [value, setValue] = React.useState(initialValue) + const [value, setValue] = React.useState(new Promise
(() => {})) React.useEffect(() => { - const closeInitialScopeIfNeeded = Scope.close(initialScope, Exit.void).pipe( - Effect.andThen(Effect.sync(() => { initialScopeClosed.current = true })), - Effect.when(() => !initialScopeClosed.current), - ) + const controller = new AbortController() + const signal = AbortSignal.any([ + controller.signal, + ...options?.signal ? [options.signal] : [], + ]) - const scope = closeInitialScopeIfNeeded.pipe( - Effect.andThen(Scope.make(options?.finalizerExecutionStrategy)), - runSync, - ) + const scope = runSync(Scope.make(options?.finalizerExecutionStrategy)) + setValue(runPromise(Effect.provideService(effect, Scope.Scope, scope), { + ...options, + signal, + })) - setValue(runPromise(Effect.provideService(effect, Scope.Scope, initialScope), options)) - - return () => { runSync(Scope.close(scope, Exit.void)) } + return () => { + controller.abort() + runSync(Scope.close(scope, Exit.void)) + } }, [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runPromise], ...(deps ?? []), @@ -371,32 +368,6 @@ export class Reffuse { return [reactStateValue, setValue] } - /** - * Binds the state of a `LazyRef` from the `@typed/lazy-ref` package to the state of the React component. - * - * Returns a [value, setter] tuple just like `React.useState` and triggers a re-render everytime the value held by the ref changes. - * - * Note that the rules of React's immutable state still apply: updating a ref with the same value will not trigger a re-render. - */ - // useLazyRefState(ref: LazyRef.LazyRef): [A, React.Dispatch>] { - // const runSync = this.useRunSync() - - // const initialState = React.useMemo(() => runSync(ref), []) - // const [reactStateValue, setReactStateValue] = React.useState(initialState) - - // this.useFork(Stream.runForEach(ref.changes, v => Effect.sync(() => - // setReactStateValue(v) - // )), [ref]) - - // const setValue = React.useCallback((setStateAction: React.SetStateAction) => - // runSync(LazyRef.update(ref, prevState => - // SetStateAction.value(setStateAction, prevState) - // )), - // [ref]) - - // return [reactStateValue, setValue] - // } - } diff --git a/packages/reffuse/src/ReffuseContext.tsx b/packages/reffuse/src/ReffuseContext.tsx index dbca682..a7b49a5 100644 --- a/packages/reffuse/src/ReffuseContext.tsx +++ b/packages/reffuse/src/ReffuseContext.tsx @@ -3,6 +3,7 @@ import React from "react" import * as ReffuseRuntime from "./ReffuseRuntime.js" +// TODO: merge this with the Provider, just like React 19 contexts export class ReffuseContext { readonly Context = React.createContext>(null!) -- 2.49.1 From 809f512d115cff83b1b73eb0d87f10e1cef3ddde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Feb 2025 22:33:49 +0100 Subject: [PATCH 009/326] Fix --- packages/reffuse/src/Reffuse.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index f3d56ec..79dc033 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -338,7 +338,7 @@ export class Reffuse { return this.useMemo( SubscriptionRef.make(value), [], - { doNotReExecuteOnRuntimeOrContextChange: false }, // Do not recreate the ref when the context changes + { doNotReExecuteOnRuntimeOrContextChange: true }, // Do not recreate the ref when the context changes ) } -- 2.49.1 From 6c843562ab98f0ee174558a1131cec4e08f8209c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Feb 2025 23:47:32 +0100 Subject: [PATCH 010/326] usePromiseScoped fork implementation --- packages/reffuse/src/Reffuse.ts | 72 ++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 79dc033..6eb0753 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -301,38 +301,80 @@ export class Reffuse { usePromiseScoped( effect: Effect.Effect, deps?: React.DependencyList, - options?: { readonly signal?: AbortSignal } & RenderOptions & ScopeOptions, + options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, ): Promise { const runSync = this.useRunSync() - const runPromise = this.useRunPromise() + const runFork = this.useRunFork() - const [value, setValue] = React.useState(new Promise(() => {})) + const [value, setValue] = React.useState(Promise.withResolvers().promise) React.useEffect(() => { - const controller = new AbortController() - const signal = AbortSignal.any([ - controller.signal, - ...options?.signal ? [options.signal] : [], - ]) + const { promise, resolve, reject } = Promise.withResolvers() + setValue(promise) const scope = runSync(Scope.make(options?.finalizerExecutionStrategy)) - setValue(runPromise(Effect.provideService(effect, Scope.Scope, scope), { - ...options, - signal, - })) + + const fiber = effect.pipe( + Effect.provideService(Scope.Scope, scope), + Effect.match({ + onSuccess: resolve, + onFailure: reject, + }), + + // TODO: use scope from RunForkOptions? + effect => runFork(effect, options), + ) return () => { - controller.abort() - runSync(Scope.close(scope, Exit.void)) + Fiber.interrupt(fiber).pipe( + Effect.andThen(Scope.close(scope, Exit.void)), + Effect.andThen(Effect.sync(() => { reject() })), // TODO: Relevant? + runFork, + ) } }, [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runPromise], + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], ...(deps ?? []), ]) return value } + // usePromiseScoped( + // effect: Effect.Effect, + // deps?: React.DependencyList, + // options?: { readonly signal?: AbortSignal } & RenderOptions & ScopeOptions, + // ): Promise { + // const runSync = this.useRunSync() + // const runPromise = this.useRunPromise() + + // const [value, setValue] = React.useState(new Promise(() => {})) + + // React.useEffect(() => { + // const controller = new AbortController() + // const signal = AbortSignal.any([ + // controller.signal, + // ...options?.signal ? [options.signal] : [], + // ]) + + // const scope = runSync(Scope.make(options?.finalizerExecutionStrategy)) + // setValue(runPromise(Effect.provideService(effect, Scope.Scope, scope), { + // ...options, + // signal, + // })) + + // return () => { + // controller.abort() + // runSync(Scope.close(scope, Exit.void)) + // } + // }, [ + // ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runPromise], + // ...(deps ?? []), + // ]) + + // return value + // } + useRef(value: A): SubscriptionRef.SubscriptionRef { return this.useMemo( -- 2.49.1 From 9e7b30fbb4ded295824d3046e2d16f78bd2b2cc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 19 Feb 2025 23:24:15 +0100 Subject: [PATCH 011/326] useFork refactoring --- packages/example/src/routes/promise.tsx | 5 +++-- packages/example/src/routes/time.tsx | 8 +++++-- packages/reffuse/src/Reffuse.ts | 28 ++++++++++++------------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/packages/example/src/routes/promise.tsx b/packages/example/src/routes/promise.tsx index d5c9b57..9577aca 100644 --- a/packages/example/src/routes/promise.tsx +++ b/packages/example/src/routes/promise.tsx @@ -2,7 +2,7 @@ import { R } from "@/reffuse" import { HttpClient } from "@effect/platform" import { Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" -import { Effect, Schema } from "effect" +import { Console, Effect, Schema } from "effect" import { Suspense, use } from "react" @@ -15,7 +15,8 @@ const Result = Schema.Tuple(Schema.String) type Result = typeof Result.Type function RouteComponent() { - const promise = R.usePromiseScoped(HttpClient.HttpClient.pipe( + const promise = R.usePromiseScoped(Effect.addFinalizer(() => Console.log("Cleanup")).pipe( + Effect.andThen(HttpClient.HttpClient), Effect.flatMap(client => client.get("https://www.uuidtools.com/api/generate/v4")), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), diff --git a/packages/example/src/routes/time.tsx b/packages/example/src/routes/time.tsx index 3a60060..7332f6b 100644 --- a/packages/example/src/routes/time.tsx +++ b/packages/example/src/routes/time.tsx @@ -1,6 +1,6 @@ import { R } from "@/reffuse" import { createFileRoute } from "@tanstack/react-router" -import { DateTime, Effect, Ref, Schedule, Stream, SubscriptionRef } from "effect" +import { Console, DateTime, Effect, Ref, Schedule, Stream, SubscriptionRef } from "effect" const timeEverySecond = Stream.repeatEffectWithSchedule( @@ -16,7 +16,11 @@ export const Route = createFileRoute("/time")({ function Time() { const timeRef = R.useMemo(DateTime.now.pipe(Effect.flatMap(SubscriptionRef.make))) - R.useFork(Stream.runForEach(timeEverySecond, v => Ref.set(timeRef, v)), [timeRef]) + + R.useFork(Effect.addFinalizer(() => Console.log("Cleanup")).pipe( + Effect.andThen(Stream.runForEach(timeEverySecond, v => Ref.set(timeRef, v))) + ), [timeRef]) + const [time] = R.useRefState(timeRef) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 6eb0753..08700cb 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -270,15 +270,13 @@ export class Reffuse { const runFork = this.useRunFork() return React.useEffect(() => { - const scope = runSync(Scope.make(options?.finalizerExecutionStrategy)) - const fiber = runFork(Effect.provideService(effect, Scope.Scope, scope), options) + const scope = runSync(options?.scope + ? Scope.fork(options.scope, options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential) + : Scope.make(options?.finalizerExecutionStrategy) + ) + runFork(Effect.provideService(effect, Scope.Scope, scope), { ...options, scope }) - return () => { - Fiber.interrupt(fiber).pipe( - Effect.andThen(Scope.close(scope, Exit.void)), - runFork, - ) - } + return () => { runFork(Scope.close(scope, Exit.void)) } }, [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], ...(deps ?? []), @@ -322,15 +320,17 @@ export class Reffuse { }), // TODO: use scope from RunForkOptions? - effect => runFork(effect, options), + effect => runFork(effect, { ...options, scope }), ) return () => { - Fiber.interrupt(fiber).pipe( - Effect.andThen(Scope.close(scope, Exit.void)), - Effect.andThen(Effect.sync(() => { reject() })), // TODO: Relevant? - runFork, - ) + // Fiber.interrupt(fiber).pipe( + // Effect.andThen(Scope.close(scope, Exit.void)), + // // \/ TODO: should interrupted promises reject? + // // Effect.andThen(Effect.sync(() => { reject() })), + // runFork, + // ) + runFork(Scope.close(scope, Exit.void)) } }, [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], -- 2.49.1 From 65810a6d7947739d94b94c28adbc60141807652a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 19 Feb 2025 23:44:02 +0100 Subject: [PATCH 012/326] usePromise --- packages/example/src/routes/promise.tsx | 5 +- packages/reffuse/src/Reffuse.ts | 72 +++++-------------------- 2 files changed, 15 insertions(+), 62 deletions(-) diff --git a/packages/example/src/routes/promise.tsx b/packages/example/src/routes/promise.tsx index 9577aca..58c1452 100644 --- a/packages/example/src/routes/promise.tsx +++ b/packages/example/src/routes/promise.tsx @@ -15,9 +15,8 @@ const Result = Schema.Tuple(Schema.String) type Result = typeof Result.Type function RouteComponent() { - const promise = R.usePromiseScoped(Effect.addFinalizer(() => Console.log("Cleanup")).pipe( - Effect.andThen(HttpClient.HttpClient), - Effect.flatMap(client => client.get("https://www.uuidtools.com/api/generate/v4")), + const promise = R.usePromise(Effect.addFinalizer(() => Console.log("Cleanup")).pipe( + Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), Effect.flatMap(Schema.decodeUnknown(Result)), diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 08700cb..50ee1a3 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -284,19 +284,6 @@ export class Reffuse { } usePromise( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: { readonly signal?: AbortSignal } & RenderOptions, - ): Promise { - const runPromise = this.useRunPromise() - - return React.useMemo(() => runPromise(effect, options), [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runPromise], - ...(deps ?? []), - ]) - } - - usePromiseScoped( effect: Effect.Effect, deps?: React.DependencyList, options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, @@ -310,27 +297,29 @@ export class Reffuse { const { promise, resolve, reject } = Promise.withResolvers() setValue(promise) - const scope = runSync(Scope.make(options?.finalizerExecutionStrategy)) + const scope = runSync(options?.scope + ? Scope.fork(options.scope, options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential) + : Scope.make(options?.finalizerExecutionStrategy) + ) - const fiber = effect.pipe( + const cleanup = () => { runFork(Scope.close(scope, Exit.void)) } + if (options?.signal) + options.signal.addEventListener("abort", cleanup) + + effect.pipe( Effect.provideService(Scope.Scope, scope), Effect.match({ onSuccess: resolve, onFailure: reject, }), - - // TODO: use scope from RunForkOptions? effect => runFork(effect, { ...options, scope }), ) return () => { - // Fiber.interrupt(fiber).pipe( - // Effect.andThen(Scope.close(scope, Exit.void)), - // // \/ TODO: should interrupted promises reject? - // // Effect.andThen(Effect.sync(() => { reject() })), - // runFork, - // ) - runFork(Scope.close(scope, Exit.void)) + if (options?.signal) + options.signal.removeEventListener("abort", cleanup) + + cleanup() } }, [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], @@ -340,41 +329,6 @@ export class Reffuse { return value } - // usePromiseScoped( - // effect: Effect.Effect, - // deps?: React.DependencyList, - // options?: { readonly signal?: AbortSignal } & RenderOptions & ScopeOptions, - // ): Promise { - // const runSync = this.useRunSync() - // const runPromise = this.useRunPromise() - - // const [value, setValue] = React.useState(new Promise(() => {})) - - // React.useEffect(() => { - // const controller = new AbortController() - // const signal = AbortSignal.any([ - // controller.signal, - // ...options?.signal ? [options.signal] : [], - // ]) - - // const scope = runSync(Scope.make(options?.finalizerExecutionStrategy)) - // setValue(runPromise(Effect.provideService(effect, Scope.Scope, scope), { - // ...options, - // signal, - // })) - - // return () => { - // controller.abort() - // runSync(Scope.close(scope, Exit.void)) - // } - // }, [ - // ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runPromise], - // ...(deps ?? []), - // ]) - - // return value - // } - useRef(value: A): SubscriptionRef.SubscriptionRef { return this.useMemo( -- 2.49.1 From 36d5414d10dcdf4fb5caac7ad495524964817a72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 19 Feb 2025 23:59:34 +0100 Subject: [PATCH 013/326] Fix --- packages/reffuse/src/Reffuse.ts | 2 +- packages/reffuse/src/ReffuseContext.tsx | 2 +- packages/reffuse/src/ReffuseRuntime.tsx | 2 +- packages/reffuse/src/SetStateAction.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 50ee1a3..39f781c 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -1,5 +1,5 @@ import { Context, Effect, ExecutionStrategy, Exit, Fiber, Pipeable, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" -import React from "react" +import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" import * as SetStateAction from "./SetStateAction.js" diff --git a/packages/reffuse/src/ReffuseContext.tsx b/packages/reffuse/src/ReffuseContext.tsx index a7b49a5..c914a61 100644 --- a/packages/reffuse/src/ReffuseContext.tsx +++ b/packages/reffuse/src/ReffuseContext.tsx @@ -1,5 +1,5 @@ import { Array, Context, Effect, Layer, Runtime } from "effect" -import React from "react" +import * as React from "react" import * as ReffuseRuntime from "./ReffuseRuntime.js" diff --git a/packages/reffuse/src/ReffuseRuntime.tsx b/packages/reffuse/src/ReffuseRuntime.tsx index d693f6b..3a6c75e 100644 --- a/packages/reffuse/src/ReffuseRuntime.tsx +++ b/packages/reffuse/src/ReffuseRuntime.tsx @@ -1,5 +1,5 @@ import { Runtime } from "effect" -import React from "react" +import * as React from "react" export const Context = React.createContext>(null!) diff --git a/packages/reffuse/src/SetStateAction.ts b/packages/reffuse/src/SetStateAction.ts index f456407..10a596b 100644 --- a/packages/reffuse/src/SetStateAction.ts +++ b/packages/reffuse/src/SetStateAction.ts @@ -1,5 +1,5 @@ import { Function } from "effect" -import type React from "react" +import type * as React from "react" export const value: { -- 2.49.1 From fffbd01b5e99f588b5d94a217931f36ce0f73ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 20 Feb 2025 00:21:43 +0100 Subject: [PATCH 014/326] Pipeable API tests --- packages/reffuse/src/Reffuse.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 39f781c..1a45971 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -384,7 +384,17 @@ export interface ScopeOptions { } -export const make = >( - ...contexts: [...{ [K in keyof T]: ReffuseContext.ReffuseContext }] -): Reffuse => - new Reffuse(contexts) +// export const make = >( +// ...contexts: [...{ [K in keyof T]: ReffuseContext.ReffuseContext }] +// ): Reffuse => +// new Reffuse(contexts) + +export const make = (): Reffuse => new Reffuse([]) + +export const withContexts = >( + ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] +) => + , R1>(self: T & Reffuse): ( + Reffuse & Exclude> + ) => + new Reffuse([...self.contexts, ...contexts as any]) as any -- 2.49.1 From b636a709f3ead60083fe3d84efc1312a5f031371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 20 Feb 2025 00:39:15 +0100 Subject: [PATCH 015/326] Tests --- packages/reffuse/src/Reffuse.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 1a45971..89ebeb3 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -384,17 +384,17 @@ export interface ScopeOptions { } -// export const make = >( -// ...contexts: [...{ [K in keyof T]: ReffuseContext.ReffuseContext }] -// ): Reffuse => -// new Reffuse(contexts) +export const make = >( + ...contexts: [...{ [K in keyof T]: ReffuseContext.ReffuseContext }] +): Reffuse => + new Reffuse(contexts) -export const make = (): Reffuse => new Reffuse([]) +// export const make = (): Reffuse => new Reffuse([]) -export const withContexts = >( - ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] -) => - , R1>(self: T & Reffuse): ( - Reffuse & Exclude> - ) => - new Reffuse([...self.contexts, ...contexts as any]) as any +// export const withContexts = >( +// ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] +// ) => +// , R1>(self: T & Reffuse): ( +// Reffuse & Exclude> +// ) => +// new Reffuse([...self.contexts, ...contexts as any]) as any -- 2.49.1 From a71640d493e6fb06901d1a973a1ee55ffab29a1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 20 Feb 2025 00:41:37 +0100 Subject: [PATCH 016/326] Cleanup --- packages/reffuse/src/Reffuse.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 89ebeb3..5f899f5 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -5,7 +5,6 @@ import * as ReffuseRuntime from "./ReffuseRuntime.js" import * as SetStateAction from "./SetStateAction.js" -// MAYBE: make it an Effect and match the R parameter? export class Reffuse { constructor( -- 2.49.1 From febeaa05d0d2d15f60e57424a243bc5af31770fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 20 Feb 2025 14:12:56 +0100 Subject: [PATCH 017/326] ReffuseExtension --- packages/reffuse/src/ReffuseExtension.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 packages/reffuse/src/ReffuseExtension.ts diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts new file mode 100644 index 0000000..4dbe515 --- /dev/null +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -0,0 +1 @@ +export const make = () => undefined -- 2.49.1 From c0097bbe8128a49aec21da6fd4703a18e7034362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 20 Feb 2025 14:57:46 +0100 Subject: [PATCH 018/326] Extension tests --- packages/reffuse/src/ReffuseExtension.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 4dbe515..84f6396 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -1 +1,19 @@ -export const make = () => undefined +import type { Effect } from "effect" +import * as ReffuseContext from "./ReffuseContext.js" + + +interface ReffuseTest { + readonly contexts: readonly ReffuseContext.ReffuseContext[] + + useEffect(effect: Effect.Effect): void +} + +const ReffuseTestProto = { + useEffect(this: ReffuseTest, effect: Effect.Effect) {} +} + +const make = (): ReffuseTest => { + const self = Object.create(ReffuseTestProto) + self.contexts = [] + return self +} -- 2.49.1 From 256638bc06ff15709f5ff1b70409e62efac7130e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Feb 2025 04:22:48 +0100 Subject: [PATCH 019/326] ReffuseHelper --- packages/reffuse/src/ReffuseExtension.ts | 21 +++------ packages/reffuse/src/ReffuseHelper.ts | 57 ++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 packages/reffuse/src/ReffuseHelper.ts diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 84f6396..6d0648c 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -1,19 +1,10 @@ import type { Effect } from "effect" import * as ReffuseContext from "./ReffuseContext.js" +import * as Reffuse from "./Reffuse.js" +import type { Simplify } from "effect/Types" -interface ReffuseTest { - readonly contexts: readonly ReffuseContext.ReffuseContext[] - - useEffect(effect: Effect.Effect): void -} - -const ReffuseTestProto = { - useEffect(this: ReffuseTest, effect: Effect.Effect) {} -} - -const make = (): ReffuseTest => { - const self = Object.create(ReffuseTestProto) - self.contexts = [] - return self -} +const make = (extension: T) => + (base: R) => { + const class_ = class extends base {} + } diff --git a/packages/reffuse/src/ReffuseHelper.ts b/packages/reffuse/src/ReffuseHelper.ts new file mode 100644 index 0000000..d41f572 --- /dev/null +++ b/packages/reffuse/src/ReffuseHelper.ts @@ -0,0 +1,57 @@ +import type { Context, Effect, ExecutionStrategy, Fiber, Pipeable, Runtime, Scope, SubscriptionRef } from "effect" +import type * as React from "react" + + +export interface ReffuseHelper extends Pipeable.Pipeable { + useContext(): Context.Context + + useRunSync(): (effect: Effect.Effect) => A + useRunPromise(): (effect: Effect.Effect, options?: { + readonly signal?: AbortSignal + }) => Promise + useRunFork(): (effect: Effect.Effect, options?: Runtime.RunForkOptions) => Fiber.RuntimeFiber + useRunCallback(): (effect: Effect.Effect, options?: Runtime.RunCallbackOptions) => Runtime.Cancel + + useMemo( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions, + ): A + + useMemoScoped( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): A + + useLayoutEffect( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): void + + useFork( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: Runtime.RunForkOptions & RenderOptions & ScopeOptions, + ): void + + usePromise( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, + ): Promise + + useRef(value: A): SubscriptionRef.SubscriptionRef + useRefState(ref: SubscriptionRef.SubscriptionRef): readonly [A, React.Dispatch>] +} + + +export interface RenderOptions { + /** Prevents re-executing the effect when the Effect runtime or context changes. Defaults to `false`. */ + readonly doNotReExecuteOnRuntimeOrContextChange?: boolean +} + +export interface ScopeOptions { + readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy +} -- 2.49.1 From 8252b6cbdf8ec37807e46f2cefc07c69f84cd7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Feb 2025 05:22:19 +0100 Subject: [PATCH 020/326] Extension work --- packages/reffuse/src/ReffuseExtension.ts | 28 +++++++++++++++++++----- packages/reffuse/src/types.ts | 21 ++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 packages/reffuse/src/types.ts diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 6d0648c..28987cb 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -1,10 +1,28 @@ -import type { Effect } from "effect" -import * as ReffuseContext from "./ReffuseContext.js" import * as Reffuse from "./Reffuse.js" -import type { Simplify } from "effect/Types" +import type { Merge, StaticType } from "./types.js" -const make = (extension: T) => - (base: R) => { +const make = (extension: Ext) => + < + BaseClass extends typeof Reffuse.Reffuse, + R, + >( + base: BaseClass & typeof Reffuse.Reffuse + ): ( + { new(): Merge, Ext> } & + StaticType + ) => { const class_ = class extends base {} + return class_ } + + +const cls = make({ + prout(this: Reffuse.Reffuse) {} +})(Reffuse.Reffuse) + +class Cls extends cls {} + +const cls2 = make({ + aya() {} +})(cls) diff --git a/packages/reffuse/src/types.ts b/packages/reffuse/src/types.ts new file mode 100644 index 0000000..51f4129 --- /dev/null +++ b/packages/reffuse/src/types.ts @@ -0,0 +1,21 @@ +/** + * Extracts the common keys between two types + */ +export type CommonKeys = Extract + +/** + * Obtain the static members type of a constructor function type + */ +export type StaticType any> = Omit + +export type Extend = + Extendable extends true + ? Omit> & Self + : never + +export type Extendable = + Pick> extends Pick> + ? true + : false + +export type Merge = Omit> & Self -- 2.49.1 From 837dcbb1cb5a4aaf51d45c7edcb7ca8e8d8a3126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Feb 2025 15:27:11 +0100 Subject: [PATCH 021/326] Extension work --- packages/reffuse/src/ReffuseExtension.ts | 56 ++- packages/reffuse/src/ReffuseHelpers.ts | 426 +++++++++++++++++++++++ 2 files changed, 475 insertions(+), 7 deletions(-) create mode 100644 packages/reffuse/src/ReffuseHelpers.ts diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 28987cb..8038e61 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -1,13 +1,24 @@ -import * as Reffuse from "./Reffuse.js" +import { Effect } from "effect" +import * as ReffuseContext from "./ReffuseContext.js" +import * as ReffuseHelpers from "./ReffuseHelpers.js" import type { Merge, StaticType } from "./types.js" +class Reffuse extends ReffuseHelpers.ReffuseHelpers {} + +class MyService extends Effect.Service()("MyService", { + succeed: {} +}) {} + +const MyContext = ReffuseContext.make() + + const make = (extension: Ext) => < - BaseClass extends typeof Reffuse.Reffuse, + BaseClass extends typeof Reffuse, R, >( - base: BaseClass & typeof Reffuse.Reffuse + base: BaseClass & typeof Reffuse ): ( { new(): Merge, Ext> } & StaticType @@ -16,12 +27,43 @@ const make = (extension: Ext) => return class_ } +export const withContexts = >( + ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] +) => + < + BaseClass extends typeof ReffuseHelpers.ReffuseHelpers, + R1 + >( + self: BaseClass & typeof ReffuseHelpers.ReffuseHelpers + ): ( + { + new(): Merge< + InstanceType, + { readonly contexts: readonly ReffuseContext.ReffuseContext[] } + > + } & + StaticType + ) => { + const instance = new self() -const cls = make({ - prout(this: Reffuse.Reffuse) {} -})(Reffuse.Reffuse) + return class extends self { + readonly contexts = [...instance.contexts, ...contexts] as const + } as any + } -class Cls extends cls {} + +const withMyContext = withContexts(MyContext) +const clsWithMyContext = withMyContext(Reffuse) +class ReffuseWithMyContext extends clsWithMyContext {} + +const t = new ReffuseWithMyContext() + + +const cls1 = make({ + prout(this: ReffuseHelpers.ReffuseHelpers) {} +})(Reffuse) + +class Cls1 extends cls1 {} const cls2 = make({ aya() {} diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts new file mode 100644 index 0000000..d1016bf --- /dev/null +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -0,0 +1,426 @@ +import { Context, Effect, ExecutionStrategy, Exit, Fiber, Pipeable, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import * as React from "react" +import * as ReffuseContext from "./ReffuseContext.js" +import * as ReffuseRuntime from "./ReffuseRuntime.js" +import * as SetStateAction from "./SetStateAction.js" + + +export interface ReffuseHelper extends Pipeable.Pipeable { + useContext(): Context.Context + + useRunSync(): (effect: Effect.Effect) => A + useRunPromise(): (effect: Effect.Effect, options?: { + readonly signal?: AbortSignal + }) => Promise + useRunFork(): (effect: Effect.Effect, options?: Runtime.RunForkOptions) => Fiber.RuntimeFiber + useRunCallback(): (effect: Effect.Effect, options?: Runtime.RunCallbackOptions) => Runtime.Cancel + + useMemo( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions, + ): A + + useMemoScoped( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): A + + useLayoutEffect( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): void + + useFork( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: Runtime.RunForkOptions & RenderOptions & ScopeOptions, + ): void + + usePromise( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, + ): Promise + + useRef(value: A): SubscriptionRef.SubscriptionRef + useRefState(ref: SubscriptionRef.SubscriptionRef): readonly [A, React.Dispatch>] +} + + +export class ReffuseHelpers { + + readonly contexts: readonly ReffuseContext.ReffuseContext[] = [] + + + useContext(): Context.Context { + return ReffuseContext.useMergeAll(...this.contexts) + } + + + useRunSync() { + const runtime = ReffuseRuntime.useRuntime() + const context = this.useContext() + + return React.useCallback(( + effect: Effect.Effect + ): A => effect.pipe( + Effect.provide(context), + Runtime.runSync(runtime), + ), [runtime, context]) + } + + useRunPromise() { + const runtime = ReffuseRuntime.useRuntime() + const context = this.useContext() + + return React.useCallback(( + effect: Effect.Effect, + options?: { readonly signal?: AbortSignal }, + ): Promise => effect.pipe( + Effect.provide(context), + effect => Runtime.runPromise(runtime)(effect, options), + ), [runtime, context]) + } + + useRunFork() { + const runtime = ReffuseRuntime.useRuntime() + const context = this.useContext() + + return React.useCallback(( + effect: Effect.Effect, + options?: Runtime.RunForkOptions, + ): Fiber.RuntimeFiber => effect.pipe( + Effect.provide(context), + effect => Runtime.runFork(runtime)(effect, options), + ), [runtime, context]) + } + + useRunCallback() { + const runtime = ReffuseRuntime.useRuntime() + const context = this.useContext() + + return React.useCallback(( + effect: Effect.Effect, + options?: Runtime.RunCallbackOptions, + ): Runtime.Cancel => effect.pipe( + Effect.provide(context), + effect => Runtime.runCallback(runtime)(effect, options), + ), [runtime, context]) + } + + + /** + * Reffuse equivalent to `React.useMemo`. + * + * `useMemo` will only recompute the memoized value by running the given synchronous effect when one of the deps has changed. \ + * Trying to run an asynchronous effect will throw. + * + * Changes to the Reffuse runtime or context will recompute the value in addition to the deps. + * You can disable this behavior by setting `doNotReExecuteOnRuntimeOrContextChange` to `true` in `options`. + */ + useMemo( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions, + ): A { + const runSync = this.useRunSync() + + return React.useMemo(() => runSync(effect), [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], + ...(deps ?? []), + ]) + } + + useMemoScoped( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): A { + const runSync = this.useRunSync() + + // Calculate an initial version of the value so that it can be accessed during the first render + const [initialScope, initialValue] = React.useMemo(() => Scope.make(options?.finalizerExecutionStrategy).pipe( + Effect.flatMap(scope => effect.pipe( + Effect.provideService(Scope.Scope, scope), + Effect.map(value => [scope, value] as const), + )), + + runSync, + ), []) + + // Keep track of the state of the initial scope + const initialScopeClosed = React.useRef(false) + + const [value, setValue] = React.useState(initialValue) + + React.useEffect(() => { + const closeInitialScopeIfNeeded = Scope.close(initialScope, Exit.void).pipe( + Effect.andThen(Effect.sync(() => { initialScopeClosed.current = true })), + Effect.when(() => !initialScopeClosed.current), + ) + + const [scope, value] = closeInitialScopeIfNeeded.pipe( + Effect.andThen(Scope.make(options?.finalizerExecutionStrategy).pipe( + Effect.flatMap(scope => effect.pipe( + Effect.provideService(Scope.Scope, scope), + Effect.map(value => [scope, value] as const), + )) + )), + + runSync, + ) + + setValue(value) + return () => { runSync(Scope.close(scope, Exit.void)) } + }, [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], + ...(deps ?? []), + ]) + + return value + } + + /** + * Reffuse equivalent to `React.useEffect`. + * + * Executes a synchronous effect wrapped into a Scope when one of the deps has changed. Trying to run an asynchronous effect will throw. + * + * The Scope is closed on every cleanup, i.e. when one of the deps has changed and the effect needs to be re-executed. \ + * Add finalizers to the Scope to handle cleanup logic. + * + * Changes to the Reffuse runtime or context will re-execute the effect in addition to the deps. + * You can disable this behavior by setting `doNotReExecuteOnRuntimeOrContextChange` to `true` in `options`. + * + * ### Example + * ``` + * useEffect(Effect.addFinalizer(() => Console.log("Component unmounted")).pipe( + * Effect.flatMap(() => Console.log("Component mounted")) + * )) + * ``` + * + * Plain React equivalent: + * ``` + * React.useEffect(() => { + * console.log("Component mounted") + * return () => { console.log("Component unmounted") } + * }) + * ``` + */ + useEffect( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): void { + const runSync = this.useRunSync() + + return React.useEffect(() => { + const scope = Scope.make(options?.finalizerExecutionStrategy).pipe( + Effect.tap(scope => Effect.provideService(effect, Scope.Scope, scope)), + runSync, + ) + + return () => { runSync(Scope.close(scope, Exit.void)) } + }, [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], + ...(deps ?? []), + ]) + } + + /** + * Reffuse equivalent to `React.useLayoutEffect`. + * + * Executes a synchronous effect wrapped into a Scope when one of the deps has changed. Fires synchronously after all DOM mutations. \ + * Trying to run an asynchronous effect will throw. + * + * The Scope is closed on every cleanup, i.e. when one of the deps has changed and the effect needs to be re-executed. \ + * Add finalizers to the Scope to handle cleanup logic. + * + * Changes to the Reffuse runtime or context will re-execute the effect in addition to the deps. + * You can disable this behavior by setting `doNotReExecuteOnRuntimeOrContextChange` to `true` in `options`. + * + * ### Example + * ``` + * useLayoutEffect(Effect.addFinalizer(() => Console.log("Component unmounted")).pipe( + * Effect.flatMap(() => Console.log("Component mounted")) + * )) + * ``` + * + * Plain React equivalent: + * ``` + * React.useLayoutEffect(() => { + * console.log("Component mounted") + * return () => { console.log("Component unmounted") } + * }) + * ``` + */ + useLayoutEffect( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions & ScopeOptions, + ): void { + const runSync = this.useRunSync() + + return React.useLayoutEffect(() => { + const scope = Scope.make(options?.finalizerExecutionStrategy).pipe( + Effect.tap(scope => Effect.provideService(effect, Scope.Scope, scope)), + runSync, + ) + + return () => { runSync(Scope.close(scope, Exit.void)) } + }, [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], + ...(deps ?? []), + ]) + } + + /** + * An asynchronous and non-blocking alternative to `React.useEffect`. + * + * Forks an effect wrapped into a Scope in the background when one of the deps has changed. + * + * The Scope is closed on every cleanup, i.e. when one of the deps has changed and the effect needs to be re-executed. \ + * Add finalizers to the Scope to handle cleanup logic. + * + * Changes to the Reffuse runtime or context will re-execute the effect in addition to the deps. + * You can disable this behavior by setting `doNotReExecuteOnRuntimeOrContextChange` to `true` in `options`. + * + * ### Example + * ``` + * const timeRef = useRefFromEffect(DateTime.now) + * + * useFork(Effect.addFinalizer(() => Console.log("Cleanup")).pipe( + * Effect.map(() => Stream.repeatEffectWithSchedule( + * DateTime.now, + * Schedule.intersect(Schedule.forever, Schedule.spaced("1 second")), + * )), + * + * Effect.flatMap(Stream.runForEach(time => Ref.set(timeRef, time)), + * )), [timeRef]) + * + * const [time] = useRefState(timeRef) + * ``` + */ + useFork( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: Runtime.RunForkOptions & RenderOptions & ScopeOptions, + ): void { + const runSync = this.useRunSync() + const runFork = this.useRunFork() + + return React.useEffect(() => { + const scope = runSync(options?.scope + ? Scope.fork(options.scope, options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential) + : Scope.make(options?.finalizerExecutionStrategy) + ) + runFork(Effect.provideService(effect, Scope.Scope, scope), { ...options, scope }) + + return () => { runFork(Scope.close(scope, Exit.void)) } + }, [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], + ...(deps ?? []), + ]) + } + + usePromise( + effect: Effect.Effect, + deps?: React.DependencyList, + options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, + ): Promise { + const runSync = this.useRunSync() + const runFork = this.useRunFork() + + const [value, setValue] = React.useState(Promise.withResolvers().promise) + + React.useEffect(() => { + const { promise, resolve, reject } = Promise.withResolvers() + setValue(promise) + + const scope = runSync(options?.scope + ? Scope.fork(options.scope, options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential) + : Scope.make(options?.finalizerExecutionStrategy) + ) + + const cleanup = () => { runFork(Scope.close(scope, Exit.void)) } + if (options?.signal) + options.signal.addEventListener("abort", cleanup) + + effect.pipe( + Effect.provideService(Scope.Scope, scope), + Effect.match({ + onSuccess: resolve, + onFailure: reject, + }), + effect => runFork(effect, { ...options, scope }), + ) + + return () => { + if (options?.signal) + options.signal.removeEventListener("abort", cleanup) + + cleanup() + } + }, [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], + ...(deps ?? []), + ]) + + return value + } + + + useRef(value: A): SubscriptionRef.SubscriptionRef { + return this.useMemo( + SubscriptionRef.make(value), + [], + { doNotReExecuteOnRuntimeOrContextChange: true }, // Do not recreate the ref when the context changes + ) + } + + /** + * Binds the state of a `SubscriptionRef` to the state of the React component. + * + * Returns a [value, setter] tuple just like `React.useState` and triggers a re-render everytime the value held by the ref changes. + * + * Note that the rules of React's immutable state still apply: updating a ref with the same value will not trigger a re-render. + */ + useRefState(ref: SubscriptionRef.SubscriptionRef): [A, React.Dispatch>] { + const runSync = this.useRunSync() + + const initialState = React.useMemo(() => runSync(ref), []) + const [reactStateValue, setReactStateValue] = React.useState(initialState) + + this.useFork(Stream.runForEach(ref.changes, v => Effect.sync(() => + setReactStateValue(v) + )), [ref]) + + const setValue = React.useCallback((setStateAction: React.SetStateAction) => + runSync(Ref.update(ref, prevState => + SetStateAction.value(setStateAction, prevState) + )), + [ref]) + + return [reactStateValue, setValue] + } + +} + + +export interface ReffuseHelpers extends Pipeable.Pipeable {} + +ReffuseHelpers.prototype.pipe = function pipe() { + return Pipeable.pipeArguments(this, arguments) +} + + +export interface RenderOptions { + /** Prevents re-executing the effect when the Effect runtime or context changes. Defaults to `false`. */ + readonly doNotReExecuteOnRuntimeOrContextChange?: boolean +} + +export interface ScopeOptions { + readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy +} -- 2.49.1 From e1349e5e0390668c5a975d188facb3c9811ba8a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Feb 2025 15:44:28 +0100 Subject: [PATCH 022/326] Tests --- packages/reffuse/src/ReffuseExtension.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 8038e61..948d2c4 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -4,7 +4,7 @@ import * as ReffuseHelpers from "./ReffuseHelpers.js" import type { Merge, StaticType } from "./types.js" -class Reffuse extends ReffuseHelpers.ReffuseHelpers {} +class Reffuse extends ReffuseHelpers.ReffuseHelpers {} class MyService extends Effect.Service()("MyService", { succeed: {} @@ -39,7 +39,7 @@ export const withContexts = >( { new(): Merge< InstanceType, - { readonly contexts: readonly ReffuseContext.ReffuseContext[] } + ReffuseHelpers.ReffuseHelpers > } & StaticType -- 2.49.1 From be79d24d6e81aa0ed1874c1a322d36a3fae40e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 22 Feb 2025 01:03:15 +0100 Subject: [PATCH 023/326] Tests --- packages/reffuse/src/ReffuseExtension.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 948d2c4..57ae5af 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -43,13 +43,11 @@ export const withContexts = >( > } & StaticType - ) => { - const instance = new self() - - return class extends self { + ) => new self().pipe( + instance => class extends self { readonly contexts = [...instance.contexts, ...contexts] as const } as any - } + ) const withMyContext = withContexts(MyContext) -- 2.49.1 From e8742e5aa60f1e20255e7a219340141f7d5bbeff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 23 Feb 2025 23:38:24 +0100 Subject: [PATCH 024/326] Fix --- packages/reffuse/src/ReffuseExtension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 57ae5af..f39a433 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -34,7 +34,7 @@ export const withContexts = >( BaseClass extends typeof ReffuseHelpers.ReffuseHelpers, R1 >( - self: BaseClass & typeof ReffuseHelpers.ReffuseHelpers + self: BaseClass & { new(): ReffuseHelpers.ReffuseHelpers } ): ( { new(): Merge< -- 2.49.1 From 1f57f7d12779c31bdabe54237f6dd7ee0ededa08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Feb 2025 01:55:47 +0100 Subject: [PATCH 025/326] Tests --- packages/reffuse/src/ReffuseExtension.ts | 6 ++- packages/reffuse/src/ReffuseHelpers.ts | 56 ++++-------------------- 2 files changed, 13 insertions(+), 49 deletions(-) diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index f39a433..f3dcc5e 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -39,13 +39,15 @@ export const withContexts = >( { new(): Merge< InstanceType, - ReffuseHelpers.ReffuseHelpers + ReffuseHelpers.ReffuseHelpers & { + prototype: ReffuseHelpers.ReffuseHelpers + } > } & StaticType ) => new self().pipe( instance => class extends self { - readonly contexts = [...instance.contexts, ...contexts] as const + readonly contexts = [...instance.contexts, ...contexts] as any } as any ) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index d1016bf..0ac8c55 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -5,58 +5,13 @@ import * as ReffuseRuntime from "./ReffuseRuntime.js" import * as SetStateAction from "./SetStateAction.js" -export interface ReffuseHelper extends Pipeable.Pipeable { - useContext(): Context.Context - - useRunSync(): (effect: Effect.Effect) => A - useRunPromise(): (effect: Effect.Effect, options?: { - readonly signal?: AbortSignal - }) => Promise - useRunFork(): (effect: Effect.Effect, options?: Runtime.RunForkOptions) => Fiber.RuntimeFiber - useRunCallback(): (effect: Effect.Effect, options?: Runtime.RunCallbackOptions) => Runtime.Cancel - - useMemo( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: RenderOptions, - ): A - - useMemoScoped( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: RenderOptions & ScopeOptions, - ): A - - useLayoutEffect( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: RenderOptions & ScopeOptions, - ): void - - useFork( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: Runtime.RunForkOptions & RenderOptions & ScopeOptions, - ): void - - usePromise( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, - ): Promise - - useRef(value: A): SubscriptionRef.SubscriptionRef - useRefState(ref: SubscriptionRef.SubscriptionRef): readonly [A, React.Dispatch>] -} - - export class ReffuseHelpers { - readonly contexts: readonly ReffuseContext.ReffuseContext[] = [] + declare ["constructor"]: ReffuseHelpersClass useContext(): Context.Context { - return ReffuseContext.useMergeAll(...this.contexts) + return ReffuseContext.useMergeAll(...this.constructor.contexts) } @@ -416,6 +371,13 @@ ReffuseHelpers.prototype.pipe = function pipe() { } +export interface ReffuseHelpersClass extends Pipeable.Pipeable { + new(): ReffuseHelpers + prototype: ReffuseHelpers + readonly contexts: readonly ReffuseContext.ReffuseContext[] +} + + export interface RenderOptions { /** Prevents re-executing the effect when the Effect runtime or context changes. Defaults to `false`. */ readonly doNotReExecuteOnRuntimeOrContextChange?: boolean -- 2.49.1 From fb5bb7fcef01990ff12ea7da797505b0e84eaf91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Feb 2025 02:21:37 +0100 Subject: [PATCH 026/326] Cleanup --- packages/reffuse/src/ReffuseExtension.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index f3dcc5e..46e381b 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -39,9 +39,7 @@ export const withContexts = >( { new(): Merge< InstanceType, - ReffuseHelpers.ReffuseHelpers & { - prototype: ReffuseHelpers.ReffuseHelpers - } + ReffuseHelpers.ReffuseHelpers > } & StaticType -- 2.49.1 From e063eb06f745588247660defc6891670bfb4822f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Feb 2025 13:17:10 +0100 Subject: [PATCH 027/326] Extension work --- packages/reffuse/src/ReffuseExtension.ts | 32 +++++++++++------------- packages/reffuse/src/ReffuseHelpers.ts | 27 +++++++++++++------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 46e381b..2160bf9 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -4,7 +4,7 @@ import * as ReffuseHelpers from "./ReffuseHelpers.js" import type { Merge, StaticType } from "./types.js" -class Reffuse extends ReffuseHelpers.ReffuseHelpers {} +class Reffuse extends ReffuseHelpers.make([]) {} class MyService extends Effect.Service()("MyService", { succeed: {} @@ -15,15 +15,15 @@ const MyContext = ReffuseContext.make() const make = (extension: Ext) => < - BaseClass extends typeof Reffuse, - R, + BaseClass extends ReffuseHelpers.ReffuseHelpersClass, + R >( - base: BaseClass & typeof Reffuse + self: BaseClass & ReffuseHelpers.ReffuseHelpersClass ): ( { new(): Merge, Ext> } & StaticType ) => { - const class_ = class extends base {} + const class_ = class extends self {} return class_ } @@ -31,10 +31,10 @@ export const withContexts = >( ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] ) => < - BaseClass extends typeof ReffuseHelpers.ReffuseHelpers, + BaseClass extends ReffuseHelpers.ReffuseHelpersClass, R1 >( - self: BaseClass & { new(): ReffuseHelpers.ReffuseHelpers } + self: BaseClass & ReffuseHelpers.ReffuseHelpersClass ): ( { new(): Merge< @@ -42,12 +42,13 @@ export const withContexts = >( ReffuseHelpers.ReffuseHelpers > } & - StaticType - ) => new self().pipe( - instance => class extends self { - readonly contexts = [...instance.contexts, ...contexts] as any - } as any - ) + Merge< + StaticType, + StaticType> + > + ) => class extends self { + readonly contexts = [...self.contexts, ...contexts] + } as any const withMyContext = withContexts(MyContext) @@ -56,13 +57,8 @@ class ReffuseWithMyContext extends clsWithMyContext {} const t = new ReffuseWithMyContext() - const cls1 = make({ prout(this: ReffuseHelpers.ReffuseHelpers) {} })(Reffuse) class Cls1 extends cls1 {} - -const cls2 = make({ - aya() {} -})(cls) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 0ac8c55..47a0160 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -5,7 +5,17 @@ import * as ReffuseRuntime from "./ReffuseRuntime.js" import * as SetStateAction from "./SetStateAction.js" -export class ReffuseHelpers { +export interface RenderOptions { + /** Prevents re-executing the effect when the Effect runtime or context changes. Defaults to `false`. */ + readonly doNotReExecuteOnRuntimeOrContextChange?: boolean +} + +export interface ScopeOptions { + readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy +} + + +export abstract class ReffuseHelpers { declare ["constructor"]: ReffuseHelpersClass @@ -373,16 +383,15 @@ ReffuseHelpers.prototype.pipe = function pipe() { export interface ReffuseHelpersClass extends Pipeable.Pipeable { new(): ReffuseHelpers - prototype: ReffuseHelpers readonly contexts: readonly ReffuseContext.ReffuseContext[] } - -export interface RenderOptions { - /** Prevents re-executing the effect when the Effect runtime or context changes. Defaults to `false`. */ - readonly doNotReExecuteOnRuntimeOrContextChange?: boolean +(ReffuseHelpers as ReffuseHelpersClass).pipe = function pipe() { + return Pipeable.pipeArguments(this, arguments) } -export interface ScopeOptions { - readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy -} + +export const make = (contexts: readonly ReffuseContext.ReffuseContext[]): ReffuseHelpersClass => + class extends (ReffuseHelpers as ReffuseHelpersClass) { + static readonly contexts = contexts + } -- 2.49.1 From 28424b63cb0d59b697ee14873f216a9dbfd75107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Feb 2025 13:47:29 +0100 Subject: [PATCH 028/326] Working extension --- packages/reffuse/src/ReffuseExtension.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 2160bf9..4e16d61 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -24,7 +24,8 @@ const make = (extension: Ext) => StaticType ) => { const class_ = class extends self {} - return class_ + class_.prototype = { ...class_.prototype, ...extension } as any + return class_ as any } export const withContexts = >( @@ -55,10 +56,14 @@ const withMyContext = withContexts(MyContext) const clsWithMyContext = withMyContext(Reffuse) class ReffuseWithMyContext extends clsWithMyContext {} -const t = new ReffuseWithMyContext() -const cls1 = make({ +const withProut = make({ prout(this: ReffuseHelpers.ReffuseHelpers) {} -})(Reffuse) +}) -class Cls1 extends cls1 {} +class MyReffuse extends Reffuse.pipe( + withProut, + withContexts(MyContext), +) {} + +new MyReffuse().useFork() -- 2.49.1 From 60274266da489d197994c5efced1c2b17cbc2a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Feb 2025 20:00:02 +0100 Subject: [PATCH 029/326] Extension work --- packages/reffuse/src/Reffuse.ts | 420 ++--------------------- packages/reffuse/src/ReffuseExtension.ts | 34 +- packages/reffuse/src/ReffuseHelpers.ts | 46 ++- 3 files changed, 58 insertions(+), 442 deletions(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 5f899f5..7aac7eb 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -1,399 +1,29 @@ -import { Context, Effect, ExecutionStrategy, Exit, Fiber, Pipeable, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" -import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" -import * as ReffuseRuntime from "./ReffuseRuntime.js" -import * as SetStateAction from "./SetStateAction.js" +import * as ReffuseHelpers from "./ReffuseHelpers.js" +import type { Merge, StaticType } from "./types.js" -export class Reffuse { +export class Reffuse extends ReffuseHelpers.make() {} - constructor( - readonly contexts: readonly ReffuseContext.ReffuseContext[] - ) {} - - - useContext(): Context.Context { - return ReffuseContext.useMergeAll(...this.contexts) - } - - - useRunSync() { - const runtime = ReffuseRuntime.useRuntime() - const context = this.useContext() - - return React.useCallback(( - effect: Effect.Effect - ): A => effect.pipe( - Effect.provide(context), - Runtime.runSync(runtime), - ), [runtime, context]) - } - - useRunPromise() { - const runtime = ReffuseRuntime.useRuntime() - const context = this.useContext() - - return React.useCallback(( - effect: Effect.Effect, - options?: { readonly signal?: AbortSignal }, - ): Promise => effect.pipe( - Effect.provide(context), - effect => Runtime.runPromise(runtime)(effect, options), - ), [runtime, context]) - } - - useRunFork() { - const runtime = ReffuseRuntime.useRuntime() - const context = this.useContext() - - return React.useCallback(( - effect: Effect.Effect, - options?: Runtime.RunForkOptions, - ): Fiber.RuntimeFiber => effect.pipe( - Effect.provide(context), - effect => Runtime.runFork(runtime)(effect, options), - ), [runtime, context]) - } - - useRunCallback() { - const runtime = ReffuseRuntime.useRuntime() - const context = this.useContext() - - return React.useCallback(( - effect: Effect.Effect, - options?: Runtime.RunCallbackOptions, - ): Runtime.Cancel => effect.pipe( - Effect.provide(context), - effect => Runtime.runCallback(runtime)(effect, options), - ), [runtime, context]) - } - - - /** - * Reffuse equivalent to `React.useMemo`. - * - * `useMemo` will only recompute the memoized value by running the given synchronous effect when one of the deps has changed. \ - * Trying to run an asynchronous effect will throw. - * - * Changes to the Reffuse runtime or context will recompute the value in addition to the deps. - * You can disable this behavior by setting `doNotReExecuteOnRuntimeOrContextChange` to `true` in `options`. - */ - useMemo( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: RenderOptions, - ): A { - const runSync = this.useRunSync() - - return React.useMemo(() => runSync(effect), [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], - ...(deps ?? []), - ]) - } - - useMemoScoped( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: RenderOptions & ScopeOptions, - ): A { - const runSync = this.useRunSync() - - // Calculate an initial version of the value so that it can be accessed during the first render - const [initialScope, initialValue] = React.useMemo(() => Scope.make(options?.finalizerExecutionStrategy).pipe( - Effect.flatMap(scope => effect.pipe( - Effect.provideService(Scope.Scope, scope), - Effect.map(value => [scope, value] as const), - )), - - runSync, - ), []) - - // Keep track of the state of the initial scope - const initialScopeClosed = React.useRef(false) - - const [value, setValue] = React.useState(initialValue) - - React.useEffect(() => { - const closeInitialScopeIfNeeded = Scope.close(initialScope, Exit.void).pipe( - Effect.andThen(Effect.sync(() => { initialScopeClosed.current = true })), - Effect.when(() => !initialScopeClosed.current), - ) - - const [scope, value] = closeInitialScopeIfNeeded.pipe( - Effect.andThen(Scope.make(options?.finalizerExecutionStrategy).pipe( - Effect.flatMap(scope => effect.pipe( - Effect.provideService(Scope.Scope, scope), - Effect.map(value => [scope, value] as const), - )) - )), - - runSync, - ) - - setValue(value) - return () => { runSync(Scope.close(scope, Exit.void)) } - }, [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], - ...(deps ?? []), - ]) - - return value - } - - /** - * Reffuse equivalent to `React.useEffect`. - * - * Executes a synchronous effect wrapped into a Scope when one of the deps has changed. Trying to run an asynchronous effect will throw. - * - * The Scope is closed on every cleanup, i.e. when one of the deps has changed and the effect needs to be re-executed. \ - * Add finalizers to the Scope to handle cleanup logic. - * - * Changes to the Reffuse runtime or context will re-execute the effect in addition to the deps. - * You can disable this behavior by setting `doNotReExecuteOnRuntimeOrContextChange` to `true` in `options`. - * - * ### Example - * ``` - * useEffect(Effect.addFinalizer(() => Console.log("Component unmounted")).pipe( - * Effect.flatMap(() => Console.log("Component mounted")) - * )) - * ``` - * - * Plain React equivalent: - * ``` - * React.useEffect(() => { - * console.log("Component mounted") - * return () => { console.log("Component unmounted") } - * }) - * ``` - */ - useEffect( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: RenderOptions & ScopeOptions, - ): void { - const runSync = this.useRunSync() - - return React.useEffect(() => { - const scope = Scope.make(options?.finalizerExecutionStrategy).pipe( - Effect.tap(scope => Effect.provideService(effect, Scope.Scope, scope)), - runSync, - ) - - return () => { runSync(Scope.close(scope, Exit.void)) } - }, [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], - ...(deps ?? []), - ]) - } - - /** - * Reffuse equivalent to `React.useLayoutEffect`. - * - * Executes a synchronous effect wrapped into a Scope when one of the deps has changed. Fires synchronously after all DOM mutations. \ - * Trying to run an asynchronous effect will throw. - * - * The Scope is closed on every cleanup, i.e. when one of the deps has changed and the effect needs to be re-executed. \ - * Add finalizers to the Scope to handle cleanup logic. - * - * Changes to the Reffuse runtime or context will re-execute the effect in addition to the deps. - * You can disable this behavior by setting `doNotReExecuteOnRuntimeOrContextChange` to `true` in `options`. - * - * ### Example - * ``` - * useLayoutEffect(Effect.addFinalizer(() => Console.log("Component unmounted")).pipe( - * Effect.flatMap(() => Console.log("Component mounted")) - * )) - * ``` - * - * Plain React equivalent: - * ``` - * React.useLayoutEffect(() => { - * console.log("Component mounted") - * return () => { console.log("Component unmounted") } - * }) - * ``` - */ - useLayoutEffect( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: RenderOptions & ScopeOptions, - ): void { - const runSync = this.useRunSync() - - return React.useLayoutEffect(() => { - const scope = Scope.make(options?.finalizerExecutionStrategy).pipe( - Effect.tap(scope => Effect.provideService(effect, Scope.Scope, scope)), - runSync, - ) - - return () => { runSync(Scope.close(scope, Exit.void)) } - }, [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], - ...(deps ?? []), - ]) - } - - /** - * An asynchronous and non-blocking alternative to `React.useEffect`. - * - * Forks an effect wrapped into a Scope in the background when one of the deps has changed. - * - * The Scope is closed on every cleanup, i.e. when one of the deps has changed and the effect needs to be re-executed. \ - * Add finalizers to the Scope to handle cleanup logic. - * - * Changes to the Reffuse runtime or context will re-execute the effect in addition to the deps. - * You can disable this behavior by setting `doNotReExecuteOnRuntimeOrContextChange` to `true` in `options`. - * - * ### Example - * ``` - * const timeRef = useRefFromEffect(DateTime.now) - * - * useFork(Effect.addFinalizer(() => Console.log("Cleanup")).pipe( - * Effect.map(() => Stream.repeatEffectWithSchedule( - * DateTime.now, - * Schedule.intersect(Schedule.forever, Schedule.spaced("1 second")), - * )), - * - * Effect.flatMap(Stream.runForEach(time => Ref.set(timeRef, time)), - * )), [timeRef]) - * - * const [time] = useRefState(timeRef) - * ``` - */ - useFork( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: Runtime.RunForkOptions & RenderOptions & ScopeOptions, - ): void { - const runSync = this.useRunSync() - const runFork = this.useRunFork() - - return React.useEffect(() => { - const scope = runSync(options?.scope - ? Scope.fork(options.scope, options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential) - : Scope.make(options?.finalizerExecutionStrategy) - ) - runFork(Effect.provideService(effect, Scope.Scope, scope), { ...options, scope }) - - return () => { runFork(Scope.close(scope, Exit.void)) } - }, [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], - ...(deps ?? []), - ]) - } - - usePromise( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, - ): Promise { - const runSync = this.useRunSync() - const runFork = this.useRunFork() - - const [value, setValue] = React.useState(Promise.withResolvers().promise) - - React.useEffect(() => { - const { promise, resolve, reject } = Promise.withResolvers() - setValue(promise) - - const scope = runSync(options?.scope - ? Scope.fork(options.scope, options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential) - : Scope.make(options?.finalizerExecutionStrategy) - ) - - const cleanup = () => { runFork(Scope.close(scope, Exit.void)) } - if (options?.signal) - options.signal.addEventListener("abort", cleanup) - - effect.pipe( - Effect.provideService(Scope.Scope, scope), - Effect.match({ - onSuccess: resolve, - onFailure: reject, - }), - effect => runFork(effect, { ...options, scope }), - ) - - return () => { - if (options?.signal) - options.signal.removeEventListener("abort", cleanup) - - cleanup() - } - }, [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], - ...(deps ?? []), - ]) - - return value - } - - - useRef(value: A): SubscriptionRef.SubscriptionRef { - return this.useMemo( - SubscriptionRef.make(value), - [], - { doNotReExecuteOnRuntimeOrContextChange: true }, // Do not recreate the ref when the context changes - ) - } - - /** - * Binds the state of a `SubscriptionRef` to the state of the React component. - * - * Returns a [value, setter] tuple just like `React.useState` and triggers a re-render everytime the value held by the ref changes. - * - * Note that the rules of React's immutable state still apply: updating a ref with the same value will not trigger a re-render. - */ - useRefState(ref: SubscriptionRef.SubscriptionRef): [A, React.Dispatch>] { - const runSync = this.useRunSync() - - const initialState = React.useMemo(() => runSync(ref), []) - const [reactStateValue, setReactStateValue] = React.useState(initialState) - - this.useFork(Stream.runForEach(ref.changes, v => Effect.sync(() => - setReactStateValue(v) - )), [ref]) - - const setValue = React.useCallback((setStateAction: React.SetStateAction) => - runSync(Ref.update(ref, prevState => - SetStateAction.value(setStateAction, prevState) - )), - [ref]) - - return [reactStateValue, setValue] - } - -} - - -export interface Reffuse extends Pipeable.Pipeable {} - -Reffuse.prototype.pipe = function pipe() { - return Pipeable.pipeArguments(this, arguments) -} - - -export interface RenderOptions { - /** Prevents re-executing the effect when the Effect runtime or context changes. Defaults to `false`. */ - readonly doNotReExecuteOnRuntimeOrContextChange?: boolean -} - -export interface ScopeOptions { - readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy -} - - -export const make = >( - ...contexts: [...{ [K in keyof T]: ReffuseContext.ReffuseContext }] -): Reffuse => - new Reffuse(contexts) - -// export const make = (): Reffuse => new Reffuse([]) - -// export const withContexts = >( -// ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] -// ) => -// , R1>(self: T & Reffuse): ( -// Reffuse & Exclude> -// ) => -// new Reffuse([...self.contexts, ...contexts as any]) as any +export const withContexts = >( + ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] +) => + < + BaseClass extends ReffuseHelpers.ReffuseHelpersClass, + R1 + >( + self: BaseClass & ReffuseHelpers.ReffuseHelpersClass + ): ( + { + new(): Merge< + InstanceType, + { constructor: ReffuseHelpers.ReffuseHelpersClass } + > + } & + Merge< + StaticType, + StaticType> + > + ) => class extends self { + readonly contexts = [...self.contexts, ...contexts] + } as any diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 4e16d61..2e0d69a 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -1,11 +1,10 @@ import { Effect } from "effect" +import * as Reffuse from "./Reffuse.js" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseHelpers from "./ReffuseHelpers.js" import type { Merge, StaticType } from "./types.js" -class Reffuse extends ReffuseHelpers.make([]) {} - class MyService extends Effect.Service()("MyService", { succeed: {} }) {} @@ -28,32 +27,9 @@ const make = (extension: Ext) => return class_ as any } -export const withContexts = >( - ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] -) => - < - BaseClass extends ReffuseHelpers.ReffuseHelpersClass, - R1 - >( - self: BaseClass & ReffuseHelpers.ReffuseHelpersClass - ): ( - { - new(): Merge< - InstanceType, - ReffuseHelpers.ReffuseHelpers - > - } & - Merge< - StaticType, - StaticType> - > - ) => class extends self { - readonly contexts = [...self.contexts, ...contexts] - } as any - -const withMyContext = withContexts(MyContext) -const clsWithMyContext = withMyContext(Reffuse) +const withMyContext = Reffuse.withContexts(MyContext) +const clsWithMyContext = withMyContext(Reffuse.Reffuse) class ReffuseWithMyContext extends clsWithMyContext {} @@ -61,9 +37,9 @@ const withProut = make({ prout(this: ReffuseHelpers.ReffuseHelpers) {} }) -class MyReffuse extends Reffuse.pipe( +class MyReffuse extends Reffuse.Reffuse.pipe( withProut, - withContexts(MyContext), + Reffuse.withContexts(MyContext), ) {} new MyReffuse().useFork() diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 47a0160..1f967ff 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -16,16 +16,15 @@ export interface ScopeOptions { export abstract class ReffuseHelpers { - declare ["constructor"]: ReffuseHelpersClass - useContext(): Context.Context { + useContext(this: ReffuseHelpers): Context.Context { return ReffuseContext.useMergeAll(...this.constructor.contexts) } - useRunSync() { + useRunSync(this: ReffuseHelpers) { const runtime = ReffuseRuntime.useRuntime() const context = this.useContext() @@ -37,7 +36,7 @@ export abstract class ReffuseHelpers { ), [runtime, context]) } - useRunPromise() { + useRunPromise(this: ReffuseHelpers) { const runtime = ReffuseRuntime.useRuntime() const context = this.useContext() @@ -50,7 +49,7 @@ export abstract class ReffuseHelpers { ), [runtime, context]) } - useRunFork() { + useRunFork(this: ReffuseHelpers) { const runtime = ReffuseRuntime.useRuntime() const context = this.useContext() @@ -63,7 +62,7 @@ export abstract class ReffuseHelpers { ), [runtime, context]) } - useRunCallback() { + useRunCallback(this: ReffuseHelpers) { const runtime = ReffuseRuntime.useRuntime() const context = this.useContext() @@ -86,7 +85,8 @@ export abstract class ReffuseHelpers { * Changes to the Reffuse runtime or context will recompute the value in addition to the deps. * You can disable this behavior by setting `doNotReExecuteOnRuntimeOrContextChange` to `true` in `options`. */ - useMemo( + useMemo( + this: ReffuseHelpers, effect: Effect.Effect, deps?: React.DependencyList, options?: RenderOptions, @@ -99,7 +99,8 @@ export abstract class ReffuseHelpers { ]) } - useMemoScoped( + useMemoScoped( + this: ReffuseHelpers, effect: Effect.Effect, deps?: React.DependencyList, options?: RenderOptions & ScopeOptions, @@ -174,7 +175,8 @@ export abstract class ReffuseHelpers { * }) * ``` */ - useEffect( + useEffect( + this: ReffuseHelpers, effect: Effect.Effect, deps?: React.DependencyList, options?: RenderOptions & ScopeOptions, @@ -221,7 +223,8 @@ export abstract class ReffuseHelpers { * }) * ``` */ - useLayoutEffect( + useLayoutEffect( + this: ReffuseHelpers, effect: Effect.Effect, deps?: React.DependencyList, options?: RenderOptions & ScopeOptions, @@ -268,7 +271,8 @@ export abstract class ReffuseHelpers { * const [time] = useRefState(timeRef) * ``` */ - useFork( + useFork( + this: ReffuseHelpers, effect: Effect.Effect, deps?: React.DependencyList, options?: Runtime.RunForkOptions & RenderOptions & ScopeOptions, @@ -290,7 +294,8 @@ export abstract class ReffuseHelpers { ]) } - usePromise( + usePromise( + this: ReffuseHelpers, effect: Effect.Effect, deps?: React.DependencyList, options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, @@ -337,7 +342,10 @@ export abstract class ReffuseHelpers { } - useRef(value: A): SubscriptionRef.SubscriptionRef { + useRef( + this: ReffuseHelpers, + value: A, + ): SubscriptionRef.SubscriptionRef { return this.useMemo( SubscriptionRef.make(value), [], @@ -352,7 +360,10 @@ export abstract class ReffuseHelpers { * * Note that the rules of React's immutable state still apply: updating a ref with the same value will not trigger a re-render. */ - useRefState(ref: SubscriptionRef.SubscriptionRef): [A, React.Dispatch>] { + useRefState( + this: ReffuseHelpers, + ref: SubscriptionRef.SubscriptionRef, + ): [A, React.Dispatch>] { const runSync = this.useRunSync() const initialState = React.useMemo(() => runSync(ref), []) @@ -370,7 +381,6 @@ export abstract class ReffuseHelpers { return [reactStateValue, setValue] } - } @@ -391,7 +401,7 @@ export interface ReffuseHelpersClass extends Pipeable.Pipeable { } -export const make = (contexts: readonly ReffuseContext.ReffuseContext[]): ReffuseHelpersClass => - class extends (ReffuseHelpers as ReffuseHelpersClass) { - static readonly contexts = contexts +export const make = (): ReffuseHelpersClass => + class extends (ReffuseHelpers as ReffuseHelpersClass) { + static readonly contexts = [] } -- 2.49.1 From 690dec1f1a989b5fa9a9a0921003fa41e300e91c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Feb 2025 20:18:56 +0100 Subject: [PATCH 030/326] Finalized --- packages/example/src/reffuse.ts | 6 ++- packages/example/src/todos/reffuse.ts | 7 ++- packages/reffuse/src/ReffuseExtension.ts | 29 +----------- packages/reffuse/src/ReffuseHelper.ts | 57 ------------------------ packages/reffuse/src/index.ts | 2 + 5 files changed, 13 insertions(+), 88 deletions(-) delete mode 100644 packages/reffuse/src/ReffuseHelper.ts diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index beba3d3..ac2e2b8 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -10,4 +10,8 @@ export const GlobalContext = ReffuseContext.make< | HttpClient.HttpClient >() -export const R = Reffuse.make(GlobalContext) +export class GlobalReffuse extends Reffuse.Reffuse.pipe( + Reffuse.withContexts(GlobalContext) +) {} + +export const R = new GlobalReffuse() diff --git a/packages/example/src/todos/reffuse.ts b/packages/example/src/todos/reffuse.ts index 8502e12..d01357c 100644 --- a/packages/example/src/todos/reffuse.ts +++ b/packages/example/src/todos/reffuse.ts @@ -1,7 +1,10 @@ -import { GlobalContext } from "@/reffuse" +import { GlobalReffuse } from "@/reffuse" import { Reffuse, ReffuseContext } from "reffuse" import { TodosState } from "./services" export const TodosContext = ReffuseContext.make() -export const R = Reffuse.make(GlobalContext, TodosContext) + +export const R = new class TodosReffuse extends GlobalReffuse.pipe( + Reffuse.withContexts(TodosContext) +) {} diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 2e0d69a..0ba7909 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -1,18 +1,8 @@ -import { Effect } from "effect" -import * as Reffuse from "./Reffuse.js" -import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseHelpers from "./ReffuseHelpers.js" import type { Merge, StaticType } from "./types.js" -class MyService extends Effect.Service()("MyService", { - succeed: {} -}) {} - -const MyContext = ReffuseContext.make() - - -const make = (extension: Ext) => +export const make = (extension: Ext) => < BaseClass extends ReffuseHelpers.ReffuseHelpersClass, R @@ -26,20 +16,3 @@ const make = (extension: Ext) => class_.prototype = { ...class_.prototype, ...extension } as any return class_ as any } - - -const withMyContext = Reffuse.withContexts(MyContext) -const clsWithMyContext = withMyContext(Reffuse.Reffuse) -class ReffuseWithMyContext extends clsWithMyContext {} - - -const withProut = make({ - prout(this: ReffuseHelpers.ReffuseHelpers) {} -}) - -class MyReffuse extends Reffuse.Reffuse.pipe( - withProut, - Reffuse.withContexts(MyContext), -) {} - -new MyReffuse().useFork() diff --git a/packages/reffuse/src/ReffuseHelper.ts b/packages/reffuse/src/ReffuseHelper.ts deleted file mode 100644 index d41f572..0000000 --- a/packages/reffuse/src/ReffuseHelper.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { Context, Effect, ExecutionStrategy, Fiber, Pipeable, Runtime, Scope, SubscriptionRef } from "effect" -import type * as React from "react" - - -export interface ReffuseHelper extends Pipeable.Pipeable { - useContext(): Context.Context - - useRunSync(): (effect: Effect.Effect) => A - useRunPromise(): (effect: Effect.Effect, options?: { - readonly signal?: AbortSignal - }) => Promise - useRunFork(): (effect: Effect.Effect, options?: Runtime.RunForkOptions) => Fiber.RuntimeFiber - useRunCallback(): (effect: Effect.Effect, options?: Runtime.RunCallbackOptions) => Runtime.Cancel - - useMemo( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: RenderOptions, - ): A - - useMemoScoped( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: RenderOptions & ScopeOptions, - ): A - - useLayoutEffect( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: RenderOptions & ScopeOptions, - ): void - - useFork( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: Runtime.RunForkOptions & RenderOptions & ScopeOptions, - ): void - - usePromise( - effect: Effect.Effect, - deps?: React.DependencyList, - options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, - ): Promise - - useRef(value: A): SubscriptionRef.SubscriptionRef - useRefState(ref: SubscriptionRef.SubscriptionRef): readonly [A, React.Dispatch>] -} - - -export interface RenderOptions { - /** Prevents re-executing the effect when the Effect runtime or context changes. Defaults to `false`. */ - readonly doNotReExecuteOnRuntimeOrContextChange?: boolean -} - -export interface ScopeOptions { - readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy -} diff --git a/packages/reffuse/src/index.ts b/packages/reffuse/src/index.ts index 01c00cb..63af29b 100644 --- a/packages/reffuse/src/index.ts +++ b/packages/reffuse/src/index.ts @@ -1,4 +1,6 @@ export * as Reffuse from "./Reffuse.js" export * as ReffuseContext from "./ReffuseContext.js" +export * as ReffuseExtension from "./ReffuseExtension.js" +export * as ReffuseHelpers from "./ReffuseHelpers.js" export * as ReffuseRuntime from "./ReffuseRuntime.js" export * as SetStateAction from "./SetStateAction.js" -- 2.49.1 From da0f6168f0305701568f54d70711d545ac9c49a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Feb 2025 20:47:49 +0100 Subject: [PATCH 031/326] Fix --- packages/reffuse/src/Reffuse.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 7aac7eb..5372b25 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -25,5 +25,5 @@ export const withContexts = >( StaticType> > ) => class extends self { - readonly contexts = [...self.contexts, ...contexts] + static readonly contexts = [...self.contexts, ...contexts] } as any -- 2.49.1 From ce3989ab77d25ef8e00babb1bb76985142596400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Feb 2025 21:09:44 +0100 Subject: [PATCH 032/326] Extension fix --- packages/reffuse/src/ReffuseExtension.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index 0ba7909..f15af1b 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -2,7 +2,7 @@ import * as ReffuseHelpers from "./ReffuseHelpers.js" import type { Merge, StaticType } from "./types.js" -export const make = (extension: Ext) => +export const make = (extension: () => Ext) => < BaseClass extends ReffuseHelpers.ReffuseHelpersClass, R @@ -13,6 +13,6 @@ export const make = (extension: Ext) => StaticType ) => { const class_ = class extends self {} - class_.prototype = { ...class_.prototype, ...extension } as any + Object.assign(class_.prototype, extension()) return class_ as any } -- 2.49.1 From 85e7b549624200ab3bf315bf52e72720203341b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Feb 2025 21:24:38 +0100 Subject: [PATCH 033/326] extension-lazyref --- bun.lock | 11 ++++++++ packages/extension-lazyref/README.md | 12 ++++++++ packages/extension-lazyref/package.json | 36 ++++++++++++++++++++++++ packages/extension-lazyref/src/index.ts | 0 packages/extension-lazyref/tsconfig.json | 33 ++++++++++++++++++++++ 5 files changed, 92 insertions(+) create mode 100644 packages/extension-lazyref/README.md create mode 100644 packages/extension-lazyref/package.json create mode 100644 packages/extension-lazyref/src/index.ts create mode 100644 packages/extension-lazyref/tsconfig.json diff --git a/bun.lock b/bun.lock index bf4b7fe..b932993 100644 --- a/bun.lock +++ b/bun.lock @@ -41,6 +41,15 @@ "vite": "^6.1.0", }, }, + "packages/extension-lazyref": { + "name": "@reffuse/extension-lazyref", + "version": "0.1.0", + "devDependencies": { + "@types/react": "^19.0.10", + "effect": "~3.13.1", + "react": "^19.0.0", + }, + }, "packages/reffuse": { "name": "reffuse", "version": "0.1.1", @@ -314,6 +323,8 @@ "@reffuse/example": ["@reffuse/example@workspace:packages/example"], + "@reffuse/extension-lazyref": ["@reffuse/extension-lazyref@workspace:packages/extension-lazyref"], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.34.8", "", { "os": "android", "cpu": "arm" }, "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw=="], "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.34.8", "", { "os": "android", "cpu": "arm64" }, "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q=="], diff --git a/packages/extension-lazyref/README.md b/packages/extension-lazyref/README.md new file mode 100644 index 0000000..dab847a --- /dev/null +++ b/packages/extension-lazyref/README.md @@ -0,0 +1,12 @@ +# Reffuse + +[Effect-TS](https://effect.website/) integration for React 19+ with the aim of integrating the Effect context system within React's component hierarchy, while avoiding touching React's internals. + +This library is in early development. While it is (almost) feature complete and mostly usable, expect bugs and quirks. Things are still being ironed out, so ideas and criticisms are more than welcome. + +Documentation is currently being written. In the meantime, you can take a look at the `packages/example` directory. + +## Dependencies +(needs to be manually installed) +- `effect` +- `react` 19+ diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json new file mode 100644 index 0000000..17434bd --- /dev/null +++ b/packages/extension-lazyref/package.json @@ -0,0 +1,36 @@ +{ + "name": "@reffuse/extension-lazyref", + "version": "0.1.0", + "type": "module", + "files": [ + "./README.md", + "./dist" + ], + "license": "MIT", + "repository": { + "url": "git+https://github.com/Thiladev/reffuse.git" + }, + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./*": { + "types": "./dist/*.d.ts", + "default": "./dist/*.js" + } + }, + "scripts": { + "build": "tsc", + "lint:tsc": "tsc --noEmit", + "clean:cache": "rm -f tsconfig.tsbuildinfo", + "clean:dist": "rm -rf dist", + "clean:node": "rm -rf node_modules" + }, + "devDependencies": { + "@types/react": "^19.0.10", + "effect": "~3.13.1", + "react": "^19.0.0" + } +} diff --git a/packages/extension-lazyref/src/index.ts b/packages/extension-lazyref/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/extension-lazyref/tsconfig.json b/packages/extension-lazyref/tsconfig.json new file mode 100644 index 0000000..eea16a8 --- /dev/null +++ b/packages/extension-lazyref/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "NodeNext", + "moduleDetection": "force", + "jsx": "react-jsx", + // "allowJs": true, + + // Bundler mode + "moduleResolution": "NodeNext", + // "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + // "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false, + + // Build + "outDir": "./dist", + "declaration": true + }, + + "include": ["./src"] +} -- 2.49.1 From 411397c7de7e496141df24789c605774b8069326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Feb 2025 21:30:13 +0100 Subject: [PATCH 034/326] Fix --- packages/reffuse/src/Reffuse.ts | 2 +- packages/reffuse/src/ReffuseExtension.ts | 2 +- packages/reffuse/src/ReffuseHelpers.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 5372b25..0721298 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -1,4 +1,4 @@ -import * as ReffuseContext from "./ReffuseContext.js" +import type * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseHelpers from "./ReffuseHelpers.js" import type { Merge, StaticType } from "./types.js" diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index f15af1b..ce1fdea 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -1,4 +1,4 @@ -import * as ReffuseHelpers from "./ReffuseHelpers.js" +import type * as ReffuseHelpers from "./ReffuseHelpers.js" import type { Merge, StaticType } from "./types.js" diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 1f967ff..1605791 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -1,4 +1,4 @@ -import { Context, Effect, ExecutionStrategy, Exit, Fiber, Pipeable, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, Pipeable, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" -- 2.49.1 From 38fcafb15cedb816a4551fab624a4dc36f6d55bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 10:21:34 +0100 Subject: [PATCH 035/326] Dependencies --- bun.lock | 206 +++++++++--------------- packages/example/package.json | 26 +-- packages/extension-lazyref/package.json | 6 +- packages/reffuse/package.json | 6 +- 4 files changed, 96 insertions(+), 148 deletions(-) diff --git a/bun.lock b/bun.lock index b932993..b795ae8 100644 --- a/bun.lock +++ b/bun.lock @@ -12,50 +12,50 @@ "name": "@reffuse/example", "version": "0.0.0", "dependencies": { - "@effect/platform": "~0.77.1", - "@effect/platform-browser": "~0.56.1", + "@effect/platform": "^0.77.2", + "@effect/platform-browser": "^0.56.2", "@radix-ui/themes": "^3.2.0", "@typed/id": "^0.17.1", "@typed/lazy-ref": "^0.3.3", - "effect": "~3.13.1", - "lucide-react": "^0.475.0", + "effect": "^3.13.2", + "lucide-react": "^0.476.0", "mobx": "^6.13.6", "reffuse": "workspace:*", }, "devDependencies": { - "@eslint/js": "^9.20.0", - "@tanstack/react-router": "^1.105.0", - "@tanstack/router-devtools": "^1.105.0", - "@tanstack/router-plugin": "^1.105.0", + "@eslint/js": "^9.21.0", + "@tanstack/react-router": "^1.111.7", + "@tanstack/router-devtools": "^1.111.7", + "@tanstack/router-plugin": "^1.111.7", "@thilawyn/thilaschema": "^0.1.4", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.20.1", + "eslint": "^9.21.0", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^15.15.0", + "globals": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "typescript-eslint": "^8.24.1", - "vite": "^6.1.0", + "typescript-eslint": "^8.25.0", + "vite": "^6.2.0", }, }, "packages/extension-lazyref": { "name": "@reffuse/extension-lazyref", "version": "0.1.0", - "devDependencies": { - "@types/react": "^19.0.10", - "effect": "~3.13.1", + "peerDependencies": { + "@types/react": "^19.0.0", + "effect": "^3.13.0", "react": "^19.0.0", }, }, "packages/reffuse": { "name": "reffuse", "version": "0.1.1", - "devDependencies": { - "@types/react": "^19.0.10", - "effect": "~3.13.1", + "peerDependencies": { + "@types/react": "^19.0.0", + "effect": "^3.13.0", "react": "^19.0.0", }, }, @@ -103,59 +103,59 @@ "@babel/types": ["@babel/types@7.26.9", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw=="], - "@effect/platform": ["@effect/platform@0.77.1", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.13.1" } }, "sha512-3oHbKiOLN7AIjyucZW+kH5ebG1PhEEBrsdd+HWbDQbAG0gVZfgOUmXR9cyM6M9L+9oVPgOW5mIgcEi6RvD02Cw=="], + "@effect/platform": ["@effect/platform@0.77.2", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.13.2" } }, "sha512-stvroKHJVfjd3XhZJEPUAOgzqu9DH1vnGHIAjfs2ma6Z4qcjVpFXrxa0ZYmwRaWVIFsiADMenkN0I7XrRdAgLw=="], - "@effect/platform-browser": ["@effect/platform-browser@0.56.1", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.77.1", "effect": "^3.13.1" } }, "sha512-LKuLblMHuHKsv9ZdN8j44zzY4ftQaGh5jsOWqTtoHIDSS8beUOcp2a5JnsRT310N4Ym7e14cKWfqgdAXm+J0dw=="], + "@effect/platform-browser": ["@effect/platform-browser@0.56.2", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.77.2", "effect": "^3.13.2" } }, "sha512-mzCNipg3FN9/ATPEO7Cc3cLmTF4gtdoQSVVi5RPJzIxXflVHbNmMFSIuFdGp0W3AbrQ20dfF6FGFaRUo3aFHeA=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.0", "", { "os": "android", "cpu": "arm" }, "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.0", "", { "os": "android", "cpu": "arm64" }, "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.0", "", { "os": "android", "cpu": "x64" }, "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.0", "", { "os": "linux", "cpu": "arm" }, "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.0", "", { "os": "linux", "cpu": "none" }, "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.0", "", { "os": "linux", "cpu": "none" }, "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.0", "", { "os": "linux", "cpu": "none" }, "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.0", "", { "os": "linux", "cpu": "x64" }, "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.0", "", { "os": "none", "cpu": "arm64" }, "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.0", "", { "os": "none", "cpu": "x64" }, "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ=="], "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="], @@ -163,15 +163,15 @@ "@eslint/config-array": ["@eslint/config-array@0.19.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w=="], - "@eslint/core": ["@eslint/core@0.11.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA=="], + "@eslint/core": ["@eslint/core@0.12.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.2.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ=="], - "@eslint/js": ["@eslint/js@9.20.0", "", {}, "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ=="], + "@eslint/js": ["@eslint/js@9.21.0", "", {}, "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.5", "", { "dependencies": { "@eslint/core": "^0.10.0", "levn": "^0.4.1" } }, "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.7", "", { "dependencies": { "@eslint/core": "^0.12.0", "levn": "^0.4.1" } }, "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g=="], "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], @@ -187,7 +187,7 @@ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.1", "", {}, "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA=="], + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.2", "", {}, "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], @@ -367,17 +367,17 @@ "@tanstack/history": ["@tanstack/history@1.99.13", "", {}, "sha512-JMd7USmnp8zV8BRGIjALqzPxazvKtQ7PGXQC7n39HpbqdsmfV2ePCzieO84IvN+mwsTrXErpbjI4BfKCa+ZNCg=="], - "@tanstack/react-router": ["@tanstack/react-router@1.105.0", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "^1.104.1", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-k4Umuy7rna/hhfHkmbq9dCmj9Hp8D0V6dPNCrCXceJb0gQWGxl1KWLXFbw8Ywe/sNyzIzPrMwrMit++MXHo8iw=="], + "@tanstack/react-router": ["@tanstack/react-router@1.111.7", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "^1.111.7", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-/hOWy7lPmVfRqbwIy2d9mvVLA6ZC4tbcgLDdMXCNRN93LMsGEHCTrgFADdSL2f/rvhPyHeYxsFazEo9+ktgUiw=="], "@tanstack/react-store": ["@tanstack/react-store@0.7.0", "", { "dependencies": { "@tanstack/store": "0.7.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng=="], - "@tanstack/router-core": ["@tanstack/router-core@1.104.1", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/store": "^0.7.0" } }, "sha512-8nP/V5paP+S/17rlw+B2F12R2bB9PixU/+qnD2QdCjK1ajnG4qA0pVN3VSTQe2oCKND6GPZpm2ikmQWumwss9Q=="], + "@tanstack/router-core": ["@tanstack/router-core@1.111.7", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/store": "^0.7.0" } }, "sha512-N3u3HGBNb1k+MvL15CGmE4KFEDy3euU/L3ENXjmzPm8zfpeVjs+Tyk3y0nicAk3MSSboGXVU1po19RATdWnTsg=="], - "@tanstack/router-devtools": ["@tanstack/router-devtools@1.105.0", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/react-router": "^1.105.0", "csstype": "^3.0.10", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["csstype"] }, "sha512-X583hyUyhL30g5ax1J/lbgb3DYpgsiSUv0ERaF5Gg0PoxPYJSybmw79xwFbrTBDxXCXxfg4AFCAEcmkAQemPWA=="], + "@tanstack/router-devtools": ["@tanstack/router-devtools@1.111.7", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/react-router": "^1.111.7", "csstype": "^3.0.10", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["csstype"] }, "sha512-xZpiIWy/HBhpYUqUxT1dNUn5smQhWhkgjNlJOATzrm81G5T3l2jEr79XPXqwRndWzu2WKqv1kPkScC0ekRgE7Q=="], - "@tanstack/router-generator": ["@tanstack/router-generator@1.105.0", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.99.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.1" }, "peerDependencies": { "@tanstack/react-router": "^1.105.0" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-P5e4S7XcaECWKDdR4Zs/FpY4Z127zGv1FcmKEzsFRSGJZm7lHshWayYJIjwkeJ+Ier2IkVN+VRaFWC5GKv0jIg=="], + "@tanstack/router-generator": ["@tanstack/router-generator@1.111.7", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.99.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.1" }, "peerDependencies": { "@tanstack/react-router": "^1.111.7" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-+jHX35iF45NHQvHzXuLgyCILUUTyMl3EeClKNkfdaKLvV1adwGDQr24cSKDQLmNKEDXGTijBI5nX8ntkKo5oyA=="], - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.105.0", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-generator": "^1.105.0", "@tanstack/router-utils": "^1.102.2", "@tanstack/virtual-file-routes": "^1.99.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.9", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.1" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.105.0", "vite": ">=5.0.0 || >=6.0.0", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "webpack"] }, "sha512-iGwKZIyl8+os4PA9v57BlTtKVnQ5mCvxYT4p5TR/Q8zW1KBs4fC5F7EhL1BgH8fY12IL4ByuuJ+porzp+mfmJQ=="], + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.111.7", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.111.7", "@tanstack/router-generator": "^1.111.7", "@tanstack/router-utils": "^1.102.2", "@tanstack/virtual-file-routes": "^1.99.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.9", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.1" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.111.7", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-aiT/j2OadGbqEWTZUY53o2UeVQIR11+S1h1Gq6GYxQmD/OjdyK/WiMighBK5zeryeWYG4XeC8eFlXMoyuG0v+g=="], "@tanstack/router-utils": ["@tanstack/router-utils@1.102.2", "", { "dependencies": { "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "ansis": "^3.11.0", "diff": "^7.0.0" } }, "sha512-Uwl2nbrxhCzviaHHBLNPhSC/OMpZLdOTxTJndUSsXTzWUP4IoQcVmngaIsxi9iriE3ArC1VXuanUAkfGmimNOQ=="], @@ -407,21 +407,21 @@ "@types/react-dom": ["@types/react-dom@19.0.4", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.24.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.24.1", "@typescript-eslint/type-utils": "8.24.1", "@typescript-eslint/utils": "8.24.1", "@typescript-eslint/visitor-keys": "8.24.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.25.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/type-utils": "8.25.0", "@typescript-eslint/utils": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.24.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.24.1", "@typescript-eslint/types": "8.24.1", "@typescript-eslint/typescript-estree": "8.24.1", "@typescript-eslint/visitor-keys": "8.24.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.25.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/types": "8.25.0", "@typescript-eslint/typescript-estree": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.24.1", "", { "dependencies": { "@typescript-eslint/types": "8.24.1", "@typescript-eslint/visitor-keys": "8.24.1" } }, "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.25.0", "", { "dependencies": { "@typescript-eslint/types": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0" } }, "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.24.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.24.1", "@typescript-eslint/utils": "8.24.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.25.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.25.0", "@typescript-eslint/utils": "8.25.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.24.1", "", {}, "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.25.0", "", {}, "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.24.1", "", { "dependencies": { "@typescript-eslint/types": "8.24.1", "@typescript-eslint/visitor-keys": "8.24.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.25.0", "", { "dependencies": { "@typescript-eslint/types": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.24.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.24.1", "@typescript-eslint/types": "8.24.1", "@typescript-eslint/typescript-estree": "8.24.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.25.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/types": "8.25.0", "@typescript-eslint/typescript-estree": "8.25.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.24.1", "", { "dependencies": { "@typescript-eslint/types": "8.24.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.25.0", "", { "dependencies": { "@typescript-eslint/types": "8.25.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@4.3.4", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug=="], @@ -433,7 +433,7 @@ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "ansis": ["ansis@3.15.0", "", {}, "sha512-zIcWDJ+Kwqxfdnogx66Gxzr0kVmCcRAdat9nlY2IHsshqTN4fBH6tMeRMPA/2w0rpBayIJvjQAaa2/4RDrNqwg=="], + "ansis": ["ansis@3.16.0", "", {}, "sha512-sU7d/tfZiYrsIAXbdL/CNZld5bCkruzwT5KmqmadCJYxuLxHAOBjidxD5+iLmN/6xEfjcQq1l7OpsiCBlc4LzA=="], "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], @@ -485,17 +485,17 @@ "diff": ["diff@7.0.0", "", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="], - "effect": ["effect@3.13.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-YbA45m51eZapqy/ptZvIIZi+XBj13fPCzbiDRLgxZTEUhKuf4xLzuuSsKc61Y3SIscMM2o+VPht2ty+bVEQHQQ=="], + "effect": ["effect@3.13.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-/w+CPqHDJ33Wq7xC4YKAchrEEPtjvxh563xH9kDTZp99seNYBoBs87vl8DJwartEjj+KLQLP8PzoDne+XmGT2A=="], - "electron-to-chromium": ["electron-to-chromium@1.5.102", "", {}, "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q=="], + "electron-to-chromium": ["electron-to-chromium@1.5.104", "", {}, "sha512-Us9M2L4cO/zMBqVkJtnj353nQhMju9slHm62NprKTmdF3HH8wYOtNvDFq/JB2+ZRoGLzdvYDiATlMHs98XBM1g=="], - "esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], + "esbuild": ["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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.20.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.11.0", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "9.20.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g=="], + "eslint": ["eslint@9.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.2", "@eslint/core": "^0.12.0", "@eslint/eslintrc": "^3.3.0", "@eslint/js": "9.21.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg=="], "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.1.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw=="], @@ -537,7 +537,7 @@ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - "flatted": ["flatted@3.3.2", "", {}, "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="], + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], @@ -549,7 +549,7 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + "globals": ["globals@16.0.0", "", {}, "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A=="], "goober": ["goober@2.1.16", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g=="], @@ -597,7 +597,7 @@ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "lucide-react": ["lucide-react@0.475.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg=="], + "lucide-react": ["lucide-react@0.476.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-x6cLTk8gahdUPje0hSgLN1/MgiJH+Xl90Xoxy9bkPAsMPOUiyRSKR4JCDPGVCEpyqnZXH3exFWNItcvra9WzUQ=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], @@ -619,7 +619,7 @@ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - "npm-check-updates": ["npm-check-updates@17.1.14", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA=="], + "npm-check-updates": ["npm-check-updates@17.1.15", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-miATvKu5rjec/1wxc5TGDjpsucgtCHwRVZorZpDkS6NzdWXfnUWlN4abZddWb7XSijAuBNzzYglIdTm9SbgMVg=="], "npm-sort": ["npm-sort@0.0.4", "", { "bin": { "npm-sort": "./index.js" } }, "sha512-S5Id/3Jvr7Cf/QnWjRteprngERCBhhEFOM+wMhUrAYP060/HUBC1aL5GoXS3xITlgacJCWaSmP4HQaAt91nNYQ=="], @@ -639,11 +639,11 @@ "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "postcss": ["postcss@8.5.2", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA=="], + "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.5.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw=="], + "prettier": ["prettier@3.5.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], @@ -705,7 +705,7 @@ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "tsx": ["tsx@4.19.2", "", { "dependencies": { "esbuild": "~0.23.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g=="], + "tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], @@ -713,7 +713,7 @@ "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], - "typescript-eslint": ["typescript-eslint@8.24.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.24.1", "@typescript-eslint/parser": "8.24.1", "@typescript-eslint/utils": "8.24.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA=="], + "typescript-eslint": ["typescript-eslint@8.25.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.25.0", "@typescript-eslint/parser": "8.25.0", "@typescript-eslint/utils": "8.25.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q=="], "unplugin": ["unplugin@2.2.0", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw=="], @@ -727,7 +727,7 @@ "use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], - "vite": ["vite@6.1.0", "", { "dependencies": { "esbuild": "^0.24.2", "postcss": "^8.5.1", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ=="], + "vite": ["vite@6.2.0", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], @@ -747,8 +747,6 @@ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.10.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw=="], - "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], @@ -759,56 +757,6 @@ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "tsx/esbuild": ["esbuild@0.23.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.23.1", "@esbuild/android-arm": "0.23.1", "@esbuild/android-arm64": "0.23.1", "@esbuild/android-x64": "0.23.1", "@esbuild/darwin-arm64": "0.23.1", "@esbuild/darwin-x64": "0.23.1", "@esbuild/freebsd-arm64": "0.23.1", "@esbuild/freebsd-x64": "0.23.1", "@esbuild/linux-arm": "0.23.1", "@esbuild/linux-arm64": "0.23.1", "@esbuild/linux-ia32": "0.23.1", "@esbuild/linux-loong64": "0.23.1", "@esbuild/linux-mips64el": "0.23.1", "@esbuild/linux-ppc64": "0.23.1", "@esbuild/linux-riscv64": "0.23.1", "@esbuild/linux-s390x": "0.23.1", "@esbuild/linux-x64": "0.23.1", "@esbuild/netbsd-x64": "0.23.1", "@esbuild/openbsd-arm64": "0.23.1", "@esbuild/openbsd-x64": "0.23.1", "@esbuild/sunos-x64": "0.23.1", "@esbuild/win32-arm64": "0.23.1", "@esbuild/win32-ia32": "0.23.1", "@esbuild/win32-x64": "0.23.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.23.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ=="], - - "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.23.1", "", { "os": "android", "cpu": "arm" }, "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ=="], - - "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.23.1", "", { "os": "android", "cpu": "arm64" }, "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw=="], - - "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.23.1", "", { "os": "android", "cpu": "x64" }, "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg=="], - - "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.23.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q=="], - - "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.23.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw=="], - - "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.23.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA=="], - - "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.23.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g=="], - - "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.23.1", "", { "os": "linux", "cpu": "arm" }, "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ=="], - - "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.23.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g=="], - - "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.23.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ=="], - - "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw=="], - - "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q=="], - - "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.23.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw=="], - - "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA=="], - - "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.23.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw=="], - - "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.23.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ=="], - - "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.23.1", "", { "os": "none", "cpu": "x64" }, "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA=="], - - "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.23.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q=="], - - "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.23.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA=="], - - "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.23.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA=="], - - "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.23.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A=="], - - "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.23.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ=="], - - "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.23.1", "", { "os": "win32", "cpu": "x64" }, "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg=="], } } diff --git a/packages/example/package.json b/packages/example/package.json index 2bb12a0..24c7735 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -11,35 +11,35 @@ "preview": "vite preview" }, "devDependencies": { - "@eslint/js": "^9.20.0", - "@tanstack/react-router": "^1.105.0", - "@tanstack/router-devtools": "^1.105.0", - "@tanstack/router-plugin": "^1.105.0", + "@eslint/js": "^9.21.0", + "@tanstack/react-router": "^1.111.7", + "@tanstack/router-devtools": "^1.111.7", + "@tanstack/router-plugin": "^1.111.7", "@thilawyn/thilaschema": "^0.1.4", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.20.1", + "eslint": "^9.21.0", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^15.15.0", + "globals": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "typescript-eslint": "^8.24.1", - "vite": "^6.1.0" + "typescript-eslint": "^8.25.0", + "vite": "^6.2.0" }, "dependencies": { - "@effect/platform": "~0.77.1", - "@effect/platform-browser": "~0.56.1", + "@effect/platform": "^0.77.2", + "@effect/platform-browser": "^0.56.2", "@radix-ui/themes": "^3.2.0", "@typed/id": "^0.17.1", "@typed/lazy-ref": "^0.3.3", - "effect": "~3.13.1", - "lucide-react": "^0.475.0", + "effect": "^3.13.2", + "lucide-react": "^0.476.0", "mobx": "^6.13.6", "reffuse": "workspace:*" }, "overrides": { - "effect": "~3.13.1" + "effect": "^3.13.2" } } diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index 17434bd..ea92696 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -28,9 +28,9 @@ "clean:dist": "rm -rf dist", "clean:node": "rm -rf node_modules" }, - "devDependencies": { - "@types/react": "^19.0.10", - "effect": "~3.13.1", + "peerDependencies": { + "@types/react": "^19.0.0", + "effect": "^3.13.0", "react": "^19.0.0" } } diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 8b27899..5082340 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -28,9 +28,9 @@ "clean:dist": "rm -rf dist", "clean:node": "rm -rf node_modules" }, - "devDependencies": { - "@types/react": "^19.0.10", - "effect": "~3.13.1", + "peerDependencies": { + "@types/react": "^19.0.0", + "effect": "^3.13.0", "react": "^19.0.0" } } -- 2.49.1 From 8873e81f7cd80c5d55871f268fdf0a338e0639b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 10:31:43 +0100 Subject: [PATCH 036/326] Dependencies --- bun.lock | 1 + packages/extension-lazyref/package.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bun.lock b/bun.lock index b795ae8..238d47b 100644 --- a/bun.lock +++ b/bun.lock @@ -48,6 +48,7 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", + "reffuse": "^0.1.1", }, }, "packages/reffuse": { diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index ea92696..16f34b6 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -31,6 +31,7 @@ "peerDependencies": { "@types/react": "^19.0.0", "effect": "^3.13.0", - "react": "^19.0.0" + "react": "^19.0.0", + "reffuse": "^0.1.1" } } -- 2.49.1 From d9a01dae0f6abd108f38eb1272e9dafca4bf2831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 11:22:49 +0100 Subject: [PATCH 037/326] withLazyRef --- bun.lock | 1 + packages/extension-lazyref/package.json | 1 + packages/extension-lazyref/src/index.ts | 29 +++++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/bun.lock b/bun.lock index 238d47b..5743f6a 100644 --- a/bun.lock +++ b/bun.lock @@ -45,6 +45,7 @@ "name": "@reffuse/extension-lazyref", "version": "0.1.0", "peerDependencies": { + "@typed/lazy-ref": "^0.3.3", "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index 16f34b6..8ca9de8 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -29,6 +29,7 @@ "clean:node": "rm -rf node_modules" }, "peerDependencies": { + "@typed/lazy-ref": "^0.3.3", "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", diff --git a/packages/extension-lazyref/src/index.ts b/packages/extension-lazyref/src/index.ts index e69de29..301509a 100644 --- a/packages/extension-lazyref/src/index.ts +++ b/packages/extension-lazyref/src/index.ts @@ -0,0 +1,29 @@ +import * as LazyRef from "@typed/lazy-ref" +import { Effect, Stream } from "effect" +import * as React from "react" +import { ReffuseExtension, ReffuseHelpers, SetStateAction } from "reffuse" + + +export const withLazyRef = ReffuseExtension.make(() => ({ + useLazyRefState( + this: ReffuseHelpers.ReffuseHelpers, + ref: LazyRef.LazyRef, + ): [A, React.Dispatch>] { + const runSync = this.useRunSync() + + const initialState = React.useMemo(() => runSync(ref), []) + const [reactStateValue, setReactStateValue] = React.useState(initialState) + + this.useFork(Stream.runForEach(ref.changes, v => Effect.sync(() => + setReactStateValue(v) + )), [ref]) + + const setValue = React.useCallback((setStateAction: React.SetStateAction) => + runSync(LazyRef.update(ref, prevState => + SetStateAction.value(setStateAction, prevState) + )), + [ref]) + + return [reactStateValue, setValue] + }, +})) -- 2.49.1 From 8754020323badd2d5f8798d9f656be6f237ac266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 12:17:45 +0100 Subject: [PATCH 038/326] Working lazyref extension --- packages/example/package.json | 1 + packages/example/src/reffuse.ts | 4 ++- packages/example/src/routeTree.gen.ts | 44 ++++++++++++++++++++++-- packages/example/src/routes/lazyref.tsx | 31 +++++++++++++++++ packages/extension-lazyref/src/index.ts | 4 +-- packages/reffuse/src/Reffuse.ts | 18 ++++++++++ packages/reffuse/src/ReffuseContext.tsx | 3 +- packages/reffuse/src/ReffuseExtension.ts | 23 ++++--------- 8 files changed, 103 insertions(+), 25 deletions(-) create mode 100644 packages/example/src/routes/lazyref.tsx diff --git a/packages/example/package.json b/packages/example/package.json index 24c7735..e1a234e 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -32,6 +32,7 @@ "@effect/platform": "^0.77.2", "@effect/platform-browser": "^0.56.2", "@radix-ui/themes": "^3.2.0", + "@reffuse/extension-lazyref": "workspace:*", "@typed/id": "^0.17.1", "@typed/lazy-ref": "^0.3.3", "effect": "^3.13.2", diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index ac2e2b8..0aefd92 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -1,5 +1,6 @@ import { HttpClient } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" +import { LazyRefExtension } from "@reffuse/extension-lazyref" import { Reffuse, ReffuseContext } from "reffuse" @@ -11,7 +12,8 @@ export const GlobalContext = ReffuseContext.make< >() export class GlobalReffuse extends Reffuse.Reffuse.pipe( - Reffuse.withContexts(GlobalContext) + Reffuse.withExtension(LazyRefExtension), + Reffuse.withContexts(GlobalContext), ) {} export const R = new GlobalReffuse() diff --git a/packages/example/src/routeTree.gen.ts b/packages/example/src/routeTree.gen.ts index b1e3d9c..98b4224 100644 --- a/packages/example/src/routeTree.gen.ts +++ b/packages/example/src/routeTree.gen.ts @@ -14,6 +14,7 @@ import { Route as rootRoute } from './routes/__root' import { Route as TimeImport } from './routes/time' import { Route as TestsImport } from './routes/tests' import { Route as PromiseImport } from './routes/promise' +import { Route as LazyrefImport } from './routes/lazyref' import { Route as CountImport } from './routes/count' import { Route as BlankImport } from './routes/blank' import { Route as IndexImport } from './routes/index' @@ -38,6 +39,12 @@ const PromiseRoute = PromiseImport.update({ getParentRoute: () => rootRoute, } as any) +const LazyrefRoute = LazyrefImport.update({ + id: '/lazyref', + path: '/lazyref', + getParentRoute: () => rootRoute, +} as any) + const CountRoute = CountImport.update({ id: '/count', path: '/count', @@ -81,6 +88,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof CountImport parentRoute: typeof rootRoute } + '/lazyref': { + id: '/lazyref' + path: '/lazyref' + fullPath: '/lazyref' + preLoaderRoute: typeof LazyrefImport + parentRoute: typeof rootRoute + } '/promise': { id: '/promise' path: '/promise' @@ -111,6 +125,7 @@ export interface FileRoutesByFullPath { '/': typeof IndexRoute '/blank': typeof BlankRoute '/count': typeof CountRoute + '/lazyref': typeof LazyrefRoute '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute @@ -120,6 +135,7 @@ export interface FileRoutesByTo { '/': typeof IndexRoute '/blank': typeof BlankRoute '/count': typeof CountRoute + '/lazyref': typeof LazyrefRoute '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute @@ -130,6 +146,7 @@ export interface FileRoutesById { '/': typeof IndexRoute '/blank': typeof BlankRoute '/count': typeof CountRoute + '/lazyref': typeof LazyrefRoute '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute @@ -137,10 +154,25 @@ export interface FileRoutesById { export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath - fullPaths: '/' | '/blank' | '/count' | '/promise' | '/tests' | '/time' + fullPaths: + | '/' + | '/blank' + | '/count' + | '/lazyref' + | '/promise' + | '/tests' + | '/time' fileRoutesByTo: FileRoutesByTo - to: '/' | '/blank' | '/count' | '/promise' | '/tests' | '/time' - id: '__root__' | '/' | '/blank' | '/count' | '/promise' | '/tests' | '/time' + to: '/' | '/blank' | '/count' | '/lazyref' | '/promise' | '/tests' | '/time' + id: + | '__root__' + | '/' + | '/blank' + | '/count' + | '/lazyref' + | '/promise' + | '/tests' + | '/time' fileRoutesById: FileRoutesById } @@ -148,6 +180,7 @@ export interface RootRouteChildren { IndexRoute: typeof IndexRoute BlankRoute: typeof BlankRoute CountRoute: typeof CountRoute + LazyrefRoute: typeof LazyrefRoute PromiseRoute: typeof PromiseRoute TestsRoute: typeof TestsRoute TimeRoute: typeof TimeRoute @@ -157,6 +190,7 @@ const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, BlankRoute: BlankRoute, CountRoute: CountRoute, + LazyrefRoute: LazyrefRoute, PromiseRoute: PromiseRoute, TestsRoute: TestsRoute, TimeRoute: TimeRoute, @@ -175,6 +209,7 @@ export const routeTree = rootRoute "/", "/blank", "/count", + "/lazyref", "/promise", "/tests", "/time" @@ -189,6 +224,9 @@ export const routeTree = rootRoute "/count": { "filePath": "count.tsx" }, + "/lazyref": { + "filePath": "lazyref.tsx" + }, "/promise": { "filePath": "promise.tsx" }, diff --git a/packages/example/src/routes/lazyref.tsx b/packages/example/src/routes/lazyref.tsx new file mode 100644 index 0000000..586f25c --- /dev/null +++ b/packages/example/src/routes/lazyref.tsx @@ -0,0 +1,31 @@ +import { R } from "@/reffuse" +import { Button, Text } from "@radix-ui/themes" +import { createFileRoute } from "@tanstack/react-router" +import * as LazyRef from "@typed/lazy-ref" +import { Suspense, use } from "react" + + +export const Route = createFileRoute("/lazyref")({ + component: RouteComponent +}) + +function RouteComponent() { + const promise = R.usePromise(LazyRef.of(0)) + + return ( + Loading...}> + + + ) +} + +function LazyRefComponent({ promise }: { readonly promise: Promise> }) { + const ref = use(promise) + const [value, setValue] = R.useLazyRefState(ref) + + return ( + + ) +} diff --git a/packages/extension-lazyref/src/index.ts b/packages/extension-lazyref/src/index.ts index 301509a..42728c5 100644 --- a/packages/extension-lazyref/src/index.ts +++ b/packages/extension-lazyref/src/index.ts @@ -1,10 +1,10 @@ import * as LazyRef from "@typed/lazy-ref" import { Effect, Stream } from "effect" import * as React from "react" -import { ReffuseExtension, ReffuseHelpers, SetStateAction } from "reffuse" +import { ReffuseExtension, type ReffuseHelpers, SetStateAction } from "reffuse" -export const withLazyRef = ReffuseExtension.make(() => ({ +export const LazyRefExtension = ReffuseExtension.make(() => ({ useLazyRefState( this: ReffuseHelpers.ReffuseHelpers, ref: LazyRef.LazyRef, diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 0721298..87d13e4 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -1,10 +1,12 @@ import type * as ReffuseContext from "./ReffuseContext.js" +import type * as ReffuseExtension from "./ReffuseExtension.js" import * as ReffuseHelpers from "./ReffuseHelpers.js" import type { Merge, StaticType } from "./types.js" export class Reffuse extends ReffuseHelpers.make() {} + export const withContexts = >( ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] ) => @@ -27,3 +29,19 @@ export const withContexts = >( ) => class extends self { static readonly contexts = [...self.contexts, ...contexts] } as any + + +export const withExtension = (extension: ReffuseExtension.ReffuseExtension) => + < + BaseClass extends ReffuseHelpers.ReffuseHelpersClass, + R + >( + self: BaseClass & ReffuseHelpers.ReffuseHelpersClass + ): ( + { new(): Merge, A> } & + StaticType + ) => { + const class_ = class extends self {} + Object.assign(class_.prototype, extension()) + return class_ as any + } diff --git a/packages/reffuse/src/ReffuseContext.tsx b/packages/reffuse/src/ReffuseContext.tsx index c914a61..e7e723a 100644 --- a/packages/reffuse/src/ReffuseContext.tsx +++ b/packages/reffuse/src/ReffuseContext.tsx @@ -3,7 +3,6 @@ import * as React from "react" import * as ReffuseRuntime from "./ReffuseRuntime.js" -// TODO: merge this with the Provider, just like React 19 contexts export class ReffuseContext { readonly Context = React.createContext>(null!) @@ -11,7 +10,7 @@ export class ReffuseContext { constructor() { // TODO: scope the layer creation - this.Provider = (props) => { + this.Provider = props => { const runtime = ReffuseRuntime.useRuntime() const value = React.useMemo(() => Effect.context().pipe( diff --git a/packages/reffuse/src/ReffuseExtension.ts b/packages/reffuse/src/ReffuseExtension.ts index ce1fdea..3dda6c2 100644 --- a/packages/reffuse/src/ReffuseExtension.ts +++ b/packages/reffuse/src/ReffuseExtension.ts @@ -1,18 +1,7 @@ -import type * as ReffuseHelpers from "./ReffuseHelpers.js" -import type { Merge, StaticType } from "./types.js" +export interface ReffuseExtension { + (): A + readonly Type: A +} - -export const make = (extension: () => Ext) => - < - BaseClass extends ReffuseHelpers.ReffuseHelpersClass, - R - >( - self: BaseClass & ReffuseHelpers.ReffuseHelpersClass - ): ( - { new(): Merge, Ext> } & - StaticType - ) => { - const class_ = class extends self {} - Object.assign(class_.prototype, extension()) - return class_ as any - } +export const make = (extension: () => A): ReffuseExtension => + extension as ReffuseExtension -- 2.49.1 From 8e1f0a27cfbd08a5259ca2cc8a6aa693546b630f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 13:45:09 +0100 Subject: [PATCH 039/326] Lockfile --- bun.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/bun.lock b/bun.lock index 5743f6a..f832058 100644 --- a/bun.lock +++ b/bun.lock @@ -15,6 +15,7 @@ "@effect/platform": "^0.77.2", "@effect/platform-browser": "^0.56.2", "@radix-ui/themes": "^3.2.0", + "@reffuse/extension-lazyref": "workspace:*", "@typed/id": "^0.17.1", "@typed/lazy-ref": "^0.3.3", "effect": "^3.13.2", -- 2.49.1 From 44de864713c1c5fef4058436d50aa63e14eaf5eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 14:48:58 +0100 Subject: [PATCH 040/326] API update --- packages/example/src/routes/lazyref.tsx | 2 +- packages/example/src/routes/promise.tsx | 2 +- packages/example/src/routes/tests.tsx | 2 +- packages/example/src/routes/time.tsx | 4 +- packages/example/src/todos/views/VNewTodo.tsx | 2 +- packages/example/src/todos/views/VTodos.tsx | 4 +- packages/extension-lazyref/src/index.ts | 2 +- packages/reffuse/src/ReffuseHelpers.ts | 68 +++++++++---------- 8 files changed, 42 insertions(+), 44 deletions(-) diff --git a/packages/example/src/routes/lazyref.tsx b/packages/example/src/routes/lazyref.tsx index 586f25c..32d8187 100644 --- a/packages/example/src/routes/lazyref.tsx +++ b/packages/example/src/routes/lazyref.tsx @@ -10,7 +10,7 @@ export const Route = createFileRoute("/lazyref")({ }) function RouteComponent() { - const promise = R.usePromise(LazyRef.of(0)) + const promise = R.usePromise(() => LazyRef.of(0)) return ( Loading...}> diff --git a/packages/example/src/routes/promise.tsx b/packages/example/src/routes/promise.tsx index 58c1452..09af62a 100644 --- a/packages/example/src/routes/promise.tsx +++ b/packages/example/src/routes/promise.tsx @@ -15,7 +15,7 @@ const Result = Schema.Tuple(Schema.String) type Result = typeof Result.Type function RouteComponent() { - const promise = R.usePromise(Effect.addFinalizer(() => Console.log("Cleanup")).pipe( + const promise = R.usePromise(() => Effect.addFinalizer(() => Console.log("Cleanup")).pipe( Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 82b6919..ab6e89a 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -14,7 +14,7 @@ function RouteComponent() { // ), []) // console.log(value) - R.useFork(Effect.addFinalizer(() => Console.log("cleanup")).pipe( + R.useFork(() => Effect.addFinalizer(() => Console.log("cleanup")).pipe( Effect.andThen(Console.log("ouient")), Effect.delay("1 second"), )) diff --git a/packages/example/src/routes/time.tsx b/packages/example/src/routes/time.tsx index 7332f6b..f99f979 100644 --- a/packages/example/src/routes/time.tsx +++ b/packages/example/src/routes/time.tsx @@ -15,9 +15,9 @@ export const Route = createFileRoute("/time")({ function Time() { - const timeRef = R.useMemo(DateTime.now.pipe(Effect.flatMap(SubscriptionRef.make))) + const timeRef = R.useMemo(() => DateTime.now.pipe(Effect.flatMap(SubscriptionRef.make))) - R.useFork(Effect.addFinalizer(() => Console.log("Cleanup")).pipe( + R.useFork(() => Effect.addFinalizer(() => Console.log("Cleanup")).pipe( Effect.andThen(Stream.runForEach(timeEverySecond, v => Ref.set(timeRef, v))) ), [timeRef]) diff --git a/packages/example/src/todos/views/VNewTodo.tsx b/packages/example/src/todos/views/VNewTodo.tsx index ccb4346..2328006 100644 --- a/packages/example/src/todos/views/VNewTodo.tsx +++ b/packages/example/src/todos/views/VNewTodo.tsx @@ -18,7 +18,7 @@ export function VNewTodo() { const runSync = R.useRunSync() - const todoRef = R.useMemo(createEmptyTodo.pipe(Effect.flatMap(SubscriptionRef.make))) + const todoRef = R.useMemo(() => createEmptyTodo.pipe(Effect.flatMap(SubscriptionRef.make))) const [todo, setTodo] = R.useRefState(todoRef) diff --git a/packages/example/src/todos/views/VTodos.tsx b/packages/example/src/todos/views/VTodos.tsx index c747afa..83485b0 100644 --- a/packages/example/src/todos/views/VTodos.tsx +++ b/packages/example/src/todos/views/VTodos.tsx @@ -9,13 +9,13 @@ import { VTodo } from "./VTodo" export function VTodos() { // Sync changes to the todos with the local storage - R.useFork(TodosState.TodosState.pipe( + R.useFork(() => TodosState.TodosState.pipe( Effect.flatMap(state => Stream.runForEach(state.todos.changes, () => state.saveToLocalStorage) ) )) - const todosRef = R.useMemo(TodosState.TodosState.pipe(Effect.map(state => state.todos))) + const todosRef = R.useMemo(() => TodosState.TodosState.pipe(Effect.map(state => state.todos))) const [todos] = R.useRefState(todosRef) diff --git a/packages/extension-lazyref/src/index.ts b/packages/extension-lazyref/src/index.ts index 42728c5..e5fbb02 100644 --- a/packages/extension-lazyref/src/index.ts +++ b/packages/extension-lazyref/src/index.ts @@ -14,7 +14,7 @@ export const LazyRefExtension = ReffuseExtension.make(() => ({ const initialState = React.useMemo(() => runSync(ref), []) const [reactStateValue, setReactStateValue] = React.useState(initialState) - this.useFork(Stream.runForEach(ref.changes, v => Effect.sync(() => + this.useFork(() => Stream.runForEach(ref.changes, v => Effect.sync(() => setReactStateValue(v) )), [ref]) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 1605791..08a8ebc 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -24,52 +24,50 @@ export abstract class ReffuseHelpers { } - useRunSync(this: ReffuseHelpers) { + useRunSync(this: ReffuseHelpers): (effect: Effect.Effect) => A { const runtime = ReffuseRuntime.useRuntime() const context = this.useContext() - return React.useCallback(( - effect: Effect.Effect - ): A => effect.pipe( + return React.useCallback(effect => effect.pipe( Effect.provide(context), Runtime.runSync(runtime), ), [runtime, context]) } - useRunPromise(this: ReffuseHelpers) { + useRunPromise(this: ReffuseHelpers): ( + effect: Effect.Effect, + options?: { readonly signal?: AbortSignal }, + ) => Promise { const runtime = ReffuseRuntime.useRuntime() const context = this.useContext() - return React.useCallback(( - effect: Effect.Effect, - options?: { readonly signal?: AbortSignal }, - ): Promise => effect.pipe( + return React.useCallback((effect, options) => effect.pipe( Effect.provide(context), effect => Runtime.runPromise(runtime)(effect, options), ), [runtime, context]) } - useRunFork(this: ReffuseHelpers) { + useRunFork(this: ReffuseHelpers): ( + effect: Effect.Effect, + options?: Runtime.RunForkOptions, + ) => Fiber.RuntimeFiber { const runtime = ReffuseRuntime.useRuntime() const context = this.useContext() - return React.useCallback(( - effect: Effect.Effect, - options?: Runtime.RunForkOptions, - ): Fiber.RuntimeFiber => effect.pipe( + return React.useCallback((effect, options) => effect.pipe( Effect.provide(context), effect => Runtime.runFork(runtime)(effect, options), ), [runtime, context]) } - useRunCallback(this: ReffuseHelpers) { + useRunCallback(this: ReffuseHelpers): ( + effect: Effect.Effect, + options?: Runtime.RunCallbackOptions, + ) => Runtime.Cancel { const runtime = ReffuseRuntime.useRuntime() const context = this.useContext() - return React.useCallback(( - effect: Effect.Effect, - options?: Runtime.RunCallbackOptions, - ): Runtime.Cancel => effect.pipe( + return React.useCallback((effect, options) => effect.pipe( Effect.provide(context), effect => Runtime.runCallback(runtime)(effect, options), ), [runtime, context]) @@ -87,13 +85,13 @@ export abstract class ReffuseHelpers { */ useMemo( this: ReffuseHelpers, - effect: Effect.Effect, + effect: () => Effect.Effect, deps?: React.DependencyList, options?: RenderOptions, ): A { const runSync = this.useRunSync() - return React.useMemo(() => runSync(effect), [ + return React.useMemo(() => runSync(effect()), [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], ...(deps ?? []), ]) @@ -101,7 +99,7 @@ export abstract class ReffuseHelpers { useMemoScoped( this: ReffuseHelpers, - effect: Effect.Effect, + effect: () => Effect.Effect, deps?: React.DependencyList, options?: RenderOptions & ScopeOptions, ): A { @@ -109,7 +107,7 @@ export abstract class ReffuseHelpers { // Calculate an initial version of the value so that it can be accessed during the first render const [initialScope, initialValue] = React.useMemo(() => Scope.make(options?.finalizerExecutionStrategy).pipe( - Effect.flatMap(scope => effect.pipe( + Effect.flatMap(scope => effect().pipe( Effect.provideService(Scope.Scope, scope), Effect.map(value => [scope, value] as const), )), @@ -130,7 +128,7 @@ export abstract class ReffuseHelpers { const [scope, value] = closeInitialScopeIfNeeded.pipe( Effect.andThen(Scope.make(options?.finalizerExecutionStrategy).pipe( - Effect.flatMap(scope => effect.pipe( + Effect.flatMap(scope => effect().pipe( Effect.provideService(Scope.Scope, scope), Effect.map(value => [scope, value] as const), )) @@ -177,15 +175,15 @@ export abstract class ReffuseHelpers { */ useEffect( this: ReffuseHelpers, - effect: Effect.Effect, + effect: () => Effect.Effect, deps?: React.DependencyList, options?: RenderOptions & ScopeOptions, ): void { const runSync = this.useRunSync() - return React.useEffect(() => { + React.useEffect(() => { const scope = Scope.make(options?.finalizerExecutionStrategy).pipe( - Effect.tap(scope => Effect.provideService(effect, Scope.Scope, scope)), + Effect.tap(scope => Effect.provideService(effect(), Scope.Scope, scope)), runSync, ) @@ -225,7 +223,7 @@ export abstract class ReffuseHelpers { */ useLayoutEffect( this: ReffuseHelpers, - effect: Effect.Effect, + effect: () => Effect.Effect, deps?: React.DependencyList, options?: RenderOptions & ScopeOptions, ): void { @@ -233,7 +231,7 @@ export abstract class ReffuseHelpers { return React.useLayoutEffect(() => { const scope = Scope.make(options?.finalizerExecutionStrategy).pipe( - Effect.tap(scope => Effect.provideService(effect, Scope.Scope, scope)), + Effect.tap(scope => Effect.provideService(effect(), Scope.Scope, scope)), runSync, ) @@ -273,7 +271,7 @@ export abstract class ReffuseHelpers { */ useFork( this: ReffuseHelpers, - effect: Effect.Effect, + effect: () => Effect.Effect, deps?: React.DependencyList, options?: Runtime.RunForkOptions & RenderOptions & ScopeOptions, ): void { @@ -285,7 +283,7 @@ export abstract class ReffuseHelpers { ? Scope.fork(options.scope, options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential) : Scope.make(options?.finalizerExecutionStrategy) ) - runFork(Effect.provideService(effect, Scope.Scope, scope), { ...options, scope }) + runFork(Effect.provideService(effect(), Scope.Scope, scope), { ...options, scope }) return () => { runFork(Scope.close(scope, Exit.void)) } }, [ @@ -296,7 +294,7 @@ export abstract class ReffuseHelpers { usePromise( this: ReffuseHelpers, - effect: Effect.Effect, + effect: () => Effect.Effect, deps?: React.DependencyList, options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, ): Promise { @@ -318,7 +316,7 @@ export abstract class ReffuseHelpers { if (options?.signal) options.signal.addEventListener("abort", cleanup) - effect.pipe( + effect().pipe( Effect.provideService(Scope.Scope, scope), Effect.match({ onSuccess: resolve, @@ -347,7 +345,7 @@ export abstract class ReffuseHelpers { value: A, ): SubscriptionRef.SubscriptionRef { return this.useMemo( - SubscriptionRef.make(value), + () => SubscriptionRef.make(value), [], { doNotReExecuteOnRuntimeOrContextChange: true }, // Do not recreate the ref when the context changes ) @@ -369,7 +367,7 @@ export abstract class ReffuseHelpers { const initialState = React.useMemo(() => runSync(ref), []) const [reactStateValue, setReactStateValue] = React.useState(initialState) - this.useFork(Stream.runForEach(ref.changes, v => Effect.sync(() => + this.useFork(() => Stream.runForEach(ref.changes, v => Effect.sync(() => setReactStateValue(v) )), [ref]) -- 2.49.1 From 523d835d00c238d410c300cb5fa988bc44d31a57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 17:14:07 +0100 Subject: [PATCH 041/326] Fix --- packages/reffuse/src/ReffuseHelpers.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 08a8ebc..1aa5164 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -160,7 +160,7 @@ export abstract class ReffuseHelpers { * * ### Example * ``` - * useEffect(Effect.addFinalizer(() => Console.log("Component unmounted")).pipe( + * useEffect(() => Effect.addFinalizer(() => Console.log("Component unmounted")).pipe( * Effect.flatMap(() => Console.log("Component mounted")) * )) * ``` @@ -170,7 +170,7 @@ export abstract class ReffuseHelpers { * React.useEffect(() => { * console.log("Component mounted") * return () => { console.log("Component unmounted") } - * }) + * }, []) * ``` */ useEffect( @@ -208,7 +208,7 @@ export abstract class ReffuseHelpers { * * ### Example * ``` - * useLayoutEffect(Effect.addFinalizer(() => Console.log("Component unmounted")).pipe( + * useLayoutEffect(() => Effect.addFinalizer(() => Console.log("Component unmounted")).pipe( * Effect.flatMap(() => Console.log("Component mounted")) * )) * ``` @@ -218,7 +218,7 @@ export abstract class ReffuseHelpers { * React.useLayoutEffect(() => { * console.log("Component mounted") * return () => { console.log("Component unmounted") } - * }) + * }, []) * ``` */ useLayoutEffect( @@ -257,7 +257,7 @@ export abstract class ReffuseHelpers { * ``` * const timeRef = useRefFromEffect(DateTime.now) * - * useFork(Effect.addFinalizer(() => Console.log("Cleanup")).pipe( + * useFork(() => Effect.addFinalizer(() => Console.log("Cleanup")).pipe( * Effect.map(() => Stream.repeatEffectWithSchedule( * DateTime.now, * Schedule.intersect(Schedule.forever, Schedule.spaced("1 second")), -- 2.49.1 From 8244c34d2a87df8cc71f44b9edd9de1040fc8c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 18:29:00 +0100 Subject: [PATCH 042/326] Callback helpers --- packages/reffuse/src/ReffuseHelpers.ts | 28 +++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 1aa5164..ef94f2d 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -73,7 +73,6 @@ export abstract class ReffuseHelpers { ), [runtime, context]) } - /** * Reffuse equivalent to `React.useMemo`. * @@ -339,6 +338,33 @@ export abstract class ReffuseHelpers { return value } + useCallbackSync( + this: ReffuseHelpers, + callback: (...args: Args) => Effect.Effect, + deps?: React.DependencyList, + options?: RenderOptions, + ): (...args: Args) => A { + const runSync = this.useRunSync() + + return React.useCallback((...args) => runSync(callback(...args)), [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], + ...(deps ?? []), + ]) + } + + useCallbackPromise( + this: ReffuseHelpers, + callback: (...args: Args) => Effect.Effect, + deps?: React.DependencyList, + options?: { readonly signal?: AbortSignal } & RenderOptions, + ): (...args: Args) => Promise { + const runPromise = this.useRunPromise() + + return React.useCallback((...args) => runPromise(callback(...args), options), [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runPromise], + ...(deps ?? []), + ]) + } useRef( this: ReffuseHelpers, -- 2.49.1 From 618cee4028daf8849e8729680427656b8c322741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 18:39:19 +0100 Subject: [PATCH 043/326] Callback tests --- packages/example/src/routes/tests.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index ab6e89a..bb58968 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -1,4 +1,5 @@ import { R } from "@/reffuse" +import { Button } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { Console, Effect } from "effect" @@ -19,6 +20,12 @@ function RouteComponent() { Effect.delay("1 second"), )) + const logValue = R.useCallbackSync(Effect.fn(function*(value: string) { + yield* Effect.log(value) + })) - return
Hello "/tests"!
+ + return ( + + ) } -- 2.49.1 From af077d34aa304ffbab8f06a834588fda43f86856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 22:07:18 +0100 Subject: [PATCH 044/326] Turbo setup --- .gitignore | 1 + bun.lock | 18 +++++++++++++++++- package.json | 6 +++++- turbo.json | 14 ++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 turbo.json diff --git a/.gitignore b/.gitignore index ceaea36..2519628 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,4 @@ dist .yarn/install-state.gz .pnp.* +.turbo diff --git a/bun.lock b/bun.lock index f832058..74b3dd4 100644 --- a/bun.lock +++ b/bun.lock @@ -2,9 +2,11 @@ "lockfileVersion": 1, "workspaces": { "": { + "name": "@reffuse/monorepo", "devDependencies": { "npm-check-updates": "^17.1.14", "npm-sort": "^0.0.4", + "turbo": "^2.4.4", "typescript": "^5.7.3", }, }, @@ -678,7 +680,7 @@ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], "rollup": ["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.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ=="], @@ -710,6 +712,20 @@ "tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="], + "turbo": ["turbo@2.4.4", "", { "optionalDependencies": { "turbo-darwin-64": "2.4.4", "turbo-darwin-arm64": "2.4.4", "turbo-linux-64": "2.4.4", "turbo-linux-arm64": "2.4.4", "turbo-windows-64": "2.4.4", "turbo-windows-arm64": "2.4.4" }, "bin": { "turbo": "bin/turbo" } }, "sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ=="], + + "turbo-darwin-64": ["turbo-darwin-64@2.4.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g=="], + + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.4.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-/gtHPqbGQXDFhrmy+Q/MFW2HUTUlThJ97WLLSe4bxkDrKHecDYhAjbZ4rN3MM93RV9STQb3Tqy4pZBtsd4DfCw=="], + + "turbo-linux-64": ["turbo-linux-64@2.4.4", "", { "os": "linux", "cpu": "x64" }, "sha512-SR0gri4k0bda56hw5u9VgDXLKb1Q+jrw4lM7WAhnNdXvVoep4d6LmnzgMHQQR12Wxl3KyWPbkz9d1whL6NTm2Q=="], + + "turbo-linux-arm64": ["turbo-linux-arm64@2.4.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-COXXwzRd3vslQIfJhXUklgEqlwq35uFUZ7hnN+AUyXx7hUOLIiD5NblL+ETrHnhY4TzWszrbwUMfe2BYWtaPQg=="], + + "turbo-windows-64": ["turbo-windows-64@2.4.4", "", { "os": "win32", "cpu": "x64" }, "sha512-PV9rYNouGz4Ff3fd6sIfQy5L7HT9a4fcZoEv8PKRavU9O75G7PoDtm8scpHU10QnK0QQNLbE9qNxOAeRvF0fJg=="], + + "turbo-windows-arm64": ["turbo-windows-arm64@2.4.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg=="], + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], "type-fest": ["type-fest@4.35.0", "", {}, "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A=="], diff --git a/package.json b/package.json index 692bb61..7851115 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,13 @@ { + "name": "@reffuse/monorepo", + "packageManager": "bun@1.2.2", "private": true, "workspaces": [ "./packages/*" ], "scripts": { - "lint:tsc": "bun run --filter '*' lint:tsc", + "build": "turbo build --filter=!@reffuse/example", + "lint:tsc": "turbo lint:tsc", "clean:cache": "rm -f tsconfig.tsbuildinfo", "clean:dist": "rm -rf dist", "clean:node": "rm -rf node_modules" @@ -12,6 +15,7 @@ "devDependencies": { "npm-check-updates": "^17.1.14", "npm-sort": "^0.0.4", + "turbo": "^2.4.4", "typescript": "^5.7.3" } } diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..a059c7b --- /dev/null +++ b/turbo.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://turbo.build/schema.json", + "tasks": { + "build": { + "dependsOn": ["^build"], + "inputs": ["./src/**"], + "outputs": ["./dist/**"] + }, + "dev": { + "persistent": true, + "cache": false + } + } +} -- 2.49.1 From 8d276d2fbf76ef7d83bec98d839f5877b4251a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 22:16:53 +0100 Subject: [PATCH 045/326] Dependencies --- bun.lock | 3 +++ packages/extension-lazyref/package.json | 3 +++ 2 files changed, 6 insertions(+) diff --git a/bun.lock b/bun.lock index 74b3dd4..14fcfe5 100644 --- a/bun.lock +++ b/bun.lock @@ -47,6 +47,9 @@ "packages/extension-lazyref": { "name": "@reffuse/extension-lazyref", "version": "0.1.0", + "devDependencies": { + "reffuse": "workspace:*", + }, "peerDependencies": { "@typed/lazy-ref": "^0.3.3", "@types/react": "^19.0.0", diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index 8ca9de8..bb5f144 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -28,6 +28,9 @@ "clean:dist": "rm -rf dist", "clean:node": "rm -rf node_modules" }, + "devDependencies": { + "reffuse": "workspace:*" + }, "peerDependencies": { "@typed/lazy-ref": "^0.3.3", "@types/react": "^19.0.0", -- 2.49.1 From 02da3df8eb76d16b1c6395ad8ec469a691115cc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 22:45:55 +0100 Subject: [PATCH 046/326] CI fix --- .gitea/workflows/lint.yaml | 4 ++-- .gitea/workflows/publish.yaml | 8 ++------ .gitea/workflows/test-build.yaml | 8 ++------ package.json | 2 ++ packages/extension-lazyref/package.json | 2 ++ packages/reffuse/package.json | 2 ++ turbo.json | 6 ++++++ 7 files changed, 18 insertions(+), 14 deletions(-) diff --git a/.gitea/workflows/lint.yaml b/.gitea/workflows/lint.yaml index 7efb5a0..d96555a 100644 --- a/.gitea/workflows/lint.yaml +++ b/.gitea/workflows/lint.yaml @@ -12,5 +12,5 @@ jobs: uses: actions/checkout@v4 - name: Install dependencies run: bun install --frozen-lockfile - - name: Lint TypeScript - run: bun run lint:tsc + - name: Build + run: bun run build diff --git a/.gitea/workflows/publish.yaml b/.gitea/workflows/publish.yaml index 075a2c3..fa80a71 100644 --- a/.gitea/workflows/publish.yaml +++ b/.gitea/workflows/publish.yaml @@ -21,12 +21,8 @@ jobs: - name: Install dependencies run: bun install --frozen-lockfile - name: Build - run: | - cd packages/reffuse - bun run build + run: bun run build - name: Publish - run: | - cd packages/reffuse - npm publish --access public + run: bun run publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitea/workflows/test-build.yaml b/.gitea/workflows/test-build.yaml index ee239a7..bf2f832 100644 --- a/.gitea/workflows/test-build.yaml +++ b/.gitea/workflows/test-build.yaml @@ -18,10 +18,6 @@ jobs: - name: Install dependencies run: bun install --frozen-lockfile - name: Build - run: | - cd packages/reffuse - bun run build + run: bun run build - name: Pack - run: | - cd packages/reffuse - npm pack --dry-run + run: bun run pack diff --git a/package.json b/package.json index 7851115..06e0721 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,8 @@ "scripts": { "build": "turbo build --filter=!@reffuse/example", "lint:tsc": "turbo lint:tsc", + "pack": "turbo pack --filter=!@reffuse/example", + "publish": "turbo publish --filter=!@reffuse/example", "clean:cache": "rm -f tsconfig.tsbuildinfo", "clean:dist": "rm -rf dist", "clean:node": "rm -rf node_modules" diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index bb5f144..8c66625 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -24,6 +24,8 @@ "scripts": { "build": "tsc", "lint:tsc": "tsc --noEmit", + "pack": "npm pack", + "publish": "npm publish --access public", "clean:cache": "rm -f tsconfig.tsbuildinfo", "clean:dist": "rm -rf dist", "clean:node": "rm -rf node_modules" diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 5082340..e898ed0 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -24,6 +24,8 @@ "scripts": { "build": "tsc", "lint:tsc": "tsc --noEmit", + "pack": "npm pack", + "publish": "npm publish --access public", "clean:cache": "rm -f tsconfig.tsbuildinfo", "clean:dist": "rm -rf dist", "clean:node": "rm -rf node_modules" diff --git a/turbo.json b/turbo.json index a059c7b..d40bdac 100644 --- a/turbo.json +++ b/turbo.json @@ -6,6 +6,12 @@ "inputs": ["./src/**"], "outputs": ["./dist/**"] }, + "pack": { + "dependsOn": ["^pack"] + }, + "publish": { + "dependsOn": ["^publish"] + }, "dev": { "persistent": true, "cache": false -- 2.49.1 From 47aa1304863aa28b58b9163ff213c96e7ab6a5a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 22:53:07 +0100 Subject: [PATCH 047/326] CI fix --- turbo.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/turbo.json b/turbo.json index d40bdac..c4d0706 100644 --- a/turbo.json +++ b/turbo.json @@ -7,10 +7,10 @@ "outputs": ["./dist/**"] }, "pack": { - "dependsOn": ["^pack"] + "dependsOn": ["pack"] }, "publish": { - "dependsOn": ["^publish"] + "dependsOn": ["publish"] }, "dev": { "persistent": true, -- 2.49.1 From 3b4eb750eda5e622bf7cf0b266a757cb25cc53fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 22:55:45 +0100 Subject: [PATCH 048/326] Version bump --- packages/extension-lazyref/package.json | 2 +- packages/reffuse/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index 8c66625..055bae6 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -38,6 +38,6 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.1" + "reffuse": "^0.1.2" } } diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index e898ed0..842c01d 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -1,6 +1,6 @@ { "name": "reffuse", - "version": "0.1.1", + "version": "0.1.2", "type": "module", "files": [ "./README.md", -- 2.49.1 From ea768218a0ce7bc6c89a6dad676fbd0998cc8cc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 23:11:58 +0100 Subject: [PATCH 049/326] Deps API change --- packages/example/src/routes/lazyref.tsx | 2 +- packages/example/src/routes/promise.tsx | 2 +- packages/example/src/routes/tests.tsx | 4 +-- packages/example/src/routes/time.tsx | 2 +- packages/example/src/todos/views/VNewTodo.tsx | 2 +- packages/example/src/todos/views/VTodos.tsx | 4 +-- packages/reffuse/src/ReffuseHelpers.ts | 36 +++++++++---------- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/example/src/routes/lazyref.tsx b/packages/example/src/routes/lazyref.tsx index 32d8187..67657a7 100644 --- a/packages/example/src/routes/lazyref.tsx +++ b/packages/example/src/routes/lazyref.tsx @@ -10,7 +10,7 @@ export const Route = createFileRoute("/lazyref")({ }) function RouteComponent() { - const promise = R.usePromise(() => LazyRef.of(0)) + const promise = R.usePromise(() => LazyRef.of(0), []) return ( Loading...}> diff --git a/packages/example/src/routes/promise.tsx b/packages/example/src/routes/promise.tsx index 09af62a..4b197cf 100644 --- a/packages/example/src/routes/promise.tsx +++ b/packages/example/src/routes/promise.tsx @@ -20,7 +20,7 @@ function RouteComponent() { HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), Effect.flatMap(Schema.decodeUnknown(Result)), - )) + ), []) return ( Loading...}> diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index bb58968..93e791e 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -18,11 +18,11 @@ function RouteComponent() { R.useFork(() => Effect.addFinalizer(() => Console.log("cleanup")).pipe( Effect.andThen(Console.log("ouient")), Effect.delay("1 second"), - )) + ), []) const logValue = R.useCallbackSync(Effect.fn(function*(value: string) { yield* Effect.log(value) - })) + }), []) return ( diff --git a/packages/example/src/routes/time.tsx b/packages/example/src/routes/time.tsx index f99f979..99e7e39 100644 --- a/packages/example/src/routes/time.tsx +++ b/packages/example/src/routes/time.tsx @@ -15,7 +15,7 @@ export const Route = createFileRoute("/time")({ function Time() { - const timeRef = R.useMemo(() => DateTime.now.pipe(Effect.flatMap(SubscriptionRef.make))) + const timeRef = R.useMemo(() => DateTime.now.pipe(Effect.flatMap(SubscriptionRef.make)), []) R.useFork(() => Effect.addFinalizer(() => Console.log("Cleanup")).pipe( Effect.andThen(Stream.runForEach(timeEverySecond, v => Ref.set(timeRef, v))) diff --git a/packages/example/src/todos/views/VNewTodo.tsx b/packages/example/src/todos/views/VNewTodo.tsx index 2328006..67e4088 100644 --- a/packages/example/src/todos/views/VNewTodo.tsx +++ b/packages/example/src/todos/views/VNewTodo.tsx @@ -18,7 +18,7 @@ export function VNewTodo() { const runSync = R.useRunSync() - const todoRef = R.useMemo(() => createEmptyTodo.pipe(Effect.flatMap(SubscriptionRef.make))) + const todoRef = R.useMemo(() => createEmptyTodo.pipe(Effect.flatMap(SubscriptionRef.make)), []) const [todo, setTodo] = R.useRefState(todoRef) diff --git a/packages/example/src/todos/views/VTodos.tsx b/packages/example/src/todos/views/VTodos.tsx index 83485b0..27229aa 100644 --- a/packages/example/src/todos/views/VTodos.tsx +++ b/packages/example/src/todos/views/VTodos.tsx @@ -13,9 +13,9 @@ export function VTodos() { Effect.flatMap(state => Stream.runForEach(state.todos.changes, () => state.saveToLocalStorage) ) - )) + ), []) - const todosRef = R.useMemo(() => TodosState.TodosState.pipe(Effect.map(state => state.todos))) + const todosRef = R.useMemo(() => TodosState.TodosState.pipe(Effect.map(state => state.todos)), []) const [todos] = R.useRefState(todosRef) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index ef94f2d..cd48191 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -85,21 +85,21 @@ export abstract class ReffuseHelpers { useMemo( this: ReffuseHelpers, effect: () => Effect.Effect, - deps?: React.DependencyList, + deps: React.DependencyList, options?: RenderOptions, ): A { const runSync = this.useRunSync() return React.useMemo(() => runSync(effect()), [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], - ...(deps ?? []), + ...deps, ]) } useMemoScoped( this: ReffuseHelpers, effect: () => Effect.Effect, - deps?: React.DependencyList, + deps: React.DependencyList, options?: RenderOptions & ScopeOptions, ): A { const runSync = this.useRunSync() @@ -140,7 +140,7 @@ export abstract class ReffuseHelpers { return () => { runSync(Scope.close(scope, Exit.void)) } }, [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], - ...(deps ?? []), + ...deps, ]) return value @@ -187,9 +187,9 @@ export abstract class ReffuseHelpers { ) return () => { runSync(Scope.close(scope, Exit.void)) } - }, [ + }, deps && [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], - ...(deps ?? []), + ...deps, ]) } @@ -235,9 +235,9 @@ export abstract class ReffuseHelpers { ) return () => { runSync(Scope.close(scope, Exit.void)) } - }, [ + }, deps && [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], - ...(deps ?? []), + ...deps, ]) } @@ -285,9 +285,9 @@ export abstract class ReffuseHelpers { runFork(Effect.provideService(effect(), Scope.Scope, scope), { ...options, scope }) return () => { runFork(Scope.close(scope, Exit.void)) } - }, [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], - ...(deps ?? []), + }, deps && [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], + ...deps, ]) } @@ -330,9 +330,9 @@ export abstract class ReffuseHelpers { cleanup() } - }, [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], - ...(deps ?? []), + }, deps && [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], + ...deps, ]) return value @@ -341,28 +341,28 @@ export abstract class ReffuseHelpers { useCallbackSync( this: ReffuseHelpers, callback: (...args: Args) => Effect.Effect, - deps?: React.DependencyList, + deps: React.DependencyList, options?: RenderOptions, ): (...args: Args) => A { const runSync = this.useRunSync() return React.useCallback((...args) => runSync(callback(...args)), [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], - ...(deps ?? []), + ...deps, ]) } useCallbackPromise( this: ReffuseHelpers, callback: (...args: Args) => Effect.Effect, - deps?: React.DependencyList, + deps: React.DependencyList, options?: { readonly signal?: AbortSignal } & RenderOptions, ): (...args: Args) => Promise
{ const runPromise = this.useRunPromise() return React.useCallback((...args) => runPromise(callback(...args), options), [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runPromise], - ...(deps ?? []), + ...deps, ]) } -- 2.49.1 From 5f60d03d83018cddb1ab725492796c0be2730b51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Feb 2025 23:19:44 +0100 Subject: [PATCH 050/326] Fix --- packages/example/src/todos/views/VNewTodo.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/example/src/todos/views/VNewTodo.tsx b/packages/example/src/todos/views/VNewTodo.tsx index 67e4088..4d183b5 100644 --- a/packages/example/src/todos/views/VNewTodo.tsx +++ b/packages/example/src/todos/views/VNewTodo.tsx @@ -37,7 +37,7 @@ export function VNewTodo() { + ) } diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index c528f62..c5e7731 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,12 +1,11 @@ import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, Option, Ref } from "effect" +import { Effect, Fiber, Option, Ref, Scope } from "effect" import * as React from "react" -import { useState } from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" export interface UseQueryProps { - effect: () => Effect.Effect + effect: () => Effect.Effect readonly deps: React.DependencyList } @@ -22,7 +21,7 @@ export const QueryExtension = ReffuseExtension.make(() => ({ props: UseQueryProps, ): UseQueryResult { const fiberRef = this.useRef(Option.none>()) - const [state, setState] = useState(AsyncData.noData()) + const stateRef = this.useRef(AsyncData.noData()) const interruptRunningQuery = React.useMemo(() => fiberRef.pipe( Effect.flatMap(Option.match({ @@ -32,32 +31,35 @@ export const QueryExtension = ReffuseExtension.make(() => ({ ), []) const runQuery = React.useMemo(() => props.effect().pipe( - Effect.matchCause({ - onSuccess: v => setState(AsyncData.success(v)), - onFailure: c => setState(AsyncData.failure(c)), + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), }) ), props.deps) const refresh = React.useMemo(() => interruptRunningQuery.pipe( - Effect.andThen(Effect.sync(() => setState(prev => + Effect.andThen(Ref.update(stateRef, prev => AsyncData.isSuccess(prev) || AsyncData.isFailure(prev) ? AsyncData.refreshing(prev) : AsyncData.loading() - ))), + )), Effect.andThen(runQuery), + Effect.scoped, Effect.forkDaemon, Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), ), [runQuery]) this.useEffect(() => interruptRunningQuery.pipe( - Effect.andThen(Effect.sync(() => setState(AsyncData.loading()))), + Effect.andThen(Ref.set(stateRef, AsyncData.loading())), Effect.andThen(runQuery), + Effect.scoped, Effect.forkDaemon, Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), ), [runQuery]) + const [state] = this.useRefState(stateRef) return { state, refresh } } })) -- 2.49.1 From f76b3f333a0b5637db865dcb39cd97e55756a372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Feb 2025 02:13:23 +0100 Subject: [PATCH 064/326] Query work --- packages/example/src/routes/query.tsx | 9 ++++++--- packages/extension-query/src/index.ts | 26 ++++++++++++++------------ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index cfca90c..c8f1374 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -16,7 +16,7 @@ const Result = Schema.Tuple(Schema.String) function RouteComponent() { const runSync = R.useRunSync() - const { state, refresh } = R.useQuery({ + const { state, triggerRefresh } = R.useQuery({ effect: () => HttpClient.get("https://www.uuidtools.com/api/generate/v4").pipe( HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), @@ -26,11 +26,14 @@ function RouteComponent() { deps: [], }) + const [queryState] = R.useRefState(state) + + return ( - {AsyncData.match(state, { + {AsyncData.match(queryState, { NoData: () => "No data yet", Loading: () => "Loading...", Success: (value, { isRefreshing, isOptimistic }) => @@ -40,7 +43,7 @@ function RouteComponent() { })} - + ) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index c5e7731..c5694cd 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,5 +1,5 @@ import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, Option, Ref, Scope } from "effect" +import { Effect, Fiber, Option, Ref, Scope, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" @@ -9,9 +9,9 @@ export interface UseQueryProps { readonly deps: React.DependencyList } -export interface UseQueryResult { - readonly state: AsyncData.AsyncData - readonly refresh: Effect.Effect +export interface UseQueryResult { + readonly state: SubscriptionRef.SubscriptionRef> + readonly triggerRefresh: Effect.Effect } @@ -19,7 +19,9 @@ export const QueryExtension = ReffuseExtension.make(() => ({ useQuery( this: ReffuseHelpers.ReffuseHelpers, props: UseQueryProps, - ): UseQueryResult { + ): UseQueryResult { + const context = this.useContext() + const fiberRef = this.useRef(Option.none>()) const stateRef = this.useRef(AsyncData.noData()) @@ -28,27 +30,28 @@ export const QueryExtension = ReffuseExtension.make(() => ({ onSome: Fiber.interrupt, onNone: () => Effect.void, })) - ), []) + ), [fiberRef]) const runQuery = React.useMemo(() => props.effect().pipe( Effect.matchCauseEffect({ onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), }) - ), props.deps) + ), [...props.deps, stateRef]) - const refresh = React.useMemo(() => interruptRunningQuery.pipe( + const triggerRefresh = React.useMemo(() => interruptRunningQuery.pipe( Effect.andThen(Ref.update(stateRef, prev => AsyncData.isSuccess(prev) || AsyncData.isFailure(prev) ? AsyncData.refreshing(prev) : AsyncData.loading() )), Effect.andThen(runQuery), + Effect.provide(context), Effect.scoped, Effect.forkDaemon, Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), - ), [runQuery]) + ), [interruptRunningQuery, stateRef, runQuery, context, fiberRef]) this.useEffect(() => interruptRunningQuery.pipe( Effect.andThen(Ref.set(stateRef, AsyncData.loading())), @@ -57,9 +60,8 @@ export const QueryExtension = ReffuseExtension.make(() => ({ Effect.forkDaemon, Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), - ), [runQuery]) + ), [stateRef, runQuery, fiberRef]) - const [state] = this.useRefState(stateRef) - return { state, refresh } + return React.useMemo(() => ({ state: stateRef, triggerRefresh }), [stateRef, triggerRefresh]) } })) -- 2.49.1 From 3f2639fda1e5ffa85e09553700571b4dac2d527e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Feb 2025 16:08:08 +0100 Subject: [PATCH 065/326] Query work --- packages/extension-query/src/index.ts | 46 +++++++++++++++------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index c5694cd..eff2bfd 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -15,6 +15,24 @@ export interface UseQueryResult { } +const interruptRunningQuery = (fiberRef: Ref.Ref>>) => fiberRef.pipe( + Effect.flatMap(Option.match({ + onSome: Fiber.interrupt, + onNone: () => Effect.void, + })) +) + +const runQuery = ( + effect: Effect.Effect, + stateRef: Ref.Ref>, +) => effect.pipe( + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }) +) + + export const QueryExtension = ReffuseExtension.make(() => ({ useQuery( this: ReffuseHelpers.ReffuseHelpers, @@ -22,45 +40,31 @@ export const QueryExtension = ReffuseExtension.make(() => ({ ): UseQueryResult { const context = this.useContext() - const fiberRef = this.useRef(Option.none>()) + const fiberRef = this.useRef(Option.none>()) const stateRef = this.useRef(AsyncData.noData()) - const interruptRunningQuery = React.useMemo(() => fiberRef.pipe( - Effect.flatMap(Option.match({ - onSome: Fiber.interrupt, - onNone: () => Effect.void, - })) - ), [fiberRef]) - - const runQuery = React.useMemo(() => props.effect().pipe( - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }) - ), [...props.deps, stateRef]) - - const triggerRefresh = React.useMemo(() => interruptRunningQuery.pipe( + const triggerRefresh = React.useMemo(() => interruptRunningQuery(fiberRef).pipe( Effect.andThen(Ref.update(stateRef, prev => AsyncData.isSuccess(prev) || AsyncData.isFailure(prev) ? AsyncData.refreshing(prev) : AsyncData.loading() )), - Effect.andThen(runQuery), + Effect.andThen(runQuery(props.effect(), stateRef)), Effect.provide(context), Effect.scoped, Effect.forkDaemon, Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), - ), [interruptRunningQuery, stateRef, runQuery, context, fiberRef]) + ), [stateRef, context, fiberRef]) - this.useEffect(() => interruptRunningQuery.pipe( + this.useEffect(() => interruptRunningQuery(fiberRef).pipe( Effect.andThen(Ref.set(stateRef, AsyncData.loading())), - Effect.andThen(runQuery), + Effect.andThen(runQuery(props.effect(), stateRef)), Effect.scoped, Effect.forkDaemon, Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), - ), [stateRef, runQuery, fiberRef]) + ), [stateRef, fiberRef]) return React.useMemo(() => ({ state: stateRef, triggerRefresh }), [stateRef, triggerRefresh]) } -- 2.49.1 From 660f32a1714fa4d258a3bb551df59784e439e6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Feb 2025 17:24:40 +0100 Subject: [PATCH 066/326] Fix --- packages/extension-query/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index eff2bfd..c2731f8 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -64,7 +64,7 @@ export const QueryExtension = ReffuseExtension.make(() => ({ Effect.forkDaemon, Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), - ), [stateRef, fiberRef]) + ), [...props.deps, stateRef, fiberRef]) return React.useMemo(() => ({ state: stateRef, triggerRefresh }), [stateRef, triggerRefresh]) } -- 2.49.1 From 2e00db57785870bce1fc364cf91c5421ede8b13c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 2 Mar 2025 01:11:18 +0100 Subject: [PATCH 067/326] Query work --- packages/extension-query/src/Query.ts | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 packages/extension-query/src/Query.ts diff --git a/packages/extension-query/src/Query.ts b/packages/extension-query/src/Query.ts new file mode 100644 index 0000000..8098466 --- /dev/null +++ b/packages/extension-query/src/Query.ts @@ -0,0 +1,39 @@ +import { Effect, Fiber, Option, type Ref, type SubscriptionRef } from "effect" +import * as AsyncData from "@typed/async-data" + + +export interface QueryRunner { + readonly stateRef: SubscriptionRef.SubscriptionRef> + readonly fiberRef: SubscriptionRef.SubscriptionRef>> + + readonly interrupt: Effect.Effect + readonly fetch: Effect.Effect + readonly refetch: Effect.Effect +} + + +export class Query { + constructor( + private readonly stateRef: SubscriptionRef.SubscriptionRef>, + private readonly fiberRef: SubscriptionRef.SubscriptionRef>>, + ) {} + + private run(effect: Effect.Effect) { + + } + + // interrupt(): Effect.Effect { + // return this.fiberRef.pipe( + // Effect.flatMap(Option.match({ + // onSome: Fiber.interrupt, + // onNone: () => Effect.void, + // })) + // ) + // } + + + + fetch = Effect.gen(this, function*() { + yield* this.interrupt() + }) +} -- 2.49.1 From 6b0f2f33cbe28c0fed9d76261f2ed23e6912b33a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 2 Mar 2025 02:48:19 +0100 Subject: [PATCH 068/326] Query work --- packages/extension-query/src/Query.ts | 46 ++++++++++++--------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/packages/extension-query/src/Query.ts b/packages/extension-query/src/Query.ts index 8098466..0cf4bdf 100644 --- a/packages/extension-query/src/Query.ts +++ b/packages/extension-query/src/Query.ts @@ -1,4 +1,4 @@ -import { Effect, Fiber, Option, type Ref, type SubscriptionRef } from "effect" +import { Effect, Fiber, Option, SubscriptionRef, type Ref } from "effect" import * as AsyncData from "@typed/async-data" @@ -7,33 +7,29 @@ export interface QueryRunner { readonly fiberRef: SubscriptionRef.SubscriptionRef>> readonly interrupt: Effect.Effect - readonly fetch: Effect.Effect - readonly refetch: Effect.Effect + fetch(effect: Effect.Effect): Effect.Effect + // refetch(effect: Effect.Effect): Effect.Effect } +export const make = Effect.fnUntraced(function*(): Effect.Effect> { + const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) + const fiberRef = yield* SubscriptionRef.make(Option.none>()) -export class Query { - constructor( - private readonly stateRef: SubscriptionRef.SubscriptionRef>, - private readonly fiberRef: SubscriptionRef.SubscriptionRef>>, - ) {} + const interrupt = fiberRef.pipe( + Effect.flatMap(Option.match({ + onSome: Fiber.interrupt, + onNone: () => Effect.void, + })) + ) - private run(effect: Effect.Effect) { + const fetch = Effect.fnUntraced(function*(effect: Effect.Effect) { - } - - // interrupt(): Effect.Effect { - // return this.fiberRef.pipe( - // Effect.flatMap(Option.match({ - // onSome: Fiber.interrupt, - // onNone: () => Effect.void, - // })) - // ) - // } - - - - fetch = Effect.gen(this, function*() { - yield* this.interrupt() }) -} + + return { + stateRef, + fiberRef, + interrupt, + fetch, + } +}) -- 2.49.1 From 3fa9b7d82153d041aeb12f93ecc629a573c13d1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 2 Mar 2025 20:14:45 +0100 Subject: [PATCH 069/326] Working query --- packages/example/src/routes/query.tsx | 5 +- packages/extension-query/src/Query.ts | 35 ---------- packages/extension-query/src/QueryRunner.ts | 75 +++++++++++++++++++++ packages/extension-query/src/index.ts | 64 +++++------------- 4 files changed, 94 insertions(+), 85 deletions(-) delete mode 100644 packages/extension-query/src/Query.ts create mode 100644 packages/extension-query/src/QueryRunner.ts diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index c8f1374..efa1d87 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -16,12 +16,13 @@ const Result = Schema.Tuple(Schema.String) function RouteComponent() { const runSync = R.useRunSync() - const { state, triggerRefresh } = R.useQuery({ + const { state, refresh } = R.useQuery({ effect: () => HttpClient.get("https://www.uuidtools.com/api/generate/v4").pipe( HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), Effect.flatMap(Schema.decodeUnknown(Result)), Effect.delay("500 millis"), + Effect.scoped, ), deps: [], }) @@ -43,7 +44,7 @@ function RouteComponent() { })} - + ) diff --git a/packages/extension-query/src/Query.ts b/packages/extension-query/src/Query.ts deleted file mode 100644 index 0cf4bdf..0000000 --- a/packages/extension-query/src/Query.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Effect, Fiber, Option, SubscriptionRef, type Ref } from "effect" -import * as AsyncData from "@typed/async-data" - - -export interface QueryRunner { - readonly stateRef: SubscriptionRef.SubscriptionRef> - readonly fiberRef: SubscriptionRef.SubscriptionRef>> - - readonly interrupt: Effect.Effect - fetch(effect: Effect.Effect): Effect.Effect - // refetch(effect: Effect.Effect): Effect.Effect -} - -export const make = Effect.fnUntraced(function*(): Effect.Effect> { - const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) - const fiberRef = yield* SubscriptionRef.make(Option.none>()) - - const interrupt = fiberRef.pipe( - Effect.flatMap(Option.match({ - onSome: Fiber.interrupt, - onNone: () => Effect.void, - })) - ) - - const fetch = Effect.fnUntraced(function*(effect: Effect.Effect) { - - }) - - return { - stateRef, - fiberRef, - interrupt, - fetch, - } -}) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts new file mode 100644 index 0000000..ddf931d --- /dev/null +++ b/packages/extension-query/src/QueryRunner.ts @@ -0,0 +1,75 @@ +import * as AsyncData from "@typed/async-data" +import { Effect, Fiber, flow, identity, Option, Ref, SubscriptionRef } from "effect" + + +export interface QueryRunner { + readonly queryRef: SubscriptionRef.SubscriptionRef> + readonly stateRef: SubscriptionRef.SubscriptionRef> + readonly fiberRef: SubscriptionRef.SubscriptionRef>> + + readonly interrupt: Effect.Effect + readonly forkFetch: Effect.Effect + readonly forkRefetch: Effect.Effect +} + + +export const make = ( + query: Effect.Effect +): Effect.Effect, never, R> => Effect.gen(function*() { + const context = yield* Effect.context() + + const queryRef = yield* SubscriptionRef.make(query) + const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) + const fiberRef = yield* SubscriptionRef.make(Option.none>()) + + const interrupt = fiberRef.pipe( + Effect.flatMap(Option.match({ + onSome: flow( + Fiber.interrupt, + Effect.andThen(Ref.set(fiberRef, Option.none())), + ), + onNone: () => Effect.void, + })) + ) + + const forkFetch = interrupt.pipe( + Effect.andThen(Ref.set(stateRef, AsyncData.loading())), + Effect.andThen(queryRef.pipe(Effect.flatMap(identity))), + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }), + Effect.provide(context), + Effect.forkDaemon, + + Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), + ) + + const forkRefetch = interrupt.pipe( + Effect.andThen(Ref.update(stateRef, previous => { + if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) + return AsyncData.refreshing(previous) + if (AsyncData.isRefreshing(previous)) + return AsyncData.refreshing(previous.previous) + return AsyncData.loading() + })), + Effect.andThen(queryRef.pipe(Effect.flatMap(identity))), + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }), + Effect.provide(context), + Effect.forkDaemon, + + Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), + ) + + return { + queryRef, + stateRef, + fiberRef, + interrupt, + forkFetch, + forkRefetch, + } +}) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index c2731f8..05797e8 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,71 +1,39 @@ import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, Option, Ref, Scope, SubscriptionRef } from "effect" +import { Effect, Ref, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" +import * as QueryRunner from "./QueryRunner.js" export interface UseQueryProps { - effect: () => Effect.Effect + effect: () => Effect.Effect readonly deps: React.DependencyList } export interface UseQueryResult { readonly state: SubscriptionRef.SubscriptionRef> - readonly triggerRefresh: Effect.Effect + readonly refresh: Effect.Effect } -const interruptRunningQuery = (fiberRef: Ref.Ref>>) => fiberRef.pipe( - Effect.flatMap(Option.match({ - onSome: Fiber.interrupt, - onNone: () => Effect.void, - })) -) - -const runQuery = ( - effect: Effect.Effect, - stateRef: Ref.Ref>, -) => effect.pipe( - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }) -) - - export const QueryExtension = ReffuseExtension.make(() => ({ useQuery( this: ReffuseHelpers.ReffuseHelpers, props: UseQueryProps, ): UseQueryResult { - const context = this.useContext() + const runner = this.useMemo(() => QueryRunner.make(props.effect()), []) - const fiberRef = this.useRef(Option.none>()) - const stateRef = this.useRef(AsyncData.noData()) + this.useFork(() => Effect.addFinalizer(() => runner.interrupt).pipe( + Effect.andThen(Ref.set(runner.queryRef, props.effect())), + Effect.andThen(runner.forkFetch), + ), [runner, ...props.deps]) - const triggerRefresh = React.useMemo(() => interruptRunningQuery(fiberRef).pipe( - Effect.andThen(Ref.update(stateRef, prev => - AsyncData.isSuccess(prev) || AsyncData.isFailure(prev) - ? AsyncData.refreshing(prev) - : AsyncData.loading() - )), - Effect.andThen(runQuery(props.effect(), stateRef)), - Effect.provide(context), - Effect.scoped, - Effect.forkDaemon, - - Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), - ), [stateRef, context, fiberRef]) - - this.useEffect(() => interruptRunningQuery(fiberRef).pipe( - Effect.andThen(Ref.set(stateRef, AsyncData.loading())), - Effect.andThen(runQuery(props.effect(), stateRef)), - Effect.scoped, - Effect.forkDaemon, - - Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), - ), [...props.deps, stateRef, fiberRef]) - - return React.useMemo(() => ({ state: stateRef, triggerRefresh }), [stateRef, triggerRefresh]) + return React.useMemo(() => ({ + state: runner.stateRef, + refresh: runner.forkRefetch, + }), [runner]) } })) + + +export * as QueryRunner from "./QueryRunner.js" -- 2.49.1 From 9c96741c8ee97119d897bbe5de7247fa5ca79a31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 3 Mar 2025 03:37:39 +0100 Subject: [PATCH 070/326] Fix --- packages/extension-query/src/QueryRunner.ts | 2 ++ packages/extension-query/src/index.ts | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index ddf931d..3bfa162 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -39,6 +39,7 @@ export const make = ( onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), }), + Effect.andThen(Ref.set(fiberRef, Option.none())), Effect.provide(context), Effect.forkDaemon, @@ -58,6 +59,7 @@ export const make = ( onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), }), + Effect.andThen(Ref.set(fiberRef, Option.none())), Effect.provide(context), Effect.forkDaemon, diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index 05797e8..390a9cc 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,5 +1,5 @@ import * as AsyncData from "@typed/async-data" -import { Effect, Ref, SubscriptionRef } from "effect" +import { Console, Effect, Ref, Stream, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" @@ -23,6 +23,8 @@ export const QueryExtension = ReffuseExtension.make(() => ({ ): UseQueryResult { const runner = this.useMemo(() => QueryRunner.make(props.effect()), []) + this.useFork(() => Stream.runForEach(runner.fiberRef.changes, Console.log), []) + this.useFork(() => Effect.addFinalizer(() => runner.interrupt).pipe( Effect.andThen(Ref.set(runner.queryRef, props.effect())), Effect.andThen(runner.forkFetch), -- 2.49.1 From 40e8bf6a1f0ef8ec3b419b1af5c6725471afc14f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 3 Mar 2025 19:42:33 +0100 Subject: [PATCH 071/326] Query work --- packages/example/src/main.tsx | 4 ++-- packages/extension-query/src/QueryRunner.ts | 16 ++++++++++++---- packages/extension-query/src/index.ts | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index 8fe1e6d..fc8645f 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -26,11 +26,11 @@ declare module "@tanstack/react-router" { createRoot(document.getElementById("root")!).render( - + // - + // ) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 3bfa162..aa66331 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -1,5 +1,5 @@ import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, flow, identity, Option, Ref, SubscriptionRef } from "effect" +import { Effect, Fiber, identity, Option, Ref, SubscriptionRef } from "effect" export interface QueryRunner { @@ -24,9 +24,17 @@ export const make = ( const interrupt = fiberRef.pipe( Effect.flatMap(Option.match({ - onSome: flow( - Fiber.interrupt, - Effect.andThen(Ref.set(fiberRef, Option.none())), + onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( + Effect.andThen(Fiber.interrupt(fiber)) + ), + onNone: () => Effect.void, + })) + ) + + const forkInterrupt = fiberRef.pipe( + Effect.flatMap(Option.match({ + onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( + Effect.andThen(Fiber.interruptFork(fiber)) ), onNone: () => Effect.void, })) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index 390a9cc..e647a3a 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -25,7 +25,7 @@ export const QueryExtension = ReffuseExtension.make(() => ({ this.useFork(() => Stream.runForEach(runner.fiberRef.changes, Console.log), []) - this.useFork(() => Effect.addFinalizer(() => runner.interrupt).pipe( + this.useEffect(() => Effect.addFinalizer(() => Effect.void).pipe( Effect.andThen(Ref.set(runner.queryRef, props.effect())), Effect.andThen(runner.forkFetch), ), [runner, ...props.deps]) -- 2.49.1 From b2f1626268fbe629b957d68f4b41454ae7ce36f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 4 Mar 2025 01:19:42 +0100 Subject: [PATCH 072/326] Working query --- packages/extension-query/src/QueryRunner.ts | 104 +++++++++++--------- packages/extension-query/src/index.ts | 10 +- 2 files changed, 63 insertions(+), 51 deletions(-) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index aa66331..072e816 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -5,11 +5,11 @@ import { Effect, Fiber, identity, Option, Ref, SubscriptionRef } from "effect" export interface QueryRunner { readonly queryRef: SubscriptionRef.SubscriptionRef> readonly stateRef: SubscriptionRef.SubscriptionRef> - readonly fiberRef: SubscriptionRef.SubscriptionRef>> + readonly fiberRef: SubscriptionRef.SubscriptionRef>> - readonly interrupt: Effect.Effect - readonly forkFetch: Effect.Effect - readonly forkRefetch: Effect.Effect + readonly forkInterrupt: Effect.Effect> + readonly forkFetch: Effect.Effect> + readonly forkRefresh: Effect.Effect> } @@ -20,66 +20,80 @@ export const make = ( const queryRef = yield* SubscriptionRef.make(query) const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) - const fiberRef = yield* SubscriptionRef.make(Option.none>()) + const fiberRef = yield* SubscriptionRef.make(Option.none>()) const interrupt = fiberRef.pipe( Effect.flatMap(Option.match({ - onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( - Effect.andThen(Fiber.interrupt(fiber)) - ), + onSome: Fiber.interrupt, onNone: () => Effect.void, })) ) - const forkInterrupt = fiberRef.pipe( - Effect.flatMap(Option.match({ - onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( - Effect.andThen(Fiber.interruptFork(fiber)) - ), - onNone: () => Effect.void, - })) - ) + const forkInterrupt = Effect.forkDaemon(interrupt) const forkFetch = interrupt.pipe( - Effect.andThen(Ref.set(stateRef, AsyncData.loading())), - Effect.andThen(queryRef.pipe(Effect.flatMap(identity))), - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }), - Effect.andThen(Ref.set(fiberRef, Option.none())), - Effect.provide(context), - Effect.forkDaemon, + Effect.andThen( + Effect.addFinalizer(() => Ref.set(fiberRef, Option.none())).pipe( + Effect.andThen(Ref.set(stateRef, AsyncData.loading())), + Effect.andThen(queryRef.pipe(Effect.flatMap(identity))), + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }), - Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), + Effect.provide(context), + Effect.scoped, + Effect.fork, + ) + ), + + Effect.flatMap(fiber => + Ref.set(fiberRef, Option.some(fiber)).pipe( + Effect.andThen(Fiber.join(fiber)) + ) + ), + + Effect.forkDaemon, ) - const forkRefetch = interrupt.pipe( - Effect.andThen(Ref.update(stateRef, previous => { - if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) - return AsyncData.refreshing(previous) - if (AsyncData.isRefreshing(previous)) - return AsyncData.refreshing(previous.previous) - return AsyncData.loading() - })), - Effect.andThen(queryRef.pipe(Effect.flatMap(identity))), - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }), - Effect.andThen(Ref.set(fiberRef, Option.none())), - Effect.provide(context), - Effect.forkDaemon, + const forkRefresh = interrupt.pipe( + Effect.andThen( + Effect.addFinalizer(() => Ref.set(fiberRef, Option.none())).pipe( + Effect.andThen(Ref.update(stateRef, previous => { + if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) + return AsyncData.refreshing(previous) + if (AsyncData.isRefreshing(previous)) + return AsyncData.refreshing(previous.previous) + return AsyncData.loading() + })), + Effect.andThen(queryRef.pipe(Effect.flatMap(identity))), + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }), - Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber))), + Effect.provide(context), + Effect.scoped, + Effect.fork, + ) + ), + + Effect.flatMap(fiber => + Ref.set(fiberRef, Option.some(fiber)).pipe( + Effect.andThen(Fiber.join(fiber)) + ) + ), + + Effect.forkDaemon, ) return { queryRef, stateRef, fiberRef, - interrupt, + + forkInterrupt, forkFetch, - forkRefetch, + forkRefresh, } }) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index e647a3a..76bb022 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,5 +1,5 @@ import * as AsyncData from "@typed/async-data" -import { Console, Effect, Ref, Stream, SubscriptionRef } from "effect" +import { Effect, Fiber, Ref, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" @@ -12,7 +12,7 @@ export interface UseQueryProps { export interface UseQueryResult { readonly state: SubscriptionRef.SubscriptionRef> - readonly refresh: Effect.Effect + readonly refresh: Effect.Effect> } @@ -23,16 +23,14 @@ export const QueryExtension = ReffuseExtension.make(() => ({ ): UseQueryResult { const runner = this.useMemo(() => QueryRunner.make(props.effect()), []) - this.useFork(() => Stream.runForEach(runner.fiberRef.changes, Console.log), []) - - this.useEffect(() => Effect.addFinalizer(() => Effect.void).pipe( + this.useEffect(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( Effect.andThen(Ref.set(runner.queryRef, props.effect())), Effect.andThen(runner.forkFetch), ), [runner, ...props.deps]) return React.useMemo(() => ({ state: runner.stateRef, - refresh: runner.forkRefetch, + refresh: runner.forkRefresh, }), [runner]) } })) -- 2.49.1 From 98091d4598a2fc0fce961f283c1c6a6c3322f299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 4 Mar 2025 01:22:51 +0100 Subject: [PATCH 073/326] Refactoring --- .../extension-query/src/QueryExtension.ts | 36 +++++++++++++++++ packages/extension-query/src/index.ts | 39 +------------------ 2 files changed, 37 insertions(+), 38 deletions(-) create mode 100644 packages/extension-query/src/QueryExtension.ts diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts new file mode 100644 index 0000000..2ee4607 --- /dev/null +++ b/packages/extension-query/src/QueryExtension.ts @@ -0,0 +1,36 @@ +import * as AsyncData from "@typed/async-data" +import { Effect, Fiber, Ref, SubscriptionRef } from "effect" +import * as React from "react" +import { ReffuseExtension, type ReffuseHelpers } from "reffuse" +import * as QueryRunner from "./QueryRunner.js" + + +export interface UseQueryProps { + effect: () => Effect.Effect + readonly deps: React.DependencyList +} + +export interface UseQueryResult { + readonly state: SubscriptionRef.SubscriptionRef> + readonly refresh: Effect.Effect> +} + + +export const QueryExtension = ReffuseExtension.make(() => ({ + useQuery( + this: ReffuseHelpers.ReffuseHelpers, + props: UseQueryProps, + ): UseQueryResult { + const runner = this.useMemo(() => QueryRunner.make(props.effect()), []) + + this.useEffect(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( + Effect.andThen(Ref.set(runner.queryRef, props.effect())), + Effect.andThen(runner.forkFetch), + ), [runner, ...props.deps]) + + return React.useMemo(() => ({ + state: runner.stateRef, + refresh: runner.forkRefresh, + }), [runner]) + } +})) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index 76bb022..0052524 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,39 +1,2 @@ -import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, Ref, SubscriptionRef } from "effect" -import * as React from "react" -import { ReffuseExtension, type ReffuseHelpers } from "reffuse" -import * as QueryRunner from "./QueryRunner.js" - - -export interface UseQueryProps { - effect: () => Effect.Effect - readonly deps: React.DependencyList -} - -export interface UseQueryResult { - readonly state: SubscriptionRef.SubscriptionRef> - readonly refresh: Effect.Effect> -} - - -export const QueryExtension = ReffuseExtension.make(() => ({ - useQuery( - this: ReffuseHelpers.ReffuseHelpers, - props: UseQueryProps, - ): UseQueryResult { - const runner = this.useMemo(() => QueryRunner.make(props.effect()), []) - - this.useEffect(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( - Effect.andThen(Ref.set(runner.queryRef, props.effect())), - Effect.andThen(runner.forkFetch), - ), [runner, ...props.deps]) - - return React.useMemo(() => ({ - state: runner.stateRef, - refresh: runner.forkRefresh, - }), [runner]) - } -})) - - +export * from "./QueryExtension.js" export * as QueryRunner from "./QueryRunner.js" -- 2.49.1 From 74cf37e3a3df2853a8ddbde45c3b3d842a2b1427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 4 Mar 2025 01:35:52 +0100 Subject: [PATCH 074/326] Query example --- packages/example/src/main.tsx | 4 ++-- packages/example/src/routes/__root.tsx | 1 + packages/example/src/routes/query.tsx | 7 ++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index fc8645f..8fe1e6d 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -26,11 +26,11 @@ declare module "@tanstack/react-router" { createRoot(document.getElementById("root")!).render( - // + - // + ) diff --git a/packages/example/src/routes/__root.tsx b/packages/example/src/routes/__root.tsx index e5a9b44..a02f201 100644 --- a/packages/example/src/routes/__root.tsx +++ b/packages/example/src/routes/__root.tsx @@ -20,6 +20,7 @@ function Root() { Count Tests Promise + Query Blank diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index efa1d87..8a2c328 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -3,7 +3,7 @@ import { HttpClient } from "@effect/platform" import { Button, Container, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import * as AsyncData from "@typed/async-data" -import { Effect, Schema } from "effect" +import { Console, Effect, Schema } from "effect" export const Route = createFileRoute("/query")({ @@ -17,11 +17,12 @@ function RouteComponent() { const runSync = R.useRunSync() const { state, refresh } = R.useQuery({ - effect: () => HttpClient.get("https://www.uuidtools.com/api/generate/v4").pipe( + effect: () => Console.log("Querying...").pipe( + Effect.andThen(Effect.sleep("500 millis")), + Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), Effect.flatMap(Schema.decodeUnknown(Result)), - Effect.delay("500 millis"), Effect.scoped, ), deps: [], -- 2.49.1 From c2b2b1b96e12bcb80f052a04594f3d58b61c0b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 4 Mar 2025 02:04:29 +0100 Subject: [PATCH 075/326] Dependencies fix --- bun.lock | 125 +++++++++--------- packages/example/package.json | 27 ++-- packages/extension-lazyref/package.json | 2 +- packages/extension-query/package.json | 4 +- .../extension-query/src/QueryExtension.ts | 8 +- 5 files changed, 91 insertions(+), 75 deletions(-) diff --git a/bun.lock b/bun.lock index c0936b8..5d880de 100644 --- a/bun.lock +++ b/bun.lock @@ -14,34 +14,35 @@ "name": "@reffuse/example", "version": "0.0.0", "dependencies": { - "@effect/platform": "^0.77.2", - "@effect/platform-browser": "^0.56.2", - "@radix-ui/themes": "^3.2.0", + "@effect/platform": "^0.77.6", + "@effect/platform-browser": "^0.56.6", + "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", + "@typed/async-data": "^0.13.1", "@typed/id": "^0.17.1", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.13.2", - "lucide-react": "^0.476.0", + "effect": "^3.13.6", + "lucide-react": "^0.477.0", "mobx": "^6.13.6", "reffuse": "workspace:*", }, "devDependencies": { "@eslint/js": "^9.21.0", - "@tanstack/react-router": "^1.111.7", - "@tanstack/router-devtools": "^1.111.7", - "@tanstack/router-plugin": "^1.111.7", + "@tanstack/react-router": "^1.112.7", + "@tanstack/router-devtools": "^1.112.7", + "@tanstack/router-plugin": "^1.112.7", "@thilawyn/thilaschema": "^0.1.4", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", "eslint": "^9.21.0", - "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "typescript-eslint": "^8.25.0", + "typescript-eslint": "^8.26.0", "vite": "^6.2.0", }, }, @@ -52,7 +53,7 @@ "reffuse": "workspace:*", }, "peerDependencies": { - "@typed/lazy-ref": "^0.3.3", + "@typed/lazy-ref": "^0.3.0", "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", @@ -66,7 +67,9 @@ "reffuse": "workspace:*", }, "peerDependencies": { - "@typed/async-data": "^0.13.1", + "@effect/platform": "^0.77.0", + "@effect/platform-browser": "^0.56.0", + "@typed/async-data": "^0.13.0", "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", @@ -126,9 +129,9 @@ "@babel/types": ["@babel/types@7.26.9", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw=="], - "@effect/platform": ["@effect/platform@0.77.2", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.13.2" } }, "sha512-stvroKHJVfjd3XhZJEPUAOgzqu9DH1vnGHIAjfs2ma6Z4qcjVpFXrxa0ZYmwRaWVIFsiADMenkN0I7XrRdAgLw=="], + "@effect/platform": ["@effect/platform@0.77.6", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.13.6" } }, "sha512-ghhLNyj/UoQvmp2I29nqngMlAzQB72BhjUKcOA58cUPaUUwNy3K2jmUAzdU6SB3RHIObsX44CM/jXZiYfTv59A=="], - "@effect/platform-browser": ["@effect/platform-browser@0.56.2", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.77.2", "effect": "^3.13.2" } }, "sha512-mzCNipg3FN9/ATPEO7Cc3cLmTF4gtdoQSVVi5RPJzIxXflVHbNmMFSIuFdGp0W3AbrQ20dfF6FGFaRUo3aFHeA=="], + "@effect/platform-browser": ["@effect/platform-browser@0.56.6", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.77.6", "effect": "^3.13.6" } }, "sha512-kD4AtfoC81/de3fdk57gRIsKDezr8Fn8jePzjYVx2nGY/0379wJfTwLIDMEHE03Ekv/61UVLbmApT5Cyor3H/A=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ=="], @@ -342,7 +345,7 @@ "@radix-ui/rect": ["@radix-ui/rect@1.1.0", "", {}, "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg=="], - "@radix-ui/themes": ["@radix-ui/themes@3.2.0", "", { "dependencies": { "@radix-ui/colors": "^3.0.0", "classnames": "^2.3.2", "radix-ui": "^1.1.2", "react-remove-scroll-bar": "^2.3.8" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-cG/47tfHN9FW1ZoAigd3oUeJaIm591vGtQ97PrhfwS22IJgWhE5h6D0w2m+NVbKRVo8qIWCG+hiWN04MlLoW4A=="], + "@radix-ui/themes": ["@radix-ui/themes@3.2.1", "", { "dependencies": { "@radix-ui/colors": "^3.0.0", "classnames": "^2.3.2", "radix-ui": "^1.1.3", "react-remove-scroll-bar": "^2.3.8" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-WJL2YKAGItkunwm3O4cLTFKCGJTfAfF6Hmq7f5bCo1ggqC9qJQ/wfg/25AAN72aoEM1yqXZQ+pslsw48AFR0Xg=="], "@reffuse/example": ["@reffuse/example@workspace:packages/example"], @@ -350,59 +353,59 @@ "@reffuse/extension-query": ["@reffuse/extension-query@workspace:packages/extension-query"], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.34.8", "", { "os": "android", "cpu": "arm" }, "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.34.9", "", { "os": "android", "cpu": "arm" }, "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.34.8", "", { "os": "android", "cpu": "arm64" }, "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.34.9", "", { "os": "android", "cpu": "arm64" }, "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.34.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.34.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.34.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.34.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.34.8", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.34.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.34.8", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.34.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.34.8", "", { "os": "linux", "cpu": "arm" }, "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.34.9", "", { "os": "linux", "cpu": "arm" }, "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.34.8", "", { "os": "linux", "cpu": "arm" }, "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.34.9", "", { "os": "linux", "cpu": "arm" }, "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.34.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.34.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.34.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.34.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A=="], - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.34.8", "", { "os": "linux", "cpu": "none" }, "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ=="], + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.34.9", "", { "os": "linux", "cpu": "none" }, "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg=="], - "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.34.8", "", { "os": "linux", "cpu": "ppc64" }, "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw=="], + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.34.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.34.8", "", { "os": "linux", "cpu": "none" }, "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.34.9", "", { "os": "linux", "cpu": "none" }, "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.34.8", "", { "os": "linux", "cpu": "s390x" }, "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.34.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.34.8", "", { "os": "linux", "cpu": "x64" }, "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.34.9", "", { "os": "linux", "cpu": "x64" }, "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.34.8", "", { "os": "linux", "cpu": "x64" }, "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.34.9", "", { "os": "linux", "cpu": "x64" }, "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.34.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.34.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.34.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.34.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.34.8", "", { "os": "win32", "cpu": "x64" }, "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.34.9", "", { "os": "win32", "cpu": "x64" }, "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw=="], "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], "@tanstack/history": ["@tanstack/history@1.99.13", "", {}, "sha512-JMd7USmnp8zV8BRGIjALqzPxazvKtQ7PGXQC7n39HpbqdsmfV2ePCzieO84IvN+mwsTrXErpbjI4BfKCa+ZNCg=="], - "@tanstack/react-router": ["@tanstack/react-router@1.111.7", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "^1.111.7", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-/hOWy7lPmVfRqbwIy2d9mvVLA6ZC4tbcgLDdMXCNRN93LMsGEHCTrgFADdSL2f/rvhPyHeYxsFazEo9+ktgUiw=="], + "@tanstack/react-router": ["@tanstack/react-router@1.112.7", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "^1.112.0", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-udThbvP01cXMvMUK5OPayxuR7ib5AtFL2VnbZSnnKS/dHGsk8KRS+qmkyqZBuuOxRkkF2MC3+BdPj2UTZ4UNjQ=="], "@tanstack/react-store": ["@tanstack/react-store@0.7.0", "", { "dependencies": { "@tanstack/store": "0.7.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng=="], - "@tanstack/router-core": ["@tanstack/router-core@1.111.7", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/store": "^0.7.0" } }, "sha512-N3u3HGBNb1k+MvL15CGmE4KFEDy3euU/L3ENXjmzPm8zfpeVjs+Tyk3y0nicAk3MSSboGXVU1po19RATdWnTsg=="], + "@tanstack/router-core": ["@tanstack/router-core@1.112.0", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/store": "^0.7.0" } }, "sha512-kmpMiBuz17Hxyl+ZO+B6/F98p07NSEmgr2JlZkKXcdupLIBAWqcXw+bjowFXNcTEwe9RWsS/WjAC/bBTftr0rA=="], - "@tanstack/router-devtools": ["@tanstack/router-devtools@1.111.7", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/react-router": "^1.111.7", "csstype": "^3.0.10", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["csstype"] }, "sha512-xZpiIWy/HBhpYUqUxT1dNUn5smQhWhkgjNlJOATzrm81G5T3l2jEr79XPXqwRndWzu2WKqv1kPkScC0ekRgE7Q=="], + "@tanstack/router-devtools": ["@tanstack/router-devtools@1.112.7", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/react-router": "^1.112.7", "csstype": "^3.0.10", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["csstype"] }, "sha512-37qpVzYK4JEg/i0CvnbKI2G+OyWai9yLyvnm8UIc9f2yDzVZKJ1qEpnRXhuLdGCL8dmsf7PjhAPmw46YnD3fHQ=="], - "@tanstack/router-generator": ["@tanstack/router-generator@1.111.7", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.99.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.1" }, "peerDependencies": { "@tanstack/react-router": "^1.111.7" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-+jHX35iF45NHQvHzXuLgyCILUUTyMl3EeClKNkfdaKLvV1adwGDQr24cSKDQLmNKEDXGTijBI5nX8ntkKo5oyA=="], + "@tanstack/router-generator": ["@tanstack/router-generator@1.112.7", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.99.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.1" }, "peerDependencies": { "@tanstack/react-router": "^1.112.7" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-2BlV64vej9T+NnjUEX42BOEKpCnC2dUtfxr9Xz0sQk43fMWtNe+2b1jzPzJZWlu8RjaQ5OK22hL+p7GSpph3Kw=="], - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.111.7", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.111.7", "@tanstack/router-generator": "^1.111.7", "@tanstack/router-utils": "^1.102.2", "@tanstack/virtual-file-routes": "^1.99.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.9", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.1" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.111.7", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-aiT/j2OadGbqEWTZUY53o2UeVQIR11+S1h1Gq6GYxQmD/OjdyK/WiMighBK5zeryeWYG4XeC8eFlXMoyuG0v+g=="], + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.112.7", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.112.0", "@tanstack/router-generator": "^1.112.7", "@tanstack/router-utils": "^1.102.2", "@tanstack/virtual-file-routes": "^1.99.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.9", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.1" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.112.7", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-9m5UfLSWd5T2jOG9O0BWd1WkChalYfkO/zZjnQ+JoyvixbqTUmkXWkbNtMrZSfM/lNQO4HiftPMMflLSGWMrWg=="], "@tanstack/router-utils": ["@tanstack/router-utils@1.102.2", "", { "dependencies": { "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "ansis": "^3.11.0", "diff": "^7.0.0" } }, "sha512-Uwl2nbrxhCzviaHHBLNPhSC/OMpZLdOTxTJndUSsXTzWUP4IoQcVmngaIsxi9iriE3ArC1VXuanUAkfGmimNOQ=="], @@ -434,21 +437,21 @@ "@types/react-dom": ["@types/react-dom@19.0.4", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.25.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/type-utils": "8.25.0", "@typescript-eslint/utils": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.26.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.26.0", "@typescript-eslint/type-utils": "8.26.0", "@typescript-eslint/utils": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.25.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/types": "8.25.0", "@typescript-eslint/typescript-estree": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.26.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.26.0", "@typescript-eslint/types": "8.26.0", "@typescript-eslint/typescript-estree": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.25.0", "", { "dependencies": { "@typescript-eslint/types": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0" } }, "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.26.0", "", { "dependencies": { "@typescript-eslint/types": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0" } }, "sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.25.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.25.0", "@typescript-eslint/utils": "8.25.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.26.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.26.0", "@typescript-eslint/utils": "8.26.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.25.0", "", {}, "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.26.0", "", {}, "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.25.0", "", { "dependencies": { "@typescript-eslint/types": "8.25.0", "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.26.0", "", { "dependencies": { "@typescript-eslint/types": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.25.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.25.0", "@typescript-eslint/types": "8.25.0", "@typescript-eslint/typescript-estree": "8.25.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.26.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.26.0", "@typescript-eslint/types": "8.26.0", "@typescript-eslint/typescript-estree": "8.26.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.25.0", "", { "dependencies": { "@typescript-eslint/types": "8.25.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.26.0", "", { "dependencies": { "@typescript-eslint/types": "8.26.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@4.3.4", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug=="], @@ -460,7 +463,7 @@ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "ansis": ["ansis@3.16.0", "", {}, "sha512-sU7d/tfZiYrsIAXbdL/CNZld5bCkruzwT5KmqmadCJYxuLxHAOBjidxD5+iLmN/6xEfjcQq1l7OpsiCBlc4LzA=="], + "ansis": ["ansis@3.17.0", "", {}, "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg=="], "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], @@ -482,7 +485,7 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001700", "", {}, "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001701", "", {}, "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -512,9 +515,9 @@ "diff": ["diff@7.0.0", "", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="], - "effect": ["effect@3.13.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-/w+CPqHDJ33Wq7xC4YKAchrEEPtjvxh563xH9kDTZp99seNYBoBs87vl8DJwartEjj+KLQLP8PzoDne+XmGT2A=="], + "effect": ["effect@3.13.6", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-NKmzyIuOb2UuHFPRz9EYScbhMBxXkzjPRuu+4axE+hMk1f0U7TZxzi2CP3TVVxA2kzvh00aBQEbyH7Opq4PnWg=="], - "electron-to-chromium": ["electron-to-chromium@1.5.104", "", {}, "sha512-Us9M2L4cO/zMBqVkJtnj353nQhMju9slHm62NprKTmdF3HH8wYOtNvDFq/JB2+ZRoGLzdvYDiATlMHs98XBM1g=="], + "electron-to-chromium": ["electron-to-chromium@1.5.111", "", {}, "sha512-vJyJlO95wQRAw6K2ZGF/8nol7AcbCOnp8S6H91mwOOBbXoS9seDBYxCTPYAFsvXLxl3lc0jLXXe9GLxC4nXVog=="], "esbuild": ["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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw=="], @@ -524,7 +527,7 @@ "eslint": ["eslint@9.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.2", "@eslint/core": "^0.12.0", "@eslint/eslintrc": "^3.3.0", "@eslint/js": "9.21.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg=="], - "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.1.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw=="], + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.19", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ=="], @@ -552,7 +555,7 @@ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - "fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="], + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], @@ -624,7 +627,7 @@ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "lucide-react": ["lucide-react@0.476.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-x6cLTk8gahdUPje0hSgLN1/MgiJH+Xl90Xoxy9bkPAsMPOUiyRSKR4JCDPGVCEpyqnZXH3exFWNItcvra9WzUQ=="], + "lucide-react": ["lucide-react@0.477.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-yCf7aYxerFZAbd8jHJxjwe1j7jEMPptjnaOqdYeirFnEy85cNR3/L+o0I875CYFYya+eEVzZSbNuRk8BZPDpVw=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], @@ -670,7 +673,7 @@ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.5.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg=="], + "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], @@ -696,7 +699,7 @@ "reffuse": ["reffuse@workspace:packages/reffuse"], - "remeda": ["remeda@2.20.2", "", { "dependencies": { "type-fest": "^4.33.0" } }, "sha512-38pfm5aUq6mUkNYbt7TdY2WEk9mSqRVV+6UsoTjabwmbu8obLbh8sYYSX2WQ3W4u6EYp3XxUKqIiwGFZu+OY9g=="], + "remeda": ["remeda@2.21.0", "", { "dependencies": { "type-fest": "^4.35.0" } }, "sha512-ANFqOts3BsvW1MrKOv9SVHG3ly0MzzLa0HIu5qLkiRuEPGPuH9ny3sgd7VdHvC2VOUSN/7RkmabPlAda6JtGgg=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -704,7 +707,7 @@ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rollup": ["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.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ=="], + "rollup": ["rollup@4.34.9", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.34.9", "@rollup/rollup-android-arm64": "4.34.9", "@rollup/rollup-darwin-arm64": "4.34.9", "@rollup/rollup-darwin-x64": "4.34.9", "@rollup/rollup-freebsd-arm64": "4.34.9", "@rollup/rollup-freebsd-x64": "4.34.9", "@rollup/rollup-linux-arm-gnueabihf": "4.34.9", "@rollup/rollup-linux-arm-musleabihf": "4.34.9", "@rollup/rollup-linux-arm64-gnu": "4.34.9", "@rollup/rollup-linux-arm64-musl": "4.34.9", "@rollup/rollup-linux-loongarch64-gnu": "4.34.9", "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9", "@rollup/rollup-linux-riscv64-gnu": "4.34.9", "@rollup/rollup-linux-s390x-gnu": "4.34.9", "@rollup/rollup-linux-x64-gnu": "4.34.9", "@rollup/rollup-linux-x64-musl": "4.34.9", "@rollup/rollup-win32-arm64-msvc": "4.34.9", "@rollup/rollup-win32-ia32-msvc": "4.34.9", "@rollup/rollup-win32-x64-msvc": "4.34.9", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], @@ -750,15 +753,15 @@ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@4.35.0", "", {}, "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A=="], + "type-fest": ["type-fest@4.36.0", "", {}, "sha512-3T/PUdKTCnkUmhQU6FFJEHsLwadsRegktX3TNHk+2JJB9HlA8gp1/VXblXVDI93kSnXF2rdPx0GMbHtJIV2LPg=="], - "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], + "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], - "typescript-eslint": ["typescript-eslint@8.25.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.25.0", "@typescript-eslint/parser": "8.25.0", "@typescript-eslint/utils": "8.25.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q=="], + "typescript-eslint": ["typescript-eslint@8.26.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.26.0", "@typescript-eslint/parser": "8.26.0", "@typescript-eslint/utils": "8.26.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA=="], "unplugin": ["unplugin@2.2.0", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw=="], - "update-browserslist-db": ["update-browserslist-db@1.1.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg=="], + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], diff --git a/packages/example/package.json b/packages/example/package.json index 6d93aba..08ae5f9 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -12,36 +12,41 @@ }, "devDependencies": { "@eslint/js": "^9.21.0", - "@tanstack/react-router": "^1.111.7", - "@tanstack/router-devtools": "^1.111.7", - "@tanstack/router-plugin": "^1.111.7", + "@tanstack/react-router": "^1.112.7", + "@tanstack/router-devtools": "^1.112.7", + "@tanstack/router-plugin": "^1.112.7", "@thilawyn/thilaschema": "^0.1.4", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", "eslint": "^9.21.0", - "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "typescript-eslint": "^8.25.0", + "typescript-eslint": "^8.26.0", "vite": "^6.2.0" }, "dependencies": { - "@effect/platform": "^0.77.2", - "@effect/platform-browser": "^0.56.2", - "@radix-ui/themes": "^3.2.0", + "@effect/platform": "^0.77.6", + "@effect/platform-browser": "^0.56.6", + "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", + "@typed/async-data": "^0.13.1", "@typed/id": "^0.17.1", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.13.2", - "lucide-react": "^0.476.0", + "effect": "^3.13.6", + "lucide-react": "^0.477.0", "mobx": "^6.13.6", "reffuse": "workspace:*" }, "overrides": { - "effect": "^3.13.2" + "effect": "^3.13.6", + "@effect/platform": "^0.77.6", + "@effect/platform-browser": "^0.56.6", + "@typed/lazy-ref": "^0.3.3", + "@typed/async-data": "^0.13.1" } } diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index 2e77c53..d9b9498 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -33,7 +33,7 @@ "reffuse": "workspace:*" }, "peerDependencies": { - "@typed/lazy-ref": "^0.3.3", + "@typed/lazy-ref": "^0.3.0", "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", diff --git a/packages/extension-query/package.json b/packages/extension-query/package.json index d50650c..5b61105 100644 --- a/packages/extension-query/package.json +++ b/packages/extension-query/package.json @@ -33,7 +33,9 @@ "reffuse": "workspace:*" }, "peerDependencies": { - "@typed/async-data": "^0.13.1", + "@effect/platform": "^0.77.0", + "@effect/platform-browser": "^0.56.0", + "@typed/async-data": "^0.13.0", "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 2ee4607..6d5d304 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,5 +1,6 @@ +import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, Ref, SubscriptionRef } from "effect" +import { Console, Effect, Fiber, Ref, Stream, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" @@ -28,6 +29,11 @@ export const QueryExtension = ReffuseExtension.make(() => ({ Effect.andThen(runner.forkFetch), ), [runner, ...props.deps]) + this.useFork(() => Stream.runForEach( + BrowserStream.fromEventListenerWindow("focus"), + () => Console.log("focus!"), + ), []) + return React.useMemo(() => ({ state: runner.stateRef, refresh: runner.forkRefresh, -- 2.49.1 From 00b72280730c33d55245ba80cadd2033725e32db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 4 Mar 2025 02:15:31 +0100 Subject: [PATCH 076/326] Refetch on focus --- packages/extension-query/src/QueryExtension.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 6d5d304..83ecdd7 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,6 +1,6 @@ import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" -import { Console, Effect, Fiber, Ref, Stream, SubscriptionRef } from "effect" +import { Effect, Fiber, Ref, Stream, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" @@ -31,8 +31,8 @@ export const QueryExtension = ReffuseExtension.make(() => ({ this.useFork(() => Stream.runForEach( BrowserStream.fromEventListenerWindow("focus"), - () => Console.log("focus!"), - ), []) + () => runner.forkRefresh, + ), [runner]) return React.useMemo(() => ({ state: runner.stateRef, -- 2.49.1 From 3af7c3bf7ad475de5800fc63cd8a22fbf0851bb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 4 Mar 2025 22:44:40 +0100 Subject: [PATCH 077/326] Query service work --- packages/example/src/query/reffuse.ts | 10 ++++ .../example/src/query/services/Uuid4Query.ts | 20 ++++++++ packages/example/src/query/services/index.ts | 1 + .../src/query/views/Uuid4QueryService.tsx | 32 ++++++++++++ packages/example/src/routeTree.gen.ts | 49 ++++++++++++++++--- packages/example/src/routes/query/service.tsx | 26 ++++++++++ packages/extension-query/src/QueryService.ts | 26 ++++++++++ packages/extension-query/src/index.ts | 1 + packages/reffuse/src/ReffuseHelpers.ts | 6 ++- 9 files changed, 164 insertions(+), 7 deletions(-) create mode 100644 packages/example/src/query/reffuse.ts create mode 100644 packages/example/src/query/services/Uuid4Query.ts create mode 100644 packages/example/src/query/services/index.ts create mode 100644 packages/example/src/query/views/Uuid4QueryService.tsx create mode 100644 packages/example/src/routes/query/service.tsx create mode 100644 packages/extension-query/src/QueryService.ts diff --git a/packages/example/src/query/reffuse.ts b/packages/example/src/query/reffuse.ts new file mode 100644 index 0000000..ced8e18 --- /dev/null +++ b/packages/example/src/query/reffuse.ts @@ -0,0 +1,10 @@ +import { GlobalReffuse } from "@/reffuse" +import { Reffuse, ReffuseContext } from "reffuse" +import { Uuid4Query } from "./services" + + +export const QueryContext = ReffuseContext.make() + +export const R = new class QueryReffuse extends GlobalReffuse.pipe( + Reffuse.withContexts(QueryContext) +) {} diff --git a/packages/example/src/query/services/Uuid4Query.ts b/packages/example/src/query/services/Uuid4Query.ts new file mode 100644 index 0000000..ab11b0e --- /dev/null +++ b/packages/example/src/query/services/Uuid4Query.ts @@ -0,0 +1,20 @@ +import { HttpClient, HttpClientError } from "@effect/platform" +import { QueryService } from "@reffuse/extension-query" +import { Console, Effect, ParseResult, Schema } from "effect" + + +export const Result = Schema.Tuple(Schema.String) + +export class Uuid4Query extends QueryService.Tag("Uuid4Query")() {} + +export const Uuid4QueryLive = QueryService.layer(Uuid4Query, Console.log("Querying...").pipe( + Effect.andThen(Effect.sleep("500 millis")), + Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), + HttpClient.withTracerPropagation(false), + Effect.flatMap(res => res.json), + Effect.flatMap(Schema.decodeUnknown(Result)), + Effect.scoped, +)) diff --git a/packages/example/src/query/services/index.ts b/packages/example/src/query/services/index.ts new file mode 100644 index 0000000..4f67d41 --- /dev/null +++ b/packages/example/src/query/services/index.ts @@ -0,0 +1 @@ +export * as Uuid4Query from "./Uuid4Query" diff --git a/packages/example/src/query/views/Uuid4QueryService.tsx b/packages/example/src/query/views/Uuid4QueryService.tsx new file mode 100644 index 0000000..ff6463b --- /dev/null +++ b/packages/example/src/query/views/Uuid4QueryService.tsx @@ -0,0 +1,32 @@ +import { Button, Container, Flex, Text } from "@radix-ui/themes" +import * as AsyncData from "@typed/async-data" +import { R } from "../reffuse" +import { Uuid4Query } from "../services" + + +export function Uuid4QueryService() { + const runSync = R.useRunSync() + + const { state, refresh } = R.useMemo(() => Uuid4Query.Uuid4Query, []) + const [queryState] = R.useRefState(state) + + + return ( + + + + {AsyncData.match(queryState, { + NoData: () => "No data yet", + Loading: () => "Loading...", + Success: (value, { isRefreshing, isOptimistic }) => + `Value: ${value} ${isRefreshing ? "(refreshing)" : ""} ${isOptimistic ? "(optimistic)" : ""}`, + Failure: (cause, { isRefreshing }) => + `Error: ${cause} ${isRefreshing ? "(refreshing)" : ""}`, + })} + + + + + + ) +} diff --git a/packages/example/src/routeTree.gen.ts b/packages/example/src/routeTree.gen.ts index 20f3fba..3e3a17c 100644 --- a/packages/example/src/routeTree.gen.ts +++ b/packages/example/src/routeTree.gen.ts @@ -19,6 +19,7 @@ import { Route as LazyrefImport } from './routes/lazyref' import { Route as CountImport } from './routes/count' import { Route as BlankImport } from './routes/blank' import { Route as IndexImport } from './routes/index' +import { Route as QueryServiceImport } from './routes/query/service' // Create/Update Routes @@ -70,6 +71,12 @@ const IndexRoute = IndexImport.update({ getParentRoute: () => rootRoute, } as any) +const QueryServiceRoute = QueryServiceImport.update({ + id: '/service', + path: '/service', + getParentRoute: () => QueryRoute, +} as any) + // Populate the FileRoutesByPath interface declare module '@tanstack/react-router' { @@ -130,20 +137,38 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof TimeImport parentRoute: typeof rootRoute } + '/query/service': { + id: '/query/service' + path: '/service' + fullPath: '/query/service' + preLoaderRoute: typeof QueryServiceImport + parentRoute: typeof QueryImport + } } } // Create and export the route tree +interface QueryRouteChildren { + QueryServiceRoute: typeof QueryServiceRoute +} + +const QueryRouteChildren: QueryRouteChildren = { + QueryServiceRoute: QueryServiceRoute, +} + +const QueryRouteWithChildren = QueryRoute._addFileChildren(QueryRouteChildren) + export interface FileRoutesByFullPath { '/': typeof IndexRoute '/blank': typeof BlankRoute '/count': typeof CountRoute '/lazyref': typeof LazyrefRoute '/promise': typeof PromiseRoute - '/query': typeof QueryRoute + '/query': typeof QueryRouteWithChildren '/tests': typeof TestsRoute '/time': typeof TimeRoute + '/query/service': typeof QueryServiceRoute } export interface FileRoutesByTo { @@ -152,9 +177,10 @@ export interface FileRoutesByTo { '/count': typeof CountRoute '/lazyref': typeof LazyrefRoute '/promise': typeof PromiseRoute - '/query': typeof QueryRoute + '/query': typeof QueryRouteWithChildren '/tests': typeof TestsRoute '/time': typeof TimeRoute + '/query/service': typeof QueryServiceRoute } export interface FileRoutesById { @@ -164,9 +190,10 @@ export interface FileRoutesById { '/count': typeof CountRoute '/lazyref': typeof LazyrefRoute '/promise': typeof PromiseRoute - '/query': typeof QueryRoute + '/query': typeof QueryRouteWithChildren '/tests': typeof TestsRoute '/time': typeof TimeRoute + '/query/service': typeof QueryServiceRoute } export interface FileRouteTypes { @@ -180,6 +207,7 @@ export interface FileRouteTypes { | '/query' | '/tests' | '/time' + | '/query/service' fileRoutesByTo: FileRoutesByTo to: | '/' @@ -190,6 +218,7 @@ export interface FileRouteTypes { | '/query' | '/tests' | '/time' + | '/query/service' id: | '__root__' | '/' @@ -200,6 +229,7 @@ export interface FileRouteTypes { | '/query' | '/tests' | '/time' + | '/query/service' fileRoutesById: FileRoutesById } @@ -209,7 +239,7 @@ export interface RootRouteChildren { CountRoute: typeof CountRoute LazyrefRoute: typeof LazyrefRoute PromiseRoute: typeof PromiseRoute - QueryRoute: typeof QueryRoute + QueryRoute: typeof QueryRouteWithChildren TestsRoute: typeof TestsRoute TimeRoute: typeof TimeRoute } @@ -220,7 +250,7 @@ const rootRouteChildren: RootRouteChildren = { CountRoute: CountRoute, LazyrefRoute: LazyrefRoute, PromiseRoute: PromiseRoute, - QueryRoute: QueryRoute, + QueryRoute: QueryRouteWithChildren, TestsRoute: TestsRoute, TimeRoute: TimeRoute, } @@ -261,13 +291,20 @@ export const routeTree = rootRoute "filePath": "promise.tsx" }, "/query": { - "filePath": "query.tsx" + "filePath": "query.tsx", + "children": [ + "/query/service" + ] }, "/tests": { "filePath": "tests.tsx" }, "/time": { "filePath": "time.tsx" + }, + "/query/service": { + "filePath": "query/service.tsx", + "parent": "/query" } } } diff --git a/packages/example/src/routes/query/service.tsx b/packages/example/src/routes/query/service.tsx new file mode 100644 index 0000000..ad1e3de --- /dev/null +++ b/packages/example/src/routes/query/service.tsx @@ -0,0 +1,26 @@ +import { QueryContext } from "@/query/reffuse" +import { Uuid4Query } from "@/query/services" +import { R } from "@/reffuse" +import { createFileRoute } from "@tanstack/react-router" +import { Effect, Layer } from "effect" +import { useMemo } from "react" + + +export const Route = createFileRoute("/query/service")({ + component: RouteComponent +}) + +function RouteComponent() { + const context = R.useContext() + + const layer = useMemo(() => Layer.empty.pipe( + Layer.provideMerge(Uuid4Query.Uuid4QueryLive), + Layer.provide(context) + ), []) + + return ( + + + + ) +} diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts new file mode 100644 index 0000000..bde1206 --- /dev/null +++ b/packages/extension-query/src/QueryService.ts @@ -0,0 +1,26 @@ +import * as AsyncData from "@typed/async-data" +import { Context, Effect, Fiber, Layer, SubscriptionRef } from "effect" +import * as QueryRunner from "./QueryRunner.js" + + +export interface QueryService { + readonly state: SubscriptionRef.SubscriptionRef> + readonly refresh: Effect.Effect> +} + + +export const Tag = (id: Id) => < + Self, A, E = never, +>() => Effect.Tag(id)>() + +export const layer = ( + tag: Context.TagClass>, + query: Effect.Effect, +): Layer.Layer => Layer.effect(tag, Effect.gen(function*() { + const runner = yield* QueryRunner.make(query) + + return { + state: runner.stateRef, + refresh: runner.forkRefresh, + } +})) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index 0052524..790fe0c 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,2 +1,3 @@ export * from "./QueryExtension.js" export * as QueryRunner from "./QueryRunner.js" +export * as QueryService from "./QueryService.js" diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 77b3b6c..bdb8858 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -1,4 +1,4 @@ -import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, Pipeable, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, Layer, Pipeable, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -23,6 +23,10 @@ export abstract class ReffuseHelpers { return ReffuseContext.useMergeAll(...this.constructor.contexts) } + useLayer(this: ReffuseHelpers): Layer.Layer { + return ReffuseContext.useMergeAllLayers(...this.constructor.contexts) + } + useRunSync(this: ReffuseHelpers): (effect: Effect.Effect) => A { const runtime = ReffuseRuntime.useRuntime() -- 2.49.1 From adaadf13b25ba90189af4aaa82d350d8646f2d1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 4 Mar 2025 23:18:35 +0100 Subject: [PATCH 078/326] Working service query --- packages/example/src/routes/query/service.tsx | 11 ++++++----- packages/reffuse/src/ReffuseContext.tsx | 16 ++++++++-------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/example/src/routes/query/service.tsx b/packages/example/src/routes/query/service.tsx index ad1e3de..638dbe3 100644 --- a/packages/example/src/routes/query/service.tsx +++ b/packages/example/src/routes/query/service.tsx @@ -1,8 +1,9 @@ import { QueryContext } from "@/query/reffuse" import { Uuid4Query } from "@/query/services" +import { Uuid4QueryService } from "@/query/views/Uuid4QueryService" import { R } from "@/reffuse" import { createFileRoute } from "@tanstack/react-router" -import { Effect, Layer } from "effect" +import { Layer } from "effect" import { useMemo } from "react" @@ -11,16 +12,16 @@ export const Route = createFileRoute("/query/service")({ }) function RouteComponent() { - const context = R.useContext() + const context = R.useLayer() const layer = useMemo(() => Layer.empty.pipe( Layer.provideMerge(Uuid4Query.Uuid4QueryLive), - Layer.provide(context) - ), []) + Layer.provide(context), + ), [context]) return ( - + ) } diff --git a/packages/reffuse/src/ReffuseContext.tsx b/packages/reffuse/src/ReffuseContext.tsx index f1898ff..89d1394 100644 --- a/packages/reffuse/src/ReffuseContext.tsx +++ b/packages/reffuse/src/ReffuseContext.tsx @@ -97,15 +97,15 @@ export function useMergeAll>( return React.useMemo(() => Context.mergeAll(...values), values) } -export function useMergeAllLayers>( +export function useMergeAllLayers>( ...contexts: [...{ [K in keyof T]: ReffuseContext }] ): Layer.Layer { - const values = Array.map( - contexts as Array.NonEmptyArray>, - v => React.use(v.Context), - ) + const values = contexts.map(v => React.use(v.Context)) - return React.useMemo(() => Layer.mergeAll( - ...Array.map(values, context => Layer.effectContext(Effect.succeed(context))) - ), values) + return React.useMemo(() => Array.isNonEmptyArray(values) + ? Layer.mergeAll( + ...Array.map(values, context => Layer.effectContext(Effect.succeed(context))) + ) + : Layer.empty as Layer.Layer, + values) } -- 2.49.1 From 8fa24b17913699f98d322fbe9751d0040a3e36b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 5 Mar 2025 00:16:13 +0100 Subject: [PATCH 079/326] Query work --- .../example/src/query/services/Uuid4Query.ts | 18 ++++++++++-------- packages/example/src/routes/query.tsx | 4 ++-- packages/extension-query/src/QueryExtension.ts | 12 +++++++----- packages/extension-query/src/QueryRunner.ts | 8 ++++++-- packages/extension-query/src/QueryService.ts | 12 +++++++++--- 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/packages/example/src/query/services/Uuid4Query.ts b/packages/example/src/query/services/Uuid4Query.ts index ab11b0e..ab9d4cf 100644 --- a/packages/example/src/query/services/Uuid4Query.ts +++ b/packages/example/src/query/services/Uuid4Query.ts @@ -10,11 +10,13 @@ export class Uuid4Query extends QueryService.Tag("Uuid4Query")() {} -export const Uuid4QueryLive = QueryService.layer(Uuid4Query, Console.log("Querying...").pipe( - Effect.andThen(Effect.sleep("500 millis")), - Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), - HttpClient.withTracerPropagation(false), - Effect.flatMap(res => res.json), - Effect.flatMap(Schema.decodeUnknown(Result)), - Effect.scoped, -)) +export const Uuid4QueryLive = QueryService.layer(Uuid4Query, { + query: Console.log("Querying...").pipe( + Effect.andThen(Effect.sleep("500 millis")), + Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), + HttpClient.withTracerPropagation(false), + Effect.flatMap(res => res.json), + Effect.flatMap(Schema.decodeUnknown(Result)), + Effect.scoped, + ) +}) diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index 8a2c328..bef9373 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -17,7 +17,7 @@ function RouteComponent() { const runSync = R.useRunSync() const { state, refresh } = R.useQuery({ - effect: () => Console.log("Querying...").pipe( + query: () => Console.log("Querying...").pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), HttpClient.withTracerPropagation(false), @@ -25,7 +25,7 @@ function RouteComponent() { Effect.flatMap(Schema.decodeUnknown(Result)), Effect.scoped, ), - deps: [], + key: [], }) const [queryState] = R.useRefState(state) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 83ecdd7..380ff56 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -7,8 +7,8 @@ import * as QueryRunner from "./QueryRunner.js" export interface UseQueryProps { - effect: () => Effect.Effect - readonly deps: React.DependencyList + readonly query: () => Effect.Effect + readonly key: React.DependencyList } export interface UseQueryResult { @@ -22,12 +22,14 @@ export const QueryExtension = ReffuseExtension.make(() => ({ this: ReffuseHelpers.ReffuseHelpers, props: UseQueryProps, ): UseQueryResult { - const runner = this.useMemo(() => QueryRunner.make(props.effect()), []) + const runner = this.useMemo(() => QueryRunner.make({ + query: props.query() + }), []) this.useEffect(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( - Effect.andThen(Ref.set(runner.queryRef, props.effect())), + Effect.andThen(Ref.set(runner.queryRef, props.query())), Effect.andThen(runner.forkFetch), - ), [runner, ...props.deps]) + ), [runner, ...props.key]) this.useFork(() => Stream.runForEach( BrowserStream.fromEventListenerWindow("focus"), diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 072e816..93cef0f 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -13,12 +13,16 @@ export interface QueryRunner { } +export interface MakeProps { + readonly query: Effect.Effect +} + export const make = ( - query: Effect.Effect + props: MakeProps ): Effect.Effect, never, R> => Effect.gen(function*() { const context = yield* Effect.context() - const queryRef = yield* SubscriptionRef.make(query) + const queryRef = yield* SubscriptionRef.make(props.query) const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) const fiberRef = yield* SubscriptionRef.make(Option.none>()) diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts index bde1206..6dc92d7 100644 --- a/packages/extension-query/src/QueryService.ts +++ b/packages/extension-query/src/QueryService.ts @@ -8,16 +8,22 @@ export interface QueryService { readonly refresh: Effect.Effect> } - export const Tag = (id: Id) => < Self, A, E = never, >() => Effect.Tag(id)>() + +export interface LayerProps { + readonly query: Effect.Effect +} + export const layer = ( tag: Context.TagClass>, - query: Effect.Effect, + props: LayerProps, ): Layer.Layer => Layer.effect(tag, Effect.gen(function*() { - const runner = yield* QueryRunner.make(query) + const runner = yield* QueryRunner.make({ + query: props.query + }) return { state: runner.stateRef, -- 2.49.1 From 86539f33f0b9b7344001fafeb0c081fdf4d24a5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 5 Mar 2025 00:24:38 +0100 Subject: [PATCH 080/326] Fix --- packages/example/src/query/views/Uuid4QueryService.tsx | 8 ++++---- packages/example/src/routes/query.tsx | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/example/src/query/views/Uuid4QueryService.tsx b/packages/example/src/query/views/Uuid4QueryService.tsx index ff6463b..bc0eada 100644 --- a/packages/example/src/query/views/Uuid4QueryService.tsx +++ b/packages/example/src/query/views/Uuid4QueryService.tsx @@ -7,15 +7,15 @@ import { Uuid4Query } from "../services" export function Uuid4QueryService() { const runSync = R.useRunSync() - const { state, refresh } = R.useMemo(() => Uuid4Query.Uuid4Query, []) - const [queryState] = R.useRefState(state) + const query = R.useMemo(() => Uuid4Query.Uuid4Query, []) + const [state] = R.useRefState(query.state) return ( - {AsyncData.match(queryState, { + {AsyncData.match(state, { NoData: () => "No data yet", Loading: () => "Loading...", Success: (value, { isRefreshing, isOptimistic }) => @@ -25,7 +25,7 @@ export function Uuid4QueryService() { })} - + ) diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index bef9373..eb01ac0 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -16,7 +16,7 @@ const Result = Schema.Tuple(Schema.String) function RouteComponent() { const runSync = R.useRunSync() - const { state, refresh } = R.useQuery({ + const query = R.useQuery({ query: () => Console.log("Querying...").pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), @@ -28,14 +28,14 @@ function RouteComponent() { key: [], }) - const [queryState] = R.useRefState(state) + const [state] = R.useRefState(query.state) return ( - {AsyncData.match(queryState, { + {AsyncData.match(state, { NoData: () => "No data yet", Loading: () => "Loading...", Success: (value, { isRefreshing, isOptimistic }) => @@ -45,7 +45,7 @@ function RouteComponent() { })} - + ) -- 2.49.1 From 1e8a5d412fbca2f91de76f27ed724d555c879c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 5 Mar 2025 00:44:13 +0100 Subject: [PATCH 081/326] Refresh on window focus --- packages/extension-query/src/QueryExtension.ts | 8 ++------ packages/extension-query/src/QueryRunner.ts | 12 +++++++++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 380ff56..8ad003f 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,6 +1,5 @@ -import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, Ref, Stream, SubscriptionRef } from "effect" +import { Effect, Fiber, Ref, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" @@ -31,10 +30,7 @@ export const QueryExtension = ReffuseExtension.make(() => ({ Effect.andThen(runner.forkFetch), ), [runner, ...props.key]) - this.useFork(() => Stream.runForEach( - BrowserStream.fromEventListenerWindow("focus"), - () => runner.forkRefresh, - ), [runner]) + this.useFork(() => runner.refreshOnWindowFocus, [runner]) return React.useMemo(() => ({ state: runner.stateRef, diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 93cef0f..2a75a70 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -1,5 +1,6 @@ +import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, identity, Option, Ref, SubscriptionRef } from "effect" +import { Effect, Fiber, identity, Option, Ref, Stream, SubscriptionRef } from "effect" export interface QueryRunner { @@ -10,6 +11,8 @@ export interface QueryRunner { readonly forkInterrupt: Effect.Effect> readonly forkFetch: Effect.Effect> readonly forkRefresh: Effect.Effect> + + readonly refreshOnWindowFocus: Effect.Effect } @@ -91,6 +94,11 @@ export const make = ( Effect.forkDaemon, ) + const refreshOnWindowFocus = Stream.runForEach( + BrowserStream.fromEventListenerWindow("focus"), + () => forkRefresh, + ) + return { queryRef, stateRef, @@ -99,5 +107,7 @@ export const make = ( forkInterrupt, forkFetch, forkRefresh, + + refreshOnWindowFocus, } }) -- 2.49.1 From 3659d3f34284abf1e37ab19642853bceebf5d254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 5 Mar 2025 01:50:08 +0100 Subject: [PATCH 082/326] Version bump --- packages/extension-lazyref/package.json | 2 +- packages/extension-query/package.json | 2 +- packages/reffuse/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index d9b9498..5b921aa 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -37,6 +37,6 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.2" + "reffuse": "^0.1.3" } } diff --git a/packages/extension-query/package.json b/packages/extension-query/package.json index 5b61105..a41819c 100644 --- a/packages/extension-query/package.json +++ b/packages/extension-query/package.json @@ -39,6 +39,6 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.2" + "reffuse": "^0.1.3" } } diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 950c3b6..bfe88f7 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -1,6 +1,6 @@ { "name": "reffuse", - "version": "0.1.2", + "version": "0.1.3", "type": "module", "files": [ "./README.md", -- 2.49.1 From d61339ea6a55965c0c30cf5804fc1b4fac3f1a2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 5 Mar 2025 02:23:43 +0100 Subject: [PATCH 083/326] Query work --- packages/example/src/routes/query.tsx | 28 ++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index eb01ac0..07387ac 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -1,9 +1,10 @@ import { R } from "@/reffuse" import { HttpClient } from "@effect/platform" -import { Button, Container, Flex, Text } from "@radix-ui/themes" +import { Button, Container, Flex, Slider, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import * as AsyncData from "@typed/async-data" -import { Console, Effect, Schema } from "effect" +import { Array, Console, Effect, flow, Option, Schema } from "effect" +import { useState } from "react" export const Route = createFileRoute("/query")({ @@ -11,21 +12,23 @@ export const Route = createFileRoute("/query")({ }) -const Result = Schema.Tuple(Schema.String) +const Result = Schema.Array(Schema.String) function RouteComponent() { const runSync = R.useRunSync() + const [count, setCount] = useState(1) + const query = R.useQuery({ - query: () => Console.log("Querying...").pipe( - Effect.andThen(Effect.sleep("500 millis")), - Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), + query: () => Console.log(`Querying ${ count } IDs...`).pipe( + // Effect.andThen(Effect.sleep("500 millis")), + Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), Effect.flatMap(Schema.decodeUnknown(Result)), Effect.scoped, ), - key: [], + key: ["uuid4", count], }) const [state] = R.useRefState(query.state) @@ -34,6 +37,17 @@ function RouteComponent() { return ( + + {AsyncData.match(state, { NoData: () => "No data yet", -- 2.49.1 From f99d18b8463fd26f7014d2d4e8c2f23754a04977 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 6 Mar 2025 03:15:43 +0100 Subject: [PATCH 084/326] Cleanup fix --- packages/example/src/routes/query.tsx | 12 +++++- .../extension-query/src/QueryExtension.ts | 14 +++++-- packages/extension-query/src/QueryRunner.ts | 42 ++++++++++++------- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index 07387ac..79b51a9 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -21,13 +21,23 @@ function RouteComponent() { const query = R.useQuery({ query: () => Console.log(`Querying ${ count } IDs...`).pipe( - // Effect.andThen(Effect.sleep("500 millis")), + Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), Effect.flatMap(Schema.decodeUnknown(Result)), Effect.scoped, ), + // query: () => Console.log(`Creating ${ count } IDs...`).pipe( + // Effect.andThen(Effect.sleep("500 millis")), + // Effect.andThen(pipe( + // Array.range(1, count), + // Array.map(() => makeUuid4), + // Effect.all, + // )), + // Effect.flatMap(Schema.decode(Result)), + // Effect.provide(GetRandomValues.CryptoRandom), + // ), key: ["uuid4", count], }) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 8ad003f..1aa807d 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -21,14 +21,20 @@ export const QueryExtension = ReffuseExtension.make(() => ({ this: ReffuseHelpers.ReffuseHelpers, props: UseQueryProps, ): UseQueryResult { + const runSync = this.useRunSync() + const runner = this.useMemo(() => QueryRunner.make({ query: props.query() }), []) - this.useEffect(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( - Effect.andThen(Ref.set(runner.queryRef, props.query())), - Effect.andThen(runner.forkFetch), - ), [runner, ...props.key]) + React.useEffect(() => { + Ref.set(runner.queryRef, props.query()).pipe( + Effect.andThen(runner.forkFetch), + runSync, + ) + + return () => { runSync(runner.forkInterrupt) } + }, [runner, ...props.key]) this.useFork(() => runner.refreshOnWindowFocus, [runner]) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 2a75a70..e5857bf 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -31,17 +31,28 @@ export const make = ( const interrupt = fiberRef.pipe( Effect.flatMap(Option.match({ - onSome: Fiber.interrupt, + onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( + Effect.andThen(Fiber.interrupt(fiber)) + ), onNone: () => Effect.void, })) ) - const forkInterrupt = Effect.forkDaemon(interrupt) + const forkInterrupt = fiberRef.pipe( + Effect.flatMap(Option.match({ + onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( + Effect.andThen(Fiber.interrupt(fiber).pipe( + Effect.asVoid, + Effect.forkDaemon, + )) + ), + onNone: () => Effect.forkDaemon(Effect.void), + })) + ) const forkFetch = interrupt.pipe( Effect.andThen( - Effect.addFinalizer(() => Ref.set(fiberRef, Option.none())).pipe( - Effect.andThen(Ref.set(stateRef, AsyncData.loading())), + Ref.set(stateRef, AsyncData.loading()).pipe( Effect.andThen(queryRef.pipe(Effect.flatMap(identity))), Effect.matchCauseEffect({ onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), @@ -49,14 +60,14 @@ export const make = ( }), Effect.provide(context), - Effect.scoped, Effect.fork, ) ), Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber)).pipe( - Effect.andThen(Fiber.join(fiber)) + Effect.andThen(Fiber.join(fiber)), + Effect.andThen(Ref.set(fiberRef, Option.none())), ) ), @@ -65,14 +76,13 @@ export const make = ( const forkRefresh = interrupt.pipe( Effect.andThen( - Effect.addFinalizer(() => Ref.set(fiberRef, Option.none())).pipe( - Effect.andThen(Ref.update(stateRef, previous => { - if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) - return AsyncData.refreshing(previous) - if (AsyncData.isRefreshing(previous)) - return AsyncData.refreshing(previous.previous) - return AsyncData.loading() - })), + Ref.update(stateRef, previous => { + if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) + return AsyncData.refreshing(previous) + if (AsyncData.isRefreshing(previous)) + return AsyncData.refreshing(previous.previous) + return AsyncData.loading() + }).pipe( Effect.andThen(queryRef.pipe(Effect.flatMap(identity))), Effect.matchCauseEffect({ onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), @@ -80,14 +90,14 @@ export const make = ( }), Effect.provide(context), - Effect.scoped, Effect.fork, ) ), Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber)).pipe( - Effect.andThen(Fiber.join(fiber)) + Effect.andThen(Fiber.join(fiber)), + Effect.andThen(Ref.set(fiberRef, Option.none())), ) ), -- 2.49.1 From 3bc0cc6586ddeff55377ec4a01389ca46d6e4102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 6 Mar 2025 03:31:21 +0100 Subject: [PATCH 085/326] Cleanup --- packages/example/src/routes/query.tsx | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index 79b51a9..b63f0db 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -28,16 +28,6 @@ function RouteComponent() { Effect.flatMap(Schema.decodeUnknown(Result)), Effect.scoped, ), - // query: () => Console.log(`Creating ${ count } IDs...`).pipe( - // Effect.andThen(Effect.sleep("500 millis")), - // Effect.andThen(pipe( - // Array.range(1, count), - // Array.map(() => makeUuid4), - // Effect.all, - // )), - // Effect.flatMap(Schema.decode(Result)), - // Effect.provide(GetRandomValues.CryptoRandom), - // ), key: ["uuid4", count], }) -- 2.49.1 From 7bebc39a87f6d4dd1e4174fe7deaf42e48faeab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 6 Mar 2025 17:22:27 +0100 Subject: [PATCH 086/326] Fix --- packages/extension-query/src/QueryExtension.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 1aa807d..9675327 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,5 +1,5 @@ import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, Ref, SubscriptionRef } from "effect" +import { Effect, ExecutionStrategy, Fiber, Ref, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" @@ -27,14 +27,10 @@ export const QueryExtension = ReffuseExtension.make(() => ({ query: props.query() }), []) - React.useEffect(() => { - Ref.set(runner.queryRef, props.query()).pipe( - Effect.andThen(runner.forkFetch), - runSync, - ) - - return () => { runSync(runner.forkInterrupt) } - }, [runner, ...props.key]) + this.useEffect(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( + Effect.andThen(Ref.set(runner.queryRef, props.query())), + Effect.andThen(runner.forkFetch), + ), [runner, ...props.key], { finalizerExecutionStrategy: ExecutionStrategy.parallel }) this.useFork(() => runner.refreshOnWindowFocus, [runner]) -- 2.49.1 From 11fd4941c0d589a07789757fdecba1fb6b8f9fc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 6 Mar 2025 17:26:08 +0100 Subject: [PATCH 087/326] Fix --- packages/extension-query/src/QueryExtension.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 9675327..526077a 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -21,8 +21,6 @@ export const QueryExtension = ReffuseExtension.make(() => ({ this: ReffuseHelpers.ReffuseHelpers, props: UseQueryProps, ): UseQueryResult { - const runSync = this.useRunSync() - const runner = this.useMemo(() => QueryRunner.make({ query: props.query() }), []) -- 2.49.1 From fad61afce7e51d72efff1650297c204a5efdcc5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 6 Mar 2025 17:32:30 +0100 Subject: [PATCH 088/326] Fix --- packages/extension-query/src/QueryRunner.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index e5857bf..f17d226 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -53,7 +53,8 @@ export const make = ( const forkFetch = interrupt.pipe( Effect.andThen( Ref.set(stateRef, AsyncData.loading()).pipe( - Effect.andThen(queryRef.pipe(Effect.flatMap(identity))), + Effect.andThen(queryRef), + Effect.flatMap(identity), Effect.matchCauseEffect({ onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), @@ -83,7 +84,8 @@ export const make = ( return AsyncData.refreshing(previous.previous) return AsyncData.loading() }).pipe( - Effect.andThen(queryRef.pipe(Effect.flatMap(identity))), + Effect.andThen(queryRef), + Effect.flatMap(identity), Effect.matchCauseEffect({ onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), -- 2.49.1 From d239a11cdcb7c10d4e3634eb8d3878da25985c1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 6 Mar 2025 20:00:40 +0100 Subject: [PATCH 089/326] Service query --- .../example/src/query/services/Uuid4Query.ts | 2 +- packages/example/src/routeTree.gen.ts | 83 ++++++++----------- packages/example/src/routes/__root.tsx | 2 +- packages/example/src/routes/query/service.tsx | 27 ++++-- .../routes/{query.tsx => query/usequery.tsx} | 4 +- .../extension-query/src/QueryExtension.ts | 13 ++- 6 files changed, 72 insertions(+), 59 deletions(-) rename packages/example/src/routes/{query.tsx => query/usequery.tsx} (97%) diff --git a/packages/example/src/query/services/Uuid4Query.ts b/packages/example/src/query/services/Uuid4Query.ts index ab9d4cf..08905a2 100644 --- a/packages/example/src/query/services/Uuid4Query.ts +++ b/packages/example/src/query/services/Uuid4Query.ts @@ -3,7 +3,7 @@ import { QueryService } from "@reffuse/extension-query" import { Console, Effect, ParseResult, Schema } from "effect" -export const Result = Schema.Tuple(Schema.String) +export const Result = Schema.Array(Schema.String) export class Uuid4Query extends QueryService.Tag("Uuid4Query") rootRoute, } as any) -const QueryRoute = QueryImport.update({ - id: '/query', - path: '/query', - getParentRoute: () => rootRoute, -} as any) - const PromiseRoute = PromiseImport.update({ id: '/promise', path: '/promise', @@ -71,10 +65,16 @@ const IndexRoute = IndexImport.update({ getParentRoute: () => rootRoute, } as any) +const QueryUsequeryRoute = QueryUsequeryImport.update({ + id: '/query/usequery', + path: '/query/usequery', + getParentRoute: () => rootRoute, +} as any) + const QueryServiceRoute = QueryServiceImport.update({ - id: '/service', - path: '/service', - getParentRoute: () => QueryRoute, + id: '/query/service', + path: '/query/service', + getParentRoute: () => rootRoute, } as any) // Populate the FileRoutesByPath interface @@ -116,13 +116,6 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof PromiseImport parentRoute: typeof rootRoute } - '/query': { - id: '/query' - path: '/query' - fullPath: '/query' - preLoaderRoute: typeof QueryImport - parentRoute: typeof rootRoute - } '/tests': { id: '/tests' path: '/tests' @@ -139,36 +132,33 @@ declare module '@tanstack/react-router' { } '/query/service': { id: '/query/service' - path: '/service' + path: '/query/service' fullPath: '/query/service' preLoaderRoute: typeof QueryServiceImport - parentRoute: typeof QueryImport + parentRoute: typeof rootRoute + } + '/query/usequery': { + id: '/query/usequery' + path: '/query/usequery' + fullPath: '/query/usequery' + preLoaderRoute: typeof QueryUsequeryImport + parentRoute: typeof rootRoute } } } // Create and export the route tree -interface QueryRouteChildren { - QueryServiceRoute: typeof QueryServiceRoute -} - -const QueryRouteChildren: QueryRouteChildren = { - QueryServiceRoute: QueryServiceRoute, -} - -const QueryRouteWithChildren = QueryRoute._addFileChildren(QueryRouteChildren) - export interface FileRoutesByFullPath { '/': typeof IndexRoute '/blank': typeof BlankRoute '/count': typeof CountRoute '/lazyref': typeof LazyrefRoute '/promise': typeof PromiseRoute - '/query': typeof QueryRouteWithChildren '/tests': typeof TestsRoute '/time': typeof TimeRoute '/query/service': typeof QueryServiceRoute + '/query/usequery': typeof QueryUsequeryRoute } export interface FileRoutesByTo { @@ -177,10 +167,10 @@ export interface FileRoutesByTo { '/count': typeof CountRoute '/lazyref': typeof LazyrefRoute '/promise': typeof PromiseRoute - '/query': typeof QueryRouteWithChildren '/tests': typeof TestsRoute '/time': typeof TimeRoute '/query/service': typeof QueryServiceRoute + '/query/usequery': typeof QueryUsequeryRoute } export interface FileRoutesById { @@ -190,10 +180,10 @@ export interface FileRoutesById { '/count': typeof CountRoute '/lazyref': typeof LazyrefRoute '/promise': typeof PromiseRoute - '/query': typeof QueryRouteWithChildren '/tests': typeof TestsRoute '/time': typeof TimeRoute '/query/service': typeof QueryServiceRoute + '/query/usequery': typeof QueryUsequeryRoute } export interface FileRouteTypes { @@ -204,10 +194,10 @@ export interface FileRouteTypes { | '/count' | '/lazyref' | '/promise' - | '/query' | '/tests' | '/time' | '/query/service' + | '/query/usequery' fileRoutesByTo: FileRoutesByTo to: | '/' @@ -215,10 +205,10 @@ export interface FileRouteTypes { | '/count' | '/lazyref' | '/promise' - | '/query' | '/tests' | '/time' | '/query/service' + | '/query/usequery' id: | '__root__' | '/' @@ -226,10 +216,10 @@ export interface FileRouteTypes { | '/count' | '/lazyref' | '/promise' - | '/query' | '/tests' | '/time' | '/query/service' + | '/query/usequery' fileRoutesById: FileRoutesById } @@ -239,9 +229,10 @@ export interface RootRouteChildren { CountRoute: typeof CountRoute LazyrefRoute: typeof LazyrefRoute PromiseRoute: typeof PromiseRoute - QueryRoute: typeof QueryRouteWithChildren TestsRoute: typeof TestsRoute TimeRoute: typeof TimeRoute + QueryServiceRoute: typeof QueryServiceRoute + QueryUsequeryRoute: typeof QueryUsequeryRoute } const rootRouteChildren: RootRouteChildren = { @@ -250,9 +241,10 @@ const rootRouteChildren: RootRouteChildren = { CountRoute: CountRoute, LazyrefRoute: LazyrefRoute, PromiseRoute: PromiseRoute, - QueryRoute: QueryRouteWithChildren, TestsRoute: TestsRoute, TimeRoute: TimeRoute, + QueryServiceRoute: QueryServiceRoute, + QueryUsequeryRoute: QueryUsequeryRoute, } export const routeTree = rootRoute @@ -270,9 +262,10 @@ export const routeTree = rootRoute "/count", "/lazyref", "/promise", - "/query", "/tests", - "/time" + "/time", + "/query/service", + "/query/usequery" ] }, "/": { @@ -290,12 +283,6 @@ export const routeTree = rootRoute "/promise": { "filePath": "promise.tsx" }, - "/query": { - "filePath": "query.tsx", - "children": [ - "/query/service" - ] - }, "/tests": { "filePath": "tests.tsx" }, @@ -303,8 +290,10 @@ export const routeTree = rootRoute "filePath": "time.tsx" }, "/query/service": { - "filePath": "query/service.tsx", - "parent": "/query" + "filePath": "query/service.tsx" + }, + "/query/usequery": { + "filePath": "query/usequery.tsx" } } } diff --git a/packages/example/src/routes/__root.tsx b/packages/example/src/routes/__root.tsx index a02f201..3253372 100644 --- a/packages/example/src/routes/__root.tsx +++ b/packages/example/src/routes/__root.tsx @@ -20,7 +20,7 @@ function Root() { Count Tests Promise - Query + Query Blank diff --git a/packages/example/src/routes/query/service.tsx b/packages/example/src/routes/query/service.tsx index 638dbe3..38a6b38 100644 --- a/packages/example/src/routes/query/service.tsx +++ b/packages/example/src/routes/query/service.tsx @@ -2,8 +2,9 @@ import { QueryContext } from "@/query/reffuse" import { Uuid4Query } from "@/query/services" import { Uuid4QueryService } from "@/query/views/Uuid4QueryService" import { R } from "@/reffuse" +import { HttpClient } from "@effect/platform" import { createFileRoute } from "@tanstack/react-router" -import { Layer } from "effect" +import { Console, Effect, Schema } from "effect" import { useMemo } from "react" @@ -12,12 +13,26 @@ export const Route = createFileRoute("/query/service")({ }) function RouteComponent() { - const context = R.useLayer() + // const context = R.useLayer() - const layer = useMemo(() => Layer.empty.pipe( - Layer.provideMerge(Uuid4Query.Uuid4QueryLive), - Layer.provide(context), - ), [context]) + // const layer = useMemo(() => Layer.empty.pipe( + // Layer.provideMerge(Uuid4Query.Uuid4QueryLive), + // Layer.provide(context), + // ), [context]) + + const query = R.useQuery({ + key: ["uuid4", 10], + query: () => Console.log(`Querying 10 IDs...`).pipe( + Effect.andThen(Effect.sleep("500 millis")), + Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/10`)), + HttpClient.withTracerPropagation(false), + Effect.flatMap(res => res.json), + Effect.flatMap(Schema.decodeUnknown(Uuid4Query.Result)), + Effect.scoped, + ), + }) + + const layer = useMemo(() => query.layer(Uuid4Query.Uuid4Query), [query]) return ( diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query/usequery.tsx similarity index 97% rename from packages/example/src/routes/query.tsx rename to packages/example/src/routes/query/usequery.tsx index b63f0db..f2c58c8 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query/usequery.tsx @@ -7,7 +7,7 @@ import { Array, Console, Effect, flow, Option, Schema } from "effect" import { useState } from "react" -export const Route = createFileRoute("/query")({ +export const Route = createFileRoute("/query/usequery")({ component: RouteComponent }) @@ -20,6 +20,7 @@ function RouteComponent() { const [count, setCount] = useState(1) const query = R.useQuery({ + key: ["uuid4", count], query: () => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), @@ -28,7 +29,6 @@ function RouteComponent() { Effect.flatMap(Schema.decodeUnknown(Result)), Effect.scoped, ), - key: ["uuid4", count], }) const [state] = R.useRefState(query.state) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 526077a..443d95c 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,18 +1,22 @@ import * as AsyncData from "@typed/async-data" -import { Effect, ExecutionStrategy, Fiber, Ref, SubscriptionRef } from "effect" +import { Context, Effect, ExecutionStrategy, Fiber, Layer, Ref, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" +import * as QueryService from "./QueryService.js" export interface UseQueryProps { - readonly query: () => Effect.Effect readonly key: React.DependencyList + readonly query: () => Effect.Effect } export interface UseQueryResult { readonly state: SubscriptionRef.SubscriptionRef> readonly refresh: Effect.Effect> + readonly layer: ( + tag: Context.TagClass> + ) => Layer.Layer } @@ -35,6 +39,11 @@ export const QueryExtension = ReffuseExtension.make(() => ({ return React.useMemo(() => ({ state: runner.stateRef, refresh: runner.forkRefresh, + + layer: tag => Layer.succeed(tag, { + state: runner.stateRef, + refresh: runner.forkRefresh, + }), }), [runner]) } })) -- 2.49.1 From cabceaffcd7374b30510b99f091986de7449b004 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 7 Mar 2025 04:26:39 +0100 Subject: [PATCH 090/326] Key work --- .../extension-query/src/QueryExtension.ts | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 443d95c..fe7dd1e 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,5 +1,5 @@ import * as AsyncData from "@typed/async-data" -import { Context, Effect, ExecutionStrategy, Fiber, Layer, Ref, SubscriptionRef } from "effect" +import { Array, Context, Effect, ExecutionStrategy, Fiber, Layer, Ref, Schema, Stream, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" @@ -7,8 +7,9 @@ import * as QueryService from "./QueryService.js" export interface UseQueryProps { - readonly key: React.DependencyList + readonly key: Stream.Stream | readonly unknown[] readonly query: () => Effect.Effect + readonly refreshOnWindowFocus?: boolean } export interface UseQueryResult { @@ -29,12 +30,26 @@ export const QueryExtension = ReffuseExtension.make(() => ({ query: props.query() }), []) - this.useEffect(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( - Effect.andThen(Ref.set(runner.queryRef, props.query())), - Effect.andThen(runner.forkFetch), - ), [runner, ...props.key], { finalizerExecutionStrategy: ExecutionStrategy.parallel }) + const key = React.useMemo(() => + (Array.isArray as (self: unknown) => self is readonly unknown[])(props.key) + ? props.key + : props.key, + [props.key]) - this.useFork(() => runner.refreshOnWindowFocus, [runner]) + this.useEffect( + () => Effect.addFinalizer(() => runner.forkInterrupt).pipe( + Effect.andThen(Ref.set(runner.queryRef, props.query())), + Effect.andThen(runner.forkFetch), + ), + + [runner, ...(Array.isArray(props.key) ? props.key : [])], + { finalizerExecutionStrategy: ExecutionStrategy.parallel }, + ) + + this.useFork(() => (props.refreshOnWindowFocus ?? true) + ? runner.refreshOnWindowFocus + : Effect.void, + [props.refreshOnWindowFocus, runner]) return React.useMemo(() => ({ state: runner.stateRef, -- 2.49.1 From 7935293bc3f81f74982e2d8f491b3ebd611792c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 7 Mar 2025 22:23:44 +0100 Subject: [PATCH 091/326] Query work --- .../example/src/query/services/Uuid4Query.ts | 15 +------- packages/example/src/routes/query/service.tsx | 2 +- .../example/src/routes/query/usequery.tsx | 2 +- packages/example/src/routes/tests.tsx | 21 +++++++++-- .../extension-query/src/QueryExtension.ts | 37 ++++++++----------- packages/extension-query/src/QueryRunner.ts | 13 ++++--- packages/extension-query/src/QueryService.ts | 33 ++++++++--------- packages/reffuse/src/ReffuseHelpers.ts | 15 +++++++- 8 files changed, 75 insertions(+), 63 deletions(-) diff --git a/packages/example/src/query/services/Uuid4Query.ts b/packages/example/src/query/services/Uuid4Query.ts index 08905a2..ffc2b36 100644 --- a/packages/example/src/query/services/Uuid4Query.ts +++ b/packages/example/src/query/services/Uuid4Query.ts @@ -1,6 +1,6 @@ -import { HttpClient, HttpClientError } from "@effect/platform" +import { HttpClientError } from "@effect/platform" import { QueryService } from "@reffuse/extension-query" -import { Console, Effect, ParseResult, Schema } from "effect" +import { ParseResult, Schema } from "effect" export const Result = Schema.Array(Schema.String) @@ -9,14 +9,3 @@ export class Uuid4Query extends QueryService.Tag("Uuid4Query")() {} - -export const Uuid4QueryLive = QueryService.layer(Uuid4Query, { - query: Console.log("Querying...").pipe( - Effect.andThen(Effect.sleep("500 millis")), - Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), - HttpClient.withTracerPropagation(false), - Effect.flatMap(res => res.json), - Effect.flatMap(Schema.decodeUnknown(Result)), - Effect.scoped, - ) -}) diff --git a/packages/example/src/routes/query/service.tsx b/packages/example/src/routes/query/service.tsx index 38a6b38..e151872 100644 --- a/packages/example/src/routes/query/service.tsx +++ b/packages/example/src/routes/query/service.tsx @@ -21,7 +21,7 @@ function RouteComponent() { // ), [context]) const query = R.useQuery({ - key: ["uuid4", 10], + key: R.useStreamFromValues(["uuid4", 10]), query: () => Console.log(`Querying 10 IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/10`)), diff --git a/packages/example/src/routes/query/usequery.tsx b/packages/example/src/routes/query/usequery.tsx index f2c58c8..7fe1a35 100644 --- a/packages/example/src/routes/query/usequery.tsx +++ b/packages/example/src/routes/query/usequery.tsx @@ -20,7 +20,7 @@ function RouteComponent() { const [count, setCount] = useState(1) const query = R.useQuery({ - key: ["uuid4", count], + key: R.useStreamFromValues(["uuid4", count]), query: () => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 93e791e..884b5f7 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -1,7 +1,9 @@ import { R } from "@/reffuse" -import { Button } from "@radix-ui/themes" +import { Button, Flex } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" -import { Console, Effect } from "effect" +import { GetRandomValues, makeUuid4 } from "@typed/id" +import { Console, Effect, Stream } from "effect" +import { useState } from "react" export const Route = createFileRoute("/tests")({ @@ -20,12 +22,25 @@ function RouteComponent() { Effect.delay("1 second"), ), []) + const [reactValue, setReactValue] = useState("initial") + const reactValueStream = R.useStreamFromValues([reactValue]) + R.useFork(() => Stream.runForEach(reactValueStream, Console.log), [reactValueStream]) + + const logValue = R.useCallbackSync(Effect.fn(function*(value: string) { yield* Effect.log(value) }), []) + const generateUuid = R.useCallbackSync(() => makeUuid4.pipe( + Effect.provide(GetRandomValues.CryptoRandom), + Effect.map(setReactValue), + ), []) + return ( - + + + + ) } diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index fe7dd1e..cdc0d7e 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,13 +1,13 @@ import * as AsyncData from "@typed/async-data" -import { Array, Context, Effect, ExecutionStrategy, Fiber, Layer, Ref, Schema, Stream, SubscriptionRef } from "effect" +import { Context, Effect, Fiber, Layer, Ref, Stream, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" import * as QueryService from "./QueryService.js" -export interface UseQueryProps { - readonly key: Stream.Stream | readonly unknown[] +export interface UseQueryProps { + readonly key: Stream.Stream readonly query: () => Effect.Effect readonly refreshOnWindowFocus?: boolean } @@ -22,29 +22,22 @@ export interface UseQueryResult { export const QueryExtension = ReffuseExtension.make(() => ({ - useQuery( + useQuery( this: ReffuseHelpers.ReffuseHelpers, - props: UseQueryProps, + props: UseQueryProps, ): UseQueryResult { const runner = this.useMemo(() => QueryRunner.make({ - query: props.query() - }), []) + key: props.key, + query: props.query(), + }), [props.key]) - const key = React.useMemo(() => - (Array.isArray as (self: unknown) => self is readonly unknown[])(props.key) - ? props.key - : props.key, - [props.key]) - - this.useEffect( - () => Effect.addFinalizer(() => runner.forkInterrupt).pipe( - Effect.andThen(Ref.set(runner.queryRef, props.query())), - Effect.andThen(runner.forkFetch), - ), - - [runner, ...(Array.isArray(props.key) ? props.key : [])], - { finalizerExecutionStrategy: ExecutionStrategy.parallel }, - ) + this.useFork(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( + Effect.andThen(Stream.runForEach(runner.key, () => + Ref.set(runner.queryRef, props.query()).pipe( + Effect.andThen(runner.forkFetch) + ) + )) + ), [runner]) this.useFork(() => (props.refreshOnWindowFocus ?? true) ? runner.refreshOnWindowFocus diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index f17d226..97e3d35 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -3,7 +3,8 @@ import * as AsyncData from "@typed/async-data" import { Effect, Fiber, identity, Option, Ref, Stream, SubscriptionRef } from "effect" -export interface QueryRunner { +export interface QueryRunner { + readonly key: Stream.Stream readonly queryRef: SubscriptionRef.SubscriptionRef> readonly stateRef: SubscriptionRef.SubscriptionRef> readonly fiberRef: SubscriptionRef.SubscriptionRef>> @@ -16,13 +17,14 @@ export interface QueryRunner { } -export interface MakeProps { +export interface MakeProps { + readonly key: Stream.Stream readonly query: Effect.Effect } -export const make = ( - props: MakeProps -): Effect.Effect, never, R> => Effect.gen(function*() { +export const make = ( + props: MakeProps +): Effect.Effect, never, R> => Effect.gen(function*() { const context = yield* Effect.context() const queryRef = yield* SubscriptionRef.make(props.query) @@ -112,6 +114,7 @@ export const make = ( ) return { + key: props.key, queryRef, stateRef, fiberRef, diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts index 6dc92d7..a9a1e24 100644 --- a/packages/extension-query/src/QueryService.ts +++ b/packages/extension-query/src/QueryService.ts @@ -1,6 +1,5 @@ import * as AsyncData from "@typed/async-data" -import { Context, Effect, Fiber, Layer, SubscriptionRef } from "effect" -import * as QueryRunner from "./QueryRunner.js" +import { Effect, Fiber, SubscriptionRef } from "effect" export interface QueryService { @@ -13,20 +12,20 @@ export const Tag = (id: Id) => < >() => Effect.Tag(id)>() -export interface LayerProps { - readonly query: Effect.Effect -} +// export interface LayerProps { +// readonly query: Effect.Effect +// } -export const layer = ( - tag: Context.TagClass>, - props: LayerProps, -): Layer.Layer => Layer.effect(tag, Effect.gen(function*() { - const runner = yield* QueryRunner.make({ - query: props.query - }) +// export const layer = ( +// tag: Context.TagClass>, +// props: LayerProps, +// ): Layer.Layer => Layer.effect(tag, Effect.gen(function*() { +// const runner = yield* QueryRunner.make({ +// query: props.query +// }) - return { - state: runner.stateRef, - refresh: runner.forkRefresh, - } -})) +// return { +// state: runner.stateRef, +// refresh: runner.forkRefresh, +// } +// })) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index bdb8858..4bb0216 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -1,4 +1,4 @@ -import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, Layer, Pipeable, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, Layer, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -407,6 +407,19 @@ export abstract class ReffuseHelpers { return [reactStateValue, setValue] } + + useStreamFromValues( + this: ReffuseHelpers, + values: A, + ): Stream.Stream { + const [queue, stream] = this.useMemo(() => Queue.unbounded().pipe( + Effect.map(queue => [queue, Stream.fromQueue(queue)] as const) + ), []) + + this.useEffect(() => Queue.offer(queue, values), values) + + return stream + } } -- 2.49.1 From 5ac3a932d9c287fe9141b992d0b3978b4b8661bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 7 Mar 2025 23:17:32 +0100 Subject: [PATCH 092/326] Query work --- packages/extension-query/src/QueryExtension.ts | 2 +- packages/extension-query/src/QueryRunner.ts | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index cdc0d7e..8b0c6dd 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -8,7 +8,7 @@ import * as QueryService from "./QueryService.js" export interface UseQueryProps { readonly key: Stream.Stream - readonly query: () => Effect.Effect + readonly query: (key: K) => Effect.Effect readonly refreshOnWindowFocus?: boolean } diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 97e3d35..6fb7da0 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -5,10 +5,12 @@ import { Effect, Fiber, identity, Option, Ref, Stream, SubscriptionRef } from "e export interface QueryRunner { readonly key: Stream.Stream - readonly queryRef: SubscriptionRef.SubscriptionRef> + readonly query: (key: K) => Effect.Effect + readonly stateRef: SubscriptionRef.SubscriptionRef> readonly fiberRef: SubscriptionRef.SubscriptionRef>> + readonly interrupt: Effect.Effect readonly forkInterrupt: Effect.Effect> readonly forkFetch: Effect.Effect> readonly forkRefresh: Effect.Effect> @@ -19,7 +21,7 @@ export interface QueryRunner { export interface MakeProps { readonly key: Stream.Stream - readonly query: Effect.Effect + readonly query: (key: K) => Effect.Effect } export const make = ( @@ -27,7 +29,6 @@ export const make = ( ): Effect.Effect, never, R> => Effect.gen(function*() { const context = yield* Effect.context() - const queryRef = yield* SubscriptionRef.make(props.query) const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) const fiberRef = yield* SubscriptionRef.make(Option.none>()) @@ -86,8 +87,8 @@ export const make = ( return AsyncData.refreshing(previous.previous) return AsyncData.loading() }).pipe( - Effect.andThen(queryRef), - Effect.flatMap(identity), + + Effect.andThen(props.query()), Effect.matchCauseEffect({ onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), @@ -115,7 +116,8 @@ export const make = ( return { key: props.key, - queryRef, + query: props.query, + stateRef, fiberRef, -- 2.49.1 From da2a32001cc6230a8a944f1995859b0d18bc7ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 8 Mar 2025 01:56:50 +0100 Subject: [PATCH 093/326] Query work --- packages/extension-query/src/QueryRunner.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 6fb7da0..106f7e4 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -25,10 +25,11 @@ export interface MakeProps { } export const make = ( - props: MakeProps + { key, query }: MakeProps ): Effect.Effect, never, R> => Effect.gen(function*() { const context = yield* Effect.context() + const currentKeyRef = yield* SubscriptionRef.make(Option.none()) const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) const fiberRef = yield* SubscriptionRef.make(Option.none>()) -- 2.49.1 From c689778cea295dea48cf95ec99406b8668b4bbef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 9 Mar 2025 18:08:52 +0100 Subject: [PATCH 094/326] Working query --- .../example/src/routes/query/usequery.tsx | 2 +- .../extension-query/src/QueryExtension.ts | 22 ++++---- packages/extension-query/src/QueryRunner.ts | 55 ++++++++++++------- packages/extension-query/src/QueryService.ts | 4 +- 4 files changed, 49 insertions(+), 34 deletions(-) diff --git a/packages/example/src/routes/query/usequery.tsx b/packages/example/src/routes/query/usequery.tsx index 7fe1a35..1f76770 100644 --- a/packages/example/src/routes/query/usequery.tsx +++ b/packages/example/src/routes/query/usequery.tsx @@ -21,7 +21,7 @@ function RouteComponent() { const query = R.useQuery({ key: R.useStreamFromValues(["uuid4", count]), - query: () => Console.log(`Querying ${ count } IDs...`).pipe( + query: ([, count]) => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), HttpClient.withTracerPropagation(false), diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 8b0c6dd..0d0cccd 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,5 +1,5 @@ import * as AsyncData from "@typed/async-data" -import { Context, Effect, Fiber, Layer, Ref, Stream, SubscriptionRef } from "effect" +import { type Cause, Context, Effect, Fiber, Layer, Stream, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" @@ -14,7 +14,7 @@ export interface UseQueryProps { export interface UseQueryResult { readonly state: SubscriptionRef.SubscriptionRef> - readonly refresh: Effect.Effect> + readonly refresh: Effect.Effect> readonly layer: ( tag: Context.TagClass> ) => Layer.Layer @@ -28,16 +28,18 @@ export const QueryExtension = ReffuseExtension.make(() => ({ ): UseQueryResult { const runner = this.useMemo(() => QueryRunner.make({ key: props.key, - query: props.query(), + query: props.query, }), [props.key]) - this.useFork(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( - Effect.andThen(Stream.runForEach(runner.key, () => - Ref.set(runner.queryRef, props.query()).pipe( - Effect.andThen(runner.forkFetch) - ) - )) - ), [runner]) + // this.useFork(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( + // Effect.andThen(Stream.runForEach(runner.key, () => + // Ref.set(runner.queryRef, props.query()).pipe( + // Effect.andThen(runner.forkFetch) + // ) + // )) + // ), [runner]) + + this.useFork(() => runner.fetchOnKeyChange, [runner]) this.useFork(() => (props.refreshOnWindowFocus ?? true) ? runner.refreshOnWindowFocus diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 106f7e4..2a517a4 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -1,6 +1,6 @@ import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, identity, Option, Ref, Stream, SubscriptionRef } from "effect" +import { type Cause, Effect, Fiber, identity, Option, Ref, Scope, Stream, SubscriptionRef } from "effect" export interface QueryRunner { @@ -8,13 +8,13 @@ export interface QueryRunner { readonly query: (key: K) => Effect.Effect readonly stateRef: SubscriptionRef.SubscriptionRef> - readonly fiberRef: SubscriptionRef.SubscriptionRef>> + readonly fiberRef: SubscriptionRef.SubscriptionRef>> - readonly interrupt: Effect.Effect - readonly forkInterrupt: Effect.Effect> - readonly forkFetch: Effect.Effect> - readonly forkRefresh: Effect.Effect> + readonly forkInterrupt: Effect.Effect> + readonly forkFetch: Effect.Effect> + readonly forkRefresh: Effect.Effect> + readonly fetchOnKeyChange: Effect.Effect readonly refreshOnWindowFocus: Effect.Effect } @@ -29,9 +29,9 @@ export const make = ( ): Effect.Effect, never, R> => Effect.gen(function*() { const context = yield* Effect.context() - const currentKeyRef = yield* SubscriptionRef.make(Option.none()) + const latestKeyRef = yield* SubscriptionRef.make(Option.none()) const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) - const fiberRef = yield* SubscriptionRef.make(Option.none>()) + const fiberRef = yield* SubscriptionRef.make(Option.none>()) const interrupt = fiberRef.pipe( Effect.flatMap(Option.match({ @@ -57,12 +57,14 @@ export const make = ( const forkFetch = interrupt.pipe( Effect.andThen( Ref.set(stateRef, AsyncData.loading()).pipe( - Effect.andThen(queryRef), + Effect.andThen(latestKeyRef), Effect.flatMap(identity), - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }), + Effect.flatMap(key => query(key).pipe( + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }) + )), Effect.provide(context), Effect.fork, @@ -88,12 +90,14 @@ export const make = ( return AsyncData.refreshing(previous.previous) return AsyncData.loading() }).pipe( - - Effect.andThen(props.query()), - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }), + Effect.andThen(latestKeyRef), + Effect.flatMap(identity), + Effect.flatMap(key => query(key).pipe( + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }) + )), Effect.provide(context), Effect.fork, @@ -110,14 +114,22 @@ export const make = ( Effect.forkDaemon, ) + const fetchOnKeyChange = Effect.addFinalizer(() => interrupt).pipe( + Effect.andThen(Stream.runForEach(key, latestKey => + Ref.set(latestKeyRef, Option.some(latestKey)).pipe( + Effect.andThen(forkFetch) + ) + )) + ) + const refreshOnWindowFocus = Stream.runForEach( BrowserStream.fromEventListenerWindow("focus"), () => forkRefresh, ) return { - key: props.key, - query: props.query, + key, + query, stateRef, fiberRef, @@ -126,6 +138,7 @@ export const make = ( forkFetch, forkRefresh, + fetchOnKeyChange, refreshOnWindowFocus, } }) diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts index a9a1e24..e872672 100644 --- a/packages/extension-query/src/QueryService.ts +++ b/packages/extension-query/src/QueryService.ts @@ -1,10 +1,10 @@ import * as AsyncData from "@typed/async-data" -import { Effect, Fiber, SubscriptionRef } from "effect" +import { type Cause, Effect, Fiber, SubscriptionRef } from "effect" export interface QueryService { readonly state: SubscriptionRef.SubscriptionRef> - readonly refresh: Effect.Effect> + readonly refresh: Effect.Effect> } export const Tag = (id: Id) => < -- 2.49.1 From 1ed73dc3ac9c1fdb59190ab4cd660517258a1d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 9 Mar 2025 18:21:35 +0100 Subject: [PATCH 095/326] Cleanup --- packages/example/src/routes/query/service.tsx | 4 ++-- packages/extension-query/src/QueryExtension.ts | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/example/src/routes/query/service.tsx b/packages/example/src/routes/query/service.tsx index e151872..5ce597a 100644 --- a/packages/example/src/routes/query/service.tsx +++ b/packages/example/src/routes/query/service.tsx @@ -22,9 +22,9 @@ function RouteComponent() { const query = R.useQuery({ key: R.useStreamFromValues(["uuid4", 10]), - query: () => Console.log(`Querying 10 IDs...`).pipe( + query: ([, count]) => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), - Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/10`)), + Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), Effect.flatMap(Schema.decodeUnknown(Uuid4Query.Result)), diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 0d0cccd..e1f16f0 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -31,14 +31,6 @@ export const QueryExtension = ReffuseExtension.make(() => ({ query: props.query, }), [props.key]) - // this.useFork(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( - // Effect.andThen(Stream.runForEach(runner.key, () => - // Ref.set(runner.queryRef, props.query()).pipe( - // Effect.andThen(runner.forkFetch) - // ) - // )) - // ), [runner]) - this.useFork(() => runner.fetchOnKeyChange, [runner]) this.useFork(() => (props.refreshOnWindowFocus ?? true) -- 2.49.1 From 1fd2a9ffbe037e0e652331b8c43db5bca000558d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 9 Mar 2025 18:35:48 +0100 Subject: [PATCH 096/326] Cleanup --- packages/extension-query/src/QueryExtension.ts | 6 +++--- packages/extension-query/src/QueryRunner.ts | 2 +- packages/extension-query/src/QueryService.ts | 4 ++-- packages/reffuse/src/ReffuseHelpers.ts | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index e1f16f0..49967b2 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,9 +1,9 @@ -import * as AsyncData from "@typed/async-data" -import { type Cause, Context, Effect, Fiber, Layer, Stream, SubscriptionRef } from "effect" +import type * as AsyncData from "@typed/async-data" +import { type Cause, type Context, Effect, type Fiber, Layer, type Stream, type SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" -import * as QueryService from "./QueryService.js" +import type * as QueryService from "./QueryService.js" export interface UseQueryProps { diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 2a517a4..812edbd 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -1,6 +1,6 @@ import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" -import { type Cause, Effect, Fiber, identity, Option, Ref, Scope, Stream, SubscriptionRef } from "effect" +import { type Cause, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" export interface QueryRunner { diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts index e872672..fd047bc 100644 --- a/packages/extension-query/src/QueryService.ts +++ b/packages/extension-query/src/QueryService.ts @@ -1,5 +1,5 @@ -import * as AsyncData from "@typed/async-data" -import { type Cause, Effect, Fiber, SubscriptionRef } from "effect" +import type * as AsyncData from "@typed/async-data" +import { type Cause, Effect, type Fiber, type SubscriptionRef } from "effect" export interface QueryService { diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 4bb0216..2f4f449 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -1,4 +1,4 @@ -import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, Layer, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" -- 2.49.1 From 7021e604ed0f391ff605193f9e5e48082750811c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 9 Mar 2025 19:14:20 +0100 Subject: [PATCH 097/326] Cleanup --- packages/example/src/routes/query/service.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/example/src/routes/query/service.tsx b/packages/example/src/routes/query/service.tsx index 5ce597a..71b97a5 100644 --- a/packages/example/src/routes/query/service.tsx +++ b/packages/example/src/routes/query/service.tsx @@ -13,13 +13,6 @@ export const Route = createFileRoute("/query/service")({ }) function RouteComponent() { - // const context = R.useLayer() - - // const layer = useMemo(() => Layer.empty.pipe( - // Layer.provideMerge(Uuid4Query.Uuid4QueryLive), - // Layer.provide(context), - // ), [context]) - const query = R.useQuery({ key: R.useStreamFromValues(["uuid4", 10]), query: ([, count]) => Console.log(`Querying ${ count } IDs...`).pipe( -- 2.49.1 From be8098fb7d7f8b20e6caacfd7bfa6038f7000871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 10 Mar 2025 01:56:11 +0100 Subject: [PATCH 098/326] Query work --- packages/example/src/query/services/Uuid4Query.ts | 1 + packages/example/src/routes/query/service.tsx | 2 +- packages/extension-query/src/QueryExtension.ts | 10 +++++++--- packages/extension-query/src/QueryService.ts | 9 +++++---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/example/src/query/services/Uuid4Query.ts b/packages/example/src/query/services/Uuid4Query.ts index ffc2b36..a7336bd 100644 --- a/packages/example/src/query/services/Uuid4Query.ts +++ b/packages/example/src/query/services/Uuid4Query.ts @@ -6,6 +6,7 @@ import { ParseResult, Schema } from "effect" export const Result = Schema.Array(Schema.String) export class Uuid4Query extends QueryService.Tag("Uuid4Query")() {} diff --git a/packages/example/src/routes/query/service.tsx b/packages/example/src/routes/query/service.tsx index 71b97a5..6a926a8 100644 --- a/packages/example/src/routes/query/service.tsx +++ b/packages/example/src/routes/query/service.tsx @@ -14,7 +14,7 @@ export const Route = createFileRoute("/query/service")({ function RouteComponent() { const query = R.useQuery({ - key: R.useStreamFromValues(["uuid4", 10]), + key: R.useStreamFromValues(["uuid4", 10 as number]), query: ([, count]) => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 49967b2..acd5cf9 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -12,11 +12,13 @@ export interface UseQueryProps { readonly refreshOnWindowFocus?: boolean } -export interface UseQueryResult { +export interface UseQueryResult { + readonly keyStream: Stream.Stream readonly state: SubscriptionRef.SubscriptionRef> readonly refresh: Effect.Effect> + readonly layer: ( - tag: Context.TagClass> + tag: Context.TagClass> ) => Layer.Layer } @@ -25,7 +27,7 @@ export const QueryExtension = ReffuseExtension.make(() => ({ useQuery( this: ReffuseHelpers.ReffuseHelpers, props: UseQueryProps, - ): UseQueryResult { + ): UseQueryResult { const runner = this.useMemo(() => QueryRunner.make({ key: props.key, query: props.query, @@ -39,10 +41,12 @@ export const QueryExtension = ReffuseExtension.make(() => ({ [props.refreshOnWindowFocus, runner]) return React.useMemo(() => ({ + keyStream: props.key, state: runner.stateRef, refresh: runner.forkRefresh, layer: tag => Layer.succeed(tag, { + keyStream: props.key, state: runner.stateRef, refresh: runner.forkRefresh, }), diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts index fd047bc..8025cb6 100644 --- a/packages/extension-query/src/QueryService.ts +++ b/packages/extension-query/src/QueryService.ts @@ -1,15 +1,16 @@ import type * as AsyncData from "@typed/async-data" -import { type Cause, Effect, type Fiber, type SubscriptionRef } from "effect" +import { type Cause, Effect, type Fiber, type Stream, type SubscriptionRef } from "effect" -export interface QueryService { +export interface QueryService { + readonly keyStream: Stream.Stream readonly state: SubscriptionRef.SubscriptionRef> readonly refresh: Effect.Effect> } export const Tag = (id: Id) => < - Self, A, E = never, ->() => Effect.Tag(id)>() + Self, K extends readonly unknown[], A, E = never, +>() => Effect.Tag(id)>() // export interface LayerProps { -- 2.49.1 From 94a0864132fdccd5e9578bbf48a11d46656c7d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 10 Mar 2025 18:37:45 +0100 Subject: [PATCH 099/326] Query refactoring --- packages/extension-query/src/QueryExtension.ts | 8 ++++---- packages/extension-query/src/QueryRunner.ts | 4 ++-- packages/extension-query/src/QueryService.ts | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index acd5cf9..79c0a89 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,5 +1,5 @@ import type * as AsyncData from "@typed/async-data" -import { type Cause, type Context, Effect, type Fiber, Layer, type Stream, type SubscriptionRef } from "effect" +import { type Cause, type Context, Effect, type Fiber, Layer, type Option, type Stream, type SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" @@ -13,7 +13,7 @@ export interface UseQueryProps { } export interface UseQueryResult { - readonly keyStream: Stream.Stream + readonly latestKey: SubscriptionRef.SubscriptionRef> readonly state: SubscriptionRef.SubscriptionRef> readonly refresh: Effect.Effect> @@ -41,12 +41,12 @@ export const QueryExtension = ReffuseExtension.make(() => ({ [props.refreshOnWindowFocus, runner]) return React.useMemo(() => ({ - keyStream: props.key, + latestKey: runner.latestKeyRef, state: runner.stateRef, refresh: runner.forkRefresh, layer: tag => Layer.succeed(tag, { - keyStream: props.key, + latestKey: runner.latestKeyRef, state: runner.stateRef, refresh: runner.forkRefresh, }), diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 812edbd..a403672 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -4,9 +4,9 @@ import { type Cause, Effect, Fiber, identity, Option, Ref, type Scope, Stream, S export interface QueryRunner { - readonly key: Stream.Stream readonly query: (key: K) => Effect.Effect + readonly latestKeyRef: SubscriptionRef.SubscriptionRef> readonly stateRef: SubscriptionRef.SubscriptionRef> readonly fiberRef: SubscriptionRef.SubscriptionRef>> @@ -128,9 +128,9 @@ export const make = ( ) return { - key, query, + latestKeyRef, stateRef, fiberRef, diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts index 8025cb6..33fce17 100644 --- a/packages/extension-query/src/QueryService.ts +++ b/packages/extension-query/src/QueryService.ts @@ -1,9 +1,9 @@ import type * as AsyncData from "@typed/async-data" -import { type Cause, Effect, type Fiber, type Stream, type SubscriptionRef } from "effect" +import { type Cause, Effect, type Fiber, type Option, type SubscriptionRef } from "effect" export interface QueryService { - readonly keyStream: Stream.Stream + readonly latestKey: SubscriptionRef.SubscriptionRef> readonly state: SubscriptionRef.SubscriptionRef> readonly refresh: Effect.Effect> } -- 2.49.1 From 8772e25ff5cfe893f114369744bdf2c92cad8572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 10 Mar 2025 18:44:08 +0100 Subject: [PATCH 100/326] CI update --- .gitea/workflows/publish.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitea/workflows/publish.yaml b/.gitea/workflows/publish.yaml index 83a6528..b71d10c 100644 --- a/.gitea/workflows/publish.yaml +++ b/.gitea/workflows/publish.yaml @@ -31,3 +31,10 @@ jobs: access: public token: ${{ secrets.NPM_TOKEN }} registry: https://registry.npmjs.org + - name: Publish @reffuse/extension-query + uses: JS-DevTools/npm-publish@v3 + with: + package: packages/extension-query + access: public + token: ${{ secrets.NPM_TOKEN }} + registry: https://registry.npmjs.org -- 2.49.1 From f7dd4e51f57d90773a633514bc57fce56d13e1c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 11 Mar 2025 01:36:13 +0100 Subject: [PATCH 101/326] Doc update --- README.md | 1 + packages/extension-lazyref/README.md | 2 +- packages/extension-query/README.md | 9 +++++---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0b644b4..bff34c9 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,5 @@ Reffuse is a [Effect-TS](https://effect.website/) integration for React 19+ with This monorepo contains: - [The `reffuse` library](packages/reffuse) - [`@reffuse/extension-lazyref`, a LazyRef integration for Reffuse](packages/extension-lazyref) +- [`@reffuse/extension-query`, TanStack Query style hooks for Reffuse](packages/extension-query) - [An example project](packges/example) diff --git a/packages/extension-lazyref/README.md b/packages/extension-lazyref/README.md index 699855e..fcf0a16 100644 --- a/packages/extension-lazyref/README.md +++ b/packages/extension-lazyref/README.md @@ -4,6 +4,6 @@ Extension to integrate `@typed/lazy-ref` with Reffuse. ## Peer dependencies - `@typed/lazy-ref` -- `reffuse` 0.1.2+ +- `reffuse` 0.1.3+ - `effect` 3.13+ - `react` & `@types/react` 19+ diff --git a/packages/extension-query/README.md b/packages/extension-query/README.md index 699855e..e9fd209 100644 --- a/packages/extension-query/README.md +++ b/packages/extension-query/README.md @@ -1,9 +1,10 @@ -# LazyRef extension for Reffuse +# Reffuse Query -Extension to integrate `@typed/lazy-ref` with Reffuse. +TanStack Query style hooks for Reffuse. ## Peer dependencies -- `@typed/lazy-ref` -- `reffuse` 0.1.2+ +- `reffuse` 0.1.3+ - `effect` 3.13+ +- `@effect/platform` & `@effect/platform-browser` - `react` & `@types/react` 19+ +- `@typed/async-data` -- 2.49.1 From d6011f78970850824091b52a528e58746fe06ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 11 Mar 2025 02:17:50 +0100 Subject: [PATCH 102/326] MutationRunner --- .../extension-query/src/MutationRunner.ts | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 packages/extension-query/src/MutationRunner.ts diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts new file mode 100644 index 0000000..a845a8d --- /dev/null +++ b/packages/extension-query/src/MutationRunner.ts @@ -0,0 +1,144 @@ +import { BrowserStream } from "@effect/platform-browser" +import * as AsyncData from "@typed/async-data" +import { type Cause, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" + + +export interface MutationRunner { + readonly key: Stream.Stream + readonly mutation: (key: K) => Effect.Effect + + readonly latestKeyRef: SubscriptionRef.SubscriptionRef> + readonly stateRef: SubscriptionRef.SubscriptionRef> + readonly fiberRef: SubscriptionRef.SubscriptionRef>> + + readonly forkInterrupt: Effect.Effect> + readonly forkFetch: Effect.Effect> + readonly forkRefresh: Effect.Effect> + + readonly fetchOnKeyChange: Effect.Effect +} + + +export interface MakeProps { + readonly key: Stream.Stream + readonly mutation: (key: K) => Effect.Effect +} + +export const make = ( + { key, query }: MakeProps +): Effect.Effect, never, R> => Effect.gen(function*() { + const context = yield* Effect.context() + + const latestKeyRef = yield* SubscriptionRef.make(Option.none()) + const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) + const fiberRef = yield* SubscriptionRef.make(Option.none>()) + + const interrupt = fiberRef.pipe( + Effect.flatMap(Option.match({ + onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( + Effect.andThen(Fiber.interrupt(fiber)) + ), + onNone: () => Effect.void, + })) + ) + + const forkInterrupt = fiberRef.pipe( + Effect.flatMap(Option.match({ + onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( + Effect.andThen(Fiber.interrupt(fiber).pipe( + Effect.asVoid, + Effect.forkDaemon, + )) + ), + onNone: () => Effect.forkDaemon(Effect.void), + })) + ) + + const forkFetch = interrupt.pipe( + Effect.andThen( + Ref.set(stateRef, AsyncData.loading()).pipe( + Effect.andThen(latestKeyRef), + Effect.flatMap(identity), + Effect.flatMap(key => query(key).pipe( + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }) + )), + + Effect.provide(context), + Effect.fork, + ) + ), + + Effect.flatMap(fiber => + Ref.set(fiberRef, Option.some(fiber)).pipe( + Effect.andThen(Fiber.join(fiber)), + Effect.andThen(Ref.set(fiberRef, Option.none())), + ) + ), + + Effect.forkDaemon, + ) + + const forkRefresh = interrupt.pipe( + Effect.andThen( + Ref.update(stateRef, previous => { + if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) + return AsyncData.refreshing(previous) + if (AsyncData.isRefreshing(previous)) + return AsyncData.refreshing(previous.previous) + return AsyncData.loading() + }).pipe( + Effect.andThen(latestKeyRef), + Effect.flatMap(identity), + Effect.flatMap(key => query(key).pipe( + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }) + )), + + Effect.provide(context), + Effect.fork, + ) + ), + + Effect.flatMap(fiber => + Ref.set(fiberRef, Option.some(fiber)).pipe( + Effect.andThen(Fiber.join(fiber)), + Effect.andThen(Ref.set(fiberRef, Option.none())), + ) + ), + + Effect.forkDaemon, + ) + + const fetchOnKeyChange = Effect.addFinalizer(() => interrupt).pipe( + Effect.andThen(Stream.runForEach(key, latestKey => + Ref.set(latestKeyRef, Option.some(latestKey)).pipe( + Effect.andThen(forkFetch) + ) + )) + ) + + const refreshOnWindowFocus = Stream.runForEach( + BrowserStream.fromEventListenerWindow("focus"), + () => forkRefresh, + ) + + return { + query, + + latestKeyRef, + stateRef, + fiberRef, + + forkInterrupt, + forkFetch, + forkRefresh, + + fetchOnKeyChange, + refreshOnWindowFocus, + } +}) -- 2.49.1 From 825de84cef6bc27a83783aabc4f5614182260bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 11 Mar 2025 03:12:36 +0100 Subject: [PATCH 103/326] Cleanup --- .../extension-query/src/MutationRunner.ts | 230 +++++++++--------- 1 file changed, 110 insertions(+), 120 deletions(-) diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts index a845a8d..9eb1cb9 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/MutationRunner.ts @@ -1,144 +1,134 @@ -import { BrowserStream } from "@effect/platform-browser" -import * as AsyncData from "@typed/async-data" -import { type Cause, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" +// import { BrowserStream } from "@effect/platform-browser" +// import * as AsyncData from "@typed/async-data" +// import { type Cause, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" -export interface MutationRunner { - readonly key: Stream.Stream - readonly mutation: (key: K) => Effect.Effect +// export interface MutationRunner { +// readonly mutation: (...args: K) => Effect.Effect - readonly latestKeyRef: SubscriptionRef.SubscriptionRef> - readonly stateRef: SubscriptionRef.SubscriptionRef> - readonly fiberRef: SubscriptionRef.SubscriptionRef>> +// readonly stateRef: SubscriptionRef.SubscriptionRef> - readonly forkInterrupt: Effect.Effect> - readonly forkFetch: Effect.Effect> - readonly forkRefresh: Effect.Effect> - - readonly fetchOnKeyChange: Effect.Effect -} +// readonly forkMutate: Effect.Effect> +// } -export interface MakeProps { - readonly key: Stream.Stream - readonly mutation: (key: K) => Effect.Effect -} +// export interface MakeProps { +// readonly mutation: (...args: K) => Effect.Effect +// } -export const make = ( - { key, query }: MakeProps -): Effect.Effect, never, R> => Effect.gen(function*() { - const context = yield* Effect.context() +// export const make = ( +// { key, query }: MakeProps +// ): Effect.Effect, never, R> => Effect.gen(function*() { +// const context = yield* Effect.context() - const latestKeyRef = yield* SubscriptionRef.make(Option.none()) - const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) - const fiberRef = yield* SubscriptionRef.make(Option.none>()) +// const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) - const interrupt = fiberRef.pipe( - Effect.flatMap(Option.match({ - onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( - Effect.andThen(Fiber.interrupt(fiber)) - ), - onNone: () => Effect.void, - })) - ) +// const interrupt = fiberRef.pipe( +// Effect.flatMap(Option.match({ +// onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( +// Effect.andThen(Fiber.interrupt(fiber)) +// ), +// onNone: () => Effect.void, +// })) +// ) - const forkInterrupt = fiberRef.pipe( - Effect.flatMap(Option.match({ - onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( - Effect.andThen(Fiber.interrupt(fiber).pipe( - Effect.asVoid, - Effect.forkDaemon, - )) - ), - onNone: () => Effect.forkDaemon(Effect.void), - })) - ) +// const forkInterrupt = fiberRef.pipe( +// Effect.flatMap(Option.match({ +// onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( +// Effect.andThen(Fiber.interrupt(fiber).pipe( +// Effect.asVoid, +// Effect.forkDaemon, +// )) +// ), +// onNone: () => Effect.forkDaemon(Effect.void), +// })) +// ) - const forkFetch = interrupt.pipe( - Effect.andThen( - Ref.set(stateRef, AsyncData.loading()).pipe( - Effect.andThen(latestKeyRef), - Effect.flatMap(identity), - Effect.flatMap(key => query(key).pipe( - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }) - )), +// const forkFetch = interrupt.pipe( +// Effect.andThen( +// Ref.set(stateRef, AsyncData.loading()).pipe( +// Effect.andThen(latestKeyRef), +// Effect.flatMap(identity), +// Effect.flatMap(key => query(key).pipe( +// Effect.matchCauseEffect({ +// onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), +// onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), +// }) +// )), - Effect.provide(context), - Effect.fork, - ) - ), +// Effect.provide(context), +// Effect.fork, +// ) +// ), - Effect.flatMap(fiber => - Ref.set(fiberRef, Option.some(fiber)).pipe( - Effect.andThen(Fiber.join(fiber)), - Effect.andThen(Ref.set(fiberRef, Option.none())), - ) - ), +// Effect.flatMap(fiber => +// Ref.set(fiberRef, Option.some(fiber)).pipe( +// Effect.andThen(Fiber.join(fiber)), +// Effect.andThen(Ref.set(fiberRef, Option.none())), +// ) +// ), - Effect.forkDaemon, - ) +// Effect.forkDaemon, +// ) - const forkRefresh = interrupt.pipe( - Effect.andThen( - Ref.update(stateRef, previous => { - if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) - return AsyncData.refreshing(previous) - if (AsyncData.isRefreshing(previous)) - return AsyncData.refreshing(previous.previous) - return AsyncData.loading() - }).pipe( - Effect.andThen(latestKeyRef), - Effect.flatMap(identity), - Effect.flatMap(key => query(key).pipe( - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }) - )), +// const forkRefresh = interrupt.pipe( +// Effect.andThen( +// Ref.update(stateRef, previous => { +// if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) +// return AsyncData.refreshing(previous) +// if (AsyncData.isRefreshing(previous)) +// return AsyncData.refreshing(previous.previous) +// return AsyncData.loading() +// }).pipe( +// Effect.andThen(latestKeyRef), +// Effect.flatMap(identity), +// Effect.flatMap(key => query(key).pipe( +// Effect.matchCauseEffect({ +// onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), +// onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), +// }) +// )), - Effect.provide(context), - Effect.fork, - ) - ), +// Effect.provide(context), +// Effect.fork, +// ) +// ), - Effect.flatMap(fiber => - Ref.set(fiberRef, Option.some(fiber)).pipe( - Effect.andThen(Fiber.join(fiber)), - Effect.andThen(Ref.set(fiberRef, Option.none())), - ) - ), +// Effect.flatMap(fiber => +// Ref.set(fiberRef, Option.some(fiber)).pipe( +// Effect.andThen(Fiber.join(fiber)), +// Effect.andThen(Ref.set(fiberRef, Option.none())), +// ) +// ), - Effect.forkDaemon, - ) +// Effect.forkDaemon, +// ) - const fetchOnKeyChange = Effect.addFinalizer(() => interrupt).pipe( - Effect.andThen(Stream.runForEach(key, latestKey => - Ref.set(latestKeyRef, Option.some(latestKey)).pipe( - Effect.andThen(forkFetch) - ) - )) - ) +// const fetchOnKeyChange = Effect.addFinalizer(() => interrupt).pipe( +// Effect.andThen(Stream.runForEach(key, latestKey => +// Ref.set(latestKeyRef, Option.some(latestKey)).pipe( +// Effect.andThen(forkFetch) +// ) +// )) +// ) - const refreshOnWindowFocus = Stream.runForEach( - BrowserStream.fromEventListenerWindow("focus"), - () => forkRefresh, - ) +// const refreshOnWindowFocus = Stream.runForEach( +// BrowserStream.fromEventListenerWindow("focus"), +// () => forkRefresh, +// ) - return { - query, +// return { +// query, - latestKeyRef, - stateRef, - fiberRef, +// latestKeyRef, +// stateRef, +// fiberRef, - forkInterrupt, - forkFetch, - forkRefresh, +// forkInterrupt, +// forkFetch, +// forkRefresh, - fetchOnKeyChange, - refreshOnWindowFocus, - } -}) +// fetchOnKeyChange, +// refreshOnWindowFocus, +// } +// }) -- 2.49.1 From ee5dbe3766fdb5eef4887fc9fa196d1b43f2532b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 11 Mar 2025 20:39:56 +0100 Subject: [PATCH 104/326] Query work --- packages/extension-query/src/QueryExtension.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 79c0a89..1a55d78 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -6,6 +6,13 @@ import * as QueryRunner from "./QueryRunner.js" import type * as QueryService from "./QueryService.js" +export interface QueryExtension { + useQuery( + this: ReffuseHelpers.ReffuseHelpers, + props: UseQueryProps, + ): UseQueryResult> +} + export interface UseQueryProps { readonly key: Stream.Stream readonly query: (key: K) => Effect.Effect -- 2.49.1 From bc81c443ab92b0ab527846401840a56c30edb879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 11 Mar 2025 21:19:57 +0100 Subject: [PATCH 105/326] Query work --- packages/extension-query/src/FailureHandler.ts | 11 +++++++++++ packages/extension-query/src/QueryExtension.ts | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 packages/extension-query/src/FailureHandler.ts diff --git a/packages/extension-query/src/FailureHandler.ts b/packages/extension-query/src/FailureHandler.ts new file mode 100644 index 0000000..96d784b --- /dev/null +++ b/packages/extension-query/src/FailureHandler.ts @@ -0,0 +1,11 @@ +import { Effect, type Queue, type Stream } from "effect" + + +export interface FailureHandler { + readonly failures: Stream.Stream + readonly queue: Queue.Queue +} + +export const Tag = (id: Id) => < + Self, E = never, +>() => Effect.Tag(id)>() diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 1a55d78..888fda6 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -6,11 +6,11 @@ import * as QueryRunner from "./QueryRunner.js" import type * as QueryService from "./QueryService.js" -export interface QueryExtension { +export interface QueryExtension { useQuery( this: ReffuseHelpers.ReffuseHelpers, props: UseQueryProps, - ): UseQueryResult> + ): UseQueryResult> } export interface UseQueryProps { -- 2.49.1 From 66b8fd2c2ee3d78ffd627fc6d77f9f090a5ddf61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 12 Mar 2025 06:37:39 +0100 Subject: [PATCH 106/326] Fix --- .../extension-query/src/FailureHandler.ts | 11 +++- packages/extension-query/src/QueryRunner.ts | 62 ++++++++----------- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/packages/extension-query/src/FailureHandler.ts b/packages/extension-query/src/FailureHandler.ts index 96d784b..e1f33ad 100644 --- a/packages/extension-query/src/FailureHandler.ts +++ b/packages/extension-query/src/FailureHandler.ts @@ -1,4 +1,4 @@ -import { Effect, type Queue, type Stream } from "effect" +import { type Context, Effect, Layer, Queue, Stream } from "effect" export interface FailureHandler { @@ -9,3 +9,12 @@ export interface FailureHandler { export const Tag = (id: Id) => < Self, E = never, >() => Effect.Tag(id)>() + +export const layer = ( + tag: Context.TagClass> +): Layer.Layer => Layer.effect(tag, Queue.unbounded().pipe( + Effect.map(queue => ({ + failures: Stream.fromQueue(queue), + queue, + })) +)) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index a403672..c1401ba 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -54,22 +54,23 @@ export const make = ( })) ) - const forkFetch = interrupt.pipe( - Effect.andThen( - Ref.set(stateRef, AsyncData.loading()).pipe( - Effect.andThen(latestKeyRef), - Effect.flatMap(identity), - Effect.flatMap(key => query(key).pipe( - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }) - )), + const run = latestKeyRef.pipe( + Effect.flatMap(identity), + Effect.flatMap(key => query(key).pipe( + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }) + )), - Effect.provide(context), - Effect.fork, - ) - ), + Effect.provide(context), + ) + + const forkFetch = interrupt.pipe( + Effect.andThen(Ref.set(stateRef, AsyncData.loading()).pipe( + Effect.andThen(run), + Effect.fork, + )), Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber)).pipe( @@ -82,27 +83,16 @@ export const make = ( ) const forkRefresh = interrupt.pipe( - Effect.andThen( - Ref.update(stateRef, previous => { - if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) - return AsyncData.refreshing(previous) - if (AsyncData.isRefreshing(previous)) - return AsyncData.refreshing(previous.previous) - return AsyncData.loading() - }).pipe( - Effect.andThen(latestKeyRef), - Effect.flatMap(identity), - Effect.flatMap(key => query(key).pipe( - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }) - )), - - Effect.provide(context), - Effect.fork, - ) - ), + Effect.andThen(Ref.update(stateRef, previous => { + if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) + return AsyncData.refreshing(previous) + if (AsyncData.isRefreshing(previous)) + return AsyncData.refreshing(previous.previous) + return AsyncData.loading() + }).pipe( + Effect.andThen(run), + Effect.fork, + )), Effect.flatMap(fiber => Ref.set(fiberRef, Option.some(fiber)).pipe( -- 2.49.1 From 3a1748bb398ec7fd02d10ca552a834ed77171cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 13 Mar 2025 22:31:50 +0100 Subject: [PATCH 107/326] QueryClient tests --- packages/extension-query/src/QueryClient.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 packages/extension-query/src/QueryClient.ts diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts new file mode 100644 index 0000000..bf33a5a --- /dev/null +++ b/packages/extension-query/src/QueryClient.ts @@ -0,0 +1,20 @@ +import { Context, Effect, Layer } from "effect" + + +interface MyService { + readonly value: T +} + +const MyServiceAnyTag = Context.GenericTag>("MyService") +const MyServiceStringTag = Context.GenericTag>("MyService") + +declare const MyServiceAnyLayer: Layer.Layer> +declare const MyServiceStringLayer: Layer.Layer> + + +const prg = Effect.gen(function*() { + yield* MyServiceAnyTag + yield* MyServiceStringTag +}).pipe( + Effect.provide(MyServiceStringLayer) +) -- 2.49.1 From ed384a62a870fbd623d4e98a8378813bc40846d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 14 Mar 2025 03:26:28 +0100 Subject: [PATCH 108/326] QueryClient work --- packages/extension-query/src/ErrorHandler.ts | 26 +++++++++++++++++++ .../extension-query/src/FailureHandler.ts | 20 -------------- packages/extension-query/src/QueryClient.ts | 25 +++++++++--------- 3 files changed, 38 insertions(+), 33 deletions(-) create mode 100644 packages/extension-query/src/ErrorHandler.ts delete mode 100644 packages/extension-query/src/FailureHandler.ts diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts new file mode 100644 index 0000000..bc10c75 --- /dev/null +++ b/packages/extension-query/src/ErrorHandler.ts @@ -0,0 +1,26 @@ +import { type Cause, type Context, Effect, Layer, Queue, Stream } from "effect" + + +export interface ErrorHandler { + readonly errors: Stream.Stream> + handle(self: Effect.Effect): Effect.Effect +} + +export const Tag = (id: Id) => < + Self, E = never, +>() => Effect.Tag(id)>() + +export const layer = ( + tag: Context.TagClass> +): Layer.Layer => Layer.effect(tag, Effect.gen(function*() { + const queue = yield* Queue.unbounded>() + const errors = Stream.fromQueue(queue) + + const handle = ( + self: Effect.Effect + ) => Effect.tapErrorCause(self, cause => + Queue.offer(queue, cause as Cause.Cause) + ) as Effect.Effect + + return { errors, handle } +})) diff --git a/packages/extension-query/src/FailureHandler.ts b/packages/extension-query/src/FailureHandler.ts deleted file mode 100644 index e1f33ad..0000000 --- a/packages/extension-query/src/FailureHandler.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { type Context, Effect, Layer, Queue, Stream } from "effect" - - -export interface FailureHandler { - readonly failures: Stream.Stream - readonly queue: Queue.Queue -} - -export const Tag = (id: Id) => < - Self, E = never, ->() => Effect.Tag(id)>() - -export const layer = ( - tag: Context.TagClass> -): Layer.Layer => Layer.effect(tag, Queue.unbounded().pipe( - Effect.map(queue => ({ - failures: Stream.fromQueue(queue), - queue, - })) -)) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index bf33a5a..fdbe679 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -1,20 +1,19 @@ import { Context, Effect, Layer } from "effect" +import * as ErrorHandler from "./ErrorHandler.js" -interface MyService { - readonly value: T +export interface QueryClient { + readonly ErrorHandler: Context.Tag> } -const MyServiceAnyTag = Context.GenericTag>("MyService") -const MyServiceStringTag = Context.GenericTag>("MyService") -declare const MyServiceAnyLayer: Layer.Layer> -declare const MyServiceStringLayer: Layer.Layer> +export interface LayerProps { + readonly ErrorHandler?: Context.Tag> +} - -const prg = Effect.gen(function*() { - yield* MyServiceAnyTag - yield* MyServiceStringTag -}).pipe( - Effect.provide(MyServiceStringLayer) -) +export const layer = ( + props: LayerProps +): Layer.Layer> => + Layer.effect(Context.GenericTag>("@reffuse/extension-query/QueryClient"), Effect.succeed({ + ErrorHandler: props.ErrorHandler + })) -- 2.49.1 From 68c68417d8ddd2e7df3dd164d2900ba0005eeb73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 14 Mar 2025 03:56:54 +0100 Subject: [PATCH 109/326] QueryClient work --- packages/extension-query/src/ErrorHandler.ts | 4 +++ packages/extension-query/src/QueryClient.ts | 28 ++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts index bc10c75..3dcdd9e 100644 --- a/packages/extension-query/src/ErrorHandler.ts +++ b/packages/extension-query/src/ErrorHandler.ts @@ -24,3 +24,7 @@ export const layer = ( return { errors, handle } })) + + +export class DefaultErrorHandler extends Tag("@reffuse/extension-query/DefaultErrorHandler")() {} +export const DefaultErrorHandlerLive = layer(DefaultErrorHandler) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index fdbe679..6fc27ab 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -11,9 +11,27 @@ export interface LayerProps { readonly ErrorHandler?: Context.Tag> } -export const layer = ( +export const layer = < + EH = ErrorHandler.DefaultErrorHandler, + HandledE = never, +>( props: LayerProps -): Layer.Layer> => - Layer.effect(Context.GenericTag>("@reffuse/extension-query/QueryClient"), Effect.succeed({ - ErrorHandler: props.ErrorHandler - })) +): Layer.Layer< + QueryClient, + never, + typeof props.ErrorHandler extends undefined + ? ErrorHandler.DefaultErrorHandler + : never +> => Layer.empty.pipe( + Layer.provideMerge(Layer.effect( + Context.GenericTag>("@reffuse/extension-query/QueryClient"), + Effect.succeed({ + ErrorHandler: (props.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> + })), + ), + + Layer.provideMerge(props.ErrorHandler + ? Layer.empty + : ErrorHandler.DefaultErrorHandlerLive + ), +) -- 2.49.1 From 747e2c6056e0366897d983608daa5f14b6c1d6ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 14 Mar 2025 04:13:14 +0100 Subject: [PATCH 110/326] Done QueryClient --- packages/extension-query/src/QueryClient.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 6fc27ab..78bd93e 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -15,23 +15,22 @@ export const layer = < EH = ErrorHandler.DefaultErrorHandler, HandledE = never, >( - props: LayerProps + props?: LayerProps ): Layer.Layer< - QueryClient, - never, - typeof props.ErrorHandler extends undefined + | QueryClient + | (EH extends ErrorHandler.DefaultErrorHandler ? ErrorHandler.DefaultErrorHandler - : never + : never) > => Layer.empty.pipe( Layer.provideMerge(Layer.effect( Context.GenericTag>("@reffuse/extension-query/QueryClient"), Effect.succeed({ - ErrorHandler: (props.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> + ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> })), ), - Layer.provideMerge(props.ErrorHandler + Layer.provideMerge((props?.ErrorHandler ? Layer.empty : ErrorHandler.DefaultErrorHandlerLive - ), + ) as Layer.Layer), ) -- 2.49.1 From f4ab575a8d701eb63c5869a647399ce5e5064046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 14 Mar 2025 04:24:56 +0100 Subject: [PATCH 111/326] QueryExtension work --- packages/extension-query/src/QueryExtension.ts | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 888fda6..fa79845 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -2,17 +2,11 @@ import type * as AsyncData from "@typed/async-data" import { type Cause, type Context, Effect, type Fiber, Layer, type Option, type Stream, type SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" +import type * as QueryClient from "./QueryClient.js" import * as QueryRunner from "./QueryRunner.js" import type * as QueryService from "./QueryService.js" -export interface QueryExtension { - useQuery( - this: ReffuseHelpers.ReffuseHelpers, - props: UseQueryProps, - ): UseQueryResult> -} - export interface UseQueryProps { readonly key: Stream.Stream readonly query: (key: K) => Effect.Effect @@ -31,10 +25,10 @@ export interface UseQueryResult { export const QueryExtension = ReffuseExtension.make(() => ({ - useQuery( - this: ReffuseHelpers.ReffuseHelpers, + useQuery( + this: ReffuseHelpers.ReffuseHelpers>, props: UseQueryProps, - ): UseQueryResult { + ): UseQueryResult> { const runner = this.useMemo(() => QueryRunner.make({ key: props.key, query: props.query, -- 2.49.1 From eedd2a7f2a58cc383a34198640447fa3c5b69a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 14 Mar 2025 04:57:07 +0100 Subject: [PATCH 112/326] makeTag --- packages/extension-query/src/QueryClient.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 78bd93e..76ea7b4 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -6,6 +6,14 @@ export interface QueryClient { readonly ErrorHandler: Context.Tag> } +export const makeTag = < + EH = never, + HandledE = never, +>(): Context.Tag< + QueryClient, + QueryClient +> => Context.GenericTag("@reffuse/extension-query/QueryClient") + export interface LayerProps { readonly ErrorHandler?: Context.Tag> @@ -22,11 +30,10 @@ export const layer = < ? ErrorHandler.DefaultErrorHandler : never) > => Layer.empty.pipe( - Layer.provideMerge(Layer.effect( - Context.GenericTag>("@reffuse/extension-query/QueryClient"), - Effect.succeed({ + Layer.provideMerge( + Layer.effect(makeTag(), Effect.succeed({ ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> - })), + })) ), Layer.provideMerge((props?.ErrorHandler -- 2.49.1 From abc47c46474e3233d50ac7e0ccafc2bdf56a3eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 14 Mar 2025 05:04:49 +0100 Subject: [PATCH 113/326] Fix --- packages/extension-query/src/ErrorHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts index 3dcdd9e..1975a25 100644 --- a/packages/extension-query/src/ErrorHandler.ts +++ b/packages/extension-query/src/ErrorHandler.ts @@ -3,7 +3,7 @@ import { type Cause, type Context, Effect, Layer, Queue, Stream } from "effect" export interface ErrorHandler { readonly errors: Stream.Stream> - handle(self: Effect.Effect): Effect.Effect + readonly handle: (self: Effect.Effect) => Effect.Effect } export const Tag = (id: Id) => < -- 2.49.1 From 2e8dfbc988ad3d03d5ffc5194442fe942575fa63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 14 Mar 2025 22:00:53 +0100 Subject: [PATCH 114/326] QueryClient --- packages/extension-query/src/ErrorHandler.ts | 6 +-- packages/extension-query/src/QueryClient.ts | 10 ++-- .../extension-query/src/QueryExtension.ts | 5 +- packages/extension-query/src/QueryRunner.ts | 46 ++++++++++++------- packages/extension-query/src/index.ts | 2 + 5 files changed, 41 insertions(+), 28 deletions(-) diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts index 1975a25..f602f62 100644 --- a/packages/extension-query/src/ErrorHandler.ts +++ b/packages/extension-query/src/ErrorHandler.ts @@ -3,7 +3,7 @@ import { type Cause, type Context, Effect, Layer, Queue, Stream } from "effect" export interface ErrorHandler { readonly errors: Stream.Stream> - readonly handle: (self: Effect.Effect) => Effect.Effect + readonly handle: (self: Effect.Effect) => Effect.Effect, R> } export const Tag = (id: Id) => < @@ -17,10 +17,10 @@ export const layer = ( const errors = Stream.fromQueue(queue) const handle = ( - self: Effect.Effect + self: Effect.Effect ) => Effect.tapErrorCause(self, cause => Queue.offer(queue, cause as Cause.Cause) - ) as Effect.Effect + ) as Effect.Effect, R> return { errors, handle } })) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 76ea7b4..c2f90d0 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -6,13 +6,9 @@ export interface QueryClient { readonly ErrorHandler: Context.Tag> } -export const makeTag = < - EH = never, - HandledE = never, ->(): Context.Tag< - QueryClient, - QueryClient -> => Context.GenericTag("@reffuse/extension-query/QueryClient") + +export type Tag = Context.Tag, QueryClient> +export const makeTag = (): Tag => Context.GenericTag("@reffuse/extension-query/QueryClient") export interface LayerProps { diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index fa79845..606ce22 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -2,7 +2,7 @@ import type * as AsyncData from "@typed/async-data" import { type Cause, type Context, Effect, type Fiber, Layer, type Option, type Stream, type SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" -import type * as QueryClient from "./QueryClient.js" +import * as QueryClient from "./QueryClient.js" import * as QueryRunner from "./QueryRunner.js" import type * as QueryService from "./QueryService.js" @@ -26,10 +26,11 @@ export interface UseQueryResult { export const QueryExtension = ReffuseExtension.make(() => ({ useQuery( - this: ReffuseHelpers.ReffuseHelpers>, + this: ReffuseHelpers.ReffuseHelpers | EH>, props: UseQueryProps, ): UseQueryResult> { const runner = this.useMemo(() => QueryRunner.make({ + QueryClient: QueryClient.makeTag(), key: props.key, query: props.query, }), [props.key]) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index c1401ba..46ec4a4 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -1,10 +1,11 @@ import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" -import { type Cause, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" +import { type Cause, type Context, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" +import type * as QueryClient from "./QueryClient.js" export interface QueryRunner { - readonly query: (key: K) => Effect.Effect + readonly context: Context.Context readonly latestKeyRef: SubscriptionRef.SubscriptionRef> readonly stateRef: SubscriptionRef.SubscriptionRef> @@ -19,18 +20,27 @@ export interface QueryRunner { } -export interface MakeProps { +export interface MakeProps { + readonly QueryClient: QueryClient.Tag readonly key: Stream.Stream readonly query: (key: K) => Effect.Effect } -export const make = ( - { key, query }: MakeProps -): Effect.Effect, never, R> => Effect.gen(function*() { - const context = yield* Effect.context() +export const make = ( + { + QueryClient, + key, + query, + }: MakeProps +): Effect.Effect< + QueryRunner, R>, + never, + R | QueryClient.QueryClient | EH +> => Effect.gen(function*() { + const context = yield* Effect.context | EH>() const latestKeyRef = yield* SubscriptionRef.make(Option.none()) - const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) + const stateRef = yield* SubscriptionRef.make(AsyncData.noData>()) const fiberRef = yield* SubscriptionRef.make(Option.none>()) const interrupt = fiberRef.pipe( @@ -54,13 +64,17 @@ export const make = ( })) ) - const run = latestKeyRef.pipe( - Effect.flatMap(identity), - Effect.flatMap(key => query(key).pipe( - Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), - }) + const run = QueryClient.pipe( + Effect.flatMap(client => client.ErrorHandler), + Effect.flatMap(errorHandler => latestKeyRef.pipe( + Effect.flatMap(identity), + Effect.flatMap(key => query(key).pipe( + errorHandler.handle, + Effect.matchCauseEffect({ + onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), + onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + }), + )), )), Effect.provide(context), @@ -118,7 +132,7 @@ export const make = ( ) return { - query, + context, latestKeyRef, stateRef, diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index 790fe0c..bbf2696 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,3 +1,5 @@ +export * as ErrorHandler from "./ErrorHandler.js" +export * as QueryClient from "./QueryClient.js" export * from "./QueryExtension.js" export * as QueryRunner from "./QueryRunner.js" export * as QueryService from "./QueryService.js" -- 2.49.1 From 70b6c4434ebb5b9f7735dbcb1e43c994b4d6bb1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 14 Mar 2025 22:07:53 +0100 Subject: [PATCH 115/326] Tests --- packages/example/src/main.tsx | 2 ++ packages/example/src/reffuse.ts | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index 8fe1e6d..89b9eb4 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -1,5 +1,6 @@ import { FetchHttpClient } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" +import { QueryClient } from "@reffuse/extension-query" import { createRouter, RouterProvider } from "@tanstack/react-router" import { Layer } from "effect" import { StrictMode } from "react" @@ -14,6 +15,7 @@ const layer = Layer.empty.pipe( Layer.provideMerge(Geolocation.layer), Layer.provideMerge(Permissions.layer), Layer.provideMerge(FetchHttpClient.layer), + Layer.provideMerge(QueryClient.layer()), ) const router = createRouter({ routeTree }) diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index c5d008f..e0b405e 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -1,7 +1,7 @@ import { HttpClient } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" import { LazyRefExtension } from "@reffuse/extension-lazyref" -import { QueryExtension } from "@reffuse/extension-query" +import { ErrorHandler, QueryClient, QueryExtension } from "@reffuse/extension-query" import { Reffuse, ReffuseContext } from "reffuse" @@ -10,6 +10,8 @@ export const GlobalContext = ReffuseContext.make< | Geolocation.Geolocation | Permissions.Permissions | HttpClient.HttpClient + | QueryClient.QueryClient + | ErrorHandler.DefaultErrorHandler >() export class GlobalReffuse extends Reffuse.Reffuse.pipe( -- 2.49.1 From 5614b8df38ac526a1ad3270d11b0813d58c39322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 15 Mar 2025 00:52:00 +0100 Subject: [PATCH 116/326] Fix --- packages/extension-query/src/QueryExtension.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 606ce22..8b336f1 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -25,10 +25,18 @@ export interface UseQueryResult { export const QueryExtension = ReffuseExtension.make(() => ({ - useQuery( + useQuery< + EH, + QK extends readonly unknown[], + QA, + QE, + HandledE, + QR extends R, + R, + >( this: ReffuseHelpers.ReffuseHelpers | EH>, - props: UseQueryProps, - ): UseQueryResult> { + props: UseQueryProps, + ): UseQueryResult> { const runner = this.useMemo(() => QueryRunner.make({ QueryClient: QueryClient.makeTag(), key: props.key, -- 2.49.1 From 0437fa5dccbd6e49acc2db6559e2fa0a2bcfd8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 15 Mar 2025 02:30:37 +0100 Subject: [PATCH 117/326] QueryErrorHandler work --- packages/example/src/QueryErrorHandler.tsx | 26 +++++++++++++++++++ packages/example/src/main.tsx | 4 ++- .../example/src/query/services/Uuid4Query.ts | 3 +-- packages/example/src/reffuse.ts | 9 ++++--- 4 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 packages/example/src/QueryErrorHandler.tsx diff --git a/packages/example/src/QueryErrorHandler.tsx b/packages/example/src/QueryErrorHandler.tsx new file mode 100644 index 0000000..003324e --- /dev/null +++ b/packages/example/src/QueryErrorHandler.tsx @@ -0,0 +1,26 @@ +import { HttpClientError } from "@effect/platform" +import { ErrorHandler } from "@reffuse/extension-query" +import { Cause, Chunk, Effect, flow, Match, Stream } from "effect" +import { R } from "./reffuse" + + +export class QueryErrorHandler extends ErrorHandler.Tag("QueryErrorHandler")() {} + +export const QueryErrorHandlerLive = ErrorHandler.layer(QueryErrorHandler) + + +export function VQueryErrorHandler() { + R.useFork(() => QueryErrorHandler.pipe(Effect.flatMap(handler => + Stream.runForEach(handler.errors, flow( + Cause.failures, + Chunk.map(flow(Match.value, + Match.tag("RequestError", () => Effect.sync(() => {})), + Match.tag("ResponseError", () => Effect.sync(() => {})), + Match.exhaustive, + )), + Effect.all, + )) + )), []) +} diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index 89b9eb4..a544300 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -6,6 +6,7 @@ import { Layer } from "effect" import { StrictMode } from "react" import { createRoot } from "react-dom/client" import { ReffuseRuntime } from "reffuse" +import { QueryErrorHandler, QueryErrorHandlerLive } from "./QueryErrorHandler" import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" @@ -15,7 +16,8 @@ const layer = Layer.empty.pipe( Layer.provideMerge(Geolocation.layer), Layer.provideMerge(Permissions.layer), Layer.provideMerge(FetchHttpClient.layer), - Layer.provideMerge(QueryClient.layer()), + Layer.provideMerge(QueryClient.layer({ ErrorHandler: QueryErrorHandler })), + Layer.provideMerge(QueryErrorHandlerLive), ) const router = createRouter({ routeTree }) diff --git a/packages/example/src/query/services/Uuid4Query.ts b/packages/example/src/query/services/Uuid4Query.ts index a7336bd..30b1545 100644 --- a/packages/example/src/query/services/Uuid4Query.ts +++ b/packages/example/src/query/services/Uuid4Query.ts @@ -1,4 +1,3 @@ -import { HttpClientError } from "@effect/platform" import { QueryService } from "@reffuse/extension-query" import { ParseResult, Schema } from "effect" @@ -8,5 +7,5 @@ export const Result = Schema.Array(Schema.String) export class Uuid4Query extends QueryService.Tag("Uuid4Query")() {} diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index e0b405e..21e178c 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -1,8 +1,9 @@ -import { HttpClient } from "@effect/platform" +import { HttpClient, HttpClientError } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" import { LazyRefExtension } from "@reffuse/extension-lazyref" -import { ErrorHandler, QueryClient, QueryExtension } from "@reffuse/extension-query" +import { QueryClient, QueryExtension } from "@reffuse/extension-query" import { Reffuse, ReffuseContext } from "reffuse" +import { QueryErrorHandler } from "./QueryErrorHandler" export const GlobalContext = ReffuseContext.make< @@ -10,8 +11,8 @@ export const GlobalContext = ReffuseContext.make< | Geolocation.Geolocation | Permissions.Permissions | HttpClient.HttpClient - | QueryClient.QueryClient - | ErrorHandler.DefaultErrorHandler + | QueryClient.QueryClient + | QueryErrorHandler >() export class GlobalReffuse extends Reffuse.Reffuse.pipe( -- 2.49.1 From 4e778b6c95d4b28e4a128b767a08b4997b0b09d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 15 Mar 2025 05:12:38 +0100 Subject: [PATCH 118/326] VQueryErrorHandler --- packages/example/src/QueryErrorHandler.tsx | 68 ++++++++++++++++---- packages/example/src/main.tsx | 3 +- packages/extension-query/src/ErrorHandler.ts | 3 + 3 files changed, 62 insertions(+), 12 deletions(-) diff --git a/packages/example/src/QueryErrorHandler.tsx b/packages/example/src/QueryErrorHandler.tsx index 003324e..844f7a4 100644 --- a/packages/example/src/QueryErrorHandler.tsx +++ b/packages/example/src/QueryErrorHandler.tsx @@ -1,6 +1,8 @@ import { HttpClientError } from "@effect/platform" +import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" import { ErrorHandler } from "@reffuse/extension-query" -import { Cause, Chunk, Effect, flow, Match, Stream } from "effect" +import { Cause, Chunk, Context, Effect, Match, Option, Queue, Stream } from "effect" +import { useState } from "react" import { R } from "./reffuse" @@ -12,15 +14,59 @@ export const QueryErrorHandlerLive = ErrorHandler.layer(QueryErrorHandler) export function VQueryErrorHandler() { + const queue = R.useMemo(() => Queue.unbounded> + >>(), []) + R.useFork(() => QueryErrorHandler.pipe(Effect.flatMap(handler => - Stream.runForEach(handler.errors, flow( - Cause.failures, - Chunk.map(flow(Match.value, - Match.tag("RequestError", () => Effect.sync(() => {})), - Match.tag("ResponseError", () => Effect.sync(() => {})), - Match.exhaustive, - )), - Effect.all, - )) - )), []) + Stream.runForEach(handler.errors, v => Queue.offer(queue, v)) + )), [queue]) + + const [failure, setFailure] = useState(R.useMemo(() => Queue.poll(queue), [])) + + const next = R.useCallbackSync(() => Queue.poll(queue).pipe( + Effect.map(setFailure) + ), [queue]) + + // R.useFork(() => QueryErrorHandler.pipe(Effect.flatMap(handler => + // Stream.runForEach(handler.errors, flow( + // Cause.failures, + // Chunk.map(flow(Match.value, + // Match.tag("RequestError", () => Effect.sync(() => {})), + // Match.tag("ResponseError", () => Effect.sync(() => {})), + // Match.exhaustive, + // )), + // Effect.all, + // )) + // )), []) + + + return Option.match(failure, { + onSome: v => ( + + + Error + + {Cause.failures(v).pipe( + Chunk.head, + Option.getOrThrow, + + Match.value, + Match.tag("RequestError", () => HTTP request error), + Match.tag("ResponseError", () => HTTP response error), + Match.exhaustive, + )} + + + + + + + + ), + + onNone: () => <>, + }) } diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index a544300..b058a72 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -6,7 +6,7 @@ import { Layer } from "effect" import { StrictMode } from "react" import { createRoot } from "react-dom/client" import { ReffuseRuntime } from "reffuse" -import { QueryErrorHandler, QueryErrorHandlerLive } from "./QueryErrorHandler" +import { QueryErrorHandler, QueryErrorHandlerLive, VQueryErrorHandler } from "./QueryErrorHandler" import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" @@ -33,6 +33,7 @@ createRoot(document.getElementById("root")!).render( + diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts index f602f62..7e4e912 100644 --- a/packages/extension-query/src/ErrorHandler.ts +++ b/packages/extension-query/src/ErrorHandler.ts @@ -6,6 +6,9 @@ export interface ErrorHandler { readonly handle: (self: Effect.Effect) => Effect.Effect, R> } +export type Error = T extends ErrorHandler ? E : never + + export const Tag = (id: Id) => < Self, E = never, >() => Effect.Tag(id)>() -- 2.49.1 From c2bc406a5f788105d41066b468fa2c2fb5c01108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 15 Mar 2025 06:43:47 +0100 Subject: [PATCH 119/326] Fixed query error handler --- packages/example/src/QueryErrorHandler.tsx | 41 +++++++--------------- packages/example/src/main.tsx | 3 +- packages/example/src/routes/__root.tsx | 3 ++ 3 files changed, 17 insertions(+), 30 deletions(-) diff --git a/packages/example/src/QueryErrorHandler.tsx b/packages/example/src/QueryErrorHandler.tsx index 844f7a4..88dc98f 100644 --- a/packages/example/src/QueryErrorHandler.tsx +++ b/packages/example/src/QueryErrorHandler.tsx @@ -1,7 +1,7 @@ import { HttpClientError } from "@effect/platform" import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" import { ErrorHandler } from "@reffuse/extension-query" -import { Cause, Chunk, Context, Effect, Match, Option, Queue, Stream } from "effect" +import { Cause, Chunk, Context, Effect, Match, Option, Stream } from "effect" import { useState } from "react" import { R } from "./reffuse" @@ -14,36 +14,19 @@ export const QueryErrorHandlerLive = ErrorHandler.layer(QueryErrorHandler) export function VQueryErrorHandler() { - const queue = R.useMemo(() => Queue.unbounded> - >>(), []) + >>()) R.useFork(() => QueryErrorHandler.pipe(Effect.flatMap(handler => - Stream.runForEach(handler.errors, v => Queue.offer(queue, v)) - )), [queue]) - - const [failure, setFailure] = useState(R.useMemo(() => Queue.poll(queue), [])) - - const next = R.useCallbackSync(() => Queue.poll(queue).pipe( - Effect.map(setFailure) - ), [queue]) - - // R.useFork(() => QueryErrorHandler.pipe(Effect.flatMap(handler => - // Stream.runForEach(handler.errors, flow( - // Cause.failures, - // Chunk.map(flow(Match.value, - // Match.tag("RequestError", () => Effect.sync(() => {})), - // Match.tag("ResponseError", () => Effect.sync(() => {})), - // Match.exhaustive, - // )), - // Effect.all, - // )) - // )), []) - + Stream.runForEach(handler.errors, v => Effect.sync(() => + setFailure(Option.some(v)) + )) + )), []) return Option.match(failure, { onSome: v => ( - + Error @@ -59,9 +42,11 @@ export function VQueryErrorHandler() { - + + + diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index b058a72..a544300 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -6,7 +6,7 @@ import { Layer } from "effect" import { StrictMode } from "react" import { createRoot } from "react-dom/client" import { ReffuseRuntime } from "reffuse" -import { QueryErrorHandler, QueryErrorHandlerLive, VQueryErrorHandler } from "./QueryErrorHandler" +import { QueryErrorHandler, QueryErrorHandlerLive } from "./QueryErrorHandler" import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" @@ -33,7 +33,6 @@ createRoot(document.getElementById("root")!).render( - diff --git a/packages/example/src/routes/__root.tsx b/packages/example/src/routes/__root.tsx index 3253372..840de40 100644 --- a/packages/example/src/routes/__root.tsx +++ b/packages/example/src/routes/__root.tsx @@ -1,3 +1,4 @@ +import { VQueryErrorHandler } from "@/QueryErrorHandler" import { Container, Flex, Theme } from "@radix-ui/themes" import { createRootRoute, Link, Outlet } from "@tanstack/react-router" import { TanStackRouterDevtools } from "@tanstack/router-devtools" @@ -26,6 +27,8 @@ function Root() { + + ) -- 2.49.1 From c943d81702aa2f5dda2bf75c8eabc0a026192f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 15 Mar 2025 22:27:15 +0100 Subject: [PATCH 120/326] QueryClient.make --- packages/example/src/QueryErrorHandler.tsx | 13 ++---- packages/example/src/main.tsx | 7 ++- packages/example/src/query.ts | 10 +++++ packages/example/src/reffuse.ts | 11 ++--- packages/extension-query/src/QueryClient.ts | 48 ++++++++++++--------- 5 files changed, 50 insertions(+), 39 deletions(-) create mode 100644 packages/example/src/query.ts diff --git a/packages/example/src/QueryErrorHandler.tsx b/packages/example/src/QueryErrorHandler.tsx index 88dc98f..2e9dcaa 100644 --- a/packages/example/src/QueryErrorHandler.tsx +++ b/packages/example/src/QueryErrorHandler.tsx @@ -1,24 +1,17 @@ -import { HttpClientError } from "@effect/platform" import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" import { ErrorHandler } from "@reffuse/extension-query" import { Cause, Chunk, Context, Effect, Match, Option, Stream } from "effect" import { useState } from "react" +import { AppQueryErrorHandler } from "./query" import { R } from "./reffuse" -export class QueryErrorHandler extends ErrorHandler.Tag("QueryErrorHandler")() {} - -export const QueryErrorHandlerLive = ErrorHandler.layer(QueryErrorHandler) - - export function VQueryErrorHandler() { const [failure, setFailure] = useState(Option.none> + ErrorHandler.Error> >>()) - R.useFork(() => QueryErrorHandler.pipe(Effect.flatMap(handler => + R.useFork(() => AppQueryErrorHandler.pipe(Effect.flatMap(handler => Stream.runForEach(handler.errors, v => Effect.sync(() => setFailure(Option.some(v)) )) diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index a544300..2800e09 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -1,12 +1,11 @@ import { FetchHttpClient } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" -import { QueryClient } from "@reffuse/extension-query" import { createRouter, RouterProvider } from "@tanstack/react-router" import { Layer } from "effect" import { StrictMode } from "react" import { createRoot } from "react-dom/client" import { ReffuseRuntime } from "reffuse" -import { QueryErrorHandler, QueryErrorHandlerLive } from "./QueryErrorHandler" +import { AppQueryClientLive, AppQueryErrorHandlerLive } from "./query" import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" @@ -16,8 +15,8 @@ const layer = Layer.empty.pipe( Layer.provideMerge(Geolocation.layer), Layer.provideMerge(Permissions.layer), Layer.provideMerge(FetchHttpClient.layer), - Layer.provideMerge(QueryClient.layer({ ErrorHandler: QueryErrorHandler })), - Layer.provideMerge(QueryErrorHandlerLive), + Layer.provideMerge(AppQueryClientLive), + Layer.provideMerge(AppQueryErrorHandlerLive), ) const router = createRouter({ routeTree }) diff --git a/packages/example/src/query.ts b/packages/example/src/query.ts new file mode 100644 index 0000000..c51a83c --- /dev/null +++ b/packages/example/src/query.ts @@ -0,0 +1,10 @@ +import { HttpClientError } from "@effect/platform" +import { ErrorHandler, QueryClient } from "@reffuse/extension-query" + + +export class AppQueryErrorHandler extends ErrorHandler.Tag("AppQueryErrorHandler")() {} +export const AppQueryErrorHandlerLive = ErrorHandler.layer(AppQueryErrorHandler) + +export const [AppQueryClient, AppQueryClientLive] = QueryClient.make({ ErrorHandler: AppQueryErrorHandler }) diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index 21e178c..41facb2 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -1,9 +1,10 @@ -import { HttpClient, HttpClientError } from "@effect/platform" +import { HttpClient } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" import { LazyRefExtension } from "@reffuse/extension-lazyref" -import { QueryClient, QueryExtension } from "@reffuse/extension-query" +import { QueryExtension } from "@reffuse/extension-query" +import { Context } from "effect" import { Reffuse, ReffuseContext } from "reffuse" -import { QueryErrorHandler } from "./QueryErrorHandler" +import { AppQueryClient, AppQueryErrorHandler } from "./query" export const GlobalContext = ReffuseContext.make< @@ -11,8 +12,8 @@ export const GlobalContext = ReffuseContext.make< | Geolocation.Geolocation | Permissions.Permissions | HttpClient.HttpClient - | QueryClient.QueryClient - | QueryErrorHandler + | Context.Tag.Service + | AppQueryErrorHandler >() export class GlobalReffuse extends Reffuse.Reffuse.pipe( diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index c2f90d0..7ca9d24 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -6,34 +6,42 @@ export interface QueryClient { readonly ErrorHandler: Context.Tag> } - export type Tag = Context.Tag, QueryClient> export const makeTag = (): Tag => Context.GenericTag("@reffuse/extension-query/QueryClient") -export interface LayerProps { +export interface MakeProps { readonly ErrorHandler?: Context.Tag> } -export const layer = < +export type MakeResult = [ + tag: Tag, + layer: Layer.Layer< + | QueryClient + | (EH extends ErrorHandler.DefaultErrorHandler + ? ErrorHandler.DefaultErrorHandler + : never) + >, +] + +export const make = < EH = ErrorHandler.DefaultErrorHandler, HandledE = never, >( - props?: LayerProps -): Layer.Layer< - | QueryClient - | (EH extends ErrorHandler.DefaultErrorHandler - ? ErrorHandler.DefaultErrorHandler - : never) -> => Layer.empty.pipe( - Layer.provideMerge( - Layer.effect(makeTag(), Effect.succeed({ - ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> - })) - ), + props?: MakeProps +): MakeResult => [ + makeTag(), - Layer.provideMerge((props?.ErrorHandler - ? Layer.empty - : ErrorHandler.DefaultErrorHandlerLive - ) as Layer.Layer), -) + Layer.empty.pipe( + Layer.provideMerge( + Layer.effect(makeTag(), Effect.succeed({ + ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> + })) + ), + + Layer.provideMerge((props?.ErrorHandler + ? Layer.empty + : ErrorHandler.DefaultErrorHandlerLive + ) as Layer.Layer), + ), +] -- 2.49.1 From 0e2c0db28f80abb71630f9989ddb6dc5612a258f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 02:52:49 +0100 Subject: [PATCH 121/326] QueryClient refactoring --- packages/extension-query/src/QueryClient.ts | 89 ++++++++++++++----- .../extension-query/src/QueryExtension.ts | 4 +- packages/extension-query/src/QueryRunner.ts | 6 +- 3 files changed, 70 insertions(+), 29 deletions(-) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 7ca9d24..1f19be5 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -6,42 +6,83 @@ export interface QueryClient { readonly ErrorHandler: Context.Tag> } -export type Tag = Context.Tag, QueryClient> -export const makeTag = (): Tag => Context.GenericTag("@reffuse/extension-query/QueryClient") + +const Id = "@reffuse/extension-query/QueryClient" + +export type TagClassShape = Context.TagClassShape> +export type GenericTagClass = Context.TagClass, typeof Id, QueryClient> +export const makeGenericTagClass = () => Context.GenericTag(Id) as GenericTagClass -export interface MakeProps { +export interface ServiceProps { readonly ErrorHandler?: Context.Tag> } -export type MakeResult = [ - tag: Tag, - layer: Layer.Layer< - | QueryClient - | (EH extends ErrorHandler.DefaultErrorHandler - ? ErrorHandler.DefaultErrorHandler - : never) - >, -] - -export const make = < +export const Service: < EH = ErrorHandler.DefaultErrorHandler, HandledE = never, >( - props?: MakeProps -): MakeResult => [ - makeTag(), - - Layer.empty.pipe( + props?: ServiceProps +) => + () => + & Context.TagClass> + & { readonly Live: Layer.Layer< + | QueryClient + | (EH extends ErrorHandler.DefaultErrorHandler + ? ErrorHandler.DefaultErrorHandler + : never) + > } += props => () => { + const TagClass = Context.Tag(Id)() as any + TagClass.Live = Layer.empty.pipe( Layer.provideMerge( - Layer.effect(makeTag(), Effect.succeed({ - ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> + Layer.effect(TagClass, Effect.succeed({ + ErrorHandler: props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler })) ), Layer.provideMerge((props?.ErrorHandler ? Layer.empty : ErrorHandler.DefaultErrorHandlerLive - ) as Layer.Layer), - ), -] + ), + )) + + return TagClass +} + + +// export interface MakeProps { +// readonly ErrorHandler?: Context.Tag> +// } + +// export type MakeResult = [ +// tag: Tag, +// layer: Layer.Layer< +// | QueryClient +// | (EH extends ErrorHandler.DefaultErrorHandler +// ? ErrorHandler.DefaultErrorHandler +// : never) +// >, +// ] + +// export const make = < +// EH = ErrorHandler.DefaultErrorHandler, +// HandledE = never, +// >( +// props?: MakeProps +// ): MakeResult => [ +// makeTag(), + +// Layer.empty.pipe( +// Layer.provideMerge( +// Layer.effect(makeTag(), Effect.succeed({ +// ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> +// })) +// ), + +// Layer.provideMerge((props?.ErrorHandler +// ? Layer.empty +// : ErrorHandler.DefaultErrorHandlerLive +// ) as Layer.Layer), +// ), +// ] diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 8b336f1..80cc059 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -34,11 +34,11 @@ export const QueryExtension = ReffuseExtension.make(() => ({ QR extends R, R, >( - this: ReffuseHelpers.ReffuseHelpers | EH>, + this: ReffuseHelpers.ReffuseHelpers | EH>, props: UseQueryProps, ): UseQueryResult> { const runner = this.useMemo(() => QueryRunner.make({ - QueryClient: QueryClient.makeTag(), + QueryClient: QueryClient.makeGenericTagClass(), key: props.key, query: props.query, }), [props.key]) diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 46ec4a4..ca1f6ae 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -21,7 +21,7 @@ export interface QueryRunner { export interface MakeProps { - readonly QueryClient: QueryClient.Tag + readonly QueryClient: QueryClient.GenericTagClass readonly key: Stream.Stream readonly query: (key: K) => Effect.Effect } @@ -35,9 +35,9 @@ export const make = ( ): Effect.Effect< QueryRunner, R>, never, - R | QueryClient.QueryClient | EH + R | QueryClient.TagClassShape | EH > => Effect.gen(function*() { - const context = yield* Effect.context | EH>() + const context = yield* Effect.context | EH>() const latestKeyRef = yield* SubscriptionRef.make(Option.none()) const stateRef = yield* SubscriptionRef.make(AsyncData.noData>()) -- 2.49.1 From e4bacd1ca7f3ec4bbffd4a66615c191c29ce0e74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 03:19:12 +0100 Subject: [PATCH 122/326] Working QueryClient refactoring --- packages/example/src/main.tsx | 4 +- packages/example/src/query.ts | 3 +- packages/example/src/reffuse.ts | 3 +- packages/extension-query/src/QueryClient.ts | 91 +++++++-------------- 4 files changed, 33 insertions(+), 68 deletions(-) diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index 2800e09..0f73461 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -5,7 +5,7 @@ import { Layer } from "effect" import { StrictMode } from "react" import { createRoot } from "react-dom/client" import { ReffuseRuntime } from "reffuse" -import { AppQueryClientLive, AppQueryErrorHandlerLive } from "./query" +import { AppQueryClient, AppQueryErrorHandlerLive } from "./query" import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" @@ -15,7 +15,7 @@ const layer = Layer.empty.pipe( Layer.provideMerge(Geolocation.layer), Layer.provideMerge(Permissions.layer), Layer.provideMerge(FetchHttpClient.layer), - Layer.provideMerge(AppQueryClientLive), + Layer.provideMerge(AppQueryClient.Live), Layer.provideMerge(AppQueryErrorHandlerLive), ) diff --git a/packages/example/src/query.ts b/packages/example/src/query.ts index c51a83c..db47f2b 100644 --- a/packages/example/src/query.ts +++ b/packages/example/src/query.ts @@ -7,4 +7,5 @@ export class AppQueryErrorHandler extends ErrorHandler.Tag("AppQueryErrorHandler >() {} export const AppQueryErrorHandlerLive = ErrorHandler.layer(AppQueryErrorHandler) -export const [AppQueryClient, AppQueryClientLive] = QueryClient.make({ ErrorHandler: AppQueryErrorHandler }) + +export class AppQueryClient extends QueryClient.Service({ ErrorHandler: AppQueryErrorHandler })() {} diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index 41facb2..f23c07e 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -2,7 +2,6 @@ import { HttpClient } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" import { LazyRefExtension } from "@reffuse/extension-lazyref" import { QueryExtension } from "@reffuse/extension-query" -import { Context } from "effect" import { Reffuse, ReffuseContext } from "reffuse" import { AppQueryClient, AppQueryErrorHandler } from "./query" @@ -12,7 +11,7 @@ export const GlobalContext = ReffuseContext.make< | Geolocation.Geolocation | Permissions.Permissions | HttpClient.HttpClient - | Context.Tag.Service + | AppQueryClient | AppQueryErrorHandler >() diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 1f19be5..bc49195 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -1,4 +1,5 @@ import { Context, Effect, Layer } from "effect" +import type { Mutable } from "effect/Types" import * as ErrorHandler from "./ErrorHandler.js" @@ -18,71 +19,35 @@ export interface ServiceProps { readonly ErrorHandler?: Context.Tag> } -export const Service: < +export interface ServiceResult extends Context.TagClass> { + readonly Live: Layer.Layer< + | Self + | (EH extends ErrorHandler.DefaultErrorHandler + ? ErrorHandler.DefaultErrorHandler + : never) + > +} + +export const Service = < EH = ErrorHandler.DefaultErrorHandler, HandledE = never, >( props?: ServiceProps -) => - () => - & Context.TagClass> - & { readonly Live: Layer.Layer< - | QueryClient - | (EH extends ErrorHandler.DefaultErrorHandler - ? ErrorHandler.DefaultErrorHandler - : never) - > } -= props => () => { - const TagClass = Context.Tag(Id)() as any - TagClass.Live = Layer.empty.pipe( - Layer.provideMerge( - Layer.effect(TagClass, Effect.succeed({ - ErrorHandler: props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler - })) - ), +) => ( + (): ServiceResult => { + const TagClass = Context.Tag(Id)() as ServiceResult + (TagClass as Mutable).Live = Layer.empty.pipe( + Layer.provideMerge( + Layer.effect(TagClass, Effect.succeed({ + ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> + })) + ), - Layer.provideMerge((props?.ErrorHandler - ? Layer.empty - : ErrorHandler.DefaultErrorHandlerLive - ), - )) - - return TagClass -} - - -// export interface MakeProps { -// readonly ErrorHandler?: Context.Tag> -// } - -// export type MakeResult = [ -// tag: Tag, -// layer: Layer.Layer< -// | QueryClient -// | (EH extends ErrorHandler.DefaultErrorHandler -// ? ErrorHandler.DefaultErrorHandler -// : never) -// >, -// ] - -// export const make = < -// EH = ErrorHandler.DefaultErrorHandler, -// HandledE = never, -// >( -// props?: MakeProps -// ): MakeResult => [ -// makeTag(), - -// Layer.empty.pipe( -// Layer.provideMerge( -// Layer.effect(makeTag(), Effect.succeed({ -// ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> -// })) -// ), - -// Layer.provideMerge((props?.ErrorHandler -// ? Layer.empty -// : ErrorHandler.DefaultErrorHandlerLive -// ) as Layer.Layer), -// ), -// ] + Layer.provideMerge((props?.ErrorHandler + ? Layer.empty + : ErrorHandler.DefaultErrorHandlerLive + ) as Layer.Layer), + ) + return TagClass + } +) -- 2.49.1 From 077816efb6cce8a9bbfef5ed1c69b8bd89a46e51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 03:23:12 +0100 Subject: [PATCH 123/326] Fix --- packages/extension-query/src/QueryClient.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index bc49195..b071244 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -1,4 +1,4 @@ -import { Context, Effect, Layer } from "effect" +import { Context, Layer } from "effect" import type { Mutable } from "effect/Types" import * as ErrorHandler from "./ErrorHandler.js" @@ -38,9 +38,9 @@ export const Service = < const TagClass = Context.Tag(Id)() as ServiceResult (TagClass as Mutable).Live = Layer.empty.pipe( Layer.provideMerge( - Layer.effect(TagClass, Effect.succeed({ + Layer.succeed(TagClass, { ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> - })) + }) ), Layer.provideMerge((props?.ErrorHandler -- 2.49.1 From 778ee277950d711b56f050b1d25ab8adfff8c852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 03:33:01 +0100 Subject: [PATCH 124/326] ErrorHandler refactoring --- packages/extension-query/src/ErrorHandler.ts | 40 +++++++++++--------- packages/extension-query/src/QueryClient.ts | 14 +++---- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts index 7e4e912..c3cf4aa 100644 --- a/packages/extension-query/src/ErrorHandler.ts +++ b/packages/extension-query/src/ErrorHandler.ts @@ -1,4 +1,5 @@ -import { type Cause, type Context, Effect, Layer, Queue, Stream } from "effect" +import { type Cause, Context, Effect, Layer, Queue, Stream } from "effect" +import type { Mutable } from "effect/Types" export interface ErrorHandler { @@ -9,25 +10,28 @@ export interface ErrorHandler { export type Error = T extends ErrorHandler ? E : never -export const Tag = (id: Id) => < - Self, E = never, ->() => Effect.Tag(id)>() +export interface ServiceResult extends Context.TagClass> { + readonly Live: Layer.Layer +} -export const layer = ( - tag: Context.TagClass> -): Layer.Layer => Layer.effect(tag, Effect.gen(function*() { - const queue = yield* Queue.unbounded>() - const errors = Stream.fromQueue(queue) +export const Service = (id: Id) => ( + (): ServiceResult => { + const TagClass = Context.Tag(id)() as ServiceResult + (TagClass as Mutable).Live = Layer.effect(TagClass, Effect.gen(function*() { + const queue = yield* Queue.unbounded>() + const errors = Stream.fromQueue(queue) - const handle = ( - self: Effect.Effect - ) => Effect.tapErrorCause(self, cause => - Queue.offer(queue, cause as Cause.Cause) - ) as Effect.Effect, R> + const handle = ( + self: Effect.Effect + ) => Effect.tapErrorCause(self, cause => + Queue.offer(queue, cause as Cause.Cause) + ) as Effect.Effect, R> - return { errors, handle } -})) + return { errors, handle } + })) + return TagClass + } +) -export class DefaultErrorHandler extends Tag("@reffuse/extension-query/DefaultErrorHandler")() {} -export const DefaultErrorHandlerLive = layer(DefaultErrorHandler) +export class DefaultErrorHandler extends Service("@reffuse/extension-query/DefaultErrorHandler")() {} diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index b071244..cd39bc9 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -8,18 +8,18 @@ export interface QueryClient { } -const Id = "@reffuse/extension-query/QueryClient" +const id = "@reffuse/extension-query/QueryClient" -export type TagClassShape = Context.TagClassShape> -export type GenericTagClass = Context.TagClass, typeof Id, QueryClient> -export const makeGenericTagClass = () => Context.GenericTag(Id) as GenericTagClass +export type TagClassShape = Context.TagClassShape> +export type GenericTagClass = Context.TagClass, typeof id, QueryClient> +export const makeGenericTagClass = () => Context.GenericTag(id) as GenericTagClass export interface ServiceProps { readonly ErrorHandler?: Context.Tag> } -export interface ServiceResult extends Context.TagClass> { +export interface ServiceResult extends Context.TagClass> { readonly Live: Layer.Layer< | Self | (EH extends ErrorHandler.DefaultErrorHandler @@ -35,7 +35,7 @@ export const Service = < props?: ServiceProps ) => ( (): ServiceResult => { - const TagClass = Context.Tag(Id)() as ServiceResult + const TagClass = Context.Tag(id)() as ServiceResult (TagClass as Mutable).Live = Layer.empty.pipe( Layer.provideMerge( Layer.succeed(TagClass, { @@ -45,7 +45,7 @@ export const Service = < Layer.provideMerge((props?.ErrorHandler ? Layer.empty - : ErrorHandler.DefaultErrorHandlerLive + : ErrorHandler.DefaultErrorHandler.Live ) as Layer.Layer), ) return TagClass -- 2.49.1 From 447d89982c66bac00b9edc5fda7df8a9dfe53caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 03:34:54 +0100 Subject: [PATCH 125/326] Fix --- packages/example/src/main.tsx | 4 ++-- packages/example/src/query.ts | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index 0f73461..a730288 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -5,7 +5,7 @@ import { Layer } from "effect" import { StrictMode } from "react" import { createRoot } from "react-dom/client" import { ReffuseRuntime } from "reffuse" -import { AppQueryClient, AppQueryErrorHandlerLive } from "./query" +import { AppQueryClient, AppQueryErrorHandler } from "./query" import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" @@ -16,7 +16,7 @@ const layer = Layer.empty.pipe( Layer.provideMerge(Permissions.layer), Layer.provideMerge(FetchHttpClient.layer), Layer.provideMerge(AppQueryClient.Live), - Layer.provideMerge(AppQueryErrorHandlerLive), + Layer.provideMerge(AppQueryErrorHandler.Live), ) const router = createRouter({ routeTree }) diff --git a/packages/example/src/query.ts b/packages/example/src/query.ts index db47f2b..092c355 100644 --- a/packages/example/src/query.ts +++ b/packages/example/src/query.ts @@ -2,10 +2,8 @@ import { HttpClientError } from "@effect/platform" import { ErrorHandler, QueryClient } from "@reffuse/extension-query" -export class AppQueryErrorHandler extends ErrorHandler.Tag("AppQueryErrorHandler")() {} -export const AppQueryErrorHandlerLive = ErrorHandler.layer(AppQueryErrorHandler) - export class AppQueryClient extends QueryClient.Service({ ErrorHandler: AppQueryErrorHandler })() {} -- 2.49.1 From 1f0ff725ff7d4c6ed9f1ea7f4db33f96d03aad02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 04:05:39 +0100 Subject: [PATCH 126/326] Fix --- packages/extension-query/src/QueryClient.ts | 24 +++++---------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index cd39bc9..50d8450 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -20,34 +20,20 @@ export interface ServiceProps { } export interface ServiceResult extends Context.TagClass> { - readonly Live: Layer.Layer< - | Self - | (EH extends ErrorHandler.DefaultErrorHandler - ? ErrorHandler.DefaultErrorHandler - : never) - > + readonly Live: Layer.Layer } export const Service = < EH = ErrorHandler.DefaultErrorHandler, - HandledE = never, + HandledE = ErrorHandler.Error>, >( props?: ServiceProps ) => ( (): ServiceResult => { const TagClass = Context.Tag(id)() as ServiceResult - (TagClass as Mutable).Live = Layer.empty.pipe( - Layer.provideMerge( - Layer.succeed(TagClass, { - ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> - }) - ), - - Layer.provideMerge((props?.ErrorHandler - ? Layer.empty - : ErrorHandler.DefaultErrorHandler.Live - ) as Layer.Layer), - ) + (TagClass as Mutable).Live = Layer.succeed(TagClass, { + ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> + }) return TagClass } ) -- 2.49.1 From e9e17ac2115a5d14a67765ceb73bb9245e0a0169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 04:11:25 +0100 Subject: [PATCH 127/326] Fix --- packages/extension-query/src/QueryClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 50d8450..f5bea0a 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -12,7 +12,7 @@ const id = "@reffuse/extension-query/QueryClient" export type TagClassShape = Context.TagClassShape> export type GenericTagClass = Context.TagClass, typeof id, QueryClient> -export const makeGenericTagClass = () => Context.GenericTag(id) as GenericTagClass +export const makeGenericTagClass = (): GenericTagClass => Context.Tag(id)() export interface ServiceProps { -- 2.49.1 From b04860aa25a1f2b2d6a504baa27372439e0408ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 04:32:51 +0100 Subject: [PATCH 128/326] Cleanup --- packages/extension-query/src/QueryService.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts index 33fce17..38235de 100644 --- a/packages/extension-query/src/QueryService.ts +++ b/packages/extension-query/src/QueryService.ts @@ -11,22 +11,3 @@ export interface QueryService { export const Tag = (id: Id) => < Self, K extends readonly unknown[], A, E = never, >() => Effect.Tag(id)>() - - -// export interface LayerProps { -// readonly query: Effect.Effect -// } - -// export const layer = ( -// tag: Context.TagClass>, -// props: LayerProps, -// ): Layer.Layer => Layer.effect(tag, Effect.gen(function*() { -// const runner = yield* QueryRunner.make({ -// query: props.query -// }) - -// return { -// state: runner.stateRef, -// refresh: runner.forkRefresh, -// } -// })) -- 2.49.1 From 6e6e675709fe17da11400e4dce9a16652827945a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 05:20:37 +0100 Subject: [PATCH 129/326] MutationRunner --- .../extension-query/src/MutationRunner.ts | 165 +++++------------- 1 file changed, 39 insertions(+), 126 deletions(-) diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts index 9eb1cb9..881966c 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/MutationRunner.ts @@ -1,134 +1,47 @@ -// import { BrowserStream } from "@effect/platform-browser" -// import * as AsyncData from "@typed/async-data" -// import { type Cause, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" +import * as AsyncData from "@typed/async-data" +import { type Context, Effect, Ref, SubscriptionRef } from "effect" +import type * as QueryClient from "./QueryClient.js" -// export interface MutationRunner { -// readonly mutation: (...args: K) => Effect.Effect - -// readonly stateRef: SubscriptionRef.SubscriptionRef> - -// readonly forkMutate: Effect.Effect> -// } +export interface MutationRunner { + readonly context: Context.Context + readonly stateRef: SubscriptionRef.SubscriptionRef> + readonly mutate: (...key: K) => Effect.Effect +} -// export interface MakeProps { -// readonly mutation: (...args: K) => Effect.Effect -// } +export interface MakeProps { + readonly QueryClient: QueryClient.GenericTagClass + readonly mutation: (...key: K) => Effect.Effect +} -// export const make = ( -// { key, query }: MakeProps -// ): Effect.Effect, never, R> => Effect.gen(function*() { -// const context = yield* Effect.context() +export const make = ( + { + QueryClient, + mutation, + }: MakeProps +): Effect.Effect< + MutationRunner, R>, + never, + R | QueryClient.TagClassShape | EH +> => Effect.gen(function*() { + const context = yield* Effect.context | EH>() + const stateRef = yield* SubscriptionRef.make(AsyncData.noData>()) -// const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) + const mutate = (...key: K) => QueryClient.pipe( + Effect.flatMap(client => client.ErrorHandler), + Effect.flatMap(errorHandler => mutation(...key).pipe( + errorHandler.handle, + Effect.tapErrorCause(c => Ref.set(stateRef, AsyncData.failure(c))), + Effect.tap(v => Ref.set(stateRef, AsyncData.success(v))), + )), -// const interrupt = fiberRef.pipe( -// Effect.flatMap(Option.match({ -// onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( -// Effect.andThen(Fiber.interrupt(fiber)) -// ), -// onNone: () => Effect.void, -// })) -// ) + Effect.provide(context), + ) -// const forkInterrupt = fiberRef.pipe( -// Effect.flatMap(Option.match({ -// onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( -// Effect.andThen(Fiber.interrupt(fiber).pipe( -// Effect.asVoid, -// Effect.forkDaemon, -// )) -// ), -// onNone: () => Effect.forkDaemon(Effect.void), -// })) -// ) - -// const forkFetch = interrupt.pipe( -// Effect.andThen( -// Ref.set(stateRef, AsyncData.loading()).pipe( -// Effect.andThen(latestKeyRef), -// Effect.flatMap(identity), -// Effect.flatMap(key => query(key).pipe( -// Effect.matchCauseEffect({ -// onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), -// onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), -// }) -// )), - -// Effect.provide(context), -// Effect.fork, -// ) -// ), - -// Effect.flatMap(fiber => -// Ref.set(fiberRef, Option.some(fiber)).pipe( -// Effect.andThen(Fiber.join(fiber)), -// Effect.andThen(Ref.set(fiberRef, Option.none())), -// ) -// ), - -// Effect.forkDaemon, -// ) - -// const forkRefresh = interrupt.pipe( -// Effect.andThen( -// Ref.update(stateRef, previous => { -// if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) -// return AsyncData.refreshing(previous) -// if (AsyncData.isRefreshing(previous)) -// return AsyncData.refreshing(previous.previous) -// return AsyncData.loading() -// }).pipe( -// Effect.andThen(latestKeyRef), -// Effect.flatMap(identity), -// Effect.flatMap(key => query(key).pipe( -// Effect.matchCauseEffect({ -// onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), -// onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), -// }) -// )), - -// Effect.provide(context), -// Effect.fork, -// ) -// ), - -// Effect.flatMap(fiber => -// Ref.set(fiberRef, Option.some(fiber)).pipe( -// Effect.andThen(Fiber.join(fiber)), -// Effect.andThen(Ref.set(fiberRef, Option.none())), -// ) -// ), - -// Effect.forkDaemon, -// ) - -// const fetchOnKeyChange = Effect.addFinalizer(() => interrupt).pipe( -// Effect.andThen(Stream.runForEach(key, latestKey => -// Ref.set(latestKeyRef, Option.some(latestKey)).pipe( -// Effect.andThen(forkFetch) -// ) -// )) -// ) - -// const refreshOnWindowFocus = Stream.runForEach( -// BrowserStream.fromEventListenerWindow("focus"), -// () => forkRefresh, -// ) - -// return { -// query, - -// latestKeyRef, -// stateRef, -// fiberRef, - -// forkInterrupt, -// forkFetch, -// forkRefresh, - -// fetchOnKeyChange, -// refreshOnWindowFocus, -// } -// }) + return { + context, + stateRef, + mutate, + } +}) -- 2.49.1 From 4995b2949f842947ab506a58c0e31fccef5ebfcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 05:20:55 +0100 Subject: [PATCH 130/326] MutationRunner --- packages/extension-query/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index bbf2696..6f603b6 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,4 +1,5 @@ export * as ErrorHandler from "./ErrorHandler.js" +export * as MutationRunner from "./MutationRunner.js" export * as QueryClient from "./QueryClient.js" export * from "./QueryExtension.js" export * as QueryRunner from "./QueryRunner.js" -- 2.49.1 From 299109d42169318655e48f384d86798c3545e420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 06:25:02 +0100 Subject: [PATCH 131/326] Mutation fix --- packages/extension-query/src/MutationRunner.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts index 881966c..d8c294e 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/MutationRunner.ts @@ -30,7 +30,8 @@ export const make = ( const mutate = (...key: K) => QueryClient.pipe( Effect.flatMap(client => client.ErrorHandler), - Effect.flatMap(errorHandler => mutation(...key).pipe( + Effect.flatMap(errorHandler => Ref.set(stateRef, AsyncData.loading()).pipe( + Effect.andThen(mutation(...key)), errorHandler.handle, Effect.tapErrorCause(c => Ref.set(stateRef, AsyncData.failure(c))), Effect.tap(v => Ref.set(stateRef, AsyncData.success(v))), -- 2.49.1 From d56578da8f0ece5234e9f1a970d5d4b3da0e454c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 16 Mar 2025 06:50:20 +0100 Subject: [PATCH 132/326] useMutation --- .../extension-query/src/MutationRunner.ts | 4 +- .../extension-query/src/QueryExtension.ts | 44 ++++++++++++++++++- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts index d8c294e..3f943c5 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/MutationRunner.ts @@ -12,7 +12,7 @@ export interface MutationRunner { export interface MakeProps { readonly QueryClient: QueryClient.GenericTagClass - readonly mutation: (...key: K) => Effect.Effect + readonly mutation: (key: K) => Effect.Effect } export const make = ( @@ -31,7 +31,7 @@ export const make = ( const mutate = (...key: K) => QueryClient.pipe( Effect.flatMap(client => client.ErrorHandler), Effect.flatMap(errorHandler => Ref.set(stateRef, AsyncData.loading()).pipe( - Effect.andThen(mutation(...key)), + Effect.andThen(mutation(key)), errorHandler.handle, Effect.tapErrorCause(c => Ref.set(stateRef, AsyncData.failure(c))), Effect.tap(v => Ref.set(stateRef, AsyncData.success(v))), diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 80cc059..4deeebb 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -2,6 +2,7 @@ import type * as AsyncData from "@typed/async-data" import { type Cause, type Context, Effect, type Fiber, Layer, type Option, type Stream, type SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" +import * as MutationRunner from "./MutationRunner.js" import * as QueryClient from "./QueryClient.js" import * as QueryRunner from "./QueryRunner.js" import type * as QueryService from "./QueryService.js" @@ -24,6 +25,19 @@ export interface UseQueryResult { } +export interface UseMutationProps { + readonly mutation: (key: K) => Effect.Effect +} + +export interface UseMutationResult { + readonly state: SubscriptionRef.SubscriptionRef> + + // readonly layer: ( + // tag: Context.TagClass> + // ) => Layer.Layer +} + + export const QueryExtension = ReffuseExtension.make(() => ({ useQuery< EH, @@ -61,5 +75,33 @@ export const QueryExtension = ReffuseExtension.make(() => ({ refresh: runner.forkRefresh, }), }), [runner]) - } + }, + + useMutation< + EH, + QK extends readonly unknown[], + QA, + QE, + HandledE, + QR extends R, + R, + >( + this: ReffuseHelpers.ReffuseHelpers | EH>, + props: UseMutationProps, + ): UseMutationResult> { + const runner = this.useMemo(() => MutationRunner.make({ + QueryClient: QueryClient.makeGenericTagClass(), + mutation: props.mutation, + }), []) + + return React.useMemo(() => ({ + state: runner.stateRef, + + // layer: tag => Layer.succeed(tag, { + // latestKey: runner.latestKeyRef, + // state: runner.stateRef, + // refresh: runner.forkRefresh, + // }), + }), [runner]) + }, })) -- 2.49.1 From 8636a28f2f6edc83e16b461f1a38fccd66fe1844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 17 Mar 2025 02:15:27 +0100 Subject: [PATCH 133/326] Working mutations --- .../extension-query/src/MutationRunner.ts | 8 ++++++- .../extension-query/src/MutationService.ts | 13 ++++++++++++ .../extension-query/src/QueryExtension.ts | 21 ++++++++++++------- packages/extension-query/src/index.ts | 1 + 4 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 packages/extension-query/src/MutationService.ts diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts index 3f943c5..323c344 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/MutationRunner.ts @@ -1,12 +1,14 @@ import * as AsyncData from "@typed/async-data" -import { type Context, Effect, Ref, SubscriptionRef } from "effect" +import { type Context, Effect, type Fiber, Ref, SubscriptionRef } from "effect" import type * as QueryClient from "./QueryClient.js" export interface MutationRunner { readonly context: Context.Context readonly stateRef: SubscriptionRef.SubscriptionRef> + readonly mutate: (...key: K) => Effect.Effect + readonly forkMutate: (...key: K) => Effect.Effect> } @@ -40,9 +42,13 @@ export const make = ( Effect.provide(context), ) + const forkMutate = (...key: K) => Effect.forkDaemon(mutate(...key)) + return { context, stateRef, + mutate, + forkMutate, } }) diff --git a/packages/extension-query/src/MutationService.ts b/packages/extension-query/src/MutationService.ts new file mode 100644 index 0000000..e366571 --- /dev/null +++ b/packages/extension-query/src/MutationService.ts @@ -0,0 +1,13 @@ +import type * as AsyncData from "@typed/async-data" +import { Effect, type Fiber, type SubscriptionRef } from "effect" + + +export interface MutationService { + readonly state: SubscriptionRef.SubscriptionRef> + readonly mutate: (...key: K) => Effect.Effect + readonly forkMutate: (...key: K) => Effect.Effect> +} + +export const Tag = (id: Id) => < + Self, K extends readonly unknown[], A, E = never, +>() => Effect.Tag(id)>() diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 4deeebb..0fa0b87 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -3,6 +3,7 @@ import { type Cause, type Context, Effect, type Fiber, Layer, type Option, type import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as MutationRunner from "./MutationRunner.js" +import type * as MutationService from "./MutationService.js" import * as QueryClient from "./QueryClient.js" import * as QueryRunner from "./QueryRunner.js" import type * as QueryService from "./QueryService.js" @@ -31,10 +32,12 @@ export interface UseMutationProps { export interface UseMutationResult { readonly state: SubscriptionRef.SubscriptionRef> + readonly mutate: (...key: K) => Effect.Effect + readonly forkMutate: (...key: K) => Effect.Effect> - // readonly layer: ( - // tag: Context.TagClass> - // ) => Layer.Layer + readonly layer: ( + tag: Context.TagClass> + ) => Layer.Layer } @@ -96,12 +99,14 @@ export const QueryExtension = ReffuseExtension.make(() => ({ return React.useMemo(() => ({ state: runner.stateRef, + mutate: runner.mutate, + forkMutate: runner.forkMutate, - // layer: tag => Layer.succeed(tag, { - // latestKey: runner.latestKeyRef, - // state: runner.stateRef, - // refresh: runner.forkRefresh, - // }), + layer: tag => Layer.succeed(tag, { + state: runner.stateRef, + mutate: runner.mutate, + forkMutate: runner.forkMutate, + }), }), [runner]) }, })) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index 6f603b6..e249d09 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,5 +1,6 @@ export * as ErrorHandler from "./ErrorHandler.js" export * as MutationRunner from "./MutationRunner.js" +export * as MutationService from "./MutationService.js" export * as QueryClient from "./QueryClient.js" export * from "./QueryExtension.js" export * as QueryRunner from "./QueryRunner.js" -- 2.49.1 From 3fdc2e31ebe9be4761a2135454ca9c79a5469f51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 17 Mar 2025 02:36:13 +0100 Subject: [PATCH 134/326] Mutation example --- packages/example/src/routeTree.gen.ts | 26 +++++++ .../example/src/routes/query/usemutation.tsx | 67 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 packages/example/src/routes/query/usemutation.tsx diff --git a/packages/example/src/routeTree.gen.ts b/packages/example/src/routeTree.gen.ts index 8e9816d..fd6ea54 100644 --- a/packages/example/src/routeTree.gen.ts +++ b/packages/example/src/routeTree.gen.ts @@ -19,6 +19,7 @@ import { Route as CountImport } from './routes/count' import { Route as BlankImport } from './routes/blank' import { Route as IndexImport } from './routes/index' import { Route as QueryUsequeryImport } from './routes/query/usequery' +import { Route as QueryUsemutationImport } from './routes/query/usemutation' import { Route as QueryServiceImport } from './routes/query/service' // Create/Update Routes @@ -71,6 +72,12 @@ const QueryUsequeryRoute = QueryUsequeryImport.update({ getParentRoute: () => rootRoute, } as any) +const QueryUsemutationRoute = QueryUsemutationImport.update({ + id: '/query/usemutation', + path: '/query/usemutation', + getParentRoute: () => rootRoute, +} as any) + const QueryServiceRoute = QueryServiceImport.update({ id: '/query/service', path: '/query/service', @@ -137,6 +144,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof QueryServiceImport parentRoute: typeof rootRoute } + '/query/usemutation': { + id: '/query/usemutation' + path: '/query/usemutation' + fullPath: '/query/usemutation' + preLoaderRoute: typeof QueryUsemutationImport + parentRoute: typeof rootRoute + } '/query/usequery': { id: '/query/usequery' path: '/query/usequery' @@ -158,6 +172,7 @@ export interface FileRoutesByFullPath { '/tests': typeof TestsRoute '/time': typeof TimeRoute '/query/service': typeof QueryServiceRoute + '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute } @@ -170,6 +185,7 @@ export interface FileRoutesByTo { '/tests': typeof TestsRoute '/time': typeof TimeRoute '/query/service': typeof QueryServiceRoute + '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute } @@ -183,6 +199,7 @@ export interface FileRoutesById { '/tests': typeof TestsRoute '/time': typeof TimeRoute '/query/service': typeof QueryServiceRoute + '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute } @@ -197,6 +214,7 @@ export interface FileRouteTypes { | '/tests' | '/time' | '/query/service' + | '/query/usemutation' | '/query/usequery' fileRoutesByTo: FileRoutesByTo to: @@ -208,6 +226,7 @@ export interface FileRouteTypes { | '/tests' | '/time' | '/query/service' + | '/query/usemutation' | '/query/usequery' id: | '__root__' @@ -219,6 +238,7 @@ export interface FileRouteTypes { | '/tests' | '/time' | '/query/service' + | '/query/usemutation' | '/query/usequery' fileRoutesById: FileRoutesById } @@ -232,6 +252,7 @@ export interface RootRouteChildren { TestsRoute: typeof TestsRoute TimeRoute: typeof TimeRoute QueryServiceRoute: typeof QueryServiceRoute + QueryUsemutationRoute: typeof QueryUsemutationRoute QueryUsequeryRoute: typeof QueryUsequeryRoute } @@ -244,6 +265,7 @@ const rootRouteChildren: RootRouteChildren = { TestsRoute: TestsRoute, TimeRoute: TimeRoute, QueryServiceRoute: QueryServiceRoute, + QueryUsemutationRoute: QueryUsemutationRoute, QueryUsequeryRoute: QueryUsequeryRoute, } @@ -265,6 +287,7 @@ export const routeTree = rootRoute "/tests", "/time", "/query/service", + "/query/usemutation", "/query/usequery" ] }, @@ -292,6 +315,9 @@ export const routeTree = rootRoute "/query/service": { "filePath": "query/service.tsx" }, + "/query/usemutation": { + "filePath": "query/usemutation.tsx" + }, "/query/usequery": { "filePath": "query/usequery.tsx" } diff --git a/packages/example/src/routes/query/usemutation.tsx b/packages/example/src/routes/query/usemutation.tsx new file mode 100644 index 0000000..977a02a --- /dev/null +++ b/packages/example/src/routes/query/usemutation.tsx @@ -0,0 +1,67 @@ +import { R } from "@/reffuse" +import { HttpClient } from "@effect/platform" +import { Button, Container, Flex, Slider, Text } from "@radix-ui/themes" +import { createFileRoute } from "@tanstack/react-router" +import * as AsyncData from "@typed/async-data" +import { Array, Console, Effect, flow, Option, Schema } from "effect" +import { useState } from "react" + + +export const Route = createFileRoute("/query/usemutation")({ + component: RouteComponent +}) + + +const Result = Schema.Array(Schema.String) + +function RouteComponent() { + const runSync = R.useRunSync() + + const [count, setCount] = useState(1) + + const mutation = R.useMutation({ + mutation: ([count]: readonly [count: number]) => Console.log(`Querying ${ count } IDs...`).pipe( + Effect.andThen(Effect.sleep("500 millis")), + Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), + HttpClient.withTracerPropagation(false), + Effect.flatMap(res => res.json), + Effect.flatMap(Schema.decodeUnknown(Result)), + Effect.scoped, + ) + }) + + const [state] = R.useRefState(mutation.state) + + + return ( + + + + + + {AsyncData.match(state, { + NoData: () => "No data yet", + Loading: () => "Loading...", + Success: value => + `Value: ${value}`, + Failure: cause => + `Error: ${cause}`, + })} + + + + + + ) +} -- 2.49.1 From 16893761c6d35c2f508eb5b045b65f248e1b47f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 17 Mar 2025 05:34:19 +0100 Subject: [PATCH 135/326] Mutation refactoring --- .../extension-query/src/MutationRunner.ts | 41 +++++++++++++++---- .../extension-query/src/MutationService.ts | 9 ++-- .../extension-query/src/QueryExtension.ts | 7 +++- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts index 323c344..25334d9 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/MutationRunner.ts @@ -1,5 +1,5 @@ import * as AsyncData from "@typed/async-data" -import { type Context, Effect, type Fiber, Ref, SubscriptionRef } from "effect" +import { type Context, Effect, type Fiber, Queue, Ref, Stream, SubscriptionRef } from "effect" import type * as QueryClient from "./QueryClient.js" @@ -7,8 +7,11 @@ export interface MutationRunner { readonly context: Context.Context readonly stateRef: SubscriptionRef.SubscriptionRef> - readonly mutate: (...key: K) => Effect.Effect - readonly forkMutate: (...key: K) => Effect.Effect> + readonly mutate: (...key: K) => Effect.Effect | AsyncData.Failure> + readonly forkMutate: (...key: K) => Effect.Effect | AsyncData.Failure>, + state: Stream.Stream>, + ]> } @@ -30,19 +33,41 @@ export const make = ( const context = yield* Effect.context | EH>() const stateRef = yield* SubscriptionRef.make(AsyncData.noData>()) - const mutate = (...key: K) => QueryClient.pipe( + const run = ( + key: K, + setState: (value: AsyncData.AsyncData>) => Effect.Effect, + ) => QueryClient.pipe( Effect.flatMap(client => client.ErrorHandler), - Effect.flatMap(errorHandler => Ref.set(stateRef, AsyncData.loading()).pipe( + Effect.flatMap(errorHandler => setState(AsyncData.loading()).pipe( Effect.andThen(mutation(key)), errorHandler.handle, - Effect.tapErrorCause(c => Ref.set(stateRef, AsyncData.failure(c))), - Effect.tap(v => Ref.set(stateRef, AsyncData.success(v))), + Effect.matchCauseEffect({ + onSuccess: v => Effect.succeed(AsyncData.success(v)).pipe( + Effect.tap(setState) + ), + onFailure: c => Effect.succeed(AsyncData.failure(c)).pipe( + Effect.tap(setState) + ), + }), )), Effect.provide(context), ) - const forkMutate = (...key: K) => Effect.forkDaemon(mutate(...key)) + const mutate = (...key: K) => run(key, value => Ref.set(stateRef, value)) + + const forkMutate = (...key: K) => Queue.unbounded>>().pipe( + Effect.flatMap(stateQueue => + run(key, value => Queue.offer(stateQueue, value).pipe( + Effect.andThen(Ref.set(stateRef, value)) + )).pipe( + Effect.tap(() => Queue.shutdown(stateQueue)), + Effect.forkDaemon, + Effect.map(fiber => [fiber, Stream.fromQueue(stateQueue)] as const) + ) + ) + ) + return { context, diff --git a/packages/extension-query/src/MutationService.ts b/packages/extension-query/src/MutationService.ts index e366571..bdfb30a 100644 --- a/packages/extension-query/src/MutationService.ts +++ b/packages/extension-query/src/MutationService.ts @@ -1,11 +1,14 @@ import type * as AsyncData from "@typed/async-data" -import { Effect, type Fiber, type SubscriptionRef } from "effect" +import { Effect, type Fiber, type Stream, type SubscriptionRef } from "effect" export interface MutationService { readonly state: SubscriptionRef.SubscriptionRef> - readonly mutate: (...key: K) => Effect.Effect - readonly forkMutate: (...key: K) => Effect.Effect> + readonly mutate: (...key: K) => Effect.Effect | AsyncData.Failure> + readonly forkMutate: (...key: K) => Effect.Effect | AsyncData.Failure>, + state: Stream.Stream>, + ]> } export const Tag = (id: Id) => < diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 0fa0b87..1be7476 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -32,8 +32,11 @@ export interface UseMutationProps { export interface UseMutationResult { readonly state: SubscriptionRef.SubscriptionRef> - readonly mutate: (...key: K) => Effect.Effect - readonly forkMutate: (...key: K) => Effect.Effect> + readonly mutate: (...key: K) => Effect.Effect | AsyncData.Failure> + readonly forkMutate: (...key: K) => Effect.Effect | AsyncData.Failure>, + state: Stream.Stream>, + ]> readonly layer: ( tag: Context.TagClass> -- 2.49.1 From 65a124de1fe2c72f63c31afbab0a192aa2a90a9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 17 Mar 2025 05:52:13 +0100 Subject: [PATCH 136/326] Mutation tests --- packages/example/src/routes/query/usemutation.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/example/src/routes/query/usemutation.tsx b/packages/example/src/routes/query/usemutation.tsx index 977a02a..cfaae0d 100644 --- a/packages/example/src/routes/query/usemutation.tsx +++ b/packages/example/src/routes/query/usemutation.tsx @@ -3,7 +3,7 @@ import { HttpClient } from "@effect/platform" import { Button, Container, Flex, Slider, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import * as AsyncData from "@typed/async-data" -import { Array, Console, Effect, flow, Option, Schema } from "effect" +import { Array, Console, Effect, flow, Option, Schema, Stream } from "effect" import { useState } from "react" @@ -58,7 +58,12 @@ function RouteComponent() { })} - -- 2.49.1 From f85173fa68e01a3568a68fe0bd40e5f3542cd3ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Mar 2025 02:46:41 +0100 Subject: [PATCH 137/326] Fix --- packages/extension-query/src/MutationRunner.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts index 25334d9..83045c3 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/MutationRunner.ts @@ -58,9 +58,12 @@ export const make = ( const forkMutate = (...key: K) => Queue.unbounded>>().pipe( Effect.flatMap(stateQueue => - run(key, value => Queue.offer(stateQueue, value).pipe( - Effect.andThen(Ref.set(stateRef, value)) - )).pipe( + run( + key, + value => Ref.set(stateRef, value).pipe( + Effect.andThen(Queue.offer(stateQueue, value)) + ), + ).pipe( Effect.tap(() => Queue.shutdown(stateQueue)), Effect.forkDaemon, Effect.map(fiber => [fiber, Stream.fromQueue(stateQueue)] as const) -- 2.49.1 From f21d8b2d8af5bbb685e6f240d1f4cdc707e46a2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 18 Mar 2025 03:11:39 +0100 Subject: [PATCH 138/326] QueryProgress --- packages/extension-query/src/QueryProgress.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 packages/extension-query/src/QueryProgress.ts diff --git a/packages/extension-query/src/QueryProgress.ts b/packages/extension-query/src/QueryProgress.ts new file mode 100644 index 0000000..53d5fee --- /dev/null +++ b/packages/extension-query/src/QueryProgress.ts @@ -0,0 +1,7 @@ +import type * as AsyncData from "@typed/async-data" +import { Effect, type Option } from "effect" + + +export class QueryProgress extends Effect.Tag("@reffuse/extension-query/QueryProgress")) => Effect.Effect +}>() {} -- 2.49.1 From 5d0aecc9d50b25f6ca40916b2e3a98ebc159fac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 19 Mar 2025 05:13:54 +0100 Subject: [PATCH 139/326] QueryProgress --- packages/extension-query/src/QueryProgress.ts | 37 +++++++++++++++++-- packages/extension-query/src/QueryState.ts | 24 ++++++++++++ packages/extension-query/src/index.ts | 2 + 3 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 packages/extension-query/src/QueryState.ts diff --git a/packages/extension-query/src/QueryProgress.ts b/packages/extension-query/src/QueryProgress.ts index 53d5fee..665da94 100644 --- a/packages/extension-query/src/QueryProgress.ts +++ b/packages/extension-query/src/QueryProgress.ts @@ -1,7 +1,36 @@ -import type * as AsyncData from "@typed/async-data" -import { Effect, type Option } from "effect" +import * as AsyncData from "@typed/async-data" +import { Effect, flow, Layer, Match, Option } from "effect" +import * as QueryState from "./QueryState.js" export class QueryProgress extends Effect.Tag("@reffuse/extension-query/QueryProgress")) => Effect.Effect -}>() {} + readonly get: Effect.Effect, never, QueryState.QueryState> + + readonly update: ( + f: (previous: Option.Option) => AsyncData.Progress + ) => Effect.Effect> +}>() { + static readonly Live = Layer.sync(this, () => { + const queryStateTag = QueryState.makeTag() + + const get = queryStateTag.pipe( + Effect.flatMap(state => state.get), + Effect.map(flow(Match.value, + Match.tag("Loading", v => v.progress), + Match.tag("Refreshing", v => v.progress), + Match.orElse(() => Option.none()), + )), + ) + + const update = (f: (previous: Option.Option) => AsyncData.Progress) => get.pipe( + Effect.map(f), + Effect.flatMap(progress => queryStateTag.pipe( + Effect.flatMap(queryState => queryState.update(previous => + AsyncData.updateProgress(previous, progress) + )) + )), + ) + + return { get, update } + }) +} diff --git a/packages/extension-query/src/QueryState.ts b/packages/extension-query/src/QueryState.ts new file mode 100644 index 0000000..3fd2951 --- /dev/null +++ b/packages/extension-query/src/QueryState.ts @@ -0,0 +1,24 @@ +import * as AsyncData from "@typed/async-data" +import { Context, Effect, Layer } from "effect" + + +export interface QueryState { + readonly get: Effect.Effect> + readonly set: (value: AsyncData.AsyncData) => Effect.Effect + readonly update: (f: (previous: AsyncData.AsyncData) => AsyncData.AsyncData) => Effect.Effect +} + +export const makeTag = (): Context.Tag, QueryState> => Context.GenericTag("@reffuse/query-extension/QueryState") + +export const layer = ( + tag: Context.Tag, QueryState>, + get: Effect.Effect>, + set: (value: AsyncData.AsyncData) => Effect.Effect, +): Layer.Layer> => Layer.succeed(tag, { + get, + set, + update: f => get.pipe( + Effect.map(f), + Effect.flatMap(set), + ), +}) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index e249d09..080c361 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -3,5 +3,7 @@ export * as MutationRunner from "./MutationRunner.js" export * as MutationService from "./MutationService.js" export * as QueryClient from "./QueryClient.js" export * from "./QueryExtension.js" +export * as QueryProgress from "./QueryProgress.js" export * as QueryRunner from "./QueryRunner.js" export * as QueryService from "./QueryService.js" +export * as QueryState from "./QueryState.js" -- 2.49.1 From 2b6b36713e2f86e32d3358f10a844dcaf255d679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 20 Mar 2025 04:31:38 +0100 Subject: [PATCH 140/326] MutationRunner work --- .../extension-query/src/MutationRunner.ts | 79 +++++++++++-------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts index 83045c3..0370ab4 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/MutationRunner.ts @@ -1,6 +1,8 @@ import * as AsyncData from "@typed/async-data" import { type Context, Effect, type Fiber, Queue, Ref, Stream, SubscriptionRef } from "effect" import type * as QueryClient from "./QueryClient.js" +import * as QueryProgress from "./QueryProgress.js" +import * as QueryState from "./QueryState.js" export interface MutationRunner { @@ -31,50 +33,63 @@ export const make = ( R | QueryClient.TagClassShape | EH > => Effect.gen(function*() { const context = yield* Effect.context | EH>() - const stateRef = yield* SubscriptionRef.make(AsyncData.noData>()) + const globalStateRef = yield* SubscriptionRef.make(AsyncData.noData>()) - const run = ( - key: K, - setState: (value: AsyncData.AsyncData>) => Effect.Effect, - ) => QueryClient.pipe( - Effect.flatMap(client => client.ErrorHandler), - Effect.flatMap(errorHandler => setState(AsyncData.loading()).pipe( - Effect.andThen(mutation(key)), - errorHandler.handle, - Effect.matchCauseEffect({ - onSuccess: v => Effect.succeed(AsyncData.success(v)).pipe( - Effect.tap(setState) - ), - onFailure: c => Effect.succeed(AsyncData.failure(c)).pipe( - Effect.tap(setState) - ), - }), + const run = (key: K) => Effect.all([ + QueryClient, + QueryState.makeTag>(), + ]).pipe( + Effect.flatMap(([client, state]) => client.ErrorHandler.pipe( + Effect.flatMap(errorHandler => state.set(AsyncData.loading()).pipe( + Effect.andThen(mutation(key)), + errorHandler.handle, + Effect.matchCauseEffect({ + onSuccess: v => Effect.succeed(AsyncData.success(v)).pipe( + Effect.tap(state.set) + ), + onFailure: c => Effect.succeed(AsyncData.failure(c)).pipe( + Effect.tap(state.set) + ), + }), + )) )), Effect.provide(context), + Effect.provide(QueryProgress.QueryProgress.Live), ) - const mutate = (...key: K) => run(key, value => Ref.set(stateRef, value)) + const mutate = (...key: K) => run(key).pipe( + Effect.provide(QueryState.layer( + QueryState.makeTag>(), + globalStateRef, + value => Ref.set(globalStateRef, value), + )) + ) - const forkMutate = (...key: K) => Queue.unbounded>>().pipe( - Effect.flatMap(stateQueue => - run( - key, - value => Ref.set(stateRef, value).pipe( - Effect.andThen(Queue.offer(stateQueue, value)) + const forkMutate = (...key: K) => Effect.gen(function*() { + const stateRef = yield* Ref.make(AsyncData.noData>()) + const stateQueue = yield* Queue.unbounded>>() + + const fiber = yield* Effect.forkDaemon(run(key).pipe( + Effect.tap(() => Queue.shutdown(stateQueue)), + + Effect.provide(QueryState.layer( + QueryState.makeTag>(), + stateRef, + value => Queue.offer(stateQueue, value).pipe( + Effect.andThen(Ref.set(stateRef, value)), + Effect.andThen(Ref.set(globalStateRef, value)), ), - ).pipe( - Effect.tap(() => Queue.shutdown(stateQueue)), - Effect.forkDaemon, - Effect.map(fiber => [fiber, Stream.fromQueue(stateQueue)] as const) - ) - ) - ) + )), + )) + + return [fiber, Stream.fromQueue(stateQueue)] as const + }) return { context, - stateRef, + stateRef: globalStateRef, mutate, forkMutate, -- 2.49.1 From 0f09573948680ac94c69161dc4843ffb881c0e10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 20 Mar 2025 07:10:55 +0100 Subject: [PATCH 141/326] Mutation services --- packages/extension-query/src/MutationRunner.ts | 2 +- packages/extension-query/src/QueryExtension.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts index 0370ab4..0f5d06f 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/MutationRunner.ts @@ -19,7 +19,7 @@ export interface MutationRunner { export interface MakeProps { readonly QueryClient: QueryClient.GenericTagClass - readonly mutation: (key: K) => Effect.Effect + readonly mutation: (key: K) => Effect.Effect>> } export const make = ( diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 1be7476..ef0be44 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -5,8 +5,10 @@ import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as MutationRunner from "./MutationRunner.js" import type * as MutationService from "./MutationService.js" import * as QueryClient from "./QueryClient.js" +import type * as QueryProgress from "./QueryProgress.js" import * as QueryRunner from "./QueryRunner.js" import type * as QueryService from "./QueryService.js" +import type * as QueryState from "./QueryState.js" export interface UseQueryProps { @@ -27,7 +29,7 @@ export interface UseQueryResult { export interface UseMutationProps { - readonly mutation: (key: K) => Effect.Effect + readonly mutation: (key: K) => Effect.Effect> } export interface UseMutationResult { -- 2.49.1 From d82d1d1c29d3c9806d8093bb6e11b4273e3857e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Mar 2025 01:23:47 +0100 Subject: [PATCH 142/326] Refactoring --- .../example/src/routes/query/usemutation.tsx | 2 ++ .../extension-query/src/QueryExtension.ts | 6 ++--- packages/extension-query/src/QueryProgress.ts | 27 ++++++++++--------- packages/extension-query/src/index.ts | 3 --- .../src/{ => internal}/MutationRunner.ts | 6 ++--- .../src/{ => internal}/QueryRunner.ts | 2 +- .../src/{ => internal}/QueryState.ts | 2 +- .../extension-query/src/internal/index.ts | 6 +++++ 8 files changed, 29 insertions(+), 25 deletions(-) rename packages/extension-query/src/{ => internal}/MutationRunner.ts (95%) rename packages/extension-query/src/{ => internal}/QueryRunner.ts (98%) rename packages/extension-query/src/{ => internal}/QueryState.ts (94%) create mode 100644 packages/extension-query/src/internal/index.ts diff --git a/packages/example/src/routes/query/usemutation.tsx b/packages/example/src/routes/query/usemutation.tsx index cfaae0d..caaa1a3 100644 --- a/packages/example/src/routes/query/usemutation.tsx +++ b/packages/example/src/routes/query/usemutation.tsx @@ -1,6 +1,7 @@ import { R } from "@/reffuse" import { HttpClient } from "@effect/platform" import { Button, Container, Flex, Slider, Text } from "@radix-ui/themes" +import { QueryProgress } from "@reffuse/extension-query" import { createFileRoute } from "@tanstack/react-router" import * as AsyncData from "@typed/async-data" import { Array, Console, Effect, flow, Option, Schema, Stream } from "effect" @@ -22,6 +23,7 @@ function RouteComponent() { const mutation = R.useMutation({ mutation: ([count]: readonly [count: number]) => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), + Effect.tap(() => QueryProgress.QueryProgress.get), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index ef0be44..55d2068 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -2,13 +2,11 @@ import type * as AsyncData from "@typed/async-data" import { type Cause, type Context, Effect, type Fiber, Layer, type Option, type Stream, type SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" -import * as MutationRunner from "./MutationRunner.js" import type * as MutationService from "./MutationService.js" import * as QueryClient from "./QueryClient.js" import type * as QueryProgress from "./QueryProgress.js" -import * as QueryRunner from "./QueryRunner.js" import type * as QueryService from "./QueryService.js" -import type * as QueryState from "./QueryState.js" +import { MutationRunner, QueryRunner } from "./internal/index.js" export interface UseQueryProps { @@ -29,7 +27,7 @@ export interface UseQueryResult { export interface UseMutationProps { - readonly mutation: (key: K) => Effect.Effect> + readonly mutation: (key: K) => Effect.Effect } export interface UseMutationResult { diff --git a/packages/extension-query/src/QueryProgress.ts b/packages/extension-query/src/QueryProgress.ts index 665da94..4a78ec5 100644 --- a/packages/extension-query/src/QueryProgress.ts +++ b/packages/extension-query/src/QueryProgress.ts @@ -1,36 +1,37 @@ import * as AsyncData from "@typed/async-data" import { Effect, flow, Layer, Match, Option } from "effect" -import * as QueryState from "./QueryState.js" +import { QueryState } from "./internal/index.js" export class QueryProgress extends Effect.Tag("@reffuse/extension-query/QueryProgress"), never, QueryState.QueryState> + readonly get: Effect.Effect> readonly update: ( f: (previous: Option.Option) => AsyncData.Progress - ) => Effect.Effect> + ) => Effect.Effect }>() { - static readonly Live = Layer.sync(this, () => { - const queryStateTag = QueryState.makeTag() + static readonly Live: Layer.Layer< + QueryProgress, + never, + QueryState.QueryState + > = Layer.effect(this, Effect.gen(function*() { + const state = yield* QueryState.makeTag() - const get = queryStateTag.pipe( - Effect.flatMap(state => state.get), + const get = state.get.pipe( Effect.map(flow(Match.value, Match.tag("Loading", v => v.progress), Match.tag("Refreshing", v => v.progress), Match.orElse(() => Option.none()), - )), + )) ) const update = (f: (previous: Option.Option) => AsyncData.Progress) => get.pipe( Effect.map(f), - Effect.flatMap(progress => queryStateTag.pipe( - Effect.flatMap(queryState => queryState.update(previous => - AsyncData.updateProgress(previous, progress) - )) + Effect.flatMap(progress => state.update(previous => + AsyncData.updateProgress(previous, progress) )), ) return { get, update } - }) + })) } diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index 080c361..d30d000 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,9 +1,6 @@ export * as ErrorHandler from "./ErrorHandler.js" -export * as MutationRunner from "./MutationRunner.js" export * as MutationService from "./MutationService.js" export * as QueryClient from "./QueryClient.js" export * from "./QueryExtension.js" export * as QueryProgress from "./QueryProgress.js" -export * as QueryRunner from "./QueryRunner.js" export * as QueryService from "./QueryService.js" -export * as QueryState from "./QueryState.js" diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/internal/MutationRunner.ts similarity index 95% rename from packages/extension-query/src/MutationRunner.ts rename to packages/extension-query/src/internal/MutationRunner.ts index 0f5d06f..6a7bace 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/internal/MutationRunner.ts @@ -1,7 +1,7 @@ import * as AsyncData from "@typed/async-data" import { type Context, Effect, type Fiber, Queue, Ref, Stream, SubscriptionRef } from "effect" -import type * as QueryClient from "./QueryClient.js" -import * as QueryProgress from "./QueryProgress.js" +import type * as QueryClient from "../QueryClient.js" +import * as QueryProgress from "../QueryProgress.js" import * as QueryState from "./QueryState.js" @@ -19,7 +19,7 @@ export interface MutationRunner { export interface MakeProps { readonly QueryClient: QueryClient.GenericTagClass - readonly mutation: (key: K) => Effect.Effect>> + readonly mutation: (key: K) => Effect.Effect } export const make = ( diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts similarity index 98% rename from packages/extension-query/src/QueryRunner.ts rename to packages/extension-query/src/internal/QueryRunner.ts index ca1f6ae..c0b18c9 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -1,7 +1,7 @@ import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" import { type Cause, type Context, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" -import type * as QueryClient from "./QueryClient.js" +import type * as QueryClient from "../QueryClient.js" export interface QueryRunner { diff --git a/packages/extension-query/src/QueryState.ts b/packages/extension-query/src/internal/QueryState.ts similarity index 94% rename from packages/extension-query/src/QueryState.ts rename to packages/extension-query/src/internal/QueryState.ts index 3fd2951..97bf412 100644 --- a/packages/extension-query/src/QueryState.ts +++ b/packages/extension-query/src/internal/QueryState.ts @@ -1,4 +1,4 @@ -import * as AsyncData from "@typed/async-data" +import type * as AsyncData from "@typed/async-data" import { Context, Effect, Layer } from "effect" diff --git a/packages/extension-query/src/internal/index.ts b/packages/extension-query/src/internal/index.ts new file mode 100644 index 0000000..bf9fec6 --- /dev/null +++ b/packages/extension-query/src/internal/index.ts @@ -0,0 +1,6 @@ +/** @internal */ +export * as MutationRunner from "./MutationRunner.js" +/** @internal */ +export * as QueryRunner from "./QueryRunner.js" +/** @internal */ +export * as QueryState from "./QueryState.js" -- 2.49.1 From 8c0d6b4c8ac2c67902baa490cb1161375b40830d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Mar 2025 01:24:52 +0100 Subject: [PATCH 143/326] Cleanup --- packages/extension-query/src/internal/index.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/extension-query/src/internal/index.ts b/packages/extension-query/src/internal/index.ts index bf9fec6..425849b 100644 --- a/packages/extension-query/src/internal/index.ts +++ b/packages/extension-query/src/internal/index.ts @@ -1,6 +1,3 @@ -/** @internal */ export * as MutationRunner from "./MutationRunner.js" -/** @internal */ export * as QueryRunner from "./QueryRunner.js" -/** @internal */ export * as QueryState from "./QueryState.js" -- 2.49.1 From aab83907bacd908fde12e2fee4d6aed1fc6c3b6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Mar 2025 02:14:36 +0100 Subject: [PATCH 144/326] Working mutation progress --- packages/example/src/QueryErrorHandler.tsx | 29 ++++++++++++------- .../example/src/routes/query/usemutation.tsx | 12 +++++--- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/packages/example/src/QueryErrorHandler.tsx b/packages/example/src/QueryErrorHandler.tsx index 2e9dcaa..2a458ea 100644 --- a/packages/example/src/QueryErrorHandler.tsx +++ b/packages/example/src/QueryErrorHandler.tsx @@ -1,6 +1,6 @@ import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" import { ErrorHandler } from "@reffuse/extension-query" -import { Cause, Chunk, Context, Effect, Match, Option, Stream } from "effect" +import { Cause, Console, Context, Effect, Either, flow, Match, Option, Stream } from "effect" import { useState } from "react" import { AppQueryErrorHandler } from "./query" import { R } from "./reffuse" @@ -12,8 +12,8 @@ export function VQueryErrorHandler() { >>()) R.useFork(() => AppQueryErrorHandler.pipe(Effect.flatMap(handler => - Stream.runForEach(handler.errors, v => Effect.sync(() => - setFailure(Option.some(v)) + Stream.runForEach(handler.errors, v => Console.error(v).pipe( + Effect.andThen(Effect.sync(() => { setFailure(Option.some(v)) })) )) )), []) @@ -23,15 +23,22 @@ export function VQueryErrorHandler() { Error - {Cause.failures(v).pipe( - Chunk.head, - Option.getOrThrow, + {Either.match(Cause.failureOrCause(v), { + onLeft: flow( + Match.value, + Match.tag("RequestError", () => HTTP request error), + Match.tag("ResponseError", () => HTTP response error), + Match.exhaustive, + ), - Match.value, - Match.tag("RequestError", () => HTTP request error), - Match.tag("ResponseError", () => HTTP response error), - Match.exhaustive, - )} + onRight: flow( + Cause.dieOption, + Option.match({ + onSome: () => Unrecoverable defect, + onNone: () => Unknown error, + }), + ), + })} diff --git a/packages/example/src/routes/query/usemutation.tsx b/packages/example/src/routes/query/usemutation.tsx index caaa1a3..988d780 100644 --- a/packages/example/src/routes/query/usemutation.tsx +++ b/packages/example/src/routes/query/usemutation.tsx @@ -16,14 +16,19 @@ export const Route = createFileRoute("/query/usemutation")({ const Result = Schema.Array(Schema.String) function RouteComponent() { - const runSync = R.useRunSync() + const runFork = R.useRunFork() const [count, setCount] = useState(1) const mutation = R.useMutation({ mutation: ([count]: readonly [count: number]) => Console.log(`Querying ${ count } IDs...`).pipe( + Effect.andThen(QueryProgress.QueryProgress.update(() => + AsyncData.Progress.make({ loaded: 0, total: Option.some(100) }) + )), Effect.andThen(Effect.sleep("500 millis")), - Effect.tap(() => QueryProgress.QueryProgress.get), + Effect.tap(() => QueryProgress.QueryProgress.update(() => + AsyncData.Progress.make({ loaded: 50, total: Option.some(100) }) + )), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), @@ -63,8 +68,7 @@ function RouteComponent() { -- 2.49.1 From 2d94e849410da27266e049e84afe785987b9c172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Mar 2025 03:24:55 +0100 Subject: [PATCH 145/326] Stream fix --- packages/extension-lazyref/src/index.ts | 7 ++++--- packages/reffuse/src/ReffuseHelpers.ts | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/extension-lazyref/src/index.ts b/packages/extension-lazyref/src/index.ts index 18e6aef..343ecdf 100644 --- a/packages/extension-lazyref/src/index.ts +++ b/packages/extension-lazyref/src/index.ts @@ -12,9 +12,10 @@ export const LazyRefExtension = ReffuseExtension.make(() => ({ const initialState = this.useMemo(() => ref, [], { doNotReExecuteOnRuntimeOrContextChange: true }) const [reactStateValue, setReactStateValue] = React.useState(initialState) - this.useFork(() => Stream.runForEach(ref.changes, v => Effect.sync(() => - setReactStateValue(v) - )), [ref]) + this.useFork(() => Stream.runForEach( + Stream.changes(ref.changes), + v => Effect.sync(() => setReactStateValue(v)), + ), [ref]) const setValue = this.useCallbackSync((setStateAction: React.SetStateAction) => LazyRef.update(ref, prevState => diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 2f4f449..60ce35d 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -395,9 +395,10 @@ export abstract class ReffuseHelpers { const initialState = this.useMemo(() => ref, [], { doNotReExecuteOnRuntimeOrContextChange: true }) const [reactStateValue, setReactStateValue] = React.useState(initialState) - this.useFork(() => Stream.runForEach(ref.changes, v => Effect.sync(() => - setReactStateValue(v) - )), [ref]) + this.useFork(() => Stream.runForEach( + Stream.changes(ref.changes), + v => Effect.sync(() => setReactStateValue(v)), + ), [ref]) const setValue = this.useCallbackSync((setStateAction: React.SetStateAction) => Ref.update(ref, prevState => -- 2.49.1 From 1ec1db06581b3ce8b69c976be09da06aa0e2c737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Mar 2025 03:38:48 +0100 Subject: [PATCH 146/326] Mutation progress --- packages/example/src/routes/query/usemutation.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/example/src/routes/query/usemutation.tsx b/packages/example/src/routes/query/usemutation.tsx index 988d780..586baff 100644 --- a/packages/example/src/routes/query/usemutation.tsx +++ b/packages/example/src/routes/query/usemutation.tsx @@ -57,11 +57,14 @@ function RouteComponent() { {AsyncData.match(state, { NoData: () => "No data yet", - Loading: () => "Loading...", - Success: value => - `Value: ${value}`, - Failure: cause => - `Error: ${cause}`, + Loading: progress => + `Loading... + ${ Option.match(progress, { + onSome: ({ loaded, total }) => ` (${ loaded }/${ Option.getOrElse(total, () => "unknown") })`, + onNone: () => "", + }) }`, + Success: value => `Value: ${ value }`, + Failure: cause => `Error: ${ cause }`, })} -- 2.49.1 From f9bd5d4d6b969236144c6f6c03111e817aace0f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Mar 2025 04:37:32 +0100 Subject: [PATCH 147/326] Query refactoring --- .../src/internal/MutationRunner.ts | 34 ++++++------ .../src/internal/QueryRunner.ts | 52 ++++++++++++------- 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/packages/extension-query/src/internal/MutationRunner.ts b/packages/extension-query/src/internal/MutationRunner.ts index 6a7bace..b5fcb38 100644 --- a/packages/extension-query/src/internal/MutationRunner.ts +++ b/packages/extension-query/src/internal/MutationRunner.ts @@ -35,23 +35,23 @@ export const make = ( const context = yield* Effect.context | EH>() const globalStateRef = yield* SubscriptionRef.make(AsyncData.noData>()) + const queryStateTag = QueryState.makeTag>() + const run = (key: K) => Effect.all([ - QueryClient, - QueryState.makeTag>(), + queryStateTag, + QueryClient.pipe(Effect.flatMap(client => client.ErrorHandler)), ]).pipe( - Effect.flatMap(([client, state]) => client.ErrorHandler.pipe( - Effect.flatMap(errorHandler => state.set(AsyncData.loading()).pipe( - Effect.andThen(mutation(key)), - errorHandler.handle, - Effect.matchCauseEffect({ - onSuccess: v => Effect.succeed(AsyncData.success(v)).pipe( - Effect.tap(state.set) - ), - onFailure: c => Effect.succeed(AsyncData.failure(c)).pipe( - Effect.tap(state.set) - ), - }), - )) + Effect.flatMap(([state, errorHandler]) => state.set(AsyncData.loading()).pipe( + Effect.andThen(mutation(key)), + errorHandler.handle, + Effect.matchCauseEffect({ + onSuccess: v => Effect.succeed(AsyncData.success(v)).pipe( + Effect.tap(state.set) + ), + onFailure: c => Effect.succeed(AsyncData.failure(c)).pipe( + Effect.tap(state.set) + ), + }), )), Effect.provide(context), @@ -60,7 +60,7 @@ export const make = ( const mutate = (...key: K) => run(key).pipe( Effect.provide(QueryState.layer( - QueryState.makeTag>(), + queryStateTag, globalStateRef, value => Ref.set(globalStateRef, value), )) @@ -74,7 +74,7 @@ export const make = ( Effect.tap(() => Queue.shutdown(stateQueue)), Effect.provide(QueryState.layer( - QueryState.makeTag>(), + queryStateTag, stateRef, value => Queue.offer(stateQueue, value).pipe( Effect.andThen(Ref.set(stateRef, value)), diff --git a/packages/extension-query/src/internal/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts index c0b18c9..8b0d6f9 100644 --- a/packages/extension-query/src/internal/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -2,6 +2,8 @@ import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" import { type Cause, type Context, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" import type * as QueryClient from "../QueryClient.js" +import * as QueryProgress from "../QueryProgress.js" +import * as QueryState from "./QueryState.js" export interface QueryRunner { @@ -43,6 +45,9 @@ export const make = ( const stateRef = yield* SubscriptionRef.make(AsyncData.noData>()) const fiberRef = yield* SubscriptionRef.make(Option.none>()) + const queryStateTag = QueryState.makeTag>() + const queryStateLayer = QueryState.layer(queryStateTag, stateRef, value => Ref.set(stateRef, value)) + const interrupt = fiberRef.pipe( Effect.flatMap(Option.match({ onSome: fiber => Ref.set(fiberRef, Option.none()).pipe( @@ -64,26 +69,31 @@ export const make = ( })) ) - const run = QueryClient.pipe( - Effect.flatMap(client => client.ErrorHandler), - Effect.flatMap(errorHandler => latestKeyRef.pipe( + const run = Effect.all([ + queryStateTag, + QueryClient.pipe(Effect.flatMap(client => client.ErrorHandler)), + ]).pipe( + Effect.flatMap(([state, errorHandler]) => latestKeyRef.pipe( Effect.flatMap(identity), Effect.flatMap(key => query(key).pipe( errorHandler.handle, Effect.matchCauseEffect({ - onSuccess: v => Ref.set(stateRef, AsyncData.success(v)), - onFailure: c => Ref.set(stateRef, AsyncData.failure(c)), + onSuccess: v => state.set(AsyncData.success(v)), + onFailure: c => state.set(AsyncData.failure(c)), }), )), )), Effect.provide(context), + Effect.provide(QueryProgress.QueryProgress.Live), ) - const forkFetch = interrupt.pipe( - Effect.andThen(Ref.set(stateRef, AsyncData.loading()).pipe( - Effect.andThen(run), - Effect.fork, + const forkFetch = queryStateTag.pipe( + Effect.flatMap(state => interrupt.pipe( + Effect.andThen(state.set(AsyncData.loading()).pipe( + Effect.andThen(run), + Effect.fork, + )), )), Effect.flatMap(fiber => @@ -94,18 +104,21 @@ export const make = ( ), Effect.forkDaemon, + Effect.provide(queryStateLayer), ) - const forkRefresh = interrupt.pipe( - Effect.andThen(Ref.update(stateRef, previous => { - if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) - return AsyncData.refreshing(previous) - if (AsyncData.isRefreshing(previous)) - return AsyncData.refreshing(previous.previous) - return AsyncData.loading() - }).pipe( - Effect.andThen(run), - Effect.fork, + const forkRefresh = queryStateTag.pipe( + Effect.flatMap(state => interrupt.pipe( + Effect.andThen(state.update(previous => { + if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) + return AsyncData.refreshing(previous) + if (AsyncData.isRefreshing(previous)) + return AsyncData.refreshing(previous.previous) + return AsyncData.loading() + }).pipe( + Effect.andThen(run), + Effect.fork, + )) )), Effect.flatMap(fiber => @@ -116,6 +129,7 @@ export const make = ( ), Effect.forkDaemon, + Effect.provide(queryStateLayer), ) const fetchOnKeyChange = Effect.addFinalizer(() => interrupt).pipe( -- 2.49.1 From 4cf70ada0baf6f105937d0ea2a2a78e42de17d1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Mar 2025 04:49:44 +0100 Subject: [PATCH 148/326] Fix --- packages/extension-query/src/QueryExtension.ts | 2 +- packages/extension-query/src/internal/QueryRunner.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 55d2068..44d462f 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -11,7 +11,7 @@ import { MutationRunner, QueryRunner } from "./internal/index.js" export interface UseQueryProps { readonly key: Stream.Stream - readonly query: (key: K) => Effect.Effect + readonly query: (key: K) => Effect.Effect readonly refreshOnWindowFocus?: boolean } diff --git a/packages/extension-query/src/internal/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts index 8b0d6f9..a714573 100644 --- a/packages/extension-query/src/internal/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -25,7 +25,7 @@ export interface QueryRunner { export interface MakeProps { readonly QueryClient: QueryClient.GenericTagClass readonly key: Stream.Stream - readonly query: (key: K) => Effect.Effect + readonly query: (key: K) => Effect.Effect } export const make = ( -- 2.49.1 From 224ccd8e32702c57b652adcaac972f021c23c5f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 21 Mar 2025 04:55:38 +0100 Subject: [PATCH 149/326] Fix --- packages/extension-query/src/internal/QueryRunner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-query/src/internal/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts index a714573..c96ec9d 100644 --- a/packages/extension-query/src/internal/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -133,7 +133,7 @@ export const make = ( ) const fetchOnKeyChange = Effect.addFinalizer(() => interrupt).pipe( - Effect.andThen(Stream.runForEach(key, latestKey => + Effect.andThen(Stream.runForEach(Stream.changes(key), latestKey => Ref.set(latestKeyRef, Option.some(latestKey)).pipe( Effect.andThen(forkFetch) ) -- 2.49.1 From 88fab2c7d7866a8b49f3b722aa35a9e8a1a8b348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 23 Mar 2025 06:08:35 +0100 Subject: [PATCH 150/326] ErrorHandler refactoring --- packages/extension-query/src/ErrorHandler.ts | 35 +++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts index c3cf4aa..b777526 100644 --- a/packages/extension-query/src/ErrorHandler.ts +++ b/packages/extension-query/src/ErrorHandler.ts @@ -1,10 +1,10 @@ -import { type Cause, Context, Effect, Layer, Queue, Stream } from "effect" +import { Cause, Context, Effect, identity, Layer, Queue, Stream } from "effect" import type { Mutable } from "effect/Types" export interface ErrorHandler { readonly errors: Stream.Stream> - readonly handle: (self: Effect.Effect) => Effect.Effect, R> + readonly handle: (self: Effect.Effect) => Effect.Effect, R> } export type Error = T extends ErrorHandler ? E : never @@ -14,24 +14,41 @@ export interface ServiceResult extends Context.TagCl readonly Live: Layer.Layer } -export const Service = (id: Id) => ( - (): ServiceResult => { +export const Service = () => ( + ( + id: Id, + f: ( + self: Effect.Effect, + failure: (failure: E) => Effect.Effect, + defect: (defect: unknown) => Effect.Effect, + ) => Effect.Effect, + ): ServiceResult => { const TagClass = Context.Tag(id)() as ServiceResult + (TagClass as Mutable).Live = Layer.effect(TagClass, Effect.gen(function*() { const queue = yield* Queue.unbounded>() const errors = Stream.fromQueue(queue) - const handle = ( + const handle = ( self: Effect.Effect - ) => Effect.tapErrorCause(self, cause => - Queue.offer(queue, cause as Cause.Cause) - ) as Effect.Effect, R> + ): Effect.Effect, R> => f(self, + (failure: E) => Queue.offer(queue, Cause.fail(failure)).pipe( + Effect.andThen(Effect.failCause(Cause.empty)) + ), + (defect: unknown) => Queue.offer(queue, Cause.die(defect)).pipe( + Effect.andThen(Effect.failCause(Cause.empty)) + ), + ) return { errors, handle } })) + return TagClass } ) -export class DefaultErrorHandler extends Service("@reffuse/extension-query/DefaultErrorHandler")() {} +export class DefaultErrorHandler extends Service()( + "@reffuse/extension-query/DefaultErrorHandler", + identity, +) {} -- 2.49.1 From 043e966e459b95e27f3f3345a4fcfd01d3e5d2eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 23 Mar 2025 07:25:03 +0100 Subject: [PATCH 151/326] ErrorHandler work --- packages/extension-query/src/ErrorHandler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts index b777526..0437901 100644 --- a/packages/extension-query/src/ErrorHandler.ts +++ b/packages/extension-query/src/ErrorHandler.ts @@ -4,7 +4,7 @@ import type { Mutable } from "effect/Types" export interface ErrorHandler { readonly errors: Stream.Stream> - readonly handle: (self: Effect.Effect) => Effect.Effect, R> + readonly handle: (self: Effect.Effect) => Effect.Effect, R> } export type Error = T extends ErrorHandler ? E : never @@ -29,9 +29,9 @@ export const Service = () => ( const queue = yield* Queue.unbounded>() const errors = Stream.fromQueue(queue) - const handle = ( + const handle = ( self: Effect.Effect - ): Effect.Effect, R> => f(self, + ): Effect.Effect, R> => f(self as unknown as Effect.Effect, (failure: E) => Queue.offer(queue, Cause.fail(failure)).pipe( Effect.andThen(Effect.failCause(Cause.empty)) ), -- 2.49.1 From 6266c7506ee51b0d330f9f4768f635b19a8e7d87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 23 Mar 2025 07:32:11 +0100 Subject: [PATCH 152/326] Example fix --- packages/example/src/query.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/example/src/query.ts b/packages/example/src/query.ts index 092c355..8d69470 100644 --- a/packages/example/src/query.ts +++ b/packages/example/src/query.ts @@ -1,9 +1,21 @@ import { HttpClientError } from "@effect/platform" import { ErrorHandler, QueryClient } from "@reffuse/extension-query" +import { Effect } from "effect" -export class AppQueryErrorHandler extends ErrorHandler.Service("AppQueryErrorHandler")() {} +>()( + "AppQueryErrorHandler", + + (self, failure, defect) => self.pipe( + Effect.catchTags({ + RequestError: failure, + ResponseError: failure, + }), + + Effect.catchAllDefect(defect), + ), +) {} export class AppQueryClient extends QueryClient.Service({ ErrorHandler: AppQueryErrorHandler })() {} -- 2.49.1 From d55b43284600ebf13be168a6eeca0780643a89ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 23 Mar 2025 23:58:05 +0100 Subject: [PATCH 153/326] Refactoring --- packages/example/src/query.ts | 2 +- packages/extension-query/src/QueryClient.ts | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/example/src/query.ts b/packages/example/src/query.ts index 8d69470..7b659eb 100644 --- a/packages/example/src/query.ts +++ b/packages/example/src/query.ts @@ -18,4 +18,4 @@ export class AppQueryErrorHandler extends ErrorHandler.Service() {} +export class AppQueryClient extends QueryClient.Service()({ ErrorHandler: AppQueryErrorHandler }) {} diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index f5bea0a..dd467f5 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -23,13 +23,13 @@ export interface ServiceResult extends Context.TagClass } -export const Service = < - EH = ErrorHandler.DefaultErrorHandler, - HandledE = ErrorHandler.Error>, ->( - props?: ServiceProps -) => ( - (): ServiceResult => { +export const Service = () => ( + < + EH = ErrorHandler.DefaultErrorHandler, + HandledE = ErrorHandler.Error>, + >( + props?: ServiceProps + ): ServiceResult => { const TagClass = Context.Tag(id)() as ServiceResult (TagClass as Mutable).Live = Layer.succeed(TagClass, { ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> -- 2.49.1 From baa8c922210c1112ced7d0c1e5cf38b3ad8319b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 12:03:55 +0100 Subject: [PATCH 154/326] Query refactoring --- .../src/query/views/Uuid4QueryService.tsx | 4 +- .../example/src/routes/query/usequery.tsx | 4 +- .../extension-query/src/QueryExtension.ts | 13 +- packages/extension-query/src/QueryService.ts | 7 +- .../src/internal/QueryRunner.ts | 111 +++++++++++------- 5 files changed, 87 insertions(+), 52 deletions(-) diff --git a/packages/example/src/query/views/Uuid4QueryService.tsx b/packages/example/src/query/views/Uuid4QueryService.tsx index bc0eada..ff92397 100644 --- a/packages/example/src/query/views/Uuid4QueryService.tsx +++ b/packages/example/src/query/views/Uuid4QueryService.tsx @@ -5,7 +5,7 @@ import { Uuid4Query } from "../services" export function Uuid4QueryService() { - const runSync = R.useRunSync() + const runFork = R.useRunFork() const query = R.useMemo(() => Uuid4Query.Uuid4Query, []) const [state] = R.useRefState(query.state) @@ -25,7 +25,7 @@ export function Uuid4QueryService() { })} - + ) diff --git a/packages/example/src/routes/query/usequery.tsx b/packages/example/src/routes/query/usequery.tsx index 1f76770..8c50f29 100644 --- a/packages/example/src/routes/query/usequery.tsx +++ b/packages/example/src/routes/query/usequery.tsx @@ -15,7 +15,7 @@ export const Route = createFileRoute("/query/usequery")({ const Result = Schema.Array(Schema.String) function RouteComponent() { - const runSync = R.useRunSync() + const runFork = R.useRunFork() const [count, setCount] = useState(1) @@ -59,7 +59,7 @@ function RouteComponent() { })} - + ) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 44d462f..5df8c69 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -18,7 +18,11 @@ export interface UseQueryProps { export interface UseQueryResult { readonly latestKey: SubscriptionRef.SubscriptionRef> readonly state: SubscriptionRef.SubscriptionRef> - readonly refresh: Effect.Effect> + + readonly forkRefresh: Effect.Effect | AsyncData.Failure, Cause.NoSuchElementException>, + state: Stream.Stream>, + ]> readonly layer: ( tag: Context.TagClass> @@ -32,6 +36,7 @@ export interface UseMutationProps { export interface UseMutationResult { readonly state: SubscriptionRef.SubscriptionRef> + readonly mutate: (...key: K) => Effect.Effect | AsyncData.Failure> readonly forkMutate: (...key: K) => Effect.Effect | AsyncData.Failure>, @@ -73,12 +78,13 @@ export const QueryExtension = ReffuseExtension.make(() => ({ return React.useMemo(() => ({ latestKey: runner.latestKeyRef, state: runner.stateRef, - refresh: runner.forkRefresh, + + forkRefresh: runner.forkRefresh, layer: tag => Layer.succeed(tag, { latestKey: runner.latestKeyRef, state: runner.stateRef, - refresh: runner.forkRefresh, + forkRefresh: runner.forkRefresh, }), }), [runner]) }, @@ -102,6 +108,7 @@ export const QueryExtension = ReffuseExtension.make(() => ({ return React.useMemo(() => ({ state: runner.stateRef, + mutate: runner.mutate, forkMutate: runner.forkMutate, diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts index 38235de..ef447b9 100644 --- a/packages/extension-query/src/QueryService.ts +++ b/packages/extension-query/src/QueryService.ts @@ -1,11 +1,14 @@ import type * as AsyncData from "@typed/async-data" -import { type Cause, Effect, type Fiber, type Option, type SubscriptionRef } from "effect" +import { type Cause, Effect, type Fiber, type Option, type Stream, type SubscriptionRef } from "effect" export interface QueryService { readonly latestKey: SubscriptionRef.SubscriptionRef> readonly state: SubscriptionRef.SubscriptionRef> - readonly refresh: Effect.Effect> + readonly forkRefresh: Effect.Effect | AsyncData.Failure, Cause.NoSuchElementException>, + state: Stream.Stream>, + ]> } export const Tag = (id: Id) => < diff --git a/packages/extension-query/src/internal/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts index c96ec9d..15148bc 100644 --- a/packages/extension-query/src/internal/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -1,6 +1,6 @@ import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" -import { type Cause, type Context, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" +import { type Cause, type Context, Effect, Fiber, identity, Option, Queue, Ref, type Scope, Stream, SubscriptionRef } from "effect" import type * as QueryClient from "../QueryClient.js" import * as QueryProgress from "../QueryProgress.js" import * as QueryState from "./QueryState.js" @@ -11,11 +11,20 @@ export interface QueryRunner { readonly latestKeyRef: SubscriptionRef.SubscriptionRef> readonly stateRef: SubscriptionRef.SubscriptionRef> - readonly fiberRef: SubscriptionRef.SubscriptionRef>> + readonly fiberRef: SubscriptionRef.SubscriptionRef | AsyncData.Failure, + Cause.NoSuchElementException + >>> readonly forkInterrupt: Effect.Effect> - readonly forkFetch: Effect.Effect> - readonly forkRefresh: Effect.Effect> + readonly forkFetch: Effect.Effect | AsyncData.Failure, Cause.NoSuchElementException>, + state: Stream.Stream>, + ]> + readonly forkRefresh: Effect.Effect | AsyncData.Failure, Cause.NoSuchElementException>, + state: Stream.Stream>, + ]> readonly fetchOnKeyChange: Effect.Effect readonly refreshOnWindowFocus: Effect.Effect @@ -43,10 +52,12 @@ export const make = ( const latestKeyRef = yield* SubscriptionRef.make(Option.none()) const stateRef = yield* SubscriptionRef.make(AsyncData.noData>()) - const fiberRef = yield* SubscriptionRef.make(Option.none>()) + const fiberRef = yield* SubscriptionRef.make(Option.none | AsyncData.Failure>, + Cause.NoSuchElementException + >>()) const queryStateTag = QueryState.makeTag>() - const queryStateLayer = QueryState.layer(queryStateTag, stateRef, value => Ref.set(stateRef, value)) const interrupt = fiberRef.pipe( Effect.flatMap(Option.match({ @@ -78,8 +89,12 @@ export const make = ( Effect.flatMap(key => query(key).pipe( errorHandler.handle, Effect.matchCauseEffect({ - onSuccess: v => state.set(AsyncData.success(v)), - onFailure: c => state.set(AsyncData.failure(c)), + onSuccess: v => Effect.succeed(AsyncData.success(v)).pipe( + Effect.tap(state.set) + ), + onFailure: c => Effect.succeed(AsyncData.failure(c)).pipe( + Effect.tap(state.set) + ), }), )), )), @@ -88,48 +103,58 @@ export const make = ( Effect.provide(QueryProgress.QueryProgress.Live), ) - const forkFetch = queryStateTag.pipe( - Effect.flatMap(state => interrupt.pipe( - Effect.andThen(state.set(AsyncData.loading()).pipe( - Effect.andThen(run), - Effect.fork, + const forkFetch = Queue.unbounded>>().pipe( + Effect.flatMap(stateQueue => queryStateTag.pipe( + Effect.flatMap(state => interrupt.pipe( + Effect.andThen(state.set(AsyncData.loading()).pipe( + Effect.andThen(run), + Effect.tap(() => Ref.set(fiberRef, Option.none())), + Effect.forkDaemon, + )), + + Effect.tap(fiber => Ref.set(fiberRef, Option.some(fiber))), + Effect.map(fiber => [fiber, Stream.fromQueue(stateQueue)] as const), )), - )), - Effect.flatMap(fiber => - Ref.set(fiberRef, Option.some(fiber)).pipe( - Effect.andThen(Fiber.join(fiber)), - Effect.andThen(Ref.set(fiberRef, Option.none())), - ) - ), - - Effect.forkDaemon, - Effect.provide(queryStateLayer), + Effect.provide(QueryState.layer( + queryStateTag, + stateRef, + value => Queue.offer(stateQueue, value).pipe( + Effect.andThen(Ref.set(stateRef, value)) + ), + )), + )) ) - const forkRefresh = queryStateTag.pipe( - Effect.flatMap(state => interrupt.pipe( - Effect.andThen(state.update(previous => { - if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) - return AsyncData.refreshing(previous) - if (AsyncData.isRefreshing(previous)) - return AsyncData.refreshing(previous.previous) - return AsyncData.loading() - }).pipe( + const setInitialRefreshState = queryStateTag.pipe( + Effect.flatMap(state => state.update(previous => { + if (AsyncData.isSuccess(previous) || AsyncData.isFailure(previous)) + return AsyncData.refreshing(previous) + if (AsyncData.isRefreshing(previous)) + return AsyncData.refreshing(previous.previous) + return AsyncData.loading() + })), + ) + + const forkRefresh = Queue.unbounded>>().pipe( + Effect.flatMap(stateQueue => interrupt.pipe( + Effect.andThen(setInitialRefreshState.pipe( Effect.andThen(run), - Effect.fork, - )) - )), + Effect.tap(() => Ref.set(fiberRef, Option.none())), + Effect.forkDaemon, + )), - Effect.flatMap(fiber => - Ref.set(fiberRef, Option.some(fiber)).pipe( - Effect.andThen(Fiber.join(fiber)), - Effect.andThen(Ref.set(fiberRef, Option.none())), - ) - ), + Effect.tap(fiber => Ref.set(fiberRef, Option.some(fiber))), + Effect.map(fiber => [fiber, Stream.fromQueue(stateQueue)] as const), - Effect.forkDaemon, - Effect.provide(queryStateLayer), + Effect.provide(QueryState.layer( + queryStateTag, + stateRef, + value => Queue.offer(stateQueue, value).pipe( + Effect.andThen(Ref.set(stateRef, value)) + ), + )), + )) ) const fetchOnKeyChange = Effect.addFinalizer(() => interrupt).pipe( -- 2.49.1 From fd3213c53f759fd754c34b5add90cf7493a6a507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 12:06:03 +0100 Subject: [PATCH 155/326] Fix --- packages/extension-query/src/internal/QueryRunner.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/extension-query/src/internal/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts index 15148bc..cbf52e9 100644 --- a/packages/extension-query/src/internal/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -109,6 +109,7 @@ export const make = ( Effect.andThen(state.set(AsyncData.loading()).pipe( Effect.andThen(run), Effect.tap(() => Ref.set(fiberRef, Option.none())), + Effect.tap(() => Queue.shutdown(stateQueue)), Effect.forkDaemon, )), @@ -141,6 +142,7 @@ export const make = ( Effect.andThen(setInitialRefreshState.pipe( Effect.andThen(run), Effect.tap(() => Ref.set(fiberRef, Option.none())), + Effect.tap(() => Queue.shutdown(stateQueue)), Effect.forkDaemon, )), -- 2.49.1 From d9aa42d23a9db0e5351fc77045c841e72dedccdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 12:16:03 +0100 Subject: [PATCH 156/326] Fix --- packages/extension-query/src/internal/QueryRunner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-query/src/internal/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts index cbf52e9..37198c6 100644 --- a/packages/extension-query/src/internal/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -134,7 +134,7 @@ export const make = ( if (AsyncData.isRefreshing(previous)) return AsyncData.refreshing(previous.previous) return AsyncData.loading() - })), + })) ) const forkRefresh = Queue.unbounded>>().pipe( -- 2.49.1 From 3b237c0588c71c690efd576138037124b36c7e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 17:30:41 +0100 Subject: [PATCH 157/326] Query refactoring --- .../extension-query/src/internal/QueryRunner.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/extension-query/src/internal/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts index 37198c6..bc659d3 100644 --- a/packages/extension-query/src/internal/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -106,10 +106,12 @@ export const make = ( const forkFetch = Queue.unbounded>>().pipe( Effect.flatMap(stateQueue => queryStateTag.pipe( Effect.flatMap(state => interrupt.pipe( - Effect.andThen(state.set(AsyncData.loading()).pipe( + Effect.andThen(Effect.addFinalizer(() => Ref.set(fiberRef, Option.none()).pipe( + Effect.andThen(Queue.shutdown(stateQueue)) + )).pipe( + Effect.andThen(state.set(AsyncData.loading())), Effect.andThen(run), - Effect.tap(() => Ref.set(fiberRef, Option.none())), - Effect.tap(() => Queue.shutdown(stateQueue)), + Effect.scoped, Effect.forkDaemon, )), @@ -139,10 +141,12 @@ export const make = ( const forkRefresh = Queue.unbounded>>().pipe( Effect.flatMap(stateQueue => interrupt.pipe( - Effect.andThen(setInitialRefreshState.pipe( + Effect.andThen(Effect.addFinalizer(() => Ref.set(fiberRef, Option.none()).pipe( + Effect.andThen(Queue.shutdown(stateQueue)) + )).pipe( + Effect.andThen(setInitialRefreshState), Effect.andThen(run), - Effect.tap(() => Ref.set(fiberRef, Option.none())), - Effect.tap(() => Queue.shutdown(stateQueue)), + Effect.scoped, Effect.forkDaemon, )), -- 2.49.1 From 7cf536740957d57fa1dc5c55c5e18afd0dcc9036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 17:34:50 +0100 Subject: [PATCH 158/326] Tests --- packages/example/src/routes/query/usequery.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/example/src/routes/query/usequery.tsx b/packages/example/src/routes/query/usequery.tsx index 8c50f29..45bbecc 100644 --- a/packages/example/src/routes/query/usequery.tsx +++ b/packages/example/src/routes/query/usequery.tsx @@ -3,7 +3,7 @@ import { HttpClient } from "@effect/platform" import { Button, Container, Flex, Slider, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import * as AsyncData from "@typed/async-data" -import { Array, Console, Effect, flow, Option, Schema } from "effect" +import { Array, Console, Effect, flow, Option, Schema, Stream } from "effect" import { useState } from "react" @@ -59,7 +59,15 @@ function RouteComponent() { })} - + ) -- 2.49.1 From 516e0a465d389dbbcbcfa03fd904f09d1c9662ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 18:38:14 +0100 Subject: [PATCH 159/326] Ref state fix --- packages/extension-lazyref/src/index.ts | 2 +- packages/reffuse/src/ReffuseHelpers.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/extension-lazyref/src/index.ts b/packages/extension-lazyref/src/index.ts index 343ecdf..ab2704b 100644 --- a/packages/extension-lazyref/src/index.ts +++ b/packages/extension-lazyref/src/index.ts @@ -13,7 +13,7 @@ export const LazyRefExtension = ReffuseExtension.make(() => ({ const [reactStateValue, setReactStateValue] = React.useState(initialState) this.useFork(() => Stream.runForEach( - Stream.changes(ref.changes), + Stream.changesWith(ref.changes, (x, y) => x === y), v => Effect.sync(() => setReactStateValue(v)), ), [ref]) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 60ce35d..81dae91 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -396,7 +396,7 @@ export abstract class ReffuseHelpers { const [reactStateValue, setReactStateValue] = React.useState(initialState) this.useFork(() => Stream.runForEach( - Stream.changes(ref.changes), + Stream.changesWith(ref.changes, (x, y) => x === y), v => Effect.sync(() => setReactStateValue(v)), ), [ref]) -- 2.49.1 From 3552c25b5cb709d71910ac1a06c82838f3314d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 19:07:11 +0100 Subject: [PATCH 160/326] Mutation refactoring --- .../src/internal/MutationRunner.ts | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/packages/extension-query/src/internal/MutationRunner.ts b/packages/extension-query/src/internal/MutationRunner.ts index b5fcb38..cd29477 100644 --- a/packages/extension-query/src/internal/MutationRunner.ts +++ b/packages/extension-query/src/internal/MutationRunner.ts @@ -58,35 +58,36 @@ export const make = ( Effect.provide(QueryProgress.QueryProgress.Live), ) - const mutate = (...key: K) => run(key).pipe( - Effect.provide(QueryState.layer( - queryStateTag, - globalStateRef, - value => Ref.set(globalStateRef, value), - )) + const mutate = (...key: K) => Effect.provide(run(key), QueryState.layer( + queryStateTag, + globalStateRef, + value => Ref.set(globalStateRef, value), + )) + + const forkMutate = (...key: K) => Effect.all([ + Ref.make(AsyncData.noData>()), + Queue.unbounded>>(), + ]).pipe( + Effect.flatMap(([stateRef, stateQueue]) => + Effect.addFinalizer(() => Queue.shutdown(stateQueue)).pipe( + Effect.andThen(run(key)), + Effect.scoped, + Effect.forkDaemon, + + Effect.map(fiber => [fiber, Stream.fromQueue(stateQueue)] as const), + + Effect.provide(QueryState.layer( + queryStateTag, + stateRef, + value => Queue.offer(stateQueue, value).pipe( + Effect.andThen(Ref.set(stateRef, value)), + Effect.andThen(Ref.set(globalStateRef, value)), + ), + )), + ) + ) ) - const forkMutate = (...key: K) => Effect.gen(function*() { - const stateRef = yield* Ref.make(AsyncData.noData>()) - const stateQueue = yield* Queue.unbounded>>() - - const fiber = yield* Effect.forkDaemon(run(key).pipe( - Effect.tap(() => Queue.shutdown(stateQueue)), - - Effect.provide(QueryState.layer( - queryStateTag, - stateRef, - value => Queue.offer(stateQueue, value).pipe( - Effect.andThen(Ref.set(stateRef, value)), - Effect.andThen(Ref.set(globalStateRef, value)), - ), - )), - )) - - return [fiber, Stream.fromQueue(stateQueue)] as const - }) - - return { context, stateRef: globalStateRef, -- 2.49.1 From 49d9edd4b132cda06afec4b7d61f2e447bbabc44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 19:29:12 +0100 Subject: [PATCH 161/326] Dependencies upgrade --- bun.lock | 256 ++++++++++++++----------- package.json | 6 +- packages/example/package.json | 32 ++-- packages/example/src/routes/__root.tsx | 2 +- 4 files changed, 165 insertions(+), 131 deletions(-) diff --git a/bun.lock b/bun.lock index 5d880de..8874156 100644 --- a/bun.lock +++ b/bun.lock @@ -4,46 +4,46 @@ "": { "name": "@reffuse/monorepo", "devDependencies": { - "npm-check-updates": "^17.1.14", + "npm-check-updates": "^17.1.16", "npm-sort": "^0.0.4", "turbo": "^2.4.4", - "typescript": "^5.7.3", + "typescript": "^5.8.2", }, }, "packages/example": { "name": "@reffuse/example", "version": "0.0.0", "dependencies": { - "@effect/platform": "^0.77.6", - "@effect/platform-browser": "^0.56.6", + "@effect/platform": "^0.80.1", + "@effect/platform-browser": "^0.59.1", "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", "@typed/async-data": "^0.13.1", "@typed/id": "^0.17.1", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.13.6", - "lucide-react": "^0.477.0", - "mobx": "^6.13.6", + "effect": "^3.14.1", + "lucide-react": "^0.483.0", + "mobx": "^6.13.7", "reffuse": "workspace:*", }, "devDependencies": { - "@eslint/js": "^9.21.0", - "@tanstack/react-router": "^1.112.7", - "@tanstack/router-devtools": "^1.112.7", - "@tanstack/router-plugin": "^1.112.7", + "@eslint/js": "^9.23.0", + "@tanstack/react-router": "^1.114.27", + "@tanstack/react-router-devtools": "^1.114.27", + "@tanstack/router-plugin": "^1.114.27", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.0.10", + "@types/react": "^19.0.12", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.21.0", + "eslint": "^9.23.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "typescript-eslint": "^8.26.0", - "vite": "^6.2.0", + "typescript-eslint": "^8.28.0", + "vite": "^6.2.3", }, }, "packages/extension-lazyref": { @@ -57,7 +57,7 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.2", + "reffuse": "^0.1.3", }, }, "packages/extension-query": { @@ -73,12 +73,12 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.2", + "reffuse": "^0.1.3", }, }, "packages/reffuse": { "name": "reffuse", - "version": "0.1.2", + "version": "0.1.3", "peerDependencies": { "@types/react": "^19.0.0", "effect": "^3.13.0", @@ -93,11 +93,11 @@ "@babel/compat-data": ["@babel/compat-data@7.26.8", "", {}, "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ=="], - "@babel/core": ["@babel/core@7.26.9", "", { "dependencies": { "@ampproject/remapping": "^2.2.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/helpers": "^7.26.9", "@babel/parser": "^7.26.9", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.9", "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw=="], + "@babel/core": ["@babel/core@7.26.10", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.10", "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ=="], - "@babel/generator": ["@babel/generator@7.26.9", "", { "dependencies": { "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg=="], + "@babel/generator": ["@babel/generator@7.27.0", "", { "dependencies": { "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw=="], - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.26.5", "", { "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA=="], + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.0", "", { "dependencies": { "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA=="], "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], @@ -111,9 +111,9 @@ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="], - "@babel/helpers": ["@babel/helpers@7.26.9", "", { "dependencies": { "@babel/template": "^7.26.9", "@babel/types": "^7.26.9" } }, "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA=="], + "@babel/helpers": ["@babel/helpers@7.27.0", "", { "dependencies": { "@babel/template": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg=="], - "@babel/parser": ["@babel/parser@7.26.9", "", { "dependencies": { "@babel/types": "^7.26.9" }, "bin": "./bin/babel-parser.js" }, "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A=="], + "@babel/parser": ["@babel/parser@7.27.0", "", { "dependencies": { "@babel/types": "^7.27.0" }, "bin": "./bin/babel-parser.js" }, "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg=="], "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA=="], @@ -123,77 +123,79 @@ "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg=="], - "@babel/template": ["@babel/template@7.26.9", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9" } }, "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA=="], + "@babel/template": ["@babel/template@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA=="], - "@babel/traverse": ["@babel/traverse@7.26.9", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.9", "@babel/parser": "^7.26.9", "@babel/template": "^7.26.9", "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg=="], + "@babel/traverse": ["@babel/traverse@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.27.0", "@babel/parser": "^7.27.0", "@babel/template": "^7.27.0", "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA=="], - "@babel/types": ["@babel/types@7.26.9", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw=="], + "@babel/types": ["@babel/types@7.27.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg=="], - "@effect/platform": ["@effect/platform@0.77.6", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.13.6" } }, "sha512-ghhLNyj/UoQvmp2I29nqngMlAzQB72BhjUKcOA58cUPaUUwNy3K2jmUAzdU6SB3RHIObsX44CM/jXZiYfTv59A=="], + "@effect/platform": ["@effect/platform@0.80.1", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.14.1" } }, "sha512-unObetsvXAk4HJn1DM/icnzOjyQ9B2xpUm+jE+g3Oc9OAi0VHVVF3F3eEsw+hWG8deJ46zWjz3Z3iCSi0ER5eQ=="], - "@effect/platform-browser": ["@effect/platform-browser@0.56.6", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.77.6", "effect": "^3.13.6" } }, "sha512-kD4AtfoC81/de3fdk57gRIsKDezr8Fn8jePzjYVx2nGY/0379wJfTwLIDMEHE03Ekv/61UVLbmApT5Cyor3H/A=="], + "@effect/platform-browser": ["@effect/platform-browser@0.59.1", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.80.1", "effect": "^3.14.1" } }, "sha512-wE9rljYnbp6N/XKr9gHHoiXcWYhKCVPdETVKhieuAbk7TFk4HrqCw141QUyfX49Z3gkV6+RdycFHicQjQpepAA=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.0", "", { "os": "android", "cpu": "arm" }, "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.1", "", { "os": "android", "cpu": "arm" }, "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.0", "", { "os": "android", "cpu": "arm64" }, "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.1", "", { "os": "android", "cpu": "arm64" }, "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.0", "", { "os": "android", "cpu": "x64" }, "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.1", "", { "os": "android", "cpu": "x64" }, "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.0", "", { "os": "linux", "cpu": "arm" }, "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.1", "", { "os": "linux", "cpu": "arm" }, "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.0", "", { "os": "linux", "cpu": "none" }, "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.0", "", { "os": "linux", "cpu": "none" }, "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.0", "", { "os": "linux", "cpu": "none" }, "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.0", "", { "os": "linux", "cpu": "x64" }, "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.0", "", { "os": "none", "cpu": "arm64" }, "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.1", "", { "os": "none", "cpu": "arm64" }, "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.0", "", { "os": "none", "cpu": "x64" }, "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.1", "", { "os": "none", "cpu": "x64" }, "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.1", "", { "os": "win32", "cpu": "x64" }, "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.5.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], "@eslint/config-array": ["@eslint/config-array@0.19.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.0", "", {}, "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ=="], + "@eslint/core": ["@eslint/core@0.12.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - "@eslint/js": ["@eslint/js@9.21.0", "", {}, "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw=="], + "@eslint/js": ["@eslint/js@9.23.0", "", {}, "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], @@ -225,6 +227,18 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw=="], + + "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw=="], + + "@msgpackr-extract/msgpackr-extract-linux-arm": ["@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3", "", { "os": "linux", "cpu": "arm" }, "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw=="], + + "@msgpackr-extract/msgpackr-extract-linux-arm64": ["@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg=="], + + "@msgpackr-extract/msgpackr-extract-linux-x64": ["@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3", "", { "os": "linux", "cpu": "x64" }, "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg=="], + + "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], @@ -353,65 +367,69 @@ "@reffuse/extension-query": ["@reffuse/extension-query@workspace:packages/extension-query"], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.34.9", "", { "os": "android", "cpu": "arm" }, "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.37.0", "", { "os": "android", "cpu": "arm" }, "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.34.9", "", { "os": "android", "cpu": "arm64" }, "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.37.0", "", { "os": "android", "cpu": "arm64" }, "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.34.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.37.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.34.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.37.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.34.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.37.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.34.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.37.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.34.9", "", { "os": "linux", "cpu": "arm" }, "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.37.0", "", { "os": "linux", "cpu": "arm" }, "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.34.9", "", { "os": "linux", "cpu": "arm" }, "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.37.0", "", { "os": "linux", "cpu": "arm" }, "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.34.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.37.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.34.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.37.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ=="], - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.34.9", "", { "os": "linux", "cpu": "none" }, "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg=="], + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA=="], - "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.34.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA=="], + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.37.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.34.9", "", { "os": "linux", "cpu": "none" }, "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.34.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.34.9", "", { "os": "linux", "cpu": "x64" }, "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.37.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.34.9", "", { "os": "linux", "cpu": "x64" }, "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.37.0", "", { "os": "linux", "cpu": "x64" }, "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.34.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.37.0", "", { "os": "linux", "cpu": "x64" }, "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.34.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.37.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.34.9", "", { "os": "win32", "cpu": "x64" }, "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.37.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.37.0", "", { "os": "win32", "cpu": "x64" }, "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA=="], "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], - "@tanstack/history": ["@tanstack/history@1.99.13", "", {}, "sha512-JMd7USmnp8zV8BRGIjALqzPxazvKtQ7PGXQC7n39HpbqdsmfV2ePCzieO84IvN+mwsTrXErpbjI4BfKCa+ZNCg=="], + "@tanstack/history": ["@tanstack/history@1.114.22", "", {}, "sha512-CNwKraj/Xa8H7DUyzrFBQC3wL96JzIxT4i9CW0hxqFNNmLDyUcMJr8264iqqfxC0u1lFSG96URad08T2Qhadpw=="], - "@tanstack/react-router": ["@tanstack/react-router@1.112.7", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "^1.112.0", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-udThbvP01cXMvMUK5OPayxuR7ib5AtFL2VnbZSnnKS/dHGsk8KRS+qmkyqZBuuOxRkkF2MC3+BdPj2UTZ4UNjQ=="], + "@tanstack/react-router": ["@tanstack/react-router@1.114.27", "", { "dependencies": { "@tanstack/history": "1.114.22", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "1.114.25", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-xfM+FMXpebZQ5//NQEgj5y5SKQqTQEr2/LvePU9IiksxUBCgfjbuOXW5vgDHJ3xXJm3pivYqRx29cHqhueClow=="], + + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.114.27", "", { "dependencies": { "@tanstack/router-devtools-core": "^1.114.25", "solid-js": "^1.9.5" }, "peerDependencies": { "@tanstack/react-router": "^1.114.27", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-DKgMeFMgVdWiNADSemtYfOMR0dQ8xTtShfgRybDGffDe4iOQgnmeFWW1N4oBJylcj7kFRVm3yVOpDC9G6/zW4w=="], "@tanstack/react-store": ["@tanstack/react-store@0.7.0", "", { "dependencies": { "@tanstack/store": "0.7.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng=="], - "@tanstack/router-core": ["@tanstack/router-core@1.112.0", "", { "dependencies": { "@tanstack/history": "1.99.13", "@tanstack/store": "^0.7.0" } }, "sha512-kmpMiBuz17Hxyl+ZO+B6/F98p07NSEmgr2JlZkKXcdupLIBAWqcXw+bjowFXNcTEwe9RWsS/WjAC/bBTftr0rA=="], + "@tanstack/router-core": ["@tanstack/router-core@1.114.25", "", { "dependencies": { "@tanstack/history": "1.114.22", "@tanstack/store": "^0.7.0", "tiny-invariant": "^1.3.3" } }, "sha512-OyLCfs7r+0LEhmQGAdyJxfO+pqGBITlr4aUN0rdhXqDTpqBn0tyrO6Tu+U9B3LQF9Xnux3KqbjzRopTY9QZBog=="], - "@tanstack/router-devtools": ["@tanstack/router-devtools@1.112.7", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/react-router": "^1.112.7", "csstype": "^3.0.10", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["csstype"] }, "sha512-37qpVzYK4JEg/i0CvnbKI2G+OyWai9yLyvnm8UIc9f2yDzVZKJ1qEpnRXhuLdGCL8dmsf7PjhAPmw46YnD3fHQ=="], + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.114.25", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.114.25", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" }, "optionalPeers": ["csstype"] }, "sha512-3KFAAytAV6nWcXLTe3nWNaiRPV8AyM3jx5aa2UpB+RLDgDbO+GkVMnv3C7fnGCM6j2nw2/1boAvTvHcoKKO5UA=="], - "@tanstack/router-generator": ["@tanstack/router-generator@1.112.7", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.99.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.1" }, "peerDependencies": { "@tanstack/react-router": "^1.112.7" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-2BlV64vej9T+NnjUEX42BOEKpCnC2dUtfxr9Xz0sQk43fMWtNe+2b1jzPzJZWlu8RjaQ5OK22hL+p7GSpph3Kw=="], + "@tanstack/router-generator": ["@tanstack/router-generator@1.114.27", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.114.12", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.2" }, "peerDependencies": { "@tanstack/react-router": "^1.114.27" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-13Cjn9wI2+OE1kK9L+JW8GypdzgA2Nf6D1H2nOiydSPph/iYsyRxCvv3S5hhuGk0L1U1NrRReCr4rVkhnhiQww=="], - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.112.7", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.112.0", "@tanstack/router-generator": "^1.112.7", "@tanstack/router-utils": "^1.102.2", "@tanstack/virtual-file-routes": "^1.99.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.9", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.1" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.112.7", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-9m5UfLSWd5T2jOG9O0BWd1WkChalYfkO/zZjnQ+JoyvixbqTUmkXWkbNtMrZSfM/lNQO4HiftPMMflLSGWMrWg=="], + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.114.27", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.114.25", "@tanstack/router-generator": "^1.114.27", "@tanstack/router-utils": "^1.114.12", "@tanstack/virtual-file-routes": "^1.114.12", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.9", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.114.27", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-/juqdv+TZPsi8GYxq58TpztV93M6BwM7Tv148vM5EZIOCj7LkhQmh4X3E33Eczh8s4D1UCL2Kr607rGEpRpK1w=="], - "@tanstack/router-utils": ["@tanstack/router-utils@1.102.2", "", { "dependencies": { "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "ansis": "^3.11.0", "diff": "^7.0.0" } }, "sha512-Uwl2nbrxhCzviaHHBLNPhSC/OMpZLdOTxTJndUSsXTzWUP4IoQcVmngaIsxi9iriE3ArC1VXuanUAkfGmimNOQ=="], + "@tanstack/router-utils": ["@tanstack/router-utils@1.114.12", "", { "dependencies": { "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "ansis": "^3.11.0", "diff": "^7.0.0" } }, "sha512-W4tltvM9FQuDEJejz/JJD3q/pVHBXBb8VmA77pZlj4IBW97RnUNy8CUwZUgSYcb9OReoO4i/VjjQCUq9ZdiDmg=="], "@tanstack/store": ["@tanstack/store@0.7.0", "", {}, "sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg=="], - "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.99.0", "", {}, "sha512-XvX8bfdo4CYiCW+ItVdBfCorh3PwQFqYqd7ll+XKWiWOJpqUGIG7VlziVavARZpUySiY2VBlHadiUYS7jhgjRg=="], + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.114.12", "", {}, "sha512-aR13V1kSE/kUkP4a8snmqvj82OUlR5Q/rzxICmObLCsERGfzikUc4wquOy1d/RzJgsLb8o+FiOjSWynt4T7Jhg=="], "@thilawyn/thilaschema": ["@thilawyn/thilaschema@0.1.4", "https://git.valverde.cloud/api/packages/Thilawyn/npm/%40thilawyn%2Fthilaschema/-/0.1.4/thilaschema-0.1.4.tgz", { "dependencies": { "remeda": "^2.17.0", "type-fest": "^4.26.1" } }, "sha512-o+lFjnRrD8N7kJtToKl+OYvVnOwaCGr1X9yMSX/8Y1n4KopOOGFSA9xqmx+MpMe3okp2Hq3Xu1aGHzFsZWxc2A=="], @@ -429,33 +447,33 @@ "@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="], - "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/react": ["@types/react@19.0.10", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g=="], + "@types/react": ["@types/react@19.0.12", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA=="], "@types/react-dom": ["@types/react-dom@19.0.4", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.26.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.26.0", "@typescript-eslint/type-utils": "8.26.0", "@typescript-eslint/utils": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.28.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/type-utils": "8.28.0", "@typescript-eslint/utils": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.26.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.26.0", "@typescript-eslint/types": "8.26.0", "@typescript-eslint/typescript-estree": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.28.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/types": "8.28.0", "@typescript-eslint/typescript-estree": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.26.0", "", { "dependencies": { "@typescript-eslint/types": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0" } }, "sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0" } }, "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.26.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.26.0", "@typescript-eslint/utils": "8.26.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.28.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.28.0", "@typescript-eslint/utils": "8.28.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.26.0", "", {}, "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.28.0", "", {}, "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.26.0", "", { "dependencies": { "@typescript-eslint/types": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.26.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.26.0", "@typescript-eslint/types": "8.26.0", "@typescript-eslint/typescript-estree": "8.26.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.28.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/types": "8.28.0", "@typescript-eslint/typescript-estree": "8.28.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.26.0", "", { "dependencies": { "@typescript-eslint/types": "8.26.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@4.3.4", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug=="], - "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], @@ -485,7 +503,7 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001701", "", {}, "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001707", "", {}, "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -511,27 +529,29 @@ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + "detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], "diff": ["diff@7.0.0", "", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="], - "effect": ["effect@3.13.6", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-NKmzyIuOb2UuHFPRz9EYScbhMBxXkzjPRuu+4axE+hMk1f0U7TZxzi2CP3TVVxA2kzvh00aBQEbyH7Opq4PnWg=="], + "effect": ["effect@3.14.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-YrE6KYUu8r+fF3/cvdM+SZRZRjarVGhfcJwQjP/YyMmF79fwE1Rf0nWqLZ9Xfw7a9njm5/wmrYP83RYt5WTTbQ=="], - "electron-to-chromium": ["electron-to-chromium@1.5.111", "", {}, "sha512-vJyJlO95wQRAw6K2ZGF/8nol7AcbCOnp8S6H91mwOOBbXoS9seDBYxCTPYAFsvXLxl3lc0jLXXe9GLxC4nXVog=="], + "electron-to-chromium": ["electron-to-chromium@1.5.123", "", {}, "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA=="], - "esbuild": ["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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw=="], + "esbuild": ["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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.2", "@eslint/core": "^0.12.0", "@eslint/eslintrc": "^3.3.0", "@eslint/js": "9.21.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg=="], + "eslint": ["eslint@9.23.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.2", "@eslint/config-helpers": "^0.2.0", "@eslint/core": "^0.12.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.23.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw=="], "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.19", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ=="], - "eslint-scope": ["eslint-scope@8.2.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A=="], + "eslint-scope": ["eslint-scope@8.3.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ=="], "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], @@ -627,7 +647,7 @@ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "lucide-react": ["lucide-react@0.477.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-yCf7aYxerFZAbd8jHJxjwe1j7jEMPptjnaOqdYeirFnEy85cNR3/L+o0I875CYFYya+eEVzZSbNuRk8BZPDpVw=="], + "lucide-react": ["lucide-react@0.483.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-WldsY17Qb/T3VZdMnVQ9C3DDIP7h1ViDTHVdVGnLZcvHNg30zH/MTQ04RTORjexoGmpsXroiQXZ4QyR0kBy0FA=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], @@ -635,21 +655,27 @@ "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "mobx": ["mobx@6.13.6", "", {}, "sha512-r19KNV0uBN4b+ER8Z0gA4y+MzDYIQ2SvOmn3fUrqPnWXdQfakd9yfbPBDBF/p5I+bd3N5Rk1fHONIvMay+bJGA=="], + "mobx": ["mobx@6.13.7", "", {}, "sha512-aChaVU/DO5aRPmk1GX8L+whocagUUpBQqoPtJk+cm7UOXUk87J4PeWCh6nNmTTIfEhiR9DI/+FnA8dln/hTK7g=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "msgpackr": ["msgpackr@1.11.2", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g=="], + + "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="], + "multipasta": ["multipasta@0.2.5", "", {}, "sha512-c8eMDb1WwZcE02WVjHoOmUVk7fnKU/RmUcosHACglrWAuPQsEJv+E8430sXj6jNc1jHw0zrS16aCjQh4BcEb4A=="], - "nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - "npm-check-updates": ["npm-check-updates@17.1.15", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-miATvKu5rjec/1wxc5TGDjpsucgtCHwRVZorZpDkS6NzdWXfnUWlN4abZddWb7XSijAuBNzzYglIdTm9SbgMVg=="], + "npm-check-updates": ["npm-check-updates@17.1.16", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-9nohkfjLRzLfsLVGbO34eXBejvrOOTuw5tvNammH73KEFG5XlFoi3G2TgjTExHtnrKWCbZ+mTT+dbNeSjASIPw=="], "npm-sort": ["npm-sort@0.0.4", "", { "bin": { "npm-sort": "./index.js" } }, "sha512-S5Id/3Jvr7Cf/QnWjRteprngERCBhhEFOM+wMhUrAYP060/HUBC1aL5GoXS3xITlgacJCWaSmP4HQaAt91nNYQ=="], @@ -699,7 +725,7 @@ "reffuse": ["reffuse@workspace:packages/reffuse"], - "remeda": ["remeda@2.21.0", "", { "dependencies": { "type-fest": "^4.35.0" } }, "sha512-ANFqOts3BsvW1MrKOv9SVHG3ly0MzzLa0HIu5qLkiRuEPGPuH9ny3sgd7VdHvC2VOUSN/7RkmabPlAda6JtGgg=="], + "remeda": ["remeda@2.21.2", "", { "dependencies": { "type-fest": "^4.37.0" } }, "sha512-wdhkMDou8HRpD7RnxKJ/FHJWEGXRH7jV/pb0NsdLLSoBo+G9RjtxcY41hVhogLfEMkThk6aySKjs+Yd6PnpzBA=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -707,7 +733,7 @@ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rollup": ["rollup@4.34.9", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.34.9", "@rollup/rollup-android-arm64": "4.34.9", "@rollup/rollup-darwin-arm64": "4.34.9", "@rollup/rollup-darwin-x64": "4.34.9", "@rollup/rollup-freebsd-arm64": "4.34.9", "@rollup/rollup-freebsd-x64": "4.34.9", "@rollup/rollup-linux-arm-gnueabihf": "4.34.9", "@rollup/rollup-linux-arm-musleabihf": "4.34.9", "@rollup/rollup-linux-arm64-gnu": "4.34.9", "@rollup/rollup-linux-arm64-musl": "4.34.9", "@rollup/rollup-linux-loongarch64-gnu": "4.34.9", "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9", "@rollup/rollup-linux-riscv64-gnu": "4.34.9", "@rollup/rollup-linux-s390x-gnu": "4.34.9", "@rollup/rollup-linux-x64-gnu": "4.34.9", "@rollup/rollup-linux-x64-musl": "4.34.9", "@rollup/rollup-win32-arm64-msvc": "4.34.9", "@rollup/rollup-win32-ia32-msvc": "4.34.9", "@rollup/rollup-win32-x64-msvc": "4.34.9", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ=="], + "rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], @@ -715,10 +741,16 @@ "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "seroval": ["seroval@1.2.1", "", {}, "sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw=="], + + "seroval-plugins": ["seroval-plugins@1.2.1", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw=="], + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "solid-js": ["solid-js@1.9.5", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", "seroval-plugins": "^1.1.0" } }, "sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw=="], + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], @@ -731,7 +763,7 @@ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "ts-api-utils": ["ts-api-utils@2.0.1", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w=="], + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -753,13 +785,13 @@ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@4.36.0", "", {}, "sha512-3T/PUdKTCnkUmhQU6FFJEHsLwadsRegktX3TNHk+2JJB9HlA8gp1/VXblXVDI93kSnXF2rdPx0GMbHtJIV2LPg=="], + "type-fest": ["type-fest@4.38.0", "", {}, "sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg=="], "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], - "typescript-eslint": ["typescript-eslint@8.26.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.26.0", "@typescript-eslint/parser": "8.26.0", "@typescript-eslint/utils": "8.26.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA=="], + "typescript-eslint": ["typescript-eslint@8.28.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.28.0", "@typescript-eslint/parser": "8.28.0", "@typescript-eslint/utils": "8.28.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ=="], - "unplugin": ["unplugin@2.2.0", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw=="], + "unplugin": ["unplugin@2.2.2", "", { "dependencies": { "acorn": "^8.14.1", "webpack-virtual-modules": "^0.6.2" } }, "sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw=="], "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], @@ -771,7 +803,7 @@ "use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], - "vite": ["vite@6.2.0", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ=="], + "vite": ["vite@6.2.3", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], @@ -801,6 +833,8 @@ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], } } diff --git a/package.json b/package.json index 06e0721..30e1821 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/monorepo", - "packageManager": "bun@1.2.2", + "packageManager": "bun@1.2.5", "private": true, "workspaces": [ "./packages/*" @@ -15,9 +15,9 @@ "clean:node": "rm -rf node_modules" }, "devDependencies": { - "npm-check-updates": "^17.1.14", + "npm-check-updates": "^17.1.16", "npm-sort": "^0.0.4", "turbo": "^2.4.4", - "typescript": "^5.7.3" + "typescript": "^5.8.2" } } diff --git a/packages/example/package.json b/packages/example/package.json index 08ae5f9..4da0c9b 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -11,41 +11,41 @@ "preview": "vite preview" }, "devDependencies": { - "@eslint/js": "^9.21.0", - "@tanstack/react-router": "^1.112.7", - "@tanstack/router-devtools": "^1.112.7", - "@tanstack/router-plugin": "^1.112.7", + "@eslint/js": "^9.23.0", + "@tanstack/react-router": "^1.114.27", + "@tanstack/react-router-devtools": "^1.114.27", + "@tanstack/router-plugin": "^1.114.27", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.0.10", + "@types/react": "^19.0.12", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.21.0", + "eslint": "^9.23.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "typescript-eslint": "^8.26.0", - "vite": "^6.2.0" + "typescript-eslint": "^8.28.0", + "vite": "^6.2.3" }, "dependencies": { - "@effect/platform": "^0.77.6", - "@effect/platform-browser": "^0.56.6", + "@effect/platform": "^0.80.1", + "@effect/platform-browser": "^0.59.1", "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", "@typed/async-data": "^0.13.1", "@typed/id": "^0.17.1", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.13.6", - "lucide-react": "^0.477.0", - "mobx": "^6.13.6", + "effect": "^3.14.1", + "lucide-react": "^0.483.0", + "mobx": "^6.13.7", "reffuse": "workspace:*" }, "overrides": { - "effect": "^3.13.6", - "@effect/platform": "^0.77.6", - "@effect/platform-browser": "^0.56.6", + "effect": "^3.14.1", + "@effect/platform": "^0.80.1", + "@effect/platform-browser": "^0.59.1", "@typed/lazy-ref": "^0.3.3", "@typed/async-data": "^0.13.1" } diff --git a/packages/example/src/routes/__root.tsx b/packages/example/src/routes/__root.tsx index 840de40..d5180aa 100644 --- a/packages/example/src/routes/__root.tsx +++ b/packages/example/src/routes/__root.tsx @@ -1,7 +1,7 @@ import { VQueryErrorHandler } from "@/QueryErrorHandler" import { Container, Flex, Theme } from "@radix-ui/themes" import { createRootRoute, Link, Outlet } from "@tanstack/react-router" -import { TanStackRouterDevtools } from "@tanstack/router-devtools" +import { TanStackRouterDevtools } from "@tanstack/react-router-devtools" import "@radix-ui/themes/styles.css" import "../index.css" -- 2.49.1 From a0928c718f99a11992c7c114eba12f52dea62b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 19:33:35 +0100 Subject: [PATCH 162/326] Version bump --- packages/extension-lazyref/package.json | 4 ++-- packages/extension-query/package.json | 4 ++-- packages/reffuse/package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index 5b921aa..1b3022a 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/extension-lazyref", - "version": "0.1.0", + "version": "0.1.1", "type": "module", "files": [ "./README.md", @@ -37,6 +37,6 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.3" + "reffuse": "^0.1.4" } } diff --git a/packages/extension-query/package.json b/packages/extension-query/package.json index a41819c..9ac68b8 100644 --- a/packages/extension-query/package.json +++ b/packages/extension-query/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/extension-query", - "version": "0.1.0", + "version": "0.1.1", "type": "module", "files": [ "./README.md", @@ -39,6 +39,6 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.3" + "reffuse": "^0.1.4" } } diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index bfe88f7..3ceb63e 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -1,6 +1,6 @@ { "name": "reffuse", - "version": "0.1.3", + "version": "0.1.4", "type": "module", "files": [ "./README.md", -- 2.49.1 From 5a121396029075e1996a48c457875b2f70926044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 19:35:56 +0100 Subject: [PATCH 163/326] Regenerated lockfile --- bun.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bun.lock b/bun.lock index 8874156..ab066ea 100644 --- a/bun.lock +++ b/bun.lock @@ -48,7 +48,7 @@ }, "packages/extension-lazyref": { "name": "@reffuse/extension-lazyref", - "version": "0.1.0", + "version": "0.1.1", "devDependencies": { "reffuse": "workspace:*", }, @@ -57,12 +57,12 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.3", + "reffuse": "^0.1.4", }, }, "packages/extension-query": { "name": "@reffuse/extension-query", - "version": "0.1.0", + "version": "0.1.1", "devDependencies": { "reffuse": "workspace:*", }, @@ -73,12 +73,12 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.3", + "reffuse": "^0.1.4", }, }, "packages/reffuse": { "name": "reffuse", - "version": "0.1.3", + "version": "0.1.4", "peerDependencies": { "@types/react": "^19.0.0", "effect": "^3.13.0", -- 2.49.1 From 9eb09046005515ce4f5c53677e332ca6b246b949 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 24 Mar 2025 20:35:22 +0100 Subject: [PATCH 164/326] Refactoring --- packages/reffuse/src/Reffuse.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 87d13e4..1c65dbe 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -7,9 +7,14 @@ import type { Merge, StaticType } from "./types.js" export class Reffuse extends ReffuseHelpers.make() {} +export const make = < + Class extends ReffuseHelpers.ReffuseHelpersClass +>(class_: Class): InstanceType => + new class_() as any + export const withContexts = >( ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] -) => +) => ( < BaseClass extends ReffuseHelpers.ReffuseHelpersClass, R1 @@ -29,9 +34,9 @@ export const withContexts = >( ) => class extends self { static readonly contexts = [...self.contexts, ...contexts] } as any +) - -export const withExtension = (extension: ReffuseExtension.ReffuseExtension) => +export const withExtension = (extension: ReffuseExtension.ReffuseExtension) => ( < BaseClass extends ReffuseHelpers.ReffuseHelpersClass, R @@ -45,3 +50,4 @@ export const withExtension = (extension: ReffuseExtension.Reff Object.assign(class_.prototype, extension()) return class_ as any } +) -- 2.49.1 From 972986241c9c45045f7acd8f16011bb3951966a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 25 Mar 2025 19:29:17 +0100 Subject: [PATCH 165/326] ReffuseHelpers.make() --- packages/reffuse/src/Reffuse.ts | 5 ----- packages/reffuse/src/ReffuseHelpers.ts | 12 +++++++++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 1c65dbe..ccfcfe1 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -7,11 +7,6 @@ import type { Merge, StaticType } from "./types.js" export class Reffuse extends ReffuseHelpers.make() {} -export const make = < - Class extends ReffuseHelpers.ReffuseHelpersClass ->(class_: Class): InstanceType => - new class_() as any - export const withContexts = >( ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] ) => ( diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 81dae91..5553a37 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -428,20 +428,26 @@ export interface ReffuseHelpers extends Pipeable.Pipeable {} ReffuseHelpers.prototype.pipe = function pipe() { return Pipeable.pipeArguments(this, arguments) -} +}; export interface ReffuseHelpersClass extends Pipeable.Pipeable { new(): ReffuseHelpers + make(this: new () => Self): Self readonly contexts: readonly ReffuseContext.ReffuseContext[] } +(ReffuseHelpers as ReffuseHelpersClass).make = function make() { + return new this() +}; + (ReffuseHelpers as ReffuseHelpersClass).pipe = function pipe() { return Pipeable.pipeArguments(this, arguments) -} +}; -export const make = (): ReffuseHelpersClass => +export const make = (): ReffuseHelpersClass => ( class extends (ReffuseHelpers as ReffuseHelpersClass) { static readonly contexts = [] } +) -- 2.49.1 From fb6d80372382c838605f694106fc76dfabdc3b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 26 Mar 2025 19:34:14 +0100 Subject: [PATCH 166/326] Removed JSX code --- packages/reffuse/src/ReffuseContext.tsx | 111 ------------------------ packages/reffuse/src/ReffuseRuntime.ts | 15 ++++ packages/reffuse/src/ReffuseRuntime.tsx | 15 ---- 3 files changed, 15 insertions(+), 126 deletions(-) delete mode 100644 packages/reffuse/src/ReffuseContext.tsx create mode 100644 packages/reffuse/src/ReffuseRuntime.ts delete mode 100644 packages/reffuse/src/ReffuseRuntime.tsx diff --git a/packages/reffuse/src/ReffuseContext.tsx b/packages/reffuse/src/ReffuseContext.tsx deleted file mode 100644 index 89d1394..0000000 --- a/packages/reffuse/src/ReffuseContext.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { Array, Context, Effect, Layer, Runtime } from "effect" -import * as React from "react" -import * as ReffuseRuntime from "./ReffuseRuntime.js" - - -export class ReffuseContext { - readonly Context = React.createContext>(null!) - readonly Provider = makeProvider(this.Context) - readonly AsyncProvider = makeAsyncProvider(this.Context) - - - useContext(): Context.Context { - return React.useContext(this.Context) - } - - useLayer(): Layer.Layer { - const context = this.useContext() - return React.useMemo(() => Layer.effectContext(Effect.succeed(context)), [context]) - } -} - -export type R = T extends ReffuseContext ? R : never - - -export type ReactProvider = React.FC<{ - readonly layer: Layer.Layer - readonly children?: React.ReactNode -}> - -function makeProvider(Context: React.Context>): ReactProvider { - return function ReffuseContextReactProvider(props) { - const runtime = ReffuseRuntime.useRuntime() - - const value = React.useMemo(() => Effect.context().pipe( - Effect.provide(props.layer), - Runtime.runSync(runtime), - ), [props.layer, runtime]) - - return ( - - ) - } -} - -export type AsyncReactProvider = React.FC<{ - readonly layer: Layer.Layer - readonly fallback?: React.ReactNode - readonly children?: React.ReactNode -}> - -function makeAsyncProvider(Context: React.Context>): AsyncReactProvider { - function Inner({ promise, children }: { - readonly promise: Promise> - readonly children?: React.ReactNode - }) { - const value = React.use(promise) - - return ( - - ) - } - - return function ReffuseContextAsyncReactProvider(props) { - const runtime = ReffuseRuntime.useRuntime() - - const promise = React.useMemo(() => Effect.context().pipe( - Effect.provide(props.layer), - Runtime.runPromise(runtime), - ), [props.layer, runtime]) - - return ( - - - - ) - } -} - - -export function make() { - return new ReffuseContext() -} - -export function useMergeAll>( - ...contexts: [...{ [K in keyof T]: ReffuseContext }] -): Context.Context { - const values = contexts.map(v => React.use(v.Context)) - return React.useMemo(() => Context.mergeAll(...values), values) -} - -export function useMergeAllLayers>( - ...contexts: [...{ [K in keyof T]: ReffuseContext }] -): Layer.Layer { - const values = contexts.map(v => React.use(v.Context)) - - return React.useMemo(() => Array.isNonEmptyArray(values) - ? Layer.mergeAll( - ...Array.map(values, context => Layer.effectContext(Effect.succeed(context))) - ) - : Layer.empty as Layer.Layer, - values) -} diff --git a/packages/reffuse/src/ReffuseRuntime.ts b/packages/reffuse/src/ReffuseRuntime.ts new file mode 100644 index 0000000..47e22b0 --- /dev/null +++ b/packages/reffuse/src/ReffuseRuntime.ts @@ -0,0 +1,15 @@ +import { Runtime } from "effect" +import * as React from "react" + + +export const Context = React.createContext>(null!) + +export const Provider = (props: { + readonly children?: React.ReactNode +}) => React.createElement(Context, { + ...props, + value: Runtime.defaultRuntime, +}) +Provider.displayName = "ReffuseRuntimeReactProvider" as const + +export const useRuntime = () => React.useContext(Context) diff --git a/packages/reffuse/src/ReffuseRuntime.tsx b/packages/reffuse/src/ReffuseRuntime.tsx deleted file mode 100644 index 3a6c75e..0000000 --- a/packages/reffuse/src/ReffuseRuntime.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Runtime } from "effect" -import * as React from "react" - - -export const Context = React.createContext>(null!) - -export const Provider = (props: { readonly children?: React.ReactNode }) => ( - -) -Provider.displayName = "ReffuseRuntimeReactProvider" - -export const useRuntime = () => React.useContext(Context) -- 2.49.1 From 03f0b623ed27d8abc4e46048621322266aaf07d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 26 Mar 2025 19:34:21 +0100 Subject: [PATCH 167/326] Removed JSX code --- packages/reffuse/src/ReffuseContext.ts | 94 ++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 packages/reffuse/src/ReffuseContext.ts diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts new file mode 100644 index 0000000..17b1588 --- /dev/null +++ b/packages/reffuse/src/ReffuseContext.ts @@ -0,0 +1,94 @@ +import { Array, Context, Effect, Layer, Runtime } from "effect" +import * as React from "react" +import * as ReffuseRuntime from "./ReffuseRuntime.js" + + +export class ReffuseContext { + readonly Context = React.createContext>(null!) + readonly Provider = makeProvider(this.Context) + readonly AsyncProvider = makeAsyncProvider(this.Context) + + + useContext(): Context.Context { + return React.useContext(this.Context) + } + + useLayer(): Layer.Layer { + const context = this.useContext() + return React.useMemo(() => Layer.effectContext(Effect.succeed(context)), [context]) + } +} + +export type R = T extends ReffuseContext ? R : never + + +export type ReactProvider = React.FC<{ + readonly layer: Layer.Layer + readonly children?: React.ReactNode +}> + +function makeProvider(Context: React.Context>): ReactProvider { + return function ReffuseContextReactProvider(props) { + const runtime = ReffuseRuntime.useRuntime() + + const value = React.useMemo(() => Effect.context().pipe( + Effect.provide(props.layer), + Runtime.runSync(runtime), + ), [props.layer, runtime]) + + return React.createElement(Context, { ...props, value }) + } +} + +export type AsyncReactProvider = React.FC<{ + readonly layer: Layer.Layer + readonly fallback?: React.ReactNode + readonly children?: React.ReactNode +}> + +function makeAsyncProvider(Context: React.Context>): AsyncReactProvider { + function Inner({ promise, children }: { + readonly promise: Promise> + readonly children?: React.ReactNode + }) { + const value = React.use(promise) + return React.createElement(Context, { value, children }) + } + + return function ReffuseContextAsyncReactProvider(props) { + const runtime = ReffuseRuntime.useRuntime() + + const promise = React.useMemo(() => Effect.context().pipe( + Effect.provide(props.layer), + Runtime.runPromise(runtime), + ), [props.layer, runtime]) + + const inner = React.createElement(Inner, { ...props, promise }) + return React.createElement(React.Suspense, { children: inner, fallback: props.fallback }) + } +} + + +export function make() { + return new ReffuseContext() +} + +export function useMergeAll>( + ...contexts: [...{ [K in keyof T]: ReffuseContext }] +): Context.Context { + const values = contexts.map(v => React.use(v.Context)) + return React.useMemo(() => Context.mergeAll(...values), values) +} + +export function useMergeAllLayers>( + ...contexts: [...{ [K in keyof T]: ReffuseContext }] +): Layer.Layer { + const values = contexts.map(v => React.use(v.Context)) + + return React.useMemo(() => Array.isNonEmptyArray(values) + ? Layer.mergeAll( + ...Array.map(values, context => Layer.effectContext(Effect.succeed(context))) + ) + : Layer.empty as Layer.Layer, + values) +} -- 2.49.1 From 66de517ab5d374dbc48cc1d8e23c4b51e0cbe91e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 26 Mar 2025 20:24:53 +0100 Subject: [PATCH 168/326] Refactoring --- packages/reffuse/src/ReffuseContext.ts | 30 ++++++++++++++------------ packages/reffuse/src/ReffuseRuntime.ts | 13 +++++------ 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index 17b1588..8f50a81 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -27,7 +27,7 @@ export type ReactProvider = React.FC<{ readonly children?: React.ReactNode }> -function makeProvider(Context: React.Context>): ReactProvider { +const makeProvider = (Context: React.Context>): ReactProvider => { return function ReffuseContextReactProvider(props) { const runtime = ReffuseRuntime.useRuntime() @@ -46,13 +46,15 @@ export type AsyncReactProvider = React.FC<{ readonly children?: React.ReactNode }> -function makeAsyncProvider(Context: React.Context>): AsyncReactProvider { - function Inner({ promise, children }: { +const makeAsyncProvider = (Context: React.Context>): AsyncReactProvider => { + function ReffuseContextAsyncReactProviderInner({ promise, children }: { readonly promise: Promise> readonly children?: React.ReactNode }) { - const value = React.use(promise) - return React.createElement(Context, { value, children }) + return React.createElement(Context, { + value: React.use(promise), + children, + }) } return function ReffuseContextAsyncReactProvider(props) { @@ -63,26 +65,26 @@ function makeAsyncProvider(Context: React.Context>): Async Runtime.runPromise(runtime), ), [props.layer, runtime]) - const inner = React.createElement(Inner, { ...props, promise }) - return React.createElement(React.Suspense, { children: inner, fallback: props.fallback }) + return React.createElement(React.Suspense, { + children: React.createElement(ReffuseContextAsyncReactProviderInner, { ...props, promise }), + fallback: props.fallback, + }) } } -export function make() { - return new ReffuseContext() -} +export const make = () => new ReffuseContext() -export function useMergeAll>( +export const useMergeAll = >( ...contexts: [...{ [K in keyof T]: ReffuseContext }] -): Context.Context { +): Context.Context => { const values = contexts.map(v => React.use(v.Context)) return React.useMemo(() => Context.mergeAll(...values), values) } -export function useMergeAllLayers>( +export const useMergeAllLayers = >( ...contexts: [...{ [K in keyof T]: ReffuseContext }] -): Layer.Layer { +): Layer.Layer => { const values = contexts.map(v => React.use(v.Context)) return React.useMemo(() => Array.isNonEmptyArray(values) diff --git a/packages/reffuse/src/ReffuseRuntime.ts b/packages/reffuse/src/ReffuseRuntime.ts index 47e22b0..d070bb2 100644 --- a/packages/reffuse/src/ReffuseRuntime.ts +++ b/packages/reffuse/src/ReffuseRuntime.ts @@ -4,12 +4,13 @@ import * as React from "react" export const Context = React.createContext>(null!) -export const Provider = (props: { +export const Provider = function ReffuseRuntimeReactProvider(props: { readonly children?: React.ReactNode -}) => React.createElement(Context, { - ...props, - value: Runtime.defaultRuntime, -}) -Provider.displayName = "ReffuseRuntimeReactProvider" as const +}) { + return React.createElement(Context, { + ...props, + value: Runtime.defaultRuntime, + }) +} export const useRuntime = () => React.useContext(Context) -- 2.49.1 From ddcd681ca455c5f4ab6e62a43461ee7b3895b0e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 16:08:04 +0100 Subject: [PATCH 169/326] Provider refactoring --- packages/reffuse/src/ReffuseContext.ts | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index 8f50a81..6467c68 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -1,4 +1,4 @@ -import { Array, Context, Effect, Layer, Runtime } from "effect" +import { Array, Context, Effect, Layer, Ref, Runtime, Scope } from "effect" import * as React from "react" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -31,10 +31,27 @@ const makeProvider = (Context: React.Context>): ReactProvi return function ReffuseContextReactProvider(props) { const runtime = ReffuseRuntime.useRuntime() - const value = React.useMemo(() => Effect.context().pipe( - Effect.provide(props.layer), + const makeScopeAndContext = React.useMemo(() => Scope.make().pipe( + Effect.flatMap(scope => Effect.context().pipe( + Effect.map(context => [scope, context] as const), + + Effect.provide(props.layer), + Effect.provideService(Scope.Scope, scope), + )) + ), [props.layer]) + + const [initialScope, initialValue, isInitialRun] = React.useMemo(() => makeScopeAndContext.pipe( + Effect.flatMap(v => Ref.make(true).pipe( + Effect.map(isInitialRun => [...v, isInitialRun] as const) + )), Runtime.runSync(runtime), - ), [props.layer, runtime]) + ), []) + + const [value, setValue] = React.useState(initialValue) + + React.useEffect(() => { + + }, []) return React.createElement(Context, { ...props, value }) } -- 2.49.1 From 9a9bd78ec6f5a63db8567599c7ff01d2af1e8e52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 17:01:41 +0100 Subject: [PATCH 170/326] Provider work --- packages/reffuse/src/ReffuseContext.ts | 33 ++++++++++++++++---------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index 6467c68..b873724 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -1,4 +1,4 @@ -import { Array, Context, Effect, Layer, Ref, Runtime, Scope } from "effect" +import { Array, Context, Effect, Exit, Layer, Ref, Runtime, Scope } from "effect" import * as React from "react" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -31,27 +31,36 @@ const makeProvider = (Context: React.Context>): ReactProvi return function ReffuseContextReactProvider(props) { const runtime = ReffuseRuntime.useRuntime() - const makeScopeAndContext = React.useMemo(() => Scope.make().pipe( - Effect.flatMap(scope => Effect.context().pipe( - Effect.map(context => [scope, context] as const), - + const makeScopeAndContext = React.useMemo(() => Effect.Do.pipe( + Effect.bind("scope", () => Scope.make()), + Effect.bind("context", ({ scope }) => Effect.context().pipe( Effect.provide(props.layer), Effect.provideService(Scope.Scope, scope), - )) + )), + Effect.map(({ scope, context }) => [scope, context] as const), ), [props.layer]) - const [initialScope, initialValue, isInitialRun] = React.useMemo(() => makeScopeAndContext.pipe( - Effect.flatMap(v => Ref.make(true).pipe( - Effect.map(isInitialRun => [...v, isInitialRun] as const) - )), + const [isInitialRun, initialScope, initialValue] = React.useMemo(() => Effect.Do.pipe( + Effect.bind("isInitialRun", () => Ref.make(true)), + Effect.bind("scopeAndContext", () => makeScopeAndContext), + Effect.map(({ isInitialRun, scopeAndContext }) => [isInitialRun, ...scopeAndContext] as const), Runtime.runSync(runtime), ), []) const [value, setValue] = React.useState(initialValue) - React.useEffect(() => { + React.useEffect(() => isInitialRun.pipe( + Effect.if({ + onTrue: () => Ref.set(isInitialRun, false), + onFalse: () => Effect.Do.pipe( + Effect.tap(Scope.close(initialScope, Exit.void)), + Effect.bind("scopeAndContext", () => makeScopeAndContext), + Effect.tap(({ scopeAndContext }) => Effect.sync(() => setValue())) + ), + }), - }, []) + Runtime.runSync(runtime), + ), [makeScopeAndContext, runtime]) return React.createElement(Context, { ...props, value }) } -- 2.49.1 From 57b7eac05cf378f4e5b3449ecca2bba89f21396f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 17:37:28 +0100 Subject: [PATCH 171/326] Test --- .gitea/workflows/lint.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/lint.yaml b/.gitea/workflows/lint.yaml index d96555a..3b7b274 100644 --- a/.gitea/workflows/lint.yaml +++ b/.gitea/workflows/lint.yaml @@ -10,7 +10,7 @@ jobs: uses: oven-sh/setup-bun@v1 - name: Clone repo uses: actions/checkout@v4 - - name: Install dependencies - run: bun install --frozen-lockfile - - name: Build - run: bun run build + # - name: Install dependencies + # run: bun install --frozen-lockfile + # - name: Build + # run: bun run build -- 2.49.1 From b5712d5433910629c7386510251b4f5143c2c2af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 17:39:23 +0100 Subject: [PATCH 172/326] Test --- .gitea/workflows/lint.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/lint.yaml b/.gitea/workflows/lint.yaml index 3b7b274..c4b8236 100644 --- a/.gitea/workflows/lint.yaml +++ b/.gitea/workflows/lint.yaml @@ -6,8 +6,8 @@ jobs: lint: runs-on: ubuntu-latest steps: - - name: Setup Bun - uses: oven-sh/setup-bun@v1 + # - name: Setup Bun + # uses: oven-sh/setup-bun@v1 - name: Clone repo uses: actions/checkout@v4 # - name: Install dependencies -- 2.49.1 From b4cd7daa81745c9e1eaba55483b261c341a87b64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 18:26:04 +0100 Subject: [PATCH 173/326] Restore --- .gitea/workflows/lint.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/lint.yaml b/.gitea/workflows/lint.yaml index c4b8236..d96555a 100644 --- a/.gitea/workflows/lint.yaml +++ b/.gitea/workflows/lint.yaml @@ -6,11 +6,11 @@ jobs: lint: runs-on: ubuntu-latest steps: - # - name: Setup Bun - # uses: oven-sh/setup-bun@v1 + - name: Setup Bun + uses: oven-sh/setup-bun@v1 - name: Clone repo uses: actions/checkout@v4 - # - name: Install dependencies - # run: bun install --frozen-lockfile - # - name: Build - # run: bun run build + - name: Install dependencies + run: bun install --frozen-lockfile + - name: Build + run: bun run build -- 2.49.1 From 0a4bb2856d6cfe78d0c2fb87afe49878a1f941a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 18:48:49 +0100 Subject: [PATCH 174/326] Provider refactoring --- packages/reffuse/src/ReffuseContext.ts | 34 ++++++++++++++------------ 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index b873724..39ec634 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -23,28 +23,26 @@ export type R = T extends ReffuseContext ? R : never export type ReactProvider = React.FC<{ - readonly layer: Layer.Layer + readonly layer: Layer.Layer readonly children?: React.ReactNode }> const makeProvider = (Context: React.Context>): ReactProvider => { return function ReffuseContextReactProvider(props) { const runtime = ReffuseRuntime.useRuntime() + const runSync = React.useMemo(() => Runtime.runSync(runtime), [runtime]) - const makeScopeAndContext = React.useMemo(() => Effect.Do.pipe( - Effect.bind("scope", () => Scope.make()), - Effect.bind("context", ({ scope }) => Effect.context().pipe( - Effect.provide(props.layer), - Effect.provideService(Scope.Scope, scope), - )), - Effect.map(({ scope, context }) => [scope, context] as const), + const makeContext = React.useCallback((scope: Scope.CloseableScope) => Effect.context().pipe( + Effect.provide(props.layer), + Effect.provideService(Scope.Scope, scope), ), [props.layer]) const [isInitialRun, initialScope, initialValue] = React.useMemo(() => Effect.Do.pipe( Effect.bind("isInitialRun", () => Ref.make(true)), - Effect.bind("scopeAndContext", () => makeScopeAndContext), - Effect.map(({ isInitialRun, scopeAndContext }) => [isInitialRun, ...scopeAndContext] as const), - Runtime.runSync(runtime), + Effect.bind("scope", () => Scope.make()), + Effect.bind("context", ({ scope }) => makeContext(scope)), + Effect.map(({ isInitialRun, scope, context }) => [isInitialRun, scope, context] as const), + runSync, ), []) const [value, setValue] = React.useState(initialValue) @@ -54,13 +52,19 @@ const makeProvider = (Context: React.Context>): ReactProvi onTrue: () => Ref.set(isInitialRun, false), onFalse: () => Effect.Do.pipe( Effect.tap(Scope.close(initialScope, Exit.void)), - Effect.bind("scopeAndContext", () => makeScopeAndContext), - Effect.tap(({ scopeAndContext }) => Effect.sync(() => setValue())) + Effect.bind("scope", () => Scope.make()), + Effect.bind("context", ({ scope }) => makeContext(scope)), + Effect.tap(({ context }) => + Effect.sync(() => setValue(context)) + ), + Effect.map(({ scope }) => + () => runSync(Scope.close(scope, Exit.void)) + ), ), }), - Runtime.runSync(runtime), - ), [makeScopeAndContext, runtime]) + runSync, + ), [makeContext, runSync]) return React.createElement(Context, { ...props, value }) } -- 2.49.1 From 8ea9146dd9a6fdaeac21bda006fe9780d5dc90a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 19:18:46 +0100 Subject: [PATCH 175/326] Provider refactoring --- packages/example/src/routeTree.gen.ts | 26 +++++++++++++++++++ packages/example/src/routes/index.tsx | 27 +++----------------- packages/example/src/routes/todos.tsx | 35 ++++++++++++++++++++++++++ packages/reffuse/src/ReffuseContext.ts | 8 ++++-- 4 files changed, 71 insertions(+), 25 deletions(-) create mode 100644 packages/example/src/routes/todos.tsx diff --git a/packages/example/src/routeTree.gen.ts b/packages/example/src/routeTree.gen.ts index fd6ea54..7080a30 100644 --- a/packages/example/src/routeTree.gen.ts +++ b/packages/example/src/routeTree.gen.ts @@ -11,6 +11,7 @@ // Import Routes import { Route as rootRoute } from './routes/__root' +import { Route as TodosImport } from './routes/todos' import { Route as TimeImport } from './routes/time' import { Route as TestsImport } from './routes/tests' import { Route as PromiseImport } from './routes/promise' @@ -24,6 +25,12 @@ import { Route as QueryServiceImport } from './routes/query/service' // Create/Update Routes +const TodosRoute = TodosImport.update({ + id: '/todos', + path: '/todos', + getParentRoute: () => rootRoute, +} as any) + const TimeRoute = TimeImport.update({ id: '/time', path: '/time', @@ -137,6 +144,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof TimeImport parentRoute: typeof rootRoute } + '/todos': { + id: '/todos' + path: '/todos' + fullPath: '/todos' + preLoaderRoute: typeof TodosImport + parentRoute: typeof rootRoute + } '/query/service': { id: '/query/service' path: '/query/service' @@ -171,6 +185,7 @@ export interface FileRoutesByFullPath { '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute + '/todos': typeof TodosRoute '/query/service': typeof QueryServiceRoute '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute @@ -184,6 +199,7 @@ export interface FileRoutesByTo { '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute + '/todos': typeof TodosRoute '/query/service': typeof QueryServiceRoute '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute @@ -198,6 +214,7 @@ export interface FileRoutesById { '/promise': typeof PromiseRoute '/tests': typeof TestsRoute '/time': typeof TimeRoute + '/todos': typeof TodosRoute '/query/service': typeof QueryServiceRoute '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute @@ -213,6 +230,7 @@ export interface FileRouteTypes { | '/promise' | '/tests' | '/time' + | '/todos' | '/query/service' | '/query/usemutation' | '/query/usequery' @@ -225,6 +243,7 @@ export interface FileRouteTypes { | '/promise' | '/tests' | '/time' + | '/todos' | '/query/service' | '/query/usemutation' | '/query/usequery' @@ -237,6 +256,7 @@ export interface FileRouteTypes { | '/promise' | '/tests' | '/time' + | '/todos' | '/query/service' | '/query/usemutation' | '/query/usequery' @@ -251,6 +271,7 @@ export interface RootRouteChildren { PromiseRoute: typeof PromiseRoute TestsRoute: typeof TestsRoute TimeRoute: typeof TimeRoute + TodosRoute: typeof TodosRoute QueryServiceRoute: typeof QueryServiceRoute QueryUsemutationRoute: typeof QueryUsemutationRoute QueryUsequeryRoute: typeof QueryUsequeryRoute @@ -264,6 +285,7 @@ const rootRouteChildren: RootRouteChildren = { PromiseRoute: PromiseRoute, TestsRoute: TestsRoute, TimeRoute: TimeRoute, + TodosRoute: TodosRoute, QueryServiceRoute: QueryServiceRoute, QueryUsemutationRoute: QueryUsemutationRoute, QueryUsequeryRoute: QueryUsequeryRoute, @@ -286,6 +308,7 @@ export const routeTree = rootRoute "/promise", "/tests", "/time", + "/todos", "/query/service", "/query/usemutation", "/query/usequery" @@ -312,6 +335,9 @@ export const routeTree = rootRoute "/time": { "filePath": "time.tsx" }, + "/todos": { + "filePath": "todos.tsx" + }, "/query/service": { "filePath": "query/service.tsx" }, diff --git a/packages/example/src/routes/index.tsx b/packages/example/src/routes/index.tsx index 6de5c78..58b96d2 100644 --- a/packages/example/src/routes/index.tsx +++ b/packages/example/src/routes/index.tsx @@ -1,29 +1,10 @@ -import { TodosContext } from "@/todos/reffuse" -import { TodosState } from "@/todos/services" -import { VTodos } from "@/todos/views/VTodos" -import { Container } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" -import { Layer } from "effect" -import { useMemo } from "react" -export const Route = createFileRoute("/")({ - component: Index +export const Route = createFileRoute('/')({ + component: RouteComponent }) -function Index() { - - const todosLayer = useMemo(() => Layer.empty.pipe( - Layer.provideMerge(TodosState.make("todos")) - ), []) - - - return ( - - - - - - ) - +function RouteComponent() { + return
Hello "/"!
} diff --git a/packages/example/src/routes/todos.tsx b/packages/example/src/routes/todos.tsx new file mode 100644 index 0000000..17aa88f --- /dev/null +++ b/packages/example/src/routes/todos.tsx @@ -0,0 +1,35 @@ +import { TodosContext } from "@/todos/reffuse" +import { TodosState } from "@/todos/services" +import { VTodos } from "@/todos/views/VTodos" +import { Container } from "@radix-ui/themes" +import { createFileRoute } from "@tanstack/react-router" +import { Console, Effect, Layer } from "effect" +import { useMemo } from "react" + + +export const Route = createFileRoute("/todos")({ + component: Todos +}) + +function Todos() { + + const todosLayer = useMemo(() => Layer.empty.pipe( + Layer.provideMerge(TodosState.make("todos")), + + Layer.merge(Layer.effectDiscard( + Effect.addFinalizer(() => Console.log("TodosContext cleaned up")).pipe( + Effect.andThen(Console.log("TodosContext constructed")) + ) + )), + ), []) + + + return ( + + + + + + ) + +} diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index 39ec634..6096857 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -49,9 +49,13 @@ const makeProvider = (Context: React.Context>): ReactProvi React.useEffect(() => isInitialRun.pipe( Effect.if({ - onTrue: () => Ref.set(isInitialRun, false), + onTrue: () => Ref.set(isInitialRun, false).pipe( + Effect.map(() => + () => runSync(Scope.close(initialScope, Exit.void)) + ) + ), + onFalse: () => Effect.Do.pipe( - Effect.tap(Scope.close(initialScope, Exit.void)), Effect.bind("scope", () => Scope.make()), Effect.bind("context", ({ scope }) => makeContext(scope)), Effect.tap(({ context }) => -- 2.49.1 From aa46ecc82dbe5eb30824917b7a6b365743131da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 20:27:25 +0100 Subject: [PATCH 176/326] Async provider refactoring --- packages/reffuse/src/ReffuseContext.ts | 36 ++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index 6096857..ce970fa 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -1,4 +1,4 @@ -import { Array, Context, Effect, Exit, Layer, Ref, Runtime, Scope } from "effect" +import { Array, Context, Effect, ExecutionStrategy, Exit, Layer, Ref, Runtime, Scope } from "effect" import * as React from "react" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -76,6 +76,10 @@ const makeProvider = (Context: React.Context>): ReactProvi export type AsyncReactProvider = React.FC<{ readonly layer: Layer.Layer + readonly options?: { + readonly scope?: Scope.Scope + readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy + } readonly fallback?: React.ReactNode readonly children?: React.ReactNode }> @@ -93,11 +97,33 @@ const makeAsyncProvider = (Context: React.Context>): Async return function ReffuseContextAsyncReactProvider(props) { const runtime = ReffuseRuntime.useRuntime() + const runSync = React.useMemo(() => Runtime.runSync(runtime), [runtime]) + const runFork = React.useMemo(() => Runtime.runFork(runtime), [runtime]) - const promise = React.useMemo(() => Effect.context().pipe( - Effect.provide(props.layer), - Runtime.runPromise(runtime), - ), [props.layer, runtime]) + const [promise, setPromise] = React.useState(Promise.withResolvers>().promise) + + React.useEffect(() => { + const { promise, resolve, reject } = Promise.withResolvers>() + setPromise(promise) + + const scope = runSync(props.options?.scope + ? Scope.fork(props.options.scope, props.options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential) + : Scope.make(props.options?.finalizerExecutionStrategy) + ) + + Effect.context().pipe( + Effect.match({ + onSuccess: resolve, + onFailure: reject, + }), + + Effect.provide(props.layer), + Effect.provideService(Scope.Scope, scope), + effect => runFork(effect, { ...props.options, scope }), + ) + + return () => { runFork(Scope.close(scope, Exit.void)) } + }, [props.layer, runSync, runFork]) return React.createElement(React.Suspense, { children: React.createElement(ReffuseContextAsyncReactProviderInner, { ...props, promise }), -- 2.49.1 From e17f945666338ed543a7fd0c2c92f5d3dc0fa706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 20:30:31 +0100 Subject: [PATCH 177/326] Fix --- packages/reffuse/src/ReffuseContext.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index ce970fa..1454acd 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -75,7 +75,7 @@ const makeProvider = (Context: React.Context>): ReactProvi } export type AsyncReactProvider = React.FC<{ - readonly layer: Layer.Layer + readonly layer: Layer.Layer readonly options?: { readonly scope?: Scope.Scope readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy -- 2.49.1 From 6b74b9a3b282c5a08b2df06b713a3064b3e17488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 21:09:27 +0100 Subject: [PATCH 178/326] useMemoScoped refactoring --- packages/reffuse/src/ReffuseHelpers.ts | 53 ++++++++++++-------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 5553a37..b66c241 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -108,41 +108,38 @@ export abstract class ReffuseHelpers { ): A { const runSync = this.useRunSync() - // Calculate an initial version of the value so that it can be accessed during the first render - const [initialScope, initialValue] = React.useMemo(() => Scope.make(options?.finalizerExecutionStrategy).pipe( - Effect.flatMap(scope => effect().pipe( - Effect.provideService(Scope.Scope, scope), - Effect.map(value => [scope, value] as const), - )), - + const [isInitialRun, initialScope, initialValue] = React.useMemo(() => Effect.Do.pipe( + Effect.bind("isInitialRun", () => Ref.make(true)), + Effect.bind("scope", () => Scope.make(options?.finalizerExecutionStrategy)), + Effect.bind("value", ({ scope }) => Effect.provideService(effect(), Scope.Scope, scope)), + Effect.map(({ isInitialRun, scope, value }) => [isInitialRun, scope, value] as const), runSync, ), []) - // Keep track of the state of the initial scope - const initialScopeClosed = React.useRef(false) - const [value, setValue] = React.useState(initialValue) - React.useEffect(() => { - const closeInitialScopeIfNeeded = Scope.close(initialScope, Exit.void).pipe( - Effect.andThen(Effect.sync(() => { initialScopeClosed.current = true })), - Effect.when(() => !initialScopeClosed.current), - ) + React.useEffect(() => isInitialRun.pipe( + Effect.if({ + onTrue: () => Ref.set(isInitialRun, false).pipe( + Effect.map(() => + () => runSync(Scope.close(initialScope, Exit.void)) + ) + ), - const [scope, value] = closeInitialScopeIfNeeded.pipe( - Effect.andThen(Scope.make(options?.finalizerExecutionStrategy).pipe( - Effect.flatMap(scope => effect().pipe( - Effect.provideService(Scope.Scope, scope), - Effect.map(value => [scope, value] as const), - )) - )), + onFalse: () => Effect.Do.pipe( + Effect.bind("scope", () => Scope.make(options?.finalizerExecutionStrategy)), + Effect.bind("value", ({ scope }) => Effect.provideService(effect(), Scope.Scope, scope)), + Effect.tap(({ value }) => + Effect.sync(() => setValue(value)) + ), + Effect.map(({ scope }) => + () => runSync(Scope.close(scope, Exit.void)) + ), + ), + }), - runSync, - ) - - setValue(value) - return () => { runSync(Scope.close(scope, Exit.void)) } - }, [ + runSync, + ), [ ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], ...deps, ]) -- 2.49.1 From a28d6c3d300295c7f509f0eeb75ded0cbd7dff10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 21:12:42 +0100 Subject: [PATCH 179/326] Refactoring --- packages/reffuse/src/ReffuseContext.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index 1454acd..95466a4 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -76,10 +76,8 @@ const makeProvider = (Context: React.Context>): ReactProvi export type AsyncReactProvider = React.FC<{ readonly layer: Layer.Layer - readonly options?: { - readonly scope?: Scope.Scope - readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy - } + readonly scope?: Scope.Scope + readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy readonly fallback?: React.ReactNode readonly children?: React.ReactNode }> @@ -106,9 +104,9 @@ const makeAsyncProvider = (Context: React.Context>): Async const { promise, resolve, reject } = Promise.withResolvers>() setPromise(promise) - const scope = runSync(props.options?.scope - ? Scope.fork(props.options.scope, props.options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential) - : Scope.make(props.options?.finalizerExecutionStrategy) + const scope = runSync(props.scope + ? Scope.fork(props.scope, props.finalizerExecutionStrategy ?? ExecutionStrategy.sequential) + : Scope.make(props.finalizerExecutionStrategy) ) Effect.context().pipe( @@ -119,7 +117,7 @@ const makeAsyncProvider = (Context: React.Context>): Async Effect.provide(props.layer), Effect.provideService(Scope.Scope, scope), - effect => runFork(effect, { ...props.options, scope }), + effect => runFork(effect, { ...props, scope }), ) return () => { runFork(Scope.close(scope, Exit.void)) } -- 2.49.1 From 46211638f5ee84233bd86e84b7a0021a83faea98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 21:19:17 +0100 Subject: [PATCH 180/326] Refactoring --- packages/reffuse/src/ReffuseContext.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/reffuse/src/ReffuseContext.ts b/packages/reffuse/src/ReffuseContext.ts index 95466a4..4470cfa 100644 --- a/packages/reffuse/src/ReffuseContext.ts +++ b/packages/reffuse/src/ReffuseContext.ts @@ -24,6 +24,7 @@ export type R = T extends ReffuseContext ? R : never export type ReactProvider = React.FC<{ readonly layer: Layer.Layer + readonly scope?: Scope.Scope readonly children?: React.ReactNode }> @@ -32,6 +33,11 @@ const makeProvider = (Context: React.Context>): ReactProvi const runtime = ReffuseRuntime.useRuntime() const runSync = React.useMemo(() => Runtime.runSync(runtime), [runtime]) + const makeScope = React.useMemo(() => props.scope + ? Scope.fork(props.scope, ExecutionStrategy.sequential) + : Scope.make(), + [props.scope]) + const makeContext = React.useCallback((scope: Scope.CloseableScope) => Effect.context().pipe( Effect.provide(props.layer), Effect.provideService(Scope.Scope, scope), @@ -39,7 +45,7 @@ const makeProvider = (Context: React.Context>): ReactProvi const [isInitialRun, initialScope, initialValue] = React.useMemo(() => Effect.Do.pipe( Effect.bind("isInitialRun", () => Ref.make(true)), - Effect.bind("scope", () => Scope.make()), + Effect.bind("scope", () => makeScope), Effect.bind("context", ({ scope }) => makeContext(scope)), Effect.map(({ isInitialRun, scope, context }) => [isInitialRun, scope, context] as const), runSync, @@ -56,7 +62,7 @@ const makeProvider = (Context: React.Context>): ReactProvi ), onFalse: () => Effect.Do.pipe( - Effect.bind("scope", () => Scope.make()), + Effect.bind("scope", () => makeScope), Effect.bind("context", ({ scope }) => makeContext(scope)), Effect.tap(({ context }) => Effect.sync(() => setValue(context)) @@ -68,7 +74,7 @@ const makeProvider = (Context: React.Context>): ReactProvi }), runSync, - ), [makeContext, runSync]) + ), [makeScope, makeContext, runSync]) return React.createElement(Context, { ...props, value }) } -- 2.49.1 From f40dae90fbd6037b0b06021cc4e5d19e3ee67736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 28 Mar 2025 21:22:32 +0100 Subject: [PATCH 181/326] Version bump --- packages/reffuse/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 3ceb63e..27bc91a 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -1,6 +1,6 @@ { "name": "reffuse", - "version": "0.1.4", + "version": "0.1.5", "type": "module", "files": [ "./README.md", -- 2.49.1 From 9a24ecaf842dd32009ffab4c4dca719cf9b23970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 31 Mar 2025 00:00:47 +0200 Subject: [PATCH 182/326] QueryClient work --- packages/extension-query/src/QueryClient.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index dd467f5..daacc0c 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -3,23 +3,23 @@ import type { Mutable } from "effect/Types" import * as ErrorHandler from "./ErrorHandler.js" -export interface QueryClient { - readonly ErrorHandler: Context.Tag> +export interface QueryClient { + readonly errorHandler: ErrorHandler.ErrorHandler } const id = "@reffuse/extension-query/QueryClient" -export type TagClassShape = Context.TagClassShape> -export type GenericTagClass = Context.TagClass, typeof id, QueryClient> -export const makeGenericTagClass = (): GenericTagClass => Context.Tag(id)() +export type TagClassShape = Context.TagClassShape> +export type GenericTagClass = Context.TagClass, typeof id, QueryClient> +export const makeGenericTagClass = (): GenericTagClass => Context.Tag(id)() export interface ServiceProps { readonly ErrorHandler?: Context.Tag> } -export interface ServiceResult extends Context.TagClass> { +export interface ServiceResult extends Context.TagClass> { readonly Live: Layer.Layer } -- 2.49.1 From 3da4b2a3181a22d8b4befbc0d2cd95192b3141e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 31 Mar 2025 01:54:08 +0200 Subject: [PATCH 183/326] QueryClient work --- packages/extension-query/src/QueryClient.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index daacc0c..4e1b416 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -1,4 +1,4 @@ -import { Context, Layer } from "effect" +import { Context, Effect, Layer } from "effect" import type { Mutable } from "effect/Types" import * as ErrorHandler from "./ErrorHandler.js" @@ -12,15 +12,15 @@ const id = "@reffuse/extension-query/QueryClient" export type TagClassShape = Context.TagClassShape> export type GenericTagClass = Context.TagClass, typeof id, QueryClient> -export const makeGenericTagClass = (): GenericTagClass => Context.Tag(id)() +export const makeGenericTagClass = (): GenericTagClass => Context.Tag(id)() export interface ServiceProps { readonly ErrorHandler?: Context.Tag> } -export interface ServiceResult extends Context.TagClass> { - readonly Live: Layer.Layer +export interface ServiceResult extends Context.TagClass> { + readonly Live: Layer.Layer } export const Service = () => ( @@ -31,9 +31,9 @@ export const Service = () => ( props?: ServiceProps ): ServiceResult => { const TagClass = Context.Tag(id)() as ServiceResult - (TagClass as Mutable).Live = Layer.succeed(TagClass, { - ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> - }) + (TagClass as Mutable).Live = Layer.effect(TagClass, Effect.Do.pipe( + Effect.bind("errorHandler", () => (props?.ErrorHandler as Effect.Effect, never, EH>) ?? ErrorHandler.DefaultErrorHandler as Effect.Effect, never, EH>) + )) return TagClass } ) -- 2.49.1 From c75bb10e6b8f7d4ae54d702f875b00e4f27a84c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 31 Mar 2025 18:22:18 +0200 Subject: [PATCH 184/326] QueryClient work --- packages/extension-query/src/QueryClient.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 4e1b416..692b2b6 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -20,7 +20,11 @@ export interface ServiceProps { } export interface ServiceResult extends Context.TagClass> { - readonly Live: Layer.Layer + readonly Live: Layer.Layer< + Self, + never, + EH extends ErrorHandler.DefaultErrorHandler ? never : EH + > } export const Service = () => ( @@ -31,9 +35,17 @@ export const Service = () => ( props?: ServiceProps ): ServiceResult => { const TagClass = Context.Tag(id)() as ServiceResult + (TagClass as Mutable).Live = Layer.effect(TagClass, Effect.Do.pipe( - Effect.bind("errorHandler", () => (props?.ErrorHandler as Effect.Effect, never, EH>) ?? ErrorHandler.DefaultErrorHandler as Effect.Effect, never, EH>) + Effect.bind("errorHandler", () => + (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Effect.Effect< + ErrorHandler.ErrorHandler, + never, + EH extends ErrorHandler.DefaultErrorHandler ? never : EH + > + ) )) + return TagClass } ) -- 2.49.1 From 76a33fccca52c6f92a24ecdbbdc075df511b2d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 31 Mar 2025 20:38:21 +0200 Subject: [PATCH 185/326] Query refactoring --- packages/extension-query/src/ErrorHandler.ts | 54 --------------- packages/extension-query/src/QueryClient.ts | 45 ++++++++----- .../extension-query/src/QueryErrorHandler.ts | 65 +++++++++++++++++++ .../extension-query/src/QueryExtension.ts | 16 ++--- packages/extension-query/src/index.ts | 2 +- .../src/internal/MutationRunner.ts | 28 ++++---- .../src/internal/QueryRunner.ts | 30 ++++----- 7 files changed, 130 insertions(+), 110 deletions(-) delete mode 100644 packages/extension-query/src/ErrorHandler.ts create mode 100644 packages/extension-query/src/QueryErrorHandler.ts diff --git a/packages/extension-query/src/ErrorHandler.ts b/packages/extension-query/src/ErrorHandler.ts deleted file mode 100644 index 0437901..0000000 --- a/packages/extension-query/src/ErrorHandler.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Cause, Context, Effect, identity, Layer, Queue, Stream } from "effect" -import type { Mutable } from "effect/Types" - - -export interface ErrorHandler { - readonly errors: Stream.Stream> - readonly handle: (self: Effect.Effect) => Effect.Effect, R> -} - -export type Error = T extends ErrorHandler ? E : never - - -export interface ServiceResult extends Context.TagClass> { - readonly Live: Layer.Layer -} - -export const Service = () => ( - ( - id: Id, - f: ( - self: Effect.Effect, - failure: (failure: E) => Effect.Effect, - defect: (defect: unknown) => Effect.Effect, - ) => Effect.Effect, - ): ServiceResult => { - const TagClass = Context.Tag(id)() as ServiceResult - - (TagClass as Mutable).Live = Layer.effect(TagClass, Effect.gen(function*() { - const queue = yield* Queue.unbounded>() - const errors = Stream.fromQueue(queue) - - const handle = ( - self: Effect.Effect - ): Effect.Effect, R> => f(self as unknown as Effect.Effect, - (failure: E) => Queue.offer(queue, Cause.fail(failure)).pipe( - Effect.andThen(Effect.failCause(Cause.empty)) - ), - (defect: unknown) => Queue.offer(queue, Cause.die(defect)).pipe( - Effect.andThen(Effect.failCause(Cause.empty)) - ), - ) - - return { errors, handle } - })) - - return TagClass - } -) - - -export class DefaultErrorHandler extends Service()( - "@reffuse/extension-query/DefaultErrorHandler", - identity, -) {} diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 692b2b6..5f0a2c0 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -1,47 +1,56 @@ import { Context, Effect, Layer } from "effect" import type { Mutable } from "effect/Types" -import * as ErrorHandler from "./ErrorHandler.js" +import * as QueryErrorHandler from "./QueryErrorHandler.js" -export interface QueryClient { - readonly errorHandler: ErrorHandler.ErrorHandler +export interface QueryClient { + readonly errorHandler: QueryErrorHandler.QueryErrorHandler } const id = "@reffuse/extension-query/QueryClient" -export type TagClassShape = Context.TagClassShape> -export type GenericTagClass = Context.TagClass, typeof id, QueryClient> -export const makeGenericTagClass = (): GenericTagClass => Context.Tag(id)() +export type TagClassShape = Context.TagClassShape> +export type GenericTagClass = Context.TagClass< + TagClassShape, + typeof id, + QueryClient +> +export const makeGenericTagClass = (): GenericTagClass => Context.Tag(id)() -export interface ServiceProps { - readonly ErrorHandler?: Context.Tag> +export interface ServiceProps { + readonly ErrorHandler?: Context.Tag> } -export interface ServiceResult extends Context.TagClass> { +export interface ServiceResult extends Context.TagClass< + Self, + typeof id, + QueryClient +> { readonly Live: Layer.Layer< Self, never, - EH extends ErrorHandler.DefaultErrorHandler ? never : EH + EH extends QueryErrorHandler.DefaultQueryErrorHandler ? never : EH > } export const Service = () => ( < - EH = ErrorHandler.DefaultErrorHandler, - HandledE = ErrorHandler.Error>, + EH = QueryErrorHandler.DefaultQueryErrorHandler, + FallbackA = QueryErrorHandler.Fallback>, + HandledE = QueryErrorHandler.Error>, >( - props?: ServiceProps - ): ServiceResult => { - const TagClass = Context.Tag(id)() as ServiceResult + props?: ServiceProps + ): ServiceResult => { + const TagClass = Context.Tag(id)() as ServiceResult (TagClass as Mutable).Live = Layer.effect(TagClass, Effect.Do.pipe( Effect.bind("errorHandler", () => - (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Effect.Effect< - ErrorHandler.ErrorHandler, + (props?.ErrorHandler ?? QueryErrorHandler.DefaultQueryErrorHandler) as Effect.Effect< + QueryErrorHandler.QueryErrorHandler, never, - EH extends ErrorHandler.DefaultErrorHandler ? never : EH + EH extends QueryErrorHandler.DefaultQueryErrorHandler ? never : EH > ) )) diff --git a/packages/extension-query/src/QueryErrorHandler.ts b/packages/extension-query/src/QueryErrorHandler.ts new file mode 100644 index 0000000..733b7e1 --- /dev/null +++ b/packages/extension-query/src/QueryErrorHandler.ts @@ -0,0 +1,65 @@ +import { Cause, Context, Effect, identity, Layer, Queue, Stream } from "effect" +import type { Mutable } from "effect/Types" + + +export interface QueryErrorHandler { + readonly errors: Stream.Stream> + readonly handle: (self: Effect.Effect) => Effect.Effect
, R> +} + +export type Fallback = T extends QueryErrorHandler ? A : never +export type Error = T extends QueryErrorHandler ? E : never + + +export interface ServiceResult< + Self, + Id extends string, + FallbackA, + HandledE, +> extends Context.TagClass< + Self, + Id, + QueryErrorHandler +> { + readonly Live: Layer.Layer +} + +export const Service = () => ( + ( + id: Id, + f: ( + self: Effect.Effect, + failure: (failure: HandledE) => Effect.Effect, + defect: (defect: unknown) => Effect.Effect, + ) => Effect.Effect, + ): ServiceResult => { + const TagClass = Context.Tag(id)() as ServiceResult + + (TagClass as Mutable).Live = Layer.effect(TagClass, Effect.gen(function*() { + const queue = yield* Queue.unbounded>() + const errors = Stream.fromQueue(queue) + + const handle = ( + self: Effect.Effect + ): Effect.Effect, R> => f( + self as unknown as Effect.Effect, + (failure: HandledE) => Queue.offer(queue, Cause.fail(failure)).pipe( + Effect.andThen(Effect.failCause(Cause.empty)) + ), + (defect: unknown) => Queue.offer(queue, Cause.die(defect)).pipe( + Effect.andThen(Effect.failCause(Cause.empty)) + ), + ) + + return { errors, handle } + })) + + return TagClass + } +) + + +export class DefaultQueryErrorHandler extends Service()( + "@reffuse/extension-query/DefaultQueryErrorHandler", + identity, +) {} diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 5df8c69..eee7860 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -51,19 +51,19 @@ export interface UseMutationResult { export const QueryExtension = ReffuseExtension.make(() => ({ useQuery< - EH, QK extends readonly unknown[], QA, + FallbackA, QE, HandledE, QR extends R, R, >( - this: ReffuseHelpers.ReffuseHelpers | EH>, + this: ReffuseHelpers.ReffuseHelpers>, props: UseQueryProps, - ): UseQueryResult> { + ): UseQueryResult> { const runner = this.useMemo(() => QueryRunner.make({ - QueryClient: QueryClient.makeGenericTagClass(), + QueryClient: QueryClient.makeGenericTagClass(), key: props.key, query: props.query, }), [props.key]) @@ -90,19 +90,19 @@ export const QueryExtension = ReffuseExtension.make(() => ({ }, useMutation< - EH, QK extends readonly unknown[], QA, + FallbackA, QE, HandledE, QR extends R, R, >( - this: ReffuseHelpers.ReffuseHelpers | EH>, + this: ReffuseHelpers.ReffuseHelpers>, props: UseMutationProps, - ): UseMutationResult> { + ): UseMutationResult> { const runner = this.useMemo(() => MutationRunner.make({ - QueryClient: QueryClient.makeGenericTagClass(), + QueryClient: QueryClient.makeGenericTagClass(), mutation: props.mutation, }), []) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index d30d000..4f0feaf 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,6 +1,6 @@ -export * as ErrorHandler from "./ErrorHandler.js" export * as MutationService from "./MutationService.js" export * as QueryClient from "./QueryClient.js" +export * as QueryErrorHandler from "./QueryErrorHandler.js" export * from "./QueryExtension.js" export * as QueryProgress from "./QueryProgress.js" export * as QueryService from "./QueryService.js" diff --git a/packages/extension-query/src/internal/MutationRunner.ts b/packages/extension-query/src/internal/MutationRunner.ts index cd29477..e81e960 100644 --- a/packages/extension-query/src/internal/MutationRunner.ts +++ b/packages/extension-query/src/internal/MutationRunner.ts @@ -17,33 +17,33 @@ export interface MutationRunner { } -export interface MakeProps { - readonly QueryClient: QueryClient.GenericTagClass +export interface MakeProps { + readonly QueryClient: QueryClient.GenericTagClass readonly mutation: (key: K) => Effect.Effect } -export const make = ( +export const make = ( { QueryClient, mutation, - }: MakeProps + }: MakeProps ): Effect.Effect< - MutationRunner, R>, + MutationRunner, R>, never, - R | QueryClient.TagClassShape | EH + R | QueryClient.TagClassShape > => Effect.gen(function*() { - const context = yield* Effect.context | EH>() - const globalStateRef = yield* SubscriptionRef.make(AsyncData.noData>()) + const context = yield* Effect.context>() + const globalStateRef = yield* SubscriptionRef.make(AsyncData.noData>()) - const queryStateTag = QueryState.makeTag>() + const queryStateTag = QueryState.makeTag>() const run = (key: K) => Effect.all([ queryStateTag, - QueryClient.pipe(Effect.flatMap(client => client.ErrorHandler)), + QueryClient, ]).pipe( - Effect.flatMap(([state, errorHandler]) => state.set(AsyncData.loading()).pipe( + Effect.flatMap(([state, client]) => state.set(AsyncData.loading()).pipe( Effect.andThen(mutation(key)), - errorHandler.handle, + client.errorHandler.handle, Effect.matchCauseEffect({ onSuccess: v => Effect.succeed(AsyncData.success(v)).pipe( Effect.tap(state.set) @@ -65,8 +65,8 @@ export const make = ( )) const forkMutate = (...key: K) => Effect.all([ - Ref.make(AsyncData.noData>()), - Queue.unbounded>>(), + Ref.make(AsyncData.noData>()), + Queue.unbounded>>(), ]).pipe( Effect.flatMap(([stateRef, stateQueue]) => Effect.addFinalizer(() => Queue.shutdown(stateQueue)).pipe( diff --git a/packages/extension-query/src/internal/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts index bc659d3..a216764 100644 --- a/packages/extension-query/src/internal/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -31,33 +31,33 @@ export interface QueryRunner { } -export interface MakeProps { - readonly QueryClient: QueryClient.GenericTagClass +export interface MakeProps { + readonly QueryClient: QueryClient.GenericTagClass readonly key: Stream.Stream readonly query: (key: K) => Effect.Effect } -export const make = ( +export const make = ( { QueryClient, key, query, - }: MakeProps + }: MakeProps ): Effect.Effect< - QueryRunner, R>, + QueryRunner, R>, never, - R | QueryClient.TagClassShape | EH + R | QueryClient.TagClassShape > => Effect.gen(function*() { - const context = yield* Effect.context | EH>() + const context = yield* Effect.context>() const latestKeyRef = yield* SubscriptionRef.make(Option.none()) - const stateRef = yield* SubscriptionRef.make(AsyncData.noData>()) + const stateRef = yield* SubscriptionRef.make(AsyncData.noData>()) const fiberRef = yield* SubscriptionRef.make(Option.none | AsyncData.Failure>, + AsyncData.Success | AsyncData.Failure>, Cause.NoSuchElementException >>()) - const queryStateTag = QueryState.makeTag>() + const queryStateTag = QueryState.makeTag>() const interrupt = fiberRef.pipe( Effect.flatMap(Option.match({ @@ -82,12 +82,12 @@ export const make = ( const run = Effect.all([ queryStateTag, - QueryClient.pipe(Effect.flatMap(client => client.ErrorHandler)), + QueryClient, ]).pipe( - Effect.flatMap(([state, errorHandler]) => latestKeyRef.pipe( + Effect.flatMap(([state, client]) => latestKeyRef.pipe( Effect.flatMap(identity), Effect.flatMap(key => query(key).pipe( - errorHandler.handle, + client.errorHandler.handle, Effect.matchCauseEffect({ onSuccess: v => Effect.succeed(AsyncData.success(v)).pipe( Effect.tap(state.set) @@ -103,7 +103,7 @@ export const make = ( Effect.provide(QueryProgress.QueryProgress.Live), ) - const forkFetch = Queue.unbounded>>().pipe( + const forkFetch = Queue.unbounded>>().pipe( Effect.flatMap(stateQueue => queryStateTag.pipe( Effect.flatMap(state => interrupt.pipe( Effect.andThen(Effect.addFinalizer(() => Ref.set(fiberRef, Option.none()).pipe( @@ -139,7 +139,7 @@ export const make = ( })) ) - const forkRefresh = Queue.unbounded>>().pipe( + const forkRefresh = Queue.unbounded>>().pipe( Effect.flatMap(stateQueue => interrupt.pipe( Effect.andThen(Effect.addFinalizer(() => Ref.set(fiberRef, Option.none()).pipe( Effect.andThen(Queue.shutdown(stateQueue)) -- 2.49.1 From 3f091d55c205236c7128ae0ceffb777ec884a969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 31 Mar 2025 20:54:32 +0200 Subject: [PATCH 186/326] QueryClient refactoring --- packages/extension-query/src/QueryClient.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 5f0a2c0..08e01ca 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -29,7 +29,7 @@ export interface ServiceResult extends Context.Ta QueryClient > { readonly Live: Layer.Layer< - Self, + Self | EH extends QueryErrorHandler.DefaultQueryErrorHandler ? EH : never, never, EH extends QueryErrorHandler.DefaultQueryErrorHandler ? never : EH > @@ -53,7 +53,12 @@ export const Service = () => ( EH extends QueryErrorHandler.DefaultQueryErrorHandler ? never : EH > ) - )) + )).pipe( + Layer.provideMerge((props?.ErrorHandler + ? Layer.empty + : QueryErrorHandler.DefaultQueryErrorHandler.Live + ) as Layer.Layer) + ) return TagClass } -- 2.49.1 From ab1f851428ee84f299b62f918b359843baa0ed00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 31 Mar 2025 21:07:42 +0200 Subject: [PATCH 187/326] Refactoring --- .../src/internal/MutationRunner.ts | 20 ++++++------ .../src/internal/QueryRunner.ts | 32 +++++++++---------- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/packages/extension-query/src/internal/MutationRunner.ts b/packages/extension-query/src/internal/MutationRunner.ts index e81e960..3865223 100644 --- a/packages/extension-query/src/internal/MutationRunner.ts +++ b/packages/extension-query/src/internal/MutationRunner.ts @@ -37,11 +37,11 @@ export const make = const queryStateTag = QueryState.makeTag>() - const run = (key: K) => Effect.all([ - queryStateTag, - QueryClient, - ]).pipe( - Effect.flatMap(([state, client]) => state.set(AsyncData.loading()).pipe( + const run = (key: K) => Effect.Do.pipe( + Effect.bind("state", () => queryStateTag), + Effect.bind("client", () => QueryClient), + + Effect.flatMap(({ state, client }) => state.set(AsyncData.loading()).pipe( Effect.andThen(mutation(key)), client.errorHandler.handle, Effect.matchCauseEffect({ @@ -64,11 +64,11 @@ export const make = value => Ref.set(globalStateRef, value), )) - const forkMutate = (...key: K) => Effect.all([ - Ref.make(AsyncData.noData>()), - Queue.unbounded>>(), - ]).pipe( - Effect.flatMap(([stateRef, stateQueue]) => + const forkMutate = (...key: K) => Effect.Do.pipe( + Effect.bind("stateRef", () => Ref.make(AsyncData.noData>())), + Effect.bind("stateQueue", () => Queue.unbounded>>()), + + Effect.flatMap(({ stateRef, stateQueue }) => Effect.addFinalizer(() => Queue.shutdown(stateQueue)).pipe( Effect.andThen(run(key)), Effect.scoped, diff --git a/packages/extension-query/src/internal/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts index a216764..5b8bab7 100644 --- a/packages/extension-query/src/internal/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -80,23 +80,21 @@ export const make = })) ) - const run = Effect.all([ - queryStateTag, - QueryClient, - ]).pipe( - Effect.flatMap(([state, client]) => latestKeyRef.pipe( - Effect.flatMap(identity), - Effect.flatMap(key => query(key).pipe( - client.errorHandler.handle, - Effect.matchCauseEffect({ - onSuccess: v => Effect.succeed(AsyncData.success(v)).pipe( - Effect.tap(state.set) - ), - onFailure: c => Effect.succeed(AsyncData.failure(c)).pipe( - Effect.tap(state.set) - ), - }), - )), + const run = Effect.Do.pipe( + Effect.bind("state", () => queryStateTag), + Effect.bind("client", () => QueryClient), + Effect.bind("latestKey", () => latestKeyRef.pipe(Effect.flatMap(identity))), + + Effect.flatMap(({ state, client, latestKey }) => query(latestKey).pipe( + client.errorHandler.handle, + Effect.matchCauseEffect({ + onSuccess: v => Effect.succeed(AsyncData.success(v)).pipe( + Effect.tap(state.set) + ), + onFailure: c => Effect.succeed(AsyncData.failure(c)).pipe( + Effect.tap(state.set) + ), + }), )), Effect.provide(context), -- 2.49.1 From a5c6b34dfe7af6e2592e168e7d97d2b64e332b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 31 Mar 2025 21:19:41 +0200 Subject: [PATCH 188/326] Example fix --- packages/example/src/QueryErrorHandler.tsx | 4 ++-- packages/example/src/main.tsx | 10 +++++----- packages/example/src/query.ts | 4 ++-- packages/example/src/query/reffuse.ts | 4 ++-- packages/example/src/reffuse.ts | 12 ++++++------ packages/example/src/todos/reffuse.ts | 4 ++-- packages/extension-query/src/QueryClient.ts | 2 +- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/example/src/QueryErrorHandler.tsx b/packages/example/src/QueryErrorHandler.tsx index 2a458ea..5a072ee 100644 --- a/packages/example/src/QueryErrorHandler.tsx +++ b/packages/example/src/QueryErrorHandler.tsx @@ -1,5 +1,5 @@ import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" -import { ErrorHandler } from "@reffuse/extension-query" +import { QueryErrorHandler } from "@reffuse/extension-query" import { Cause, Console, Context, Effect, Either, flow, Match, Option, Stream } from "effect" import { useState } from "react" import { AppQueryErrorHandler } from "./query" @@ -8,7 +8,7 @@ import { R } from "./reffuse" export function VQueryErrorHandler() { const [failure, setFailure] = useState(Option.none> + QueryErrorHandler.Error> >>()) R.useFork(() => AppQueryErrorHandler.pipe(Effect.flatMap(handler => diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index a730288..a5da407 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -6,17 +6,17 @@ import { StrictMode } from "react" import { createRoot } from "react-dom/client" import { ReffuseRuntime } from "reffuse" import { AppQueryClient, AppQueryErrorHandler } from "./query" -import { GlobalContext } from "./reffuse" +import { RootContext } from "./reffuse" import { routeTree } from "./routeTree.gen" const layer = Layer.empty.pipe( + Layer.provideMerge(AppQueryClient.Live), + Layer.provideMerge(AppQueryErrorHandler.Live), Layer.provideMerge(Clipboard.layer), Layer.provideMerge(Geolocation.layer), Layer.provideMerge(Permissions.layer), Layer.provideMerge(FetchHttpClient.layer), - Layer.provideMerge(AppQueryClient.Live), - Layer.provideMerge(AppQueryErrorHandler.Live), ) const router = createRouter({ routeTree }) @@ -31,9 +31,9 @@ declare module "@tanstack/react-router" { createRoot(document.getElementById("root")!).render( - + - + ) diff --git a/packages/example/src/query.ts b/packages/example/src/query.ts index 7b659eb..ecf7e53 100644 --- a/packages/example/src/query.ts +++ b/packages/example/src/query.ts @@ -1,9 +1,9 @@ import { HttpClientError } from "@effect/platform" -import { ErrorHandler, QueryClient } from "@reffuse/extension-query" +import { QueryClient, QueryErrorHandler } from "@reffuse/extension-query" import { Effect } from "effect" -export class AppQueryErrorHandler extends ErrorHandler.Service()( "AppQueryErrorHandler", diff --git a/packages/example/src/query/reffuse.ts b/packages/example/src/query/reffuse.ts index ced8e18..08cf368 100644 --- a/packages/example/src/query/reffuse.ts +++ b/packages/example/src/query/reffuse.ts @@ -1,10 +1,10 @@ -import { GlobalReffuse } from "@/reffuse" +import { RootReffuse } from "@/reffuse" import { Reffuse, ReffuseContext } from "reffuse" import { Uuid4Query } from "./services" export const QueryContext = ReffuseContext.make() -export const R = new class QueryReffuse extends GlobalReffuse.pipe( +export const R = new class QueryReffuse extends RootReffuse.pipe( Reffuse.withContexts(QueryContext) ) {} diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index f23c07e..25a8fa7 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -6,19 +6,19 @@ import { Reffuse, ReffuseContext } from "reffuse" import { AppQueryClient, AppQueryErrorHandler } from "./query" -export const GlobalContext = ReffuseContext.make< +export const RootContext = ReffuseContext.make< + | AppQueryClient + | AppQueryErrorHandler | Clipboard.Clipboard | Geolocation.Geolocation | Permissions.Permissions | HttpClient.HttpClient - | AppQueryClient - | AppQueryErrorHandler >() -export class GlobalReffuse extends Reffuse.Reffuse.pipe( +export class RootReffuse extends Reffuse.Reffuse.pipe( Reffuse.withExtension(LazyRefExtension), Reffuse.withExtension(QueryExtension), - Reffuse.withContexts(GlobalContext), + Reffuse.withContexts(RootContext), ) {} -export const R = new GlobalReffuse() +export const R = new RootReffuse() diff --git a/packages/example/src/todos/reffuse.ts b/packages/example/src/todos/reffuse.ts index d01357c..986f562 100644 --- a/packages/example/src/todos/reffuse.ts +++ b/packages/example/src/todos/reffuse.ts @@ -1,10 +1,10 @@ -import { GlobalReffuse } from "@/reffuse" +import { RootReffuse } from "@/reffuse" import { Reffuse, ReffuseContext } from "reffuse" import { TodosState } from "./services" export const TodosContext = ReffuseContext.make() -export const R = new class TodosReffuse extends GlobalReffuse.pipe( +export const R = new class TodosReffuse extends RootReffuse.pipe( Reffuse.withContexts(TodosContext) ) {} diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 08e01ca..2b9b003 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -29,7 +29,7 @@ export interface ServiceResult extends Context.Ta QueryClient > { readonly Live: Layer.Layer< - Self | EH extends QueryErrorHandler.DefaultQueryErrorHandler ? EH : never, + Self | (EH extends QueryErrorHandler.DefaultQueryErrorHandler ? EH : never), never, EH extends QueryErrorHandler.DefaultQueryErrorHandler ? never : EH > -- 2.49.1 From 4e422a19017a252e71f849c36a6404422a0ca3dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 31 Mar 2025 21:40:55 +0200 Subject: [PATCH 189/326] Version bump --- packages/extension-query/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension-query/package.json b/packages/extension-query/package.json index 9ac68b8..a28e278 100644 --- a/packages/extension-query/package.json +++ b/packages/extension-query/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/extension-query", - "version": "0.1.1", + "version": "0.1.2", "type": "module", "files": [ "./README.md", -- 2.49.1 From 52a36cb8829a637bdbf74250c063f534fde748df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 10 Apr 2025 22:38:29 +0200 Subject: [PATCH 190/326] RefState component --- packages/reffuse/src/ReffuseHelpers.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index b66c241..97fe30b 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -418,6 +418,17 @@ export abstract class ReffuseHelpers { return stream } + + + RefState( + this: ReffuseHelpers, + props: { + readonly ref: SubscriptionRef.SubscriptionRef + readonly children: (state: [A, React.Dispatch>]) => React.ReactNode + }, + ): React.ReactNode { + return props.children(this.useRefState(props.ref)) + } } -- 2.49.1 From 8b141b907f0e022e397005202382bf30e298cec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 10 Apr 2025 23:06:13 +0200 Subject: [PATCH 191/326] RefState tests --- packages/example/src/routes/tests.tsx | 9 ++++++++- packages/reffuse/src/ReffuseHelpers.ts | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 884b5f7..acd3c8f 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -1,5 +1,5 @@ import { R } from "@/reffuse" -import { Button, Flex } from "@radix-ui/themes" +import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" import { Console, Effect, Stream } from "effect" @@ -22,6 +22,9 @@ function RouteComponent() { Effect.delay("1 second"), ), []) + + const aRef = R.useRef("a value") + const [reactValue, setReactValue] = useState("initial") const reactValueStream = R.useStreamFromValues([reactValue]) R.useFork(() => Stream.runForEach(reactValueStream, Console.log), [reactValueStream]) @@ -39,6 +42,10 @@ function RouteComponent() { return ( + + {([aValue]) => {aValue}} + + diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 97fe30b..38e82a8 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -420,7 +420,7 @@ export abstract class ReffuseHelpers { } - RefState( + RefState( this: ReffuseHelpers, props: { readonly ref: SubscriptionRef.SubscriptionRef -- 2.49.1 From ef13e87d125aa7bc31861a9774338d7d76b9139d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 11 Apr 2025 00:23:15 +0200 Subject: [PATCH 192/326] Fix --- packages/reffuse/src/ReffuseHelpers.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 38e82a8..3cc3adf 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -18,6 +18,10 @@ export interface ScopeOptions { export abstract class ReffuseHelpers { declare ["constructor"]: ReffuseHelpersClass + constructor() { + this.RefState = this.RefState.bind(this as any) as any + } + useContext(this: ReffuseHelpers): Context.Context { return ReffuseContext.useMergeAll(...this.constructor.contexts) -- 2.49.1 From d1ba4148f2b6314b2131d58430a0250972838904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 11 Apr 2025 02:10:21 +0200 Subject: [PATCH 193/326] useRefsState work --- packages/reffuse/src/ReffuseHelpers.ts | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 3cc3adf..737661e 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -410,6 +410,38 @@ export abstract class ReffuseHelpers { return [reactStateValue, setValue] } + useRefsState< + Refs extends { [K in keyof Refs]: SubscriptionRef.SubscriptionRef }, + R, + >( + this: ReffuseHelpers, + refs: Refs, + ): { + [K in keyof Refs]: readonly [ + Effect.Effect, + React.Dispatch>>, + ] + } { + const initialState = this.useMemo(() => Effect.Do.pipe( + Effect.bindAll(() => refs) + ), [], { doNotReExecuteOnRuntimeOrContextChange: true }) + + const [reactStateValue, setReactStateValue] = React.useState(initialState) + + this.useFork(() => Stream.runForEach( + Stream.changesWith(ref.changes, (x, y) => x === y), + v => Effect.sync(() => setReactStateValue(v)), + ), [ref]) + + const setValue = this.useCallbackSync((setStateAction: React.SetStateAction) => + Ref.update(ref, prevState => + SetStateAction.value(setStateAction, prevState) + ), + [ref]) + + return [reactStateValue, setValue] + } + useStreamFromValues( this: ReffuseHelpers, values: A, -- 2.49.1 From c1b6e732315cb14c34277a25abfef832e51aee1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 11 Apr 2025 02:58:44 +0200 Subject: [PATCH 194/326] useRefsState work --- packages/example/src/routes/tests.tsx | 4 +++ packages/reffuse/src/ReffuseHelpers.ts | 37 +++++++++++++------------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index acd3c8f..14c9552 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -24,6 +24,10 @@ function RouteComponent() { const aRef = R.useRef("a value") + const anotherRef = R.useRef(69) + + const res = R.useRefsState({ aRef, anotherRef }) + const [reactValue, setReactValue] = useState("initial") const reactValueStream = R.useStreamFromValues([reactValue]) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 737661e..7026830 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -411,35 +411,36 @@ export abstract class ReffuseHelpers { } useRefsState< - Refs extends { [K in keyof Refs]: SubscriptionRef.SubscriptionRef }, + const Refs extends { readonly [K in keyof Refs]: SubscriptionRef.SubscriptionRef }, R, >( this: ReffuseHelpers, refs: Refs, ): { - [K in keyof Refs]: readonly [ - Effect.Effect, - React.Dispatch>>, + readonly [K in keyof Refs]: readonly [ + Effect.Effect.Success, + React.Dispatch>>, ] } { - const initialState = this.useMemo(() => Effect.Do.pipe( - Effect.bindAll(() => refs) - ), [], { doNotReExecuteOnRuntimeOrContextChange: true }) + // const initialState = this.useMemo(() => Effect.Do.pipe( + // Effect.bindAll(() => refs) + // ), [], { doNotReExecuteOnRuntimeOrContextChange: true }) - const [reactStateValue, setReactStateValue] = React.useState(initialState) + // const [reactStateValue, setReactStateValue] = React.useState(initialState) - this.useFork(() => Stream.runForEach( - Stream.changesWith(ref.changes, (x, y) => x === y), - v => Effect.sync(() => setReactStateValue(v)), - ), [ref]) + // this.useFork(() => Stream.runForEach( + // Stream.changesWith(ref.changes, (x, y) => x === y), + // v => Effect.sync(() => setReactStateValue(v)), + // ), [ref]) - const setValue = this.useCallbackSync((setStateAction: React.SetStateAction) => - Ref.update(ref, prevState => - SetStateAction.value(setStateAction, prevState) - ), - [ref]) + // const setValue = this.useCallbackSync((setStateAction: React.SetStateAction) => + // Ref.update(ref, prevState => + // SetStateAction.value(setStateAction, prevState) + // ), + // [ref]) - return [reactStateValue, setValue] + // return [reactStateValue, setValue] + return null! } useStreamFromValues( -- 2.49.1 From 9d47418a69fa27b339a94f7c7db3fafd412c5dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 11 Apr 2025 20:10:34 +0200 Subject: [PATCH 195/326] useRefsState work --- packages/reffuse/src/ReffuseHelpers.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 7026830..77d8dd6 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -422,11 +422,15 @@ export abstract class ReffuseHelpers { React.Dispatch>>, ] } { - // const initialState = this.useMemo(() => Effect.Do.pipe( - // Effect.bindAll(() => refs) - // ), [], { doNotReExecuteOnRuntimeOrContextChange: true }) + const [reactStateValue, setReactStateValue] = React.useState( + this.useMemo(() => Effect.Do.pipe( + Effect.bindAll(() => refs as Record>) + ), [], { + doNotReExecuteOnRuntimeOrContextChange: true + }) as { readonly [K in keyof Refs]: any } + ) - // const [reactStateValue, setReactStateValue] = React.useState(initialState) + this.useFork(() => ) // this.useFork(() => Stream.runForEach( // Stream.changesWith(ref.changes, (x, y) => x === y), -- 2.49.1 From 529e3d3f9db8d2d113b0ce07458ed6ab90022051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 11 Apr 2025 21:43:32 +0200 Subject: [PATCH 196/326] useSubscribeRefs work --- packages/reffuse/src/ReffuseHelpers.ts | 49 +++++++------------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 77d8dd6..516791a 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -382,6 +382,18 @@ export abstract class ReffuseHelpers { ) } + useSubscribeRefs< + const Refs extends readonly SubscriptionRef.SubscriptionRef[], + R, + >( + this: ReffuseHelpers, + ...refs: Refs + ): [...{ [K in keyof Refs]: Effect.Effect.Success }] { + const [reactStateValue, setReactStateValue] = React.useState( + this.useMemo(() => Effect.all(refs), [], { doNotReExecuteOnRuntimeOrContextChange: true }) + ) + } + /** * Binds the state of a `SubscriptionRef` to the state of the React component. * @@ -410,43 +422,6 @@ export abstract class ReffuseHelpers { return [reactStateValue, setValue] } - useRefsState< - const Refs extends { readonly [K in keyof Refs]: SubscriptionRef.SubscriptionRef }, - R, - >( - this: ReffuseHelpers, - refs: Refs, - ): { - readonly [K in keyof Refs]: readonly [ - Effect.Effect.Success, - React.Dispatch>>, - ] - } { - const [reactStateValue, setReactStateValue] = React.useState( - this.useMemo(() => Effect.Do.pipe( - Effect.bindAll(() => refs as Record>) - ), [], { - doNotReExecuteOnRuntimeOrContextChange: true - }) as { readonly [K in keyof Refs]: any } - ) - - this.useFork(() => ) - - // this.useFork(() => Stream.runForEach( - // Stream.changesWith(ref.changes, (x, y) => x === y), - // v => Effect.sync(() => setReactStateValue(v)), - // ), [ref]) - - // const setValue = this.useCallbackSync((setStateAction: React.SetStateAction) => - // Ref.update(ref, prevState => - // SetStateAction.value(setStateAction, prevState) - // ), - // [ref]) - - // return [reactStateValue, setValue] - return null! - } - useStreamFromValues( this: ReffuseHelpers, values: A, -- 2.49.1 From cbd39f893eece01dc609a46d2883d8e3808ae6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 11 Apr 2025 23:40:06 +0200 Subject: [PATCH 197/326] Done useSubscribeRefs --- packages/reffuse/src/ReffuseHelpers.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 516791a..4e3d3de 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -1,4 +1,4 @@ -import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { Array, type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, pipe, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -389,9 +389,21 @@ export abstract class ReffuseHelpers { this: ReffuseHelpers, ...refs: Refs ): [...{ [K in keyof Refs]: Effect.Effect.Success }] { - const [reactStateValue, setReactStateValue] = React.useState( - this.useMemo(() => Effect.all(refs), [], { doNotReExecuteOnRuntimeOrContextChange: true }) - ) + const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( + () => Effect.all(refs as readonly SubscriptionRef.SubscriptionRef[]), + [], + { doNotReExecuteOnRuntimeOrContextChange: true }, + ) as [...{ [K in keyof Refs]: Effect.Effect.Success }]) + + this.useFork(() => pipe(refs as readonly SubscriptionRef.SubscriptionRef[], + Array.map(ref => Stream.changesWith(ref.changes, (x, y) => x === y)), + streams => Stream.zipLatestAll(...streams), + Stream.runForEach(v => + Effect.sync(() => setReactStateValue(v as [...{ [K in keyof Refs]: Effect.Effect.Success }])) + ), + ), refs) + + return reactStateValue } /** -- 2.49.1 From 5f5ef5614b517be7b8ffbf7567d9371def8f8fdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 12 Apr 2025 00:16:04 +0200 Subject: [PATCH 198/326] Working SubscribeRefs --- packages/example/src/routes/tests.tsx | 8 ++++---- packages/reffuse/src/ReffuseHelpers.ts | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 14c9552..928c2d8 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -26,7 +26,7 @@ function RouteComponent() { const aRef = R.useRef("a value") const anotherRef = R.useRef(69) - const res = R.useRefsState({ aRef, anotherRef }) + const res = R.useSubscribeRefs(aRef, anotherRef) const [reactValue, setReactValue] = useState("initial") @@ -46,9 +46,9 @@ function RouteComponent() { return ( - - {([aValue]) => {aValue}} - + + {(aValue, anotherRef) => {aValue} / {anotherRef}} + diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseHelpers.ts index 4e3d3de..15716ab 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseHelpers.ts @@ -19,6 +19,7 @@ export abstract class ReffuseHelpers { declare ["constructor"]: ReffuseHelpersClass constructor() { + this.SubscribeRefs = this.SubscribeRefs.bind(this as any) as any this.RefState = this.RefState.bind(this as any) as any } @@ -448,6 +449,19 @@ export abstract class ReffuseHelpers { } + SubscribeRefs< + const Refs extends readonly SubscriptionRef.SubscriptionRef[], + R, + >( + this: ReffuseHelpers, + props: { + readonly refs: Refs + readonly children: (...args: [...{ [K in keyof Refs]: Effect.Effect.Success }]) => React.ReactNode + }, + ): React.ReactNode { + return props.children(...this.useSubscribeRefs(...props.refs)) + } + RefState( this: ReffuseHelpers, props: { -- 2.49.1 From b7ef95341becfa590ca986907cca812054fbfb52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 12 Apr 2025 00:39:02 +0200 Subject: [PATCH 199/326] Tests --- packages/example/src/routes/tests.tsx | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 928c2d8..0869fe6 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -2,7 +2,7 @@ import { R } from "@/reffuse" import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" -import { Console, Effect, Stream } from "effect" +import { Console, Effect, Ref, Stream } from "effect" import { useState } from "react" @@ -23,16 +23,9 @@ function RouteComponent() { ), []) - const aRef = R.useRef("a value") + const uuidRef = R.useRef("none") const anotherRef = R.useRef(69) - const res = R.useSubscribeRefs(aRef, anotherRef) - - - const [reactValue, setReactValue] = useState("initial") - const reactValueStream = R.useStreamFromValues([reactValue]) - R.useFork(() => Stream.runForEach(reactValueStream, Console.log), [reactValueStream]) - const logValue = R.useCallbackSync(Effect.fn(function*(value: string) { yield* Effect.log(value) @@ -40,14 +33,14 @@ function RouteComponent() { const generateUuid = R.useCallbackSync(() => makeUuid4.pipe( Effect.provide(GetRandomValues.CryptoRandom), - Effect.map(setReactValue), + Effect.flatMap(v => Ref.set(uuidRef, v)), ), []) return ( - - {(aValue, anotherRef) => {aValue} / {anotherRef}} + + {(uuid, anotherRef) => {uuid} / {anotherRef}} -- 2.49.1 From 821fd18f8f2394957ddae1acd2797853512b83a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 12 Apr 2025 18:30:37 +0200 Subject: [PATCH 200/326] Fix --- packages/example/src/routes/query/usemutation.tsx | 2 +- packages/example/src/routes/query/usequery.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/example/src/routes/query/usemutation.tsx b/packages/example/src/routes/query/usemutation.tsx index 586baff..fdc042a 100644 --- a/packages/example/src/routes/query/usemutation.tsx +++ b/packages/example/src/routes/query/usemutation.tsx @@ -37,7 +37,7 @@ function RouteComponent() { ) }) - const [state] = R.useRefState(mutation.state) + const [state] = R.useSubscribeRefs(mutation.state) return ( diff --git a/packages/example/src/routes/query/usequery.tsx b/packages/example/src/routes/query/usequery.tsx index 45bbecc..535c25b 100644 --- a/packages/example/src/routes/query/usequery.tsx +++ b/packages/example/src/routes/query/usequery.tsx @@ -31,7 +31,7 @@ function RouteComponent() { ), }) - const [state] = R.useRefState(query.state) + const [state] = R.useSubscribeRefs(query.state) return ( -- 2.49.1 From 570fb938764beb0a8f0426d3a8debb7e1a8dce33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 12 Apr 2025 23:03:17 +0200 Subject: [PATCH 201/326] ReffuseHelpers -> ReffuseNamespace --- packages/example/src/routes/tests.tsx | 3 +- packages/extension-lazyref/src/index.ts | 4 +- .../extension-query/src/QueryExtension.ts | 6 +- packages/reffuse/src/Reffuse.ts | 16 ++--- ...{ReffuseHelpers.ts => ReffuseNamespace.ts} | 60 +++++++++---------- packages/reffuse/src/index.ts | 2 +- 6 files changed, 45 insertions(+), 46 deletions(-) rename packages/reffuse/src/{ReffuseHelpers.ts => ReffuseNamespace.ts} (92%) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 0869fe6..64bac4d 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -2,8 +2,7 @@ import { R } from "@/reffuse" import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" -import { Console, Effect, Ref, Stream } from "effect" -import { useState } from "react" +import { Console, Effect, Ref } from "effect" export const Route = createFileRoute("/tests")({ diff --git a/packages/extension-lazyref/src/index.ts b/packages/extension-lazyref/src/index.ts index ab2704b..42b76ec 100644 --- a/packages/extension-lazyref/src/index.ts +++ b/packages/extension-lazyref/src/index.ts @@ -1,12 +1,12 @@ import * as LazyRef from "@typed/lazy-ref" import { Effect, Stream } from "effect" import * as React from "react" -import { ReffuseExtension, type ReffuseHelpers, SetStateAction } from "reffuse" +import { ReffuseExtension, type ReffuseNamespace, SetStateAction } from "reffuse" export const LazyRefExtension = ReffuseExtension.make(() => ({ useLazyRefState( - this: ReffuseHelpers.ReffuseHelpers, + this: ReffuseNamespace.ReffuseNamespace, ref: LazyRef.LazyRef, ): [A, React.Dispatch>] { const initialState = this.useMemo(() => ref, [], { doNotReExecuteOnRuntimeOrContextChange: true }) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index eee7860..ddd6b07 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,7 +1,7 @@ import type * as AsyncData from "@typed/async-data" import { type Cause, type Context, Effect, type Fiber, Layer, type Option, type Stream, type SubscriptionRef } from "effect" import * as React from "react" -import { ReffuseExtension, type ReffuseHelpers } from "reffuse" +import { ReffuseExtension, type ReffuseNamespace } from "reffuse" import type * as MutationService from "./MutationService.js" import * as QueryClient from "./QueryClient.js" import type * as QueryProgress from "./QueryProgress.js" @@ -59,7 +59,7 @@ export const QueryExtension = ReffuseExtension.make(() => ({ QR extends R, R, >( - this: ReffuseHelpers.ReffuseHelpers>, + this: ReffuseNamespace.ReffuseNamespace>, props: UseQueryProps, ): UseQueryResult> { const runner = this.useMemo(() => QueryRunner.make({ @@ -98,7 +98,7 @@ export const QueryExtension = ReffuseExtension.make(() => ({ QR extends R, R, >( - this: ReffuseHelpers.ReffuseHelpers>, + this: ReffuseNamespace.ReffuseNamespace>, props: UseMutationProps, ): UseMutationResult> { const runner = this.useMemo(() => MutationRunner.make({ diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index ccfcfe1..547342a 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -1,30 +1,30 @@ import type * as ReffuseContext from "./ReffuseContext.js" import type * as ReffuseExtension from "./ReffuseExtension.js" -import * as ReffuseHelpers from "./ReffuseHelpers.js" +import * as ReffuseNamespace from "./ReffuseNamespace.js" import type { Merge, StaticType } from "./types.js" -export class Reffuse extends ReffuseHelpers.make() {} +export class Reffuse extends ReffuseNamespace.makeClass() {} export const withContexts = >( ...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext }] ) => ( < - BaseClass extends ReffuseHelpers.ReffuseHelpersClass, + BaseClass extends ReffuseNamespace.ReffuseNamespaceClass, R1 >( - self: BaseClass & ReffuseHelpers.ReffuseHelpersClass + self: BaseClass & ReffuseNamespace.ReffuseNamespaceClass ): ( { new(): Merge< InstanceType, - { constructor: ReffuseHelpers.ReffuseHelpersClass } + { constructor: ReffuseNamespace.ReffuseNamespaceClass } > } & Merge< StaticType, - StaticType> + StaticType> > ) => class extends self { static readonly contexts = [...self.contexts, ...contexts] @@ -33,10 +33,10 @@ export const withContexts = >( export const withExtension = (extension: ReffuseExtension.ReffuseExtension) => ( < - BaseClass extends ReffuseHelpers.ReffuseHelpersClass, + BaseClass extends ReffuseNamespace.ReffuseNamespaceClass, R >( - self: BaseClass & ReffuseHelpers.ReffuseHelpersClass + self: BaseClass & ReffuseNamespace.ReffuseNamespaceClass ): ( { new(): Merge, A> } & StaticType diff --git a/packages/reffuse/src/ReffuseHelpers.ts b/packages/reffuse/src/ReffuseNamespace.ts similarity index 92% rename from packages/reffuse/src/ReffuseHelpers.ts rename to packages/reffuse/src/ReffuseNamespace.ts index 15716ab..7bf1549 100644 --- a/packages/reffuse/src/ReffuseHelpers.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -15,8 +15,8 @@ export interface ScopeOptions { } -export abstract class ReffuseHelpers { - declare ["constructor"]: ReffuseHelpersClass +export abstract class ReffuseNamespace { + declare ["constructor"]: ReffuseNamespaceClass constructor() { this.SubscribeRefs = this.SubscribeRefs.bind(this as any) as any @@ -24,16 +24,16 @@ export abstract class ReffuseHelpers { } - useContext(this: ReffuseHelpers): Context.Context { + useContext(this: ReffuseNamespace): Context.Context { return ReffuseContext.useMergeAll(...this.constructor.contexts) } - useLayer(this: ReffuseHelpers): Layer.Layer { + useLayer(this: ReffuseNamespace): Layer.Layer { return ReffuseContext.useMergeAllLayers(...this.constructor.contexts) } - useRunSync(this: ReffuseHelpers): (effect: Effect.Effect) => A { + useRunSync(this: ReffuseNamespace): (effect: Effect.Effect) => A { const runtime = ReffuseRuntime.useRuntime() const context = this.useContext() @@ -43,7 +43,7 @@ export abstract class ReffuseHelpers { ), [runtime, context]) } - useRunPromise(this: ReffuseHelpers): ( + useRunPromise(this: ReffuseNamespace): ( effect: Effect.Effect, options?: { readonly signal?: AbortSignal }, ) => Promise { @@ -56,7 +56,7 @@ export abstract class ReffuseHelpers { ), [runtime, context]) } - useRunFork(this: ReffuseHelpers): ( + useRunFork(this: ReffuseNamespace): ( effect: Effect.Effect, options?: Runtime.RunForkOptions, ) => Fiber.RuntimeFiber { @@ -69,7 +69,7 @@ export abstract class ReffuseHelpers { ), [runtime, context]) } - useRunCallback(this: ReffuseHelpers): ( + useRunCallback(this: ReffuseNamespace): ( effect: Effect.Effect, options?: Runtime.RunCallbackOptions, ) => Runtime.Cancel { @@ -92,7 +92,7 @@ export abstract class ReffuseHelpers { * You can disable this behavior by setting `doNotReExecuteOnRuntimeOrContextChange` to `true` in `options`. */ useMemo( - this: ReffuseHelpers, + this: ReffuseNamespace, effect: () => Effect.Effect, deps: React.DependencyList, options?: RenderOptions, @@ -106,7 +106,7 @@ export abstract class ReffuseHelpers { } useMemoScoped( - this: ReffuseHelpers, + this: ReffuseNamespace, effect: () => Effect.Effect, deps: React.DependencyList, options?: RenderOptions & ScopeOptions, @@ -179,7 +179,7 @@ export abstract class ReffuseHelpers { * ``` */ useEffect( - this: ReffuseHelpers, + this: ReffuseNamespace, effect: () => Effect.Effect, deps?: React.DependencyList, options?: RenderOptions & ScopeOptions, @@ -227,7 +227,7 @@ export abstract class ReffuseHelpers { * ``` */ useLayoutEffect( - this: ReffuseHelpers, + this: ReffuseNamespace, effect: () => Effect.Effect, deps?: React.DependencyList, options?: RenderOptions & ScopeOptions, @@ -275,7 +275,7 @@ export abstract class ReffuseHelpers { * ``` */ useFork( - this: ReffuseHelpers, + this: ReffuseNamespace, effect: () => Effect.Effect, deps?: React.DependencyList, options?: Runtime.RunForkOptions & RenderOptions & ScopeOptions, @@ -298,7 +298,7 @@ export abstract class ReffuseHelpers { } usePromise( - this: ReffuseHelpers, + this: ReffuseNamespace, effect: () => Effect.Effect, deps?: React.DependencyList, options?: { readonly signal?: AbortSignal } & Runtime.RunForkOptions & RenderOptions & ScopeOptions, @@ -345,7 +345,7 @@ export abstract class ReffuseHelpers { } useCallbackSync( - this: ReffuseHelpers, + this: ReffuseNamespace, callback: (...args: Args) => Effect.Effect, deps: React.DependencyList, options?: RenderOptions, @@ -359,7 +359,7 @@ export abstract class ReffuseHelpers { } useCallbackPromise( - this: ReffuseHelpers, + this: ReffuseNamespace, callback: (...args: Args) => Effect.Effect, deps: React.DependencyList, options?: { readonly signal?: AbortSignal } & RenderOptions, @@ -373,7 +373,7 @@ export abstract class ReffuseHelpers { } useRef( - this: ReffuseHelpers, + this: ReffuseNamespace, value: A, ): SubscriptionRef.SubscriptionRef { return this.useMemo( @@ -387,7 +387,7 @@ export abstract class ReffuseHelpers { const Refs extends readonly SubscriptionRef.SubscriptionRef[], R, >( - this: ReffuseHelpers, + this: ReffuseNamespace, ...refs: Refs ): [...{ [K in keyof Refs]: Effect.Effect.Success }] { const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( @@ -415,7 +415,7 @@ export abstract class ReffuseHelpers { * Note that the rules of React's immutable state still apply: updating a ref with the same value will not trigger a re-render. */ useRefState( - this: ReffuseHelpers, + this: ReffuseNamespace, ref: SubscriptionRef.SubscriptionRef, ): [A, React.Dispatch>] { const initialState = this.useMemo(() => ref, [], { doNotReExecuteOnRuntimeOrContextChange: true }) @@ -436,7 +436,7 @@ export abstract class ReffuseHelpers { } useStreamFromValues( - this: ReffuseHelpers, + this: ReffuseNamespace, values: A, ): Stream.Stream { const [queue, stream] = this.useMemo(() => Queue.unbounded().pipe( @@ -453,7 +453,7 @@ export abstract class ReffuseHelpers { const Refs extends readonly SubscriptionRef.SubscriptionRef[], R, >( - this: ReffuseHelpers, + this: ReffuseNamespace, props: { readonly refs: Refs readonly children: (...args: [...{ [K in keyof Refs]: Effect.Effect.Success }]) => React.ReactNode @@ -463,7 +463,7 @@ export abstract class ReffuseHelpers { } RefState( - this: ReffuseHelpers, + this: ReffuseNamespace, props: { readonly ref: SubscriptionRef.SubscriptionRef readonly children: (state: [A, React.Dispatch>]) => React.ReactNode @@ -474,30 +474,30 @@ export abstract class ReffuseHelpers { } -export interface ReffuseHelpers extends Pipeable.Pipeable {} +export interface ReffuseNamespace extends Pipeable.Pipeable {} -ReffuseHelpers.prototype.pipe = function pipe() { +ReffuseNamespace.prototype.pipe = function pipe() { return Pipeable.pipeArguments(this, arguments) }; -export interface ReffuseHelpersClass extends Pipeable.Pipeable { - new(): ReffuseHelpers +export interface ReffuseNamespaceClass extends Pipeable.Pipeable { + new(): ReffuseNamespace make(this: new () => Self): Self readonly contexts: readonly ReffuseContext.ReffuseContext[] } -(ReffuseHelpers as ReffuseHelpersClass).make = function make() { +(ReffuseNamespace as ReffuseNamespaceClass).make = function make() { return new this() }; -(ReffuseHelpers as ReffuseHelpersClass).pipe = function pipe() { +(ReffuseNamespace as ReffuseNamespaceClass).pipe = function pipe() { return Pipeable.pipeArguments(this, arguments) }; -export const make = (): ReffuseHelpersClass => ( - class extends (ReffuseHelpers as ReffuseHelpersClass) { +export const makeClass = (): ReffuseNamespaceClass => ( + class extends (ReffuseNamespace as ReffuseNamespaceClass) { static readonly contexts = [] } ) diff --git a/packages/reffuse/src/index.ts b/packages/reffuse/src/index.ts index 63af29b..01fb88f 100644 --- a/packages/reffuse/src/index.ts +++ b/packages/reffuse/src/index.ts @@ -1,6 +1,6 @@ export * as Reffuse from "./Reffuse.js" export * as ReffuseContext from "./ReffuseContext.js" export * as ReffuseExtension from "./ReffuseExtension.js" -export * as ReffuseHelpers from "./ReffuseHelpers.js" +export * as ReffuseNamespace from "./ReffuseNamespace.js" export * as ReffuseRuntime from "./ReffuseRuntime.js" export * as SetStateAction from "./SetStateAction.js" -- 2.49.1 From 6e8ce84851b4f766b5a2e42552ec2ec36e06ecd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 12 Apr 2025 23:06:43 +0200 Subject: [PATCH 202/326] Cleanup --- packages/reffuse/src/types.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/reffuse/src/types.ts b/packages/reffuse/src/types.ts index 51f4129..d4abd6c 100644 --- a/packages/reffuse/src/types.ts +++ b/packages/reffuse/src/types.ts @@ -8,14 +8,4 @@ export type CommonKeys = Extract */ export type StaticType any> = Omit -export type Extend = - Extendable extends true - ? Omit> & Self - : never - -export type Extendable = - Pick> extends Pick> - ? true - : false - export type Merge = Omit> & Self -- 2.49.1 From 1cb02407c877d2779b611e26d0b9ec0a1962e711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 12 Apr 2025 23:47:43 +0200 Subject: [PATCH 203/326] Dependencies fix --- bun.lock | 364 +++++++++++++++++----------------- package.json | 8 +- packages/example/package.json | 38 ++-- 3 files changed, 208 insertions(+), 202 deletions(-) diff --git a/bun.lock b/bun.lock index ab066ea..3d51717 100644 --- a/bun.lock +++ b/bun.lock @@ -4,46 +4,46 @@ "": { "name": "@reffuse/monorepo", "devDependencies": { - "npm-check-updates": "^17.1.16", + "npm-check-updates": "^17.1.18", "npm-sort": "^0.0.4", - "turbo": "^2.4.4", - "typescript": "^5.8.2", + "turbo": "^2.5.0", + "typescript": "^5.8.3", }, }, "packages/example": { "name": "@reffuse/example", "version": "0.0.0", "dependencies": { - "@effect/platform": "^0.80.1", - "@effect/platform-browser": "^0.59.1", + "@effect/platform": "^0.80.8", + "@effect/platform-browser": "^0.59.8", "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", "@typed/async-data": "^0.13.1", - "@typed/id": "^0.17.1", + "@typed/id": "^0.17.2", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.14.1", - "lucide-react": "^0.483.0", + "effect": "^3.14.8", + "lucide-react": "^0.487.0", "mobx": "^6.13.7", "reffuse": "workspace:*", }, "devDependencies": { - "@eslint/js": "^9.23.0", - "@tanstack/react-router": "^1.114.27", - "@tanstack/react-router-devtools": "^1.114.27", - "@tanstack/router-plugin": "^1.114.27", + "@eslint/js": "^9.24.0", + "@tanstack/react-router": "^1.115.3", + "@tanstack/react-router-devtools": "^1.115.3", + "@tanstack/router-plugin": "^1.115.3", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.0.12", - "@types/react-dom": "^19.0.4", + "@types/react": "^19.1.1", + "@types/react-dom": "^19.1.2", "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.23.0", + "eslint": "^9.24.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "typescript-eslint": "^8.28.0", - "vite": "^6.2.3", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "typescript-eslint": "^8.29.1", + "vite": "^6.2.6", }, }, "packages/extension-lazyref": { @@ -62,7 +62,7 @@ }, "packages/extension-query": { "name": "@reffuse/extension-query", - "version": "0.1.1", + "version": "0.1.2", "devDependencies": { "reffuse": "workspace:*", }, @@ -78,7 +78,7 @@ }, "packages/reffuse": { "name": "reffuse", - "version": "0.1.4", + "version": "0.1.5", "peerDependencies": { "@types/react": "^19.0.0", "effect": "^3.13.0", @@ -129,77 +129,77 @@ "@babel/types": ["@babel/types@7.27.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg=="], - "@effect/platform": ["@effect/platform@0.80.1", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.14.1" } }, "sha512-unObetsvXAk4HJn1DM/icnzOjyQ9B2xpUm+jE+g3Oc9OAi0VHVVF3F3eEsw+hWG8deJ46zWjz3Z3iCSi0ER5eQ=="], + "@effect/platform": ["@effect/platform@0.80.8", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.14.8" } }, "sha512-iNHMioRWJSBGElFVhKiE23eO16N2tyDQBvYFKwqxg1/O+aGeOeo1EA7BI0YTyUcQ4pBvMI+1QiLJlskB+UV/6g=="], - "@effect/platform-browser": ["@effect/platform-browser@0.59.1", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.80.1", "effect": "^3.14.1" } }, "sha512-wE9rljYnbp6N/XKr9gHHoiXcWYhKCVPdETVKhieuAbk7TFk4HrqCw141QUyfX49Z3gkV6+RdycFHicQjQpepAA=="], + "@effect/platform-browser": ["@effect/platform-browser@0.59.8", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.80.8", "effect": "^3.14.8" } }, "sha512-PRRSXoT3s/zrLNKKLujvhQ1vH6P88rXSCW0Jc8RNRXN/3DVSCE1WfvAZ8lYD05r6Crj5eTpDctJbUuGvIFuSOw=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.1", "", { "os": "android", "cpu": "arm" }, "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.2", "", { "os": "android", "cpu": "arm" }, "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.1", "", { "os": "android", "cpu": "arm64" }, "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.1", "", { "os": "android", "cpu": "x64" }, "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.2", "", { "os": "android", "cpu": "x64" }, "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.1", "", { "os": "linux", "cpu": "arm" }, "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.2", "", { "os": "linux", "cpu": "arm" }, "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.2", "", { "os": "linux", "cpu": "x64" }, "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.1", "", { "os": "none", "cpu": "arm64" }, "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.2", "", { "os": "none", "cpu": "arm64" }, "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.1", "", { "os": "none", "cpu": "x64" }, "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.2", "", { "os": "none", "cpu": "x64" }, "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.1", "", { "os": "win32", "cpu": "x64" }, "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.2", "", { "os": "win32", "cpu": "x64" }, "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.5.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.6.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], - "@eslint/config-array": ["@eslint/config-array@0.19.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w=="], + "@eslint/config-array": ["@eslint/config-array@0.20.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.2.0", "", {}, "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.1", "", {}, "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw=="], "@eslint/core": ["@eslint/core@0.12.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg=="], "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - "@eslint/js": ["@eslint/js@9.23.0", "", {}, "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw=="], + "@eslint/js": ["@eslint/js@9.24.0", "", {}, "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.7", "", { "dependencies": { "@eslint/core": "^0.12.0", "levn": "^0.4.1" } }, "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.8", "", { "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" } }, "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA=="], "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], @@ -247,117 +247,117 @@ "@radix-ui/colors": ["@radix-ui/colors@3.0.0", "", {}, "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg=="], - "@radix-ui/number": ["@radix-ui/number@1.1.0", "", {}, "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ=="], + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], - "@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="], + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], - "@radix-ui/react-accessible-icon": ["@radix-ui/react-accessible-icon@1.1.2", "", { "dependencies": { "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+rnMO0SEfzkcHr93RshkQVpOA26MtGOv4pcS9QUnLg4F8+GDmCJ8c2FEPhPz5e7arf31EzbTqJxFbzg3qen14g=="], + "@radix-ui/react-accessible-icon": ["@radix-ui/react-accessible-icon@1.1.3", "", { "dependencies": { "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-givBUIlhucV212j05wJCzXtcUtQnAwoUF9eAyUyOB2YwKHnWyme817trCtAzLjo0OndPr09kbkFe2onKRxLWdg=="], - "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collapsible": "1.1.3", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A=="], + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collapsible": "1.1.4", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-SGCxlSBaMvEzDROzyZjsVNzu9XY5E28B3k8jOENyrz6csOv/pG1eHyYfLJai1n9tRjwG61coXDhfpgtxKxUv5g=="], - "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dialog": "1.1.6", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-p4XnPqgej8sZAAReCAKgz1REYZEBLR8hU9Pg27wFnCWIMc8g1ccCs0FjBcy05V15VTu8pAePw/VDYeOm/uZ6yQ=="], + "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dialog": "1.1.7", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7Gx1gcoltd0VxKoR8mc+TAVbzvChJyZryZsTam0UhoL92z0L+W8ovxvcgvd+nkz24y7Qc51JQKBAGe4+825tYw=="], - "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg=="], + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2dvVU4jva0qkNZH6HHWuSz5FN5GeU5tymvCgutF8WaXz9WnD1NgUhy73cqzkjkN4Zkn8lfTPv5JIfrC221W+Nw=="], - "@radix-ui/react-aspect-ratio": ["@radix-ui/react-aspect-ratio@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TaJxYoCpxJ7vfEkv2PTNox/6zzmpKXT6ewvCuf2tTOIVN45/Jahhlld29Yw4pciOXS2Xq91/rSGEdmEnUWZCqA=="], + "@radix-ui/react-aspect-ratio": ["@radix-ui/react-aspect-ratio@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yIrYZUc2e/JtRkDpuJCmaR6kj/jzekDfQLcPFdEWzSOygCPy8poR4YcszaHP5A7mh25ncofHEpeTwfhxEuBv8Q=="], - "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.3", "", { "dependencies": { "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Paen00T4P8L8gd9bNsRMw7Cbaz85oxiv+hzomsRZgFm2byltPFDtfcoqlWJ8GyZlIBWgLssJlzLCnKU0G0302g=="], + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.4", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+kBesLBzwqyDiYCtYFK+6Ktf+N7+Y6QOTUueLGLIbLZ/YeyFW6bsBGDsN+5HxHpM55C90u5fxsg0ErxzXTcwKA=="], - "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw=="], + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-B0gYIVxl77KYDR25AY9EGe/G//ef85RVBIxQvK+m5pxAC7XihAc/8leMHhDvjvhDu02SBSb6BuytlWr/G7F3+g=="], - "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw=="], + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-u7LCw1EYInQtBNLGjm9nZ89S/4GcvX1UR5XbekEgnQae2Hkpq39ycJ1OhdeN1/JDfVNG91kWaWoest127TaEKQ=="], - "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw=="], + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-mM2pxoQw5HJ49rkzwOs7Y6J4oYH22wS8BfK2/bBxROlI4xuR0c4jEenQP63LlTlDkO6Buj2Vt+QYAYcOgqtrXA=="], - "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], - "@radix-ui/react-context": ["@radix-ui/react-context@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q=="], + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], - "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-menu": "2.1.6", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-aUP99QZ3VU84NPsHeaFt4cQUNgJqFsLLOt/RbbWXszZ6MP0DpDyjkFZORr4RpAEx3sUBk+Kc8h13yGtC5Qw8dg=="], + "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.2.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-menu": "2.1.7", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-EwO3tyyqwGaLPg0P64jmIKJnBywD0yjiL1eRuMPyhUXPkWWpa5JPDS+oyeIWHy2JbhF+NUlfUPVq6vE7OqgZww=="], - "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw=="], + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.3", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-EIdma8C0C/I6kL6sO02avaCRqi3fmWJpxH6mqbVScorW6nNktzKJT/le7VPho3o/7wCsyRg3z0+Q+Obr0Gy/VQ=="], - "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg=="], + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], - "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg=="], + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7gpgMT2gyKym9Jz2ZhlRXSg2y6cNQIK8d/cqBZ0RBCaps8pFryCWXiUKI+uHGFrhMrbGUP7U6PWgiXzIxoyF3Q=="], - "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-menu": "2.1.6", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA=="], + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.7", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7/1LiuNZuCQE3IzdicGoHdQOHkS2Q08+7p8w6TXZ6ZjgAULaCI85ZY15yPl4o4FVgoKLRT43/rsfNVN8osClQQ=="], - "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg=="], + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA=="], - "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA=="], + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-4XaDlq0bPt7oJwR+0k0clCiCO/7lO7NKZTAaJBYxDNQT/vj4ig0/UvctrRscZaFREpRvUTkpKR96ov1e6jptQg=="], - "@radix-ui/react-form": ["@radix-ui/react-form@0.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-label": "2.1.2", "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Owj1MjLq6/Rp85bgzYI+zRK5APLiWDtXDM63Z39FW15bNdehrcS+FjQgLGQYswFzipYu4GAA+t5w/VqvvNZ3ag=="], + "@radix-ui/react-form": ["@radix-ui/react-form@0.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-label": "2.1.3", "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-fVxaewKm9+oKL5q+E1+tIKNEkAeh8waJ+MsFNhLFAmpF8VG6nrNXYd2FFU8J7P3gIGNr023Sp+dD0xflqI84mA=="], - "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-E4ozl35jq0VRlrdc4dhHrNSV0JqBb4Jy73WAhBEK7JoYnQ83ED5r0Rb/XdVKw89ReAJN38N492BAPBZQ57VmqQ=="], + "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HwM03kP8psrv21J1+9T/hhxi0f5rARVbqIZl9+IAq13l4j4fX+oGIuxisukZZmebO7J35w9gpoILvtG8bbph0w=="], - "@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="], + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], - "@radix-ui/react-label": ["@radix-ui/react-label@2.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw=="], + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zwSQ1NzSKG95yA0tvBMgv6XPHoqapJCcg9nsUBaQQ66iRBhZNhlpaQG2ERYYX4O4stkYFK5rxj5NsWfO9CS+Hg=="], - "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-callback-ref": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg=="], + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.3", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tBODsrk68rOi1/iQzbM54toFF+gSw/y+eQgttFflqlGekuSebNqvFNHjJgjqPhiMb4Fw9A0zNFly1QT6ZFdQ+Q=="], - "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-menu": "2.1.6", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-FHq7+3DlXwh/7FOM4i0G4bC4vPjiq89VEEvNF4VMLchGnaUuUbE5uKXMUCjdKaOghEEMeiKa5XCa2Pk4kteWmg=="], + "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.7", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YB2zFhGdZ5SWEgRS+PgrF7EkwpsjEHntIFB/LRbT49LJdnIeK/xQQyuwLiRcOCgTDN+ALlPXQ08f0P0+TfR41g=="], - "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-myMHHQUZ3ZLTi8W381/Vu43Ia0NqakkQZ2vzynMmTUtQQ9kNkjzhOwkZC9TAM5R07OZUVIQyHC06f/9JZJpvvA=="], + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HJqyzqG74Lj7KV58rk73i/B1nnopVyCfUmKgeGWWrZZiCuMNcY0KKugTrmqMbIeMliUnkBUDKCy9J6Mzl6xeWw=="], - "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg=="], + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.3", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-I38OYWDmJF2kbO74LX8UsFydSHWOJuQ7LxPnTefjxxvdvPLempvAnmsyX9UsBlywcbSGpRH7oMLfkUf+ij4nrw=="], - "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.2", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-rect": "1.1.0", "@radix-ui/react-use-size": "1.1.0", "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA=="], + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.3", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-iNb9LYUMkne9zIahukgQmHlSBp9XWGeQQ7FvUGNk45ywzOb6kQa+Ca38OphXlWDiKvyneo9S+KSJsLfLt8812A=="], - "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA=="], + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.5", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ps/67ZqsFm+Mb6lSPJpfhRLrVL2i2fntgCmGMqqth4eaGUf+knAuuRtWVJrNjUhExgmdRqftSgzpf0DF0n6yXA=="], - "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg=="], + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA=="], - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.2", "", { "dependencies": { "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w=="], + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g=="], - "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.2", "", { "dependencies": { "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-u1IgJFQ4zNAUTjGdDL5dcl/U8ntOR6jsnhxKb5RKp5Ozwl88xKR9EqRZOe/Mk8tnx0x5tNUe2F+MzsyjqMg0MA=="], + "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.3", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F56aZPGTPb4qJQ/vDjnAq63oTu/DRoIG/Asb5XKOWj8rpefNLtUllR969j5QDN2sRrTk9VXIqQDRj5VvAuquaw=="], - "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.2.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-xtCsqt8Rp09FK50ItqEqTJ7Sxanz8EM8dnkVIhJrc/wkMMomSmXHvYbhv3E7Zx4oXh98aaLt9W679SUYXg4IDA=="], + "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.2.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oLz7ATfKgVTUbpr5OBu6Q7hQcnV22uPT306bmG0QwgnKqBStR98RfWfJGCfW/MmhL4ISmrmmBPBW+c77SDwV9g=="], - "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw=="], + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ufbpLUjZiOg4iYgb2hQrWXEPYX6jOLBbR27bDyAff5GYMRrCzcze8lukjuXVUQvJ6HZe8+oL+hhswDcjmcgVyg=="], - "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.3", "", { "dependencies": { "@radix-ui/number": "1.1.0", "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-l7+NNBfBYYJa9tNqVcP2AGvxdE3lmE6kFTBXdvHgUaZuy+4wGCL1Cl2AfaR7RKyimj7lZURGLwFO59k4eBnDJQ=="], + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.4", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-G9rdWTQjOR4sk76HwSdROhPU0jZWpfozn9skU1v4N0/g9k7TmswrJn8W8WMU+aYktnLLpk5LX6fofj2bGe5NFQ=="], - "@radix-ui/react-select": ["@radix-ui/react-select@2.1.6", "", { "dependencies": { "@radix-ui/number": "1.1.0", "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg=="], + "@radix-ui/react-select": ["@radix-ui/react-select@2.1.7", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.3", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.1.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-exzGIRtc7S8EIM2KjFg+7lJZsH7O7tpaBaJbBNVDnOZNhtoQ2iV+iSNfi2Wth0m6h3trJkMVvzAehB3c6xj/3Q=="], - "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ=="], + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2omrWKJvxR0U/tkIXezcc1nFMwtLU0+b/rDK40gnzJqTLWQ/TD/D5IYVefp9sC3QWfeQbpSbEA6op9MQKyaALQ=="], - "@radix-ui/react-slider": ["@radix-ui/react-slider@1.2.3", "", { "dependencies": { "@radix-ui/number": "1.1.0", "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-nNrLAWLjGESnhqBqcCNW4w2nn7LxudyMzeB6VgdyAnFLC6kfQgnAjSL2v6UkQTnDctJBlxrmxfplWS4iYjdUTw=="], + "@radix-ui/react-slider": ["@radix-ui/react-slider@1.2.4", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Vr/OgNejNJPAghIhjS7Mf/2F/EXGDT0qgtiHf2BHz71+KqgN+jndFLKq5xAB9JOGejGzejfJLIvT04Do+yzhcg=="], - "@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ=="], + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], - "@radix-ui/react-switch": ["@radix-ui/react-switch@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ=="], + "@radix-ui/react-switch": ["@radix-ui/react-switch@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zGP6W8plLeogoeGMiTHJ/uvf+TE1C2chVsEwfP8YlvpQKJHktG+iCkUtCLGPAuDV8/qDSmIRPm4NggaTxFMVBQ=="], - "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng=="], + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-fuHMHWSf5SRhXke+DbHXj2wVMo+ghVH30vhX3XVacdXqDl+J4XWafMIGOOER861QpBx1jxgwKXL2dQnfrsd8MQ=="], - "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gN4dpuIVKEgpLn1z5FhzT9mYRUitbfZq9XqN/7kkBMUgFTzTG8x/KszWJugJXHcwxckY8xcKDZPz7kG3o6DsUA=="], + "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0IWTbAUKvzdpOaWDMZisXZvScXzF0phaQjWspK8RUMEUxjLbli+886mB/kXTIC3F+t5vQ0n0vYn+dsX8s+WdfA=="], - "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lntKchNWx3aCHuWKiDY+8WudiegQvBpDRAYL8dKLRvKEH8VOpl0XX6SSU/bUBqIRJbcTy4+MW06Wv8vgp10rzQ=="], + "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Za5HHd9nvsiZ2t3EI/dVd4Bm/JydK+D22uHKk46fPtvuPxVCJBUo5mQybN+g5sZe35y7I6GDTTfdkVv5SnxlFg=="], - "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-toggle": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-JBm6s6aVG/nwuY5eadhU2zDi/IwYS0sDM5ZWb4nymv/hn3hZdkw+gENn0LP4iY1yCd7+bgJaCwueMYJIU3vk4A=="], + "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-toggle": "1.1.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-khTzdGIxy8WurYUEUrapvj5aOev/tUA8TDEFi1D0Dn3yX+KR5AqjX0b7E5sL9ngRRpxDN2RRJdn5siasu5jtcg=="], - "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-separator": "1.1.2", "@radix-ui/react-toggle-group": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wT20eQ7ScFk+kBMDmHp+lMk18cgxhu35b2Bn5deUcPxiVwfn5vuZgi7NGcHu8ocdkinahmp4FaSZysKDyRVPWQ=="], + "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-separator": "1.1.3", "@radix-ui/react-toggle-group": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yTZ8ooxlBqljSiruO6y6azKXSXYBpnzd23yohjyFesun4nm8yh+D91J1yCqhtnRtSjRWuAmr9vFgGxmGwLjTfg=="], - "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.1.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA=="], + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.0", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-b1Sdc75s7zN9B8ONQTGBSHL3XS8+IcjcOIY51fhM4R1Hx8s0YbgqgyNZiri4qcYMVZK8hfCZVBiyCm7N9rs0rw=="], - "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw=="], + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], - "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw=="], + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-YnEXIy8/ga01Y1PN0VfaNH//MhA91JlEGVBDxDzROqwrAtG5Yr2QGEPz8A/rJA3C7ZAHryOYGaUv8fLSW2H/mg=="], - "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw=="], + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], - "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="], + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], - "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og=="], + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], - "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.0", "", { "dependencies": { "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ=="], + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], - "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw=="], + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], - "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q=="], + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oXSF3ZQRd5fvomd9hmUCb2EHSZbPp3ZSHAHJJU/DlF9XoFkJBBW8RHU/E8WEH+RbSfJd/QFA0sl8ClJXknBwHQ=="], - "@radix-ui/rect": ["@radix-ui/rect@1.1.0", "", {}, "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg=="], + "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], "@radix-ui/themes": ["@radix-ui/themes@3.2.1", "", { "dependencies": { "@radix-ui/colors": "^3.0.0", "classnames": "^2.3.2", "radix-ui": "^1.1.3", "react-remove-scroll-bar": "^2.3.8" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-WJL2YKAGItkunwm3O4cLTFKCGJTfAfF6Hmq7f5bCo1ggqC9qJQ/wfg/25AAN72aoEM1yqXZQ+pslsw48AFR0Xg=="], @@ -367,109 +367,109 @@ "@reffuse/extension-query": ["@reffuse/extension-query@workspace:packages/extension-query"], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.37.0", "", { "os": "android", "cpu": "arm" }, "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.40.0", "", { "os": "android", "cpu": "arm" }, "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.37.0", "", { "os": "android", "cpu": "arm64" }, "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.40.0", "", { "os": "android", "cpu": "arm64" }, "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.37.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.40.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.37.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.40.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.37.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.40.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.37.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.40.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.37.0", "", { "os": "linux", "cpu": "arm" }, "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.40.0", "", { "os": "linux", "cpu": "arm" }, "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.37.0", "", { "os": "linux", "cpu": "arm" }, "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.40.0", "", { "os": "linux", "cpu": "arm" }, "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.37.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.40.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.37.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.40.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ=="], - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA=="], + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg=="], - "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.37.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ=="], + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.40.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.37.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.40.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.37.0", "", { "os": "linux", "cpu": "x64" }, "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.40.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.37.0", "", { "os": "linux", "cpu": "x64" }, "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.40.0", "", { "os": "linux", "cpu": "x64" }, "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.37.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.40.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.37.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.40.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.37.0", "", { "os": "win32", "cpu": "x64" }, "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.40.0", "", { "os": "win32", "cpu": "x64" }, "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ=="], "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], - "@tanstack/history": ["@tanstack/history@1.114.22", "", {}, "sha512-CNwKraj/Xa8H7DUyzrFBQC3wL96JzIxT4i9CW0hxqFNNmLDyUcMJr8264iqqfxC0u1lFSG96URad08T2Qhadpw=="], + "@tanstack/history": ["@tanstack/history@1.115.0", "", {}, "sha512-K7JJNrRVvyjAVnbXOH2XLRhFXDkeP54Kt2P4FR1Kl2KDGlIbkua5VqZQD2rot3qaDrpufyUa63nuLai1kOLTsQ=="], - "@tanstack/react-router": ["@tanstack/react-router@1.114.27", "", { "dependencies": { "@tanstack/history": "1.114.22", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "1.114.25", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-xfM+FMXpebZQ5//NQEgj5y5SKQqTQEr2/LvePU9IiksxUBCgfjbuOXW5vgDHJ3xXJm3pivYqRx29cHqhueClow=="], + "@tanstack/react-router": ["@tanstack/react-router@1.115.3", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "1.115.3", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-5mV9t0hW/gMdUeBabY+/lU3HuvGdaYUMDvlLpCG5dQJXBU0UzHwPAM2xy2UTte9Ty1tqxJqeA7DQoyNe/u5SEw=="], - "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.114.27", "", { "dependencies": { "@tanstack/router-devtools-core": "^1.114.25", "solid-js": "^1.9.5" }, "peerDependencies": { "@tanstack/react-router": "^1.114.27", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-DKgMeFMgVdWiNADSemtYfOMR0dQ8xTtShfgRybDGffDe4iOQgnmeFWW1N4oBJylcj7kFRVm3yVOpDC9G6/zW4w=="], + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.115.3", "", { "dependencies": { "@tanstack/router-devtools-core": "^1.115.3", "solid-js": "^1.9.5" }, "peerDependencies": { "@tanstack/react-router": "^1.115.3", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-aAeS/Q4Dz5sOKlFK9jptU7ugfpmQcfEOlSI/bIifUugp2VVtKvyZIQ7k27YiTOMQpsmo/hifqxAhR/DSXm4dWw=="], "@tanstack/react-store": ["@tanstack/react-store@0.7.0", "", { "dependencies": { "@tanstack/store": "0.7.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng=="], - "@tanstack/router-core": ["@tanstack/router-core@1.114.25", "", { "dependencies": { "@tanstack/history": "1.114.22", "@tanstack/store": "^0.7.0", "tiny-invariant": "^1.3.3" } }, "sha512-OyLCfs7r+0LEhmQGAdyJxfO+pqGBITlr4aUN0rdhXqDTpqBn0tyrO6Tu+U9B3LQF9Xnux3KqbjzRopTY9QZBog=="], + "@tanstack/router-core": ["@tanstack/router-core@1.115.3", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/store": "^0.7.0", "tiny-invariant": "^1.3.3" } }, "sha512-gynHs72LHVg05fuJTwZZYhDL4VNEAK0sXz7IqiBv7a3qsYeEmIZsGaFr9sVjTkuF1kbrFBdJd5JYutzBh9Uuhw=="], - "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.114.25", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.114.25", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" }, "optionalPeers": ["csstype"] }, "sha512-3KFAAytAV6nWcXLTe3nWNaiRPV8AyM3jx5aa2UpB+RLDgDbO+GkVMnv3C7fnGCM6j2nw2/1boAvTvHcoKKO5UA=="], + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.115.3", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.115.3", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" }, "optionalPeers": ["csstype"] }, "sha512-VBdgw1qxeOD/6FlZ9gitrWPUKGW83CuAW31gf32E0dxL7sIXP+yEFyPlNsVlENan1oSaEuV8tjKkuq5s4MfaPw=="], - "@tanstack/router-generator": ["@tanstack/router-generator@1.114.27", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.114.12", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.2" }, "peerDependencies": { "@tanstack/react-router": "^1.114.27" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-13Cjn9wI2+OE1kK9L+JW8GypdzgA2Nf6D1H2nOiydSPph/iYsyRxCvv3S5hhuGk0L1U1NrRReCr4rVkhnhiQww=="], + "@tanstack/router-generator": ["@tanstack/router-generator@1.115.3", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.115.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.2" }, "peerDependencies": { "@tanstack/react-router": "^1.115.3" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-DnhC49ZtLRdEweUSEvVGVQtM/6Lpe8CqzRyqJGq4XSYodaoLhcOdICDVBuuwCBAJjMXAOH97rNxfL8PPPEvUJA=="], - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.114.27", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.114.25", "@tanstack/router-generator": "^1.114.27", "@tanstack/router-utils": "^1.114.12", "@tanstack/virtual-file-routes": "^1.114.12", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.9", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.114.27", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-/juqdv+TZPsi8GYxq58TpztV93M6BwM7Tv148vM5EZIOCj7LkhQmh4X3E33Eczh8s4D1UCL2Kr607rGEpRpK1w=="], + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.115.3", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.115.3", "@tanstack/router-generator": "^1.115.3", "@tanstack/router-utils": "^1.115.0", "@tanstack/virtual-file-routes": "^1.115.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.115.3", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-lqX467nCZbXZgqvLGKkfDhw7TIBSU2aDvKycaaVncPenrl12yrFb1B/EPZzfyfMD7ztsCD+kJ1xhnUPoSxzw0g=="], - "@tanstack/router-utils": ["@tanstack/router-utils@1.114.12", "", { "dependencies": { "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "ansis": "^3.11.0", "diff": "^7.0.0" } }, "sha512-W4tltvM9FQuDEJejz/JJD3q/pVHBXBb8VmA77pZlj4IBW97RnUNy8CUwZUgSYcb9OReoO4i/VjjQCUq9ZdiDmg=="], + "@tanstack/router-utils": ["@tanstack/router-utils@1.115.0", "", { "dependencies": { "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "ansis": "^3.11.0", "diff": "^7.0.0" } }, "sha512-Dng4y+uLR9b5zPGg7dHReHOTHQa6x+G6nCoZshsDtWrYsrdCcJEtLyhwZ5wG8OyYS6dVr/Cn+E5Bd2b6BhJ89w=="], "@tanstack/store": ["@tanstack/store@0.7.0", "", {}, "sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg=="], - "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.114.12", "", {}, "sha512-aR13V1kSE/kUkP4a8snmqvj82OUlR5Q/rzxICmObLCsERGfzikUc4wquOy1d/RzJgsLb8o+FiOjSWynt4T7Jhg=="], + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.115.0", "", {}, "sha512-XLUh1Py3AftcERrxkxC5Y5m5mfllRH3YR6YVlyjFgI2Tc2Ssy2NKmQFQIafoxfW459UJ8Dn81nWKETEIJifE4g=="], "@thilawyn/thilaschema": ["@thilawyn/thilaschema@0.1.4", "https://git.valverde.cloud/api/packages/Thilawyn/npm/%40thilawyn%2Fthilaschema/-/0.1.4/thilaschema-0.1.4.tgz", { "dependencies": { "remeda": "^2.17.0", "type-fest": "^4.26.1" } }, "sha512-o+lFjnRrD8N7kJtToKl+OYvVnOwaCGr1X9yMSX/8Y1n4KopOOGFSA9xqmx+MpMe3okp2Hq3Xu1aGHzFsZWxc2A=="], "@typed/async-data": ["@typed/async-data@0.13.1", "", { "dependencies": { "@typed/lazy-ref": "^0.3.2", "effect": "^3.11.9" } }, "sha512-rKv3HQtoHeGJwZpEaTL0FAEKfqHcMr/x3GtgkE01p2tJiKjq1eVaPZYpweZEEF/zUutox7DQ14oH85x+ZpPA/Q=="], - "@typed/id": ["@typed/id@0.17.1", "", { "dependencies": { "effect": "^3.11.9" } }, "sha512-+nypUUw6PJWePD1aF1CHY4995hDF3VA9c8EBtp1M+pTnyLBZQIkgKbOKamimnl4U+ZV5I3qC+3q1Y4hpmxT+zw=="], + "@typed/id": ["@typed/id@0.17.2", "", { "peerDependencies": { "effect": "^3.14.7" } }, "sha512-z/Z14/moeu9x45IpkGaRwuvb+CQ3s3UCc/agcpZibTz1yPb3RgSDXx4rOHIuyb6hG6oNzqe9yY4GbbMq3Hb5Ug=="], "@typed/lazy-ref": ["@typed/lazy-ref@0.3.3", "", { "dependencies": { "effect": "^3.11.9" } }, "sha512-qJoy01/RFYwWBaWhQBzL3Ow20Q+CPybJ/KJnGNKzyDpRUFcEvd3YSQMqZjRdBZmG2wnEpjedAnlCx9ApvKJIlA=="], "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], - "@types/babel__generator": ["@types/babel__generator@7.6.8", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="], + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], - "@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="], + "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="], "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/react": ["@types/react@19.0.12", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA=="], + "@types/react": ["@types/react@19.1.1", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-ePapxDL7qrgqSF67s0h9m412d9DbXyC1n59O2st+9rjuuamWsZuD2w55rqY12CbzsZ7uVXb5Nw0gEp9Z8MMutQ=="], - "@types/react-dom": ["@types/react-dom@19.0.4", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg=="], + "@types/react-dom": ["@types/react-dom@19.1.2", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.28.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/type-utils": "8.28.0", "@typescript-eslint/utils": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.29.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.29.1", "@typescript-eslint/type-utils": "8.29.1", "@typescript-eslint/utils": "8.29.1", "@typescript-eslint/visitor-keys": "8.29.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.28.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/types": "8.28.0", "@typescript-eslint/typescript-estree": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.29.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.29.1", "@typescript-eslint/types": "8.29.1", "@typescript-eslint/typescript-estree": "8.29.1", "@typescript-eslint/visitor-keys": "8.29.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0" } }, "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.29.1", "", { "dependencies": { "@typescript-eslint/types": "8.29.1", "@typescript-eslint/visitor-keys": "8.29.1" } }, "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.28.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.28.0", "@typescript-eslint/utils": "8.28.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.29.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.29.1", "@typescript-eslint/utils": "8.29.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.28.0", "", {}, "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.29.1", "", {}, "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.29.1", "", { "dependencies": { "@typescript-eslint/types": "8.29.1", "@typescript-eslint/visitor-keys": "8.29.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.28.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.28.0", "@typescript-eslint/types": "8.28.0", "@typescript-eslint/typescript-estree": "8.28.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.29.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.29.1", "@typescript-eslint/types": "8.29.1", "@typescript-eslint/typescript-estree": "8.29.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.28.0", "", { "dependencies": { "@typescript-eslint/types": "8.28.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.29.1", "", { "dependencies": { "@typescript-eslint/types": "8.29.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@4.3.4", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug=="], @@ -489,7 +489,7 @@ "aria-hidden": ["aria-hidden@1.2.4", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A=="], - "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.9", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-JLIhax/xullfInZjtu13UJjaLHDeTzt3vOeomaSUdO/nAMEL/pWC/laKrSvWylXMnVWyL5bpmG9njqBZlUQOdg=="], + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.10", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], @@ -503,7 +503,7 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001707", "", {}, "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001713", "", {}, "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -535,17 +535,17 @@ "diff": ["diff@7.0.0", "", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="], - "effect": ["effect@3.14.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-YrE6KYUu8r+fF3/cvdM+SZRZRjarVGhfcJwQjP/YyMmF79fwE1Rf0nWqLZ9Xfw7a9njm5/wmrYP83RYt5WTTbQ=="], + "effect": ["effect@3.14.8", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-cHV6Mc2gb1e6l+CxhCeZm1JOzE4C9Mp7MhqHNFuAcSds2c2f23ZAb1ef4gBRHMIcdJ5sr3KGm+Xn+4z/UByE8w=="], - "electron-to-chromium": ["electron-to-chromium@1.5.123", "", {}, "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA=="], + "electron-to-chromium": ["electron-to-chromium@1.5.136", "", {}, "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ=="], - "esbuild": ["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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ=="], + "esbuild": ["esbuild@0.25.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.2", "@esbuild/android-arm": "0.25.2", "@esbuild/android-arm64": "0.25.2", "@esbuild/android-x64": "0.25.2", "@esbuild/darwin-arm64": "0.25.2", "@esbuild/darwin-x64": "0.25.2", "@esbuild/freebsd-arm64": "0.25.2", "@esbuild/freebsd-x64": "0.25.2", "@esbuild/linux-arm": "0.25.2", "@esbuild/linux-arm64": "0.25.2", "@esbuild/linux-ia32": "0.25.2", "@esbuild/linux-loong64": "0.25.2", "@esbuild/linux-mips64el": "0.25.2", "@esbuild/linux-ppc64": "0.25.2", "@esbuild/linux-riscv64": "0.25.2", "@esbuild/linux-s390x": "0.25.2", "@esbuild/linux-x64": "0.25.2", "@esbuild/netbsd-arm64": "0.25.2", "@esbuild/netbsd-x64": "0.25.2", "@esbuild/openbsd-arm64": "0.25.2", "@esbuild/openbsd-x64": "0.25.2", "@esbuild/sunos-x64": "0.25.2", "@esbuild/win32-arm64": "0.25.2", "@esbuild/win32-ia32": "0.25.2", "@esbuild/win32-x64": "0.25.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.23.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.2", "@eslint/config-helpers": "^0.2.0", "@eslint/core": "^0.12.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.23.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw=="], + "eslint": ["eslint@9.24.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.0", "@eslint/core": "^0.12.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.24.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ=="], "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], @@ -647,7 +647,7 @@ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "lucide-react": ["lucide-react@0.483.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-WldsY17Qb/T3VZdMnVQ9C3DDIP7h1ViDTHVdVGnLZcvHNg30zH/MTQ04RTORjexoGmpsXroiQXZ4QyR0kBy0FA=="], + "lucide-react": ["lucide-react@0.487.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-aKqhOQ+YmFnwq8dWgGjOuLc8V1R9/c/yOd+zDY4+ohsR2Jo05lSGc3WsstYPIzcTpeosN7LoCkLReUUITvaIvw=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], @@ -675,7 +675,7 @@ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - "npm-check-updates": ["npm-check-updates@17.1.16", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-9nohkfjLRzLfsLVGbO34eXBejvrOOTuw5tvNammH73KEFG5XlFoi3G2TgjTExHtnrKWCbZ+mTT+dbNeSjASIPw=="], + "npm-check-updates": ["npm-check-updates@17.1.18", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-bkUy2g4v1i+3FeUf5fXMLbxmV95eG4/sS7lYE32GrUeVgQRfQEk39gpskksFunyaxQgTIdrvYbnuNbO/pSUSqw=="], "npm-sort": ["npm-sort@0.0.4", "", { "bin": { "npm-sort": "./index.js" } }, "sha512-S5Id/3Jvr7Cf/QnWjRteprngERCBhhEFOM+wMhUrAYP060/HUBC1aL5GoXS3xITlgacJCWaSmP4HQaAt91nNYQ=="], @@ -693,7 +693,7 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], @@ -707,11 +707,11 @@ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - "radix-ui": ["radix-ui@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-accessible-icon": "1.1.2", "@radix-ui/react-accordion": "1.2.3", "@radix-ui/react-alert-dialog": "1.1.6", "@radix-ui/react-aspect-ratio": "1.1.2", "@radix-ui/react-avatar": "1.1.3", "@radix-ui/react-checkbox": "1.1.4", "@radix-ui/react-collapsible": "1.1.3", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-context-menu": "2.2.6", "@radix-ui/react-dialog": "1.1.6", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-dropdown-menu": "2.1.6", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-form": "0.1.2", "@radix-ui/react-hover-card": "1.1.6", "@radix-ui/react-label": "2.1.2", "@radix-ui/react-menu": "2.1.6", "@radix-ui/react-menubar": "1.1.6", "@radix-ui/react-navigation-menu": "1.2.5", "@radix-ui/react-popover": "1.1.6", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-progress": "1.1.2", "@radix-ui/react-radio-group": "1.2.3", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-scroll-area": "1.2.3", "@radix-ui/react-select": "2.1.6", "@radix-ui/react-separator": "1.1.2", "@radix-ui/react-slider": "1.2.3", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-switch": "1.1.3", "@radix-ui/react-tabs": "1.1.3", "@radix-ui/react-toast": "1.2.6", "@radix-ui/react-toggle": "1.1.2", "@radix-ui/react-toggle-group": "1.1.2", "@radix-ui/react-toolbar": "1.1.2", "@radix-ui/react-tooltip": "1.1.8", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-size": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-W8L6soM1vQnIXVvVa31AkQhoZBDPwVoNHhT13R3aB9Qq7ARYIUS9DLaCopRBsbTdZm1NEEPx3rnq659CiNOBDw=="], + "radix-ui": ["radix-ui@1.2.0", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-accessible-icon": "1.1.3", "@radix-ui/react-accordion": "1.2.4", "@radix-ui/react-alert-dialog": "1.1.7", "@radix-ui/react-aspect-ratio": "1.1.3", "@radix-ui/react-avatar": "1.1.4", "@radix-ui/react-checkbox": "1.1.5", "@radix-ui/react-collapsible": "1.1.4", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.7", "@radix-ui/react-dialog": "1.1.7", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-dropdown-menu": "2.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.3", "@radix-ui/react-form": "0.1.3", "@radix-ui/react-hover-card": "1.1.7", "@radix-ui/react-label": "2.1.3", "@radix-ui/react-menu": "2.1.7", "@radix-ui/react-menubar": "1.1.7", "@radix-ui/react-navigation-menu": "1.2.6", "@radix-ui/react-popover": "1.1.7", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-progress": "1.1.3", "@radix-ui/react-radio-group": "1.2.4", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-scroll-area": "1.2.4", "@radix-ui/react-select": "2.1.7", "@radix-ui/react-separator": "1.1.3", "@radix-ui/react-slider": "1.2.4", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-switch": "1.1.4", "@radix-ui/react-tabs": "1.1.4", "@radix-ui/react-toast": "1.2.7", "@radix-ui/react-toggle": "1.1.3", "@radix-ui/react-toggle-group": "1.1.3", "@radix-ui/react-toolbar": "1.1.3", "@radix-ui/react-tooltip": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-05auM88p3yNwAarx3JQGnRHbtzDNATbMx6/Qkr2gXg5QNLPUjdeduJvlhhVzlGxfUMBnwzYmydUIzAdrOz3J5w=="], - "react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], + "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], - "react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], + "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], @@ -733,11 +733,11 @@ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="], + "rollup": ["rollup@4.40.0", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.40.0", "@rollup/rollup-android-arm64": "4.40.0", "@rollup/rollup-darwin-arm64": "4.40.0", "@rollup/rollup-darwin-x64": "4.40.0", "@rollup/rollup-freebsd-arm64": "4.40.0", "@rollup/rollup-freebsd-x64": "4.40.0", "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", "@rollup/rollup-linux-arm-musleabihf": "4.40.0", "@rollup/rollup-linux-arm64-gnu": "4.40.0", "@rollup/rollup-linux-arm64-musl": "4.40.0", "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", "@rollup/rollup-linux-riscv64-gnu": "4.40.0", "@rollup/rollup-linux-riscv64-musl": "4.40.0", "@rollup/rollup-linux-s390x-gnu": "4.40.0", "@rollup/rollup-linux-x64-gnu": "4.40.0", "@rollup/rollup-linux-x64-musl": "4.40.0", "@rollup/rollup-win32-arm64-msvc": "4.40.0", "@rollup/rollup-win32-ia32-msvc": "4.40.0", "@rollup/rollup-win32-x64-msvc": "4.40.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - "scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -769,29 +769,29 @@ "tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="], - "turbo": ["turbo@2.4.4", "", { "optionalDependencies": { "turbo-darwin-64": "2.4.4", "turbo-darwin-arm64": "2.4.4", "turbo-linux-64": "2.4.4", "turbo-linux-arm64": "2.4.4", "turbo-windows-64": "2.4.4", "turbo-windows-arm64": "2.4.4" }, "bin": { "turbo": "bin/turbo" } }, "sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ=="], + "turbo": ["turbo@2.5.0", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.0", "turbo-darwin-arm64": "2.5.0", "turbo-linux-64": "2.5.0", "turbo-linux-arm64": "2.5.0", "turbo-windows-64": "2.5.0", "turbo-windows-arm64": "2.5.0" }, "bin": { "turbo": "bin/turbo" } }, "sha512-PvSRruOsitjy6qdqwIIyolv99+fEn57gP6gn4zhsHTEcCYgXPhv6BAxzAjleS8XKpo+Y582vTTA9nuqYDmbRuA=="], - "turbo-darwin-64": ["turbo-darwin-64@2.4.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g=="], + "turbo-darwin-64": ["turbo-darwin-64@2.5.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fP1hhI9zY8hv0idym3hAaXdPi80TLovmGmgZFocVAykFtOxF+GlfIgM/l4iLAV9ObIO4SUXPVWHeBZQQ+Hpjag=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.4.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-/gtHPqbGQXDFhrmy+Q/MFW2HUTUlThJ97WLLSe4bxkDrKHecDYhAjbZ4rN3MM93RV9STQb3Tqy4pZBtsd4DfCw=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-p9sYq7kXH7qeJwIQE86cOWv/xNqvow846l6c/qWc26Ib1ci5W7V0sI5thsrP3eH+VA0d+SHalTKg5SQXgNQBWA=="], - "turbo-linux-64": ["turbo-linux-64@2.4.4", "", { "os": "linux", "cpu": "x64" }, "sha512-SR0gri4k0bda56hw5u9VgDXLKb1Q+jrw4lM7WAhnNdXvVoep4d6LmnzgMHQQR12Wxl3KyWPbkz9d1whL6NTm2Q=="], + "turbo-linux-64": ["turbo-linux-64@2.5.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1iEln2GWiF3iPPPS1HQJT6ZCFXynJPd89gs9SkggH2EJsj3eRUSVMmMC8y6d7bBbhBFsiGGazwFIYrI12zs6uQ=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.4.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-COXXwzRd3vslQIfJhXUklgEqlwq35uFUZ7hnN+AUyXx7hUOLIiD5NblL+ETrHnhY4TzWszrbwUMfe2BYWtaPQg=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.5.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-bKBcbvuQHmsX116KcxHJuAcppiiBOfivOObh2O5aXNER6mce7YDDQJy00xQQNp1DhEfcSV2uOsvb3O3nN2cbcA=="], - "turbo-windows-64": ["turbo-windows-64@2.4.4", "", { "os": "win32", "cpu": "x64" }, "sha512-PV9rYNouGz4Ff3fd6sIfQy5L7HT9a4fcZoEv8PKRavU9O75G7PoDtm8scpHU10QnK0QQNLbE9qNxOAeRvF0fJg=="], + "turbo-windows-64": ["turbo-windows-64@2.5.0", "", { "os": "win32", "cpu": "x64" }, "sha512-9BCo8oQ7BO7J0K913Czbc3tw8QwLqn2nTe4E47k6aVYkM12ASTScweXPTuaPFP5iYXAT6z5Dsniw704Ixa5eGg=="], - "turbo-windows-arm64": ["turbo-windows-arm64@2.4.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.5.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-OUHCV+ueXa3UzfZ4co/ueIHgeq9B2K48pZwIxKSm5VaLVuv8M13MhM7unukW09g++dpdrrE1w4IOVgxKZ0/exg=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@4.38.0", "", {}, "sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg=="], + "type-fest": ["type-fest@4.39.1", "", {}, "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w=="], - "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], - "typescript-eslint": ["typescript-eslint@8.28.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.28.0", "@typescript-eslint/parser": "8.28.0", "@typescript-eslint/utils": "8.28.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ=="], + "typescript-eslint": ["typescript-eslint@8.29.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.29.1", "@typescript-eslint/parser": "8.29.1", "@typescript-eslint/utils": "8.29.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w=="], - "unplugin": ["unplugin@2.2.2", "", { "dependencies": { "acorn": "^8.14.1", "webpack-virtual-modules": "^0.6.2" } }, "sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw=="], + "unplugin": ["unplugin@2.3.2", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w=="], "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], @@ -801,9 +801,9 @@ "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], - "use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], + "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], - "vite": ["vite@6.2.3", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg=="], + "vite": ["vite@6.2.6", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], @@ -823,17 +823,23 @@ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="], + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], "@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], } diff --git a/package.json b/package.json index 30e1821..d63fe62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/monorepo", - "packageManager": "bun@1.2.5", + "packageManager": "bun@1.2.9", "private": true, "workspaces": [ "./packages/*" @@ -15,9 +15,9 @@ "clean:node": "rm -rf node_modules" }, "devDependencies": { - "npm-check-updates": "^17.1.16", + "npm-check-updates": "^17.1.18", "npm-sort": "^0.0.4", - "turbo": "^2.4.4", - "typescript": "^5.8.2" + "turbo": "^2.5.0", + "typescript": "^5.8.3" } } diff --git a/packages/example/package.json b/packages/example/package.json index 4da0c9b..47054ba 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -11,41 +11,41 @@ "preview": "vite preview" }, "devDependencies": { - "@eslint/js": "^9.23.0", - "@tanstack/react-router": "^1.114.27", - "@tanstack/react-router-devtools": "^1.114.27", - "@tanstack/router-plugin": "^1.114.27", + "@eslint/js": "^9.24.0", + "@tanstack/react-router": "^1.115.3", + "@tanstack/react-router-devtools": "^1.115.3", + "@tanstack/router-plugin": "^1.115.3", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.0.12", - "@types/react-dom": "^19.0.4", + "@types/react": "^19.1.1", + "@types/react-dom": "^19.1.2", "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.23.0", + "eslint": "^9.24.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "typescript-eslint": "^8.28.0", - "vite": "^6.2.3" + "react": "^19.1.0", + "react-dom": "^19.1.0", + "typescript-eslint": "^8.29.1", + "vite": "^6.2.6" }, "dependencies": { - "@effect/platform": "^0.80.1", - "@effect/platform-browser": "^0.59.1", + "@effect/platform": "^0.80.8", + "@effect/platform-browser": "^0.59.8", "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", "@typed/async-data": "^0.13.1", - "@typed/id": "^0.17.1", + "@typed/id": "^0.17.2", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.14.1", - "lucide-react": "^0.483.0", + "effect": "^3.14.8", + "lucide-react": "^0.487.0", "mobx": "^6.13.7", "reffuse": "workspace:*" }, "overrides": { - "effect": "^3.14.1", - "@effect/platform": "^0.80.1", - "@effect/platform-browser": "^0.59.1", + "effect": "^3.14.8", + "@effect/platform": "^0.80.8", + "@effect/platform-browser": "^0.59.8", "@typed/lazy-ref": "^0.3.3", "@typed/async-data": "^0.13.1" } -- 2.49.1 From 26a2111705415f9a500936c8f0743f3800190027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 12 Apr 2025 23:52:35 +0200 Subject: [PATCH 204/326] Version bump --- packages/extension-lazyref/package.json | 4 ++-- packages/extension-query/package.json | 4 ++-- packages/reffuse/package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index 1b3022a..5991388 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/extension-lazyref", - "version": "0.1.1", + "version": "0.1.2", "type": "module", "files": [ "./README.md", @@ -37,6 +37,6 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.4" + "reffuse": "^0.1.6" } } diff --git a/packages/extension-query/package.json b/packages/extension-query/package.json index a28e278..dac050c 100644 --- a/packages/extension-query/package.json +++ b/packages/extension-query/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/extension-query", - "version": "0.1.2", + "version": "0.1.3", "type": "module", "files": [ "./README.md", @@ -39,6 +39,6 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.4" + "reffuse": "^0.1.6" } } diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 27bc91a..cd66e15 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -1,6 +1,6 @@ { "name": "reffuse", - "version": "0.1.5", + "version": "0.1.6", "type": "module", "files": [ "./README.md", -- 2.49.1 From 7a12abdbdfc2056a97ee1b4a53a63ac3379b2ca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 13 Apr 2025 02:30:29 +0200 Subject: [PATCH 205/326] useSubscribeStream --- packages/example/src/routes/tests.tsx | 2 ++ packages/reffuse/src/ReffuseNamespace.ts | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 64bac4d..81d2fd4 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -25,6 +25,8 @@ function RouteComponent() { const uuidRef = R.useRef("none") const anotherRef = R.useRef(69) + console.log(R.useSubscribeStream(uuidRef.changes)) + const logValue = R.useCallbackSync(Effect.fn(function*(value: string) { yield* Effect.log(value) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 7bf1549..d2728a5 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -1,4 +1,4 @@ -import { Array, type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, pipe, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { Array, type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, Option, pipe, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -448,6 +448,21 @@ export abstract class ReffuseNamespace { return stream } + useSubscribeStream( + this: ReffuseNamespace, + stream: Stream.Stream, + initialValue?: InitialA, + ): InitialA extends A ? Option.Some : Option.Option { + const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) + + this.useFork(() => Stream.runForEach( + Stream.changesWith(stream, (x, y) => x === y), + v => Effect.sync(() => setReactStateValue(Option.some(v))), + ), [stream]) + + return reactStateValue as InitialA extends A ? Option.Some : Option.Option + } + SubscribeRefs< const Refs extends readonly SubscriptionRef.SubscriptionRef[], -- 2.49.1 From 574136e161fa39f7d7b5442403b7f5cb4e816988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 13 Apr 2025 03:21:11 +0200 Subject: [PATCH 206/326] SubscribeStream --- packages/reffuse/src/ReffuseNamespace.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index d2728a5..5220472 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -486,6 +486,17 @@ export abstract class ReffuseNamespace { ): React.ReactNode { return props.children(this.useRefState(props.ref)) } + + SubscribeStream( + this: ReffuseNamespace, + props: { + readonly stream: Stream.Stream + readonly initialValue?: InitialA + readonly children: (latestValue: InitialA extends A ? Option.Some : Option.Option) => React.ReactNode + }, + ): React.ReactNode { + return props.children(this.useSubscribeStream(props.stream, props.initialValue)) + } } -- 2.49.1 From 0f761524fd35c3ca062caa3a2d942712a74c2672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 13 Apr 2025 17:06:20 +0200 Subject: [PATCH 207/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 5220472..5123269 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -21,6 +21,7 @@ export abstract class ReffuseNamespace { constructor() { this.SubscribeRefs = this.SubscribeRefs.bind(this as any) as any this.RefState = this.RefState.bind(this as any) as any + this.SubscribeStream = this.SubscribeStream.bind(this as any) as any } -- 2.49.1 From 4f9827720cb3c30877649188f32391edd9d9ea35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 13 Apr 2025 17:18:06 +0200 Subject: [PATCH 208/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 5123269..4ed41b7 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -1,4 +1,4 @@ -import { Array, type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, Option, pipe, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, Option, pipe, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -397,8 +397,8 @@ export abstract class ReffuseNamespace { { doNotReExecuteOnRuntimeOrContextChange: true }, ) as [...{ [K in keyof Refs]: Effect.Effect.Success }]) - this.useFork(() => pipe(refs as readonly SubscriptionRef.SubscriptionRef[], - Array.map(ref => Stream.changesWith(ref.changes, (x, y) => x === y)), + this.useFork(() => pipe( + refs.map(ref => Stream.changesWith(ref.changes, (x, y) => x === y)), streams => Stream.zipLatestAll(...streams), Stream.runForEach(v => Effect.sync(() => setReactStateValue(v as [...{ [K in keyof Refs]: Effect.Effect.Success }])) -- 2.49.1 From f594f4779382210e1b3b0574d42b66ff7408ab6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 13 Apr 2025 17:39:54 +0200 Subject: [PATCH 209/326] VQueryErrorHandler --- packages/example/src/QueryErrorHandler.tsx | 57 --------------------- packages/example/src/VQueryErrorHandler.tsx | 57 +++++++++++++++++++++ packages/example/src/routes/__root.tsx | 2 +- 3 files changed, 58 insertions(+), 58 deletions(-) delete mode 100644 packages/example/src/QueryErrorHandler.tsx create mode 100644 packages/example/src/VQueryErrorHandler.tsx diff --git a/packages/example/src/QueryErrorHandler.tsx b/packages/example/src/QueryErrorHandler.tsx deleted file mode 100644 index 5a072ee..0000000 --- a/packages/example/src/QueryErrorHandler.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" -import { QueryErrorHandler } from "@reffuse/extension-query" -import { Cause, Console, Context, Effect, Either, flow, Match, Option, Stream } from "effect" -import { useState } from "react" -import { AppQueryErrorHandler } from "./query" -import { R } from "./reffuse" - - -export function VQueryErrorHandler() { - const [failure, setFailure] = useState(Option.none> - >>()) - - R.useFork(() => AppQueryErrorHandler.pipe(Effect.flatMap(handler => - Stream.runForEach(handler.errors, v => Console.error(v).pipe( - Effect.andThen(Effect.sync(() => { setFailure(Option.some(v)) })) - )) - )), []) - - return Option.match(failure, { - onSome: v => ( - - - Error - - {Either.match(Cause.failureOrCause(v), { - onLeft: flow( - Match.value, - Match.tag("RequestError", () => HTTP request error), - Match.tag("ResponseError", () => HTTP response error), - Match.exhaustive, - ), - - onRight: flow( - Cause.dieOption, - Option.match({ - onSome: () => Unrecoverable defect, - onNone: () => Unknown error, - }), - ), - })} - - - - - - - - - - ), - - onNone: () => <>, - }) -} diff --git a/packages/example/src/VQueryErrorHandler.tsx b/packages/example/src/VQueryErrorHandler.tsx new file mode 100644 index 0000000..0b9fa57 --- /dev/null +++ b/packages/example/src/VQueryErrorHandler.tsx @@ -0,0 +1,57 @@ +import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" +import { Cause, Console, Effect, Either, flow, Match, Option, Stream } from "effect" +import { useState } from "react" +import { AppQueryErrorHandler } from "./query" +import { R } from "./reffuse" + + +export function VQueryErrorHandler() { + const [open, setOpen] = useState(false) + + const error = R.useSubscribeStream( + R.useMemo(() => AppQueryErrorHandler.pipe( + Effect.map(handler => handler.errors.pipe( + Stream.changes, + Stream.tap(Console.error), + Stream.tap(() => Effect.sync(() => setOpen(true))), + )) + ), []) + ) + + if (Option.isNone(error)) + return <> + + return ( + + + Error + + {Either.match(Cause.failureOrCause(error.value), { + onLeft: flow( + Match.value, + Match.tag("RequestError", () => HTTP request error), + Match.tag("ResponseError", () => HTTP response error), + Match.exhaustive, + ), + + onRight: flow( + Cause.dieOption, + Option.match({ + onSome: () => Unrecoverable defect, + onNone: () => Unknown error, + }), + ), + })} + + + + + + + + + + ) +} diff --git a/packages/example/src/routes/__root.tsx b/packages/example/src/routes/__root.tsx index d5180aa..12abc9b 100644 --- a/packages/example/src/routes/__root.tsx +++ b/packages/example/src/routes/__root.tsx @@ -1,4 +1,4 @@ -import { VQueryErrorHandler } from "@/QueryErrorHandler" +import { VQueryErrorHandler } from "@/VQueryErrorHandler" import { Container, Flex, Theme } from "@radix-ui/themes" import { createRootRoute, Link, Outlet } from "@tanstack/react-router" import { TanStackRouterDevtools } from "@tanstack/react-router-devtools" -- 2.49.1 From 98bd72d1d783e61265276a9f0a089e21aae018fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 13 Apr 2025 18:29:00 +0200 Subject: [PATCH 210/326] Cleanup --- packages/example/src/routes/tests.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 81d2fd4..64bac4d 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -25,8 +25,6 @@ function RouteComponent() { const uuidRef = R.useRef("none") const anotherRef = R.useRef(69) - console.log(R.useSubscribeStream(uuidRef.changes)) - const logValue = R.useCallbackSync(Effect.fn(function*(value: string) { yield* Effect.log(value) -- 2.49.1 From 1ca832e69dbe4cd91ad2063f90f8fb95e86247e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 14 Apr 2025 00:54:06 +0200 Subject: [PATCH 211/326] Fix --- packages/extension-lazyref/package.json | 4 +-- packages/extension-lazyref/src/index.ts | 33 +++++++++++++++++++++--- packages/reffuse/package.json | 2 +- packages/reffuse/src/ReffuseNamespace.ts | 7 +++-- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index 5991388..f126cdd 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/extension-lazyref", - "version": "0.1.2", + "version": "0.1.3", "type": "module", "files": [ "./README.md", @@ -37,6 +37,6 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.6" + "reffuse": "^0.1.7" } } diff --git a/packages/extension-lazyref/src/index.ts b/packages/extension-lazyref/src/index.ts index 42b76ec..7a51a86 100644 --- a/packages/extension-lazyref/src/index.ts +++ b/packages/extension-lazyref/src/index.ts @@ -1,16 +1,43 @@ import * as LazyRef from "@typed/lazy-ref" -import { Effect, Stream } from "effect" +import { Effect, pipe, Stream } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseNamespace, SetStateAction } from "reffuse" export const LazyRefExtension = ReffuseExtension.make(() => ({ + useSubscribeLazyRefs< + const Refs extends readonly LazyRef.LazyRef[], + R, + >( + this: ReffuseNamespace.ReffuseNamespace, + ...refs: Refs + ): [...{ [K in keyof Refs]: Effect.Effect.Success }] { + const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( + () => Effect.all(refs as readonly LazyRef.LazyRef[]), + [], + { doNotReExecuteOnRuntimeOrContextChange: true }, + ) as [...{ [K in keyof Refs]: Effect.Effect.Success }]) + + this.useFork(() => pipe( + refs.map(ref => Stream.changesWith(ref.changes, (x, y) => x === y)), + streams => Stream.zipLatestAll(...streams), + Stream.runForEach(v => + Effect.sync(() => setReactStateValue(v as [...{ [K in keyof Refs]: Effect.Effect.Success }])) + ), + ), refs) + + return reactStateValue + }, + useLazyRefState( this: ReffuseNamespace.ReffuseNamespace, ref: LazyRef.LazyRef, ): [A, React.Dispatch>] { - const initialState = this.useMemo(() => ref, [], { doNotReExecuteOnRuntimeOrContextChange: true }) - const [reactStateValue, setReactStateValue] = React.useState(initialState) + const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( + () => ref, + [], + { doNotReExecuteOnRuntimeOrContextChange: true }, + )) this.useFork(() => Stream.runForEach( Stream.changesWith(ref.changes, (x, y) => x === y), diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index cd66e15..5e189c2 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -1,6 +1,6 @@ { "name": "reffuse", - "version": "0.1.6", + "version": "0.1.7", "type": "module", "files": [ "./README.md", diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 4ed41b7..a6d56e3 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -419,8 +419,11 @@ export abstract class ReffuseNamespace { this: ReffuseNamespace, ref: SubscriptionRef.SubscriptionRef, ): [A, React.Dispatch>] { - const initialState = this.useMemo(() => ref, [], { doNotReExecuteOnRuntimeOrContextChange: true }) - const [reactStateValue, setReactStateValue] = React.useState(initialState) + const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( + () => ref, + [], + { doNotReExecuteOnRuntimeOrContextChange: true }, + )) this.useFork(() => Stream.runForEach( Stream.changesWith(ref.changes, (x, y) => x === y), -- 2.49.1 From be88035936c2384eaf4a6755156f71613bdad5c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 19 Apr 2025 03:42:48 +0200 Subject: [PATCH 212/326] SubscriptionSubRef --- packages/reffuse/src/SubscriptionSubRef.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 packages/reffuse/src/SubscriptionSubRef.ts diff --git a/packages/reffuse/src/SubscriptionSubRef.ts b/packages/reffuse/src/SubscriptionSubRef.ts new file mode 100644 index 0000000..7c671fa --- /dev/null +++ b/packages/reffuse/src/SubscriptionSubRef.ts @@ -0,0 +1,18 @@ +import type { Stream, SubscriptionRef, SynchronizedRef, Unify } from "effect" + + +export interface SubscriptionSubRef extends SynchronizedRef.SynchronizedRef { + readonly parent: Ref.Ref + /** @internal */ + readonly pubsub: PubSub.PubSub + /** @internal */ + readonly semaphore: Effect.Semaphore + /** + * A stream containing the current value of the `Ref` as well as all changes + * to that value. + */ + readonly changes: Stream.Stream + readonly [Unify.typeSymbol]?: unknown + readonly [Unify.unifySymbol]?: SubscriptionRefUnify + readonly [Unify.ignoreSymbol]?: SubscriptionRefUnifyIgnore +} -- 2.49.1 From 49d4bd4d433115117fb3ea0dac2d83f6bbc4ac61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 20 Apr 2025 00:22:24 +0200 Subject: [PATCH 213/326] SubscriptionSubRef work --- packages/reffuse/src/SubscriptionSubRef.ts | 76 +++++++++++++++++----- 1 file changed, 61 insertions(+), 15 deletions(-) diff --git a/packages/reffuse/src/SubscriptionSubRef.ts b/packages/reffuse/src/SubscriptionSubRef.ts index 7c671fa..dbc7f01 100644 --- a/packages/reffuse/src/SubscriptionSubRef.ts +++ b/packages/reffuse/src/SubscriptionSubRef.ts @@ -1,18 +1,64 @@ -import type { Stream, SubscriptionRef, SynchronizedRef, Unify } from "effect" +import { Effect, Effectable, PubSub, Readable, Ref, Stream, Subscribable, SubscriptionRef, SynchronizedRef } from "effect" -export interface SubscriptionSubRef extends SynchronizedRef.SynchronizedRef { - readonly parent: Ref.Ref - /** @internal */ - readonly pubsub: PubSub.PubSub - /** @internal */ - readonly semaphore: Effect.Semaphore - /** - * A stream containing the current value of the `Ref` as well as all changes - * to that value. - */ - readonly changes: Stream.Stream - readonly [Unify.typeSymbol]?: unknown - readonly [Unify.unifySymbol]?: SubscriptionRefUnify - readonly [Unify.ignoreSymbol]?: SubscriptionRefUnifyIgnore +export interface SubscriptionSubRef extends SubscriptionRef.SubscriptionRef { + /** + * A stream containing the current value of the `Ref` as well as all changes + * to that value. + */ + readonly changes: Stream.Stream +} + +const synchronizedRefVariance = { _A: (_: any) => _ } +const subscriptionRefVariance = { _A: (_: any) => _ } + +class SubscriptionSubRefImpl extends Effectable.Class implements SubscriptionSubRef { + readonly [Readable.TypeId]: Readable.TypeId = Readable.TypeId + readonly [Subscribable.TypeId]: Subscribable.TypeId = Subscribable.TypeId + readonly [Ref.RefTypeId]: Ref.Ref.Variance[Ref.RefTypeId] = { _A: (_: any) => _ } + readonly [SynchronizedRef.SynchronizedRefTypeId]: SynchronizedRef.SynchronizedRef.Variance[SynchronizedRef.SynchronizedRefTypeId] = synchronizedRefVariance + readonly [SubscriptionRef.SubscriptionRefTypeId]: SubscriptionRef.SubscriptionRef.Variance[SubscriptionRef.SubscriptionRefTypeId] = subscriptionRefVariance + + constructor( + readonly ref: Ref.Ref, + readonly pubsub: PubSub.PubSub, + readonly semaphore: Effect.Semaphore, + ) { + super() + this.get = Ref.get(this.ref) + } + + commit() { + return this.get + } + + readonly get: Effect.Effect + + get changes(): Stream.Stream { + return Ref.get(this.ref).pipe( + Effect.flatMap(a => Effect.map( + Stream.fromPubSub(this.pubsub, { scoped: true }), + s => Stream.concat(Stream.make(a), s), + )), + + this.semaphore.withPermits(1), + Stream.unwrapScoped, + ) + } + + modify(f: (a: A) => readonly [B, A]): Effect.Effect { + return this.modifyEffect((a) => Effect.succeed(f(a))) + } + + modifyEffect(f: (a: A) => Effect.Effect): Effect.Effect { + return Ref.get(this.ref).pipe( + Effect.flatMap(f), + Effect.flatMap(([b, a]) => Ref.set(this.ref, a).pipe( + Effect.as(b), + Effect.zipLeft(PubSub.publish(this.pubsub, a)) + )), + + this.semaphore.withPermits(1) + ) + } } -- 2.49.1 From 17686e68c321b48addde514b8bcc0d8c2cf8220e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 20 Apr 2025 04:34:01 +0200 Subject: [PATCH 214/326] SubscriptionSubRef --- packages/reffuse/src/SubscriptionSubRef.ts | 53 ++++++++++++---------- packages/reffuse/src/index.ts | 1 + 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/packages/reffuse/src/SubscriptionSubRef.ts b/packages/reffuse/src/SubscriptionSubRef.ts index dbc7f01..60e08ac 100644 --- a/packages/reffuse/src/SubscriptionSubRef.ts +++ b/packages/reffuse/src/SubscriptionSubRef.ts @@ -1,7 +1,9 @@ -import { Effect, Effectable, PubSub, Readable, Ref, Stream, Subscribable, SubscriptionRef, SynchronizedRef } from "effect" +import { Effect, Effectable, Readable, Ref, Stream, Subscribable, SubscriptionRef, SynchronizedRef } from "effect" -export interface SubscriptionSubRef extends SubscriptionRef.SubscriptionRef { +export interface SubscriptionSubRef extends SubscriptionRef.SubscriptionRef { + readonly ref: SubscriptionRef.SubscriptionRef + /** * A stream containing the current value of the `Ref` as well as all changes * to that value. @@ -9,56 +11,59 @@ export interface SubscriptionSubRef extends SubscriptionRef.Subscripti readonly changes: Stream.Stream } + const synchronizedRefVariance = { _A: (_: any) => _ } const subscriptionRefVariance = { _A: (_: any) => _ } -class SubscriptionSubRefImpl extends Effectable.Class implements SubscriptionSubRef { +class SubscriptionSubRefImpl extends Effectable.Class implements SubscriptionSubRef { readonly [Readable.TypeId]: Readable.TypeId = Readable.TypeId readonly [Subscribable.TypeId]: Subscribable.TypeId = Subscribable.TypeId readonly [Ref.RefTypeId]: Ref.Ref.Variance[Ref.RefTypeId] = { _A: (_: any) => _ } readonly [SynchronizedRef.SynchronizedRefTypeId]: SynchronizedRef.SynchronizedRef.Variance[SynchronizedRef.SynchronizedRefTypeId] = synchronizedRefVariance readonly [SubscriptionRef.SubscriptionRefTypeId]: SubscriptionRef.SubscriptionRef.Variance[SubscriptionRef.SubscriptionRefTypeId] = subscriptionRefVariance + readonly get: Effect.Effect + constructor( - readonly ref: Ref.Ref, - readonly pubsub: PubSub.PubSub, - readonly semaphore: Effect.Semaphore, + readonly ref: SubscriptionRef.SubscriptionRef, + readonly select: (value: B) => A, + readonly setter: (value: A) => B, ) { super() - this.get = Ref.get(this.ref) + this.get = Ref.get(this.ref).pipe(Effect.map(this.select)) } commit() { return this.get } - readonly get: Effect.Effect - get changes(): Stream.Stream { - return Ref.get(this.ref).pipe( - Effect.flatMap(a => Effect.map( - Stream.fromPubSub(this.pubsub, { scoped: true }), + return this.get.pipe( + Effect.map(a => this.ref.changes.pipe( + Stream.map(this.select), s => Stream.concat(Stream.make(a), s), )), - - this.semaphore.withPermits(1), - Stream.unwrapScoped, + Stream.unwrap, ) } - modify(f: (a: A) => readonly [B, A]): Effect.Effect { - return this.modifyEffect((a) => Effect.succeed(f(a))) + modify(f: (a: A) => readonly [C, A]): Effect.Effect { + return this.modifyEffect(a => Effect.succeed(f(a))) } - modifyEffect(f: (a: A) => Effect.Effect): Effect.Effect { - return Ref.get(this.ref).pipe( + modifyEffect(f: (a: A) => Effect.Effect): Effect.Effect { + return this.get.pipe( Effect.flatMap(f), - Effect.flatMap(([b, a]) => Ref.set(this.ref, a).pipe( - Effect.as(b), - Effect.zipLeft(PubSub.publish(this.pubsub, a)) + Effect.flatMap(([b, a]) => Ref.set(this.ref, this.setter(a)).pipe( + Effect.as(b) )), - - this.semaphore.withPermits(1) ) } } + + +export const make = ( + ref: SubscriptionRef.SubscriptionRef, + select: (value: B) => A, + setter: (value: A) => B, +): SubscriptionSubRef => new SubscriptionSubRefImpl(ref, select, setter) diff --git a/packages/reffuse/src/index.ts b/packages/reffuse/src/index.ts index 01fb88f..593b50f 100644 --- a/packages/reffuse/src/index.ts +++ b/packages/reffuse/src/index.ts @@ -4,3 +4,4 @@ export * as ReffuseExtension from "./ReffuseExtension.js" export * as ReffuseNamespace from "./ReffuseNamespace.js" export * as ReffuseRuntime from "./ReffuseRuntime.js" export * as SetStateAction from "./SetStateAction.js" +export * as SubscriptionSubRef from "./SubscriptionSubRef.js" -- 2.49.1 From 31dd7b5fdb69db9197a85d3d31b83cded4987878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 20 Apr 2025 05:06:48 +0200 Subject: [PATCH 215/326] Working SubscriptionSubRef --- packages/example/src/routes/tests.tsx | 16 +++++++++++++++- packages/reffuse/src/SubscriptionSubRef.ts | 14 +++++++------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 64bac4d..578578d 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -3,6 +3,8 @@ import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" import { Console, Effect, Ref } from "effect" +import { useMemo } from "react" +import { SubscriptionSubRef } from "reffuse" export const Route = createFileRoute("/tests")({ @@ -10,6 +12,13 @@ export const Route = createFileRoute("/tests")({ }) function RouteComponent() { + const deepRef = R.useRef({ value: "poulet" }) + const deepValueRef = useMemo(() => SubscriptionSubRef.make( + deepRef, + b => b.value, + (b, a) => ({ ...b, value: a }), + ), [deepRef]) + // const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( // Effect.andThen(makeUuid4), // Effect.provide(GetRandomValues.CryptoRandom), @@ -32,7 +41,8 @@ function RouteComponent() { const generateUuid = R.useCallbackSync(() => makeUuid4.pipe( Effect.provide(GetRandomValues.CryptoRandom), - Effect.flatMap(v => Ref.set(uuidRef, v)), + Effect.tap(v => Ref.set(uuidRef, v)), + Effect.tap(v => Ref.set(deepValueRef, v)), ), []) @@ -42,6 +52,10 @@ function RouteComponent() { {(uuid, anotherRef) => {uuid} / {anotherRef}} + + {(deep, deepValue) => {JSON.stringify(deep)} / {deepValue}} + + diff --git a/packages/reffuse/src/SubscriptionSubRef.ts b/packages/reffuse/src/SubscriptionSubRef.ts index 60e08ac..13a2e44 100644 --- a/packages/reffuse/src/SubscriptionSubRef.ts +++ b/packages/reffuse/src/SubscriptionSubRef.ts @@ -27,7 +27,7 @@ class SubscriptionSubRefImpl extends Effectable.Class imp constructor( readonly ref: SubscriptionRef.SubscriptionRef, readonly select: (value: B) => A, - readonly setter: (value: A) => B, + readonly setter: (value: B, subValue: A) => B, ) { super() this.get = Ref.get(this.ref).pipe(Effect.map(this.select)) @@ -52,11 +52,11 @@ class SubscriptionSubRefImpl extends Effectable.Class imp } modifyEffect(f: (a: A) => Effect.Effect): Effect.Effect { - return this.get.pipe( - Effect.flatMap(f), - Effect.flatMap(([b, a]) => Ref.set(this.ref, this.setter(a)).pipe( - Effect.as(b) - )), + return Effect.Do.pipe( + Effect.bind("b", () => Ref.get(this.ref)), + Effect.bind("ca", ({ b }) => f(this.select(b))), + Effect.tap(({ b, ca: [, a] }) => Ref.set(this.ref, this.setter(b, a))), + Effect.map(({ ca: [c] }) => c), ) } } @@ -65,5 +65,5 @@ class SubscriptionSubRefImpl extends Effectable.Class imp export const make = ( ref: SubscriptionRef.SubscriptionRef, select: (value: B) => A, - setter: (value: A) => B, + setter: (value: B, subValue: A) => B, ): SubscriptionSubRef => new SubscriptionSubRefImpl(ref, select, setter) -- 2.49.1 From 682e473bf74e4abea8d5246196132309f1452acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 20 Apr 2025 05:10:51 +0200 Subject: [PATCH 216/326] Fix --- packages/reffuse/src/SubscriptionSubRef.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/reffuse/src/SubscriptionSubRef.ts b/packages/reffuse/src/SubscriptionSubRef.ts index 13a2e44..b7c666a 100644 --- a/packages/reffuse/src/SubscriptionSubRef.ts +++ b/packages/reffuse/src/SubscriptionSubRef.ts @@ -3,12 +3,6 @@ import { Effect, Effectable, Readable, Ref, Stream, Subscribable, SubscriptionRe export interface SubscriptionSubRef extends SubscriptionRef.SubscriptionRef { readonly ref: SubscriptionRef.SubscriptionRef - - /** - * A stream containing the current value of the `Ref` as well as all changes - * to that value. - */ - readonly changes: Stream.Stream } -- 2.49.1 From d8d6e87a123f10439dd14e7e45ccc52d8b9fc1c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 20 Apr 2025 05:26:31 +0200 Subject: [PATCH 217/326] Refactoring --- packages/example/src/routes/tests.tsx | 2 +- packages/reffuse/package.json | 4 ++++ packages/reffuse/src/Reffuse.ts | 2 +- packages/reffuse/src/ReffuseNamespace.ts | 2 +- packages/reffuse/src/index.ts | 2 -- packages/reffuse/src/{ => types}/SetStateAction.ts | 0 packages/reffuse/src/{ => types}/SubscriptionSubRef.ts | 0 packages/reffuse/src/types/index.ts | 2 ++ packages/reffuse/src/{types.ts => utils.ts} | 0 9 files changed, 9 insertions(+), 5 deletions(-) rename packages/reffuse/src/{ => types}/SetStateAction.ts (100%) rename packages/reffuse/src/{ => types}/SubscriptionSubRef.ts (100%) create mode 100644 packages/reffuse/src/types/index.ts rename packages/reffuse/src/{types.ts => utils.ts} (100%) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 578578d..a79c689 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -4,7 +4,7 @@ import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" import { Console, Effect, Ref } from "effect" import { useMemo } from "react" -import { SubscriptionSubRef } from "reffuse" +import { SubscriptionSubRef } from "reffuse/types" export const Route = createFileRoute("/tests")({ diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 5e189c2..12bac9b 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -16,6 +16,10 @@ "types": "./dist/index.d.ts", "default": "./dist/index.js" }, + "./types": { + "types": "./dist/types/index.d.ts", + "default": "./dist/types/index.js" + }, "./*": { "types": "./dist/*.d.ts", "default": "./dist/*.js" diff --git a/packages/reffuse/src/Reffuse.ts b/packages/reffuse/src/Reffuse.ts index 547342a..ad95a80 100644 --- a/packages/reffuse/src/Reffuse.ts +++ b/packages/reffuse/src/Reffuse.ts @@ -1,7 +1,7 @@ import type * as ReffuseContext from "./ReffuseContext.js" import type * as ReffuseExtension from "./ReffuseExtension.js" import * as ReffuseNamespace from "./ReffuseNamespace.js" -import type { Merge, StaticType } from "./types.js" +import type { Merge, StaticType } from "./utils.js" export class Reffuse extends ReffuseNamespace.makeClass() {} diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index a6d56e3..f4d6c06 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -2,7 +2,7 @@ import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" -import * as SetStateAction from "./SetStateAction.js" +import { SetStateAction } from "./types/index.js" export interface RenderOptions { diff --git a/packages/reffuse/src/index.ts b/packages/reffuse/src/index.ts index 593b50f..c99d6b2 100644 --- a/packages/reffuse/src/index.ts +++ b/packages/reffuse/src/index.ts @@ -3,5 +3,3 @@ export * as ReffuseContext from "./ReffuseContext.js" export * as ReffuseExtension from "./ReffuseExtension.js" export * as ReffuseNamespace from "./ReffuseNamespace.js" export * as ReffuseRuntime from "./ReffuseRuntime.js" -export * as SetStateAction from "./SetStateAction.js" -export * as SubscriptionSubRef from "./SubscriptionSubRef.js" diff --git a/packages/reffuse/src/SetStateAction.ts b/packages/reffuse/src/types/SetStateAction.ts similarity index 100% rename from packages/reffuse/src/SetStateAction.ts rename to packages/reffuse/src/types/SetStateAction.ts diff --git a/packages/reffuse/src/SubscriptionSubRef.ts b/packages/reffuse/src/types/SubscriptionSubRef.ts similarity index 100% rename from packages/reffuse/src/SubscriptionSubRef.ts rename to packages/reffuse/src/types/SubscriptionSubRef.ts diff --git a/packages/reffuse/src/types/index.ts b/packages/reffuse/src/types/index.ts new file mode 100644 index 0000000..ec93c5f --- /dev/null +++ b/packages/reffuse/src/types/index.ts @@ -0,0 +1,2 @@ +export * as SetStateAction from "./SetStateAction.js" +export * as SubscriptionSubRef from "./SubscriptionSubRef.js" diff --git a/packages/reffuse/src/types.ts b/packages/reffuse/src/utils.ts similarity index 100% rename from packages/reffuse/src/types.ts rename to packages/reffuse/src/utils.ts -- 2.49.1 From d6e1d445e8ee4ad178597a1df883eb55dd7bf762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 20 Apr 2025 05:28:44 +0200 Subject: [PATCH 218/326] Fix --- packages/extension-lazyref/src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/extension-lazyref/src/index.ts b/packages/extension-lazyref/src/index.ts index 7a51a86..70c1f39 100644 --- a/packages/extension-lazyref/src/index.ts +++ b/packages/extension-lazyref/src/index.ts @@ -1,7 +1,8 @@ import * as LazyRef from "@typed/lazy-ref" import { Effect, pipe, Stream } from "effect" import * as React from "react" -import { ReffuseExtension, type ReffuseNamespace, SetStateAction } from "reffuse" +import { ReffuseExtension, type ReffuseNamespace } from "reffuse" +import { SetStateAction } from "reffuse/types" export const LazyRefExtension = ReffuseExtension.make(() => ({ -- 2.49.1 From 974af95a22ba2528024c56674a1f4dd4dd9fab8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 20 Apr 2025 05:32:19 +0200 Subject: [PATCH 219/326] Version bump --- packages/extension-lazyref/package.json | 4 ++-- packages/reffuse/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index f126cdd..14e6ab6 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/extension-lazyref", - "version": "0.1.3", + "version": "0.1.4", "type": "module", "files": [ "./README.md", @@ -37,6 +37,6 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.7" + "reffuse": "^0.1.8" } } diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 12bac9b..907e111 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -1,6 +1,6 @@ { "name": "reffuse", - "version": "0.1.7", + "version": "0.1.8", "type": "module", "files": [ "./README.md", -- 2.49.1 From 110b0813f8036558fc5ee1fab6ddd2360e75ecb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 20 Apr 2025 06:14:58 +0200 Subject: [PATCH 220/326] Refactoring --- packages/example/src/routes/tests.tsx | 2 +- .../reffuse/src/types/SubscriptionSubRef.ts | 30 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index a79c689..55faa45 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -13,7 +13,7 @@ export const Route = createFileRoute("/tests")({ function RouteComponent() { const deepRef = R.useRef({ value: "poulet" }) - const deepValueRef = useMemo(() => SubscriptionSubRef.make( + const deepValueRef = useMemo(() => SubscriptionSubRef.makeFromGetSet( deepRef, b => b.value, (b, a) => ({ ...b, value: a }), diff --git a/packages/reffuse/src/types/SubscriptionSubRef.ts b/packages/reffuse/src/types/SubscriptionSubRef.ts index b7c666a..4fdca0d 100644 --- a/packages/reffuse/src/types/SubscriptionSubRef.ts +++ b/packages/reffuse/src/types/SubscriptionSubRef.ts @@ -2,7 +2,7 @@ import { Effect, Effectable, Readable, Ref, Stream, Subscribable, SubscriptionRe export interface SubscriptionSubRef extends SubscriptionRef.SubscriptionRef { - readonly ref: SubscriptionRef.SubscriptionRef + readonly parent: SubscriptionRef.SubscriptionRef } @@ -19,12 +19,12 @@ class SubscriptionSubRefImpl extends Effectable.Class imp readonly get: Effect.Effect constructor( - readonly ref: SubscriptionRef.SubscriptionRef, - readonly select: (value: B) => A, - readonly setter: (value: B, subValue: A) => B, + readonly parent: SubscriptionRef.SubscriptionRef, + readonly getter: (parentValue: B) => A, + readonly setter: (parentValue: B, value: A) => B, ) { super() - this.get = Ref.get(this.ref).pipe(Effect.map(this.select)) + this.get = Ref.get(this.parent).pipe(Effect.map(this.getter)) } commit() { @@ -33,8 +33,8 @@ class SubscriptionSubRefImpl extends Effectable.Class imp get changes(): Stream.Stream { return this.get.pipe( - Effect.map(a => this.ref.changes.pipe( - Stream.map(this.select), + Effect.map(a => this.parent.changes.pipe( + Stream.map(this.getter), s => Stream.concat(Stream.make(a), s), )), Stream.unwrap, @@ -47,17 +47,17 @@ class SubscriptionSubRefImpl extends Effectable.Class imp modifyEffect(f: (a: A) => Effect.Effect): Effect.Effect { return Effect.Do.pipe( - Effect.bind("b", () => Ref.get(this.ref)), - Effect.bind("ca", ({ b }) => f(this.select(b))), - Effect.tap(({ b, ca: [, a] }) => Ref.set(this.ref, this.setter(b, a))), + Effect.bind("b", () => Ref.get(this.parent)), + Effect.bind("ca", ({ b }) => f(this.getter(b))), + Effect.tap(({ b, ca: [, a] }) => Ref.set(this.parent, this.setter(b, a))), Effect.map(({ ca: [c] }) => c), ) } } -export const make = ( - ref: SubscriptionRef.SubscriptionRef, - select: (value: B) => A, - setter: (value: B, subValue: A) => B, -): SubscriptionSubRef => new SubscriptionSubRefImpl(ref, select, setter) +export const makeFromGetSet = ( + parent: SubscriptionRef.SubscriptionRef, + getter: (parentValue: B) => A, + setter: (parentValue: B, value: A) => B, +): SubscriptionSubRef => new SubscriptionSubRefImpl(parent, getter, setter) -- 2.49.1 From 926482b154073402a90ea8b0c267419b5aa6283a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 20 Apr 2025 19:38:18 +0200 Subject: [PATCH 221/326] Fix --- packages/reffuse/src/types/SubscriptionSubRef.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/reffuse/src/types/SubscriptionSubRef.ts b/packages/reffuse/src/types/SubscriptionSubRef.ts index 4fdca0d..151f515 100644 --- a/packages/reffuse/src/types/SubscriptionSubRef.ts +++ b/packages/reffuse/src/types/SubscriptionSubRef.ts @@ -6,13 +6,14 @@ export interface SubscriptionSubRef extends SubscriptionRef. } +const refVariance = { _A: (_: any) => _ } const synchronizedRefVariance = { _A: (_: any) => _ } const subscriptionRefVariance = { _A: (_: any) => _ } class SubscriptionSubRefImpl extends Effectable.Class implements SubscriptionSubRef { readonly [Readable.TypeId]: Readable.TypeId = Readable.TypeId readonly [Subscribable.TypeId]: Subscribable.TypeId = Subscribable.TypeId - readonly [Ref.RefTypeId]: Ref.Ref.Variance[Ref.RefTypeId] = { _A: (_: any) => _ } + readonly [Ref.RefTypeId]: Ref.Ref.Variance[Ref.RefTypeId] = refVariance readonly [SynchronizedRef.SynchronizedRefTypeId]: SynchronizedRef.SynchronizedRef.Variance[SynchronizedRef.SynchronizedRefTypeId] = synchronizedRefVariance readonly [SubscriptionRef.SubscriptionRefTypeId]: SubscriptionRef.SubscriptionRef.Variance[SubscriptionRef.SubscriptionRefTypeId] = subscriptionRefVariance -- 2.49.1 From eabcf9085b28fdadb2a2cff80fd60c8272a59c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 21 Apr 2025 01:21:59 +0200 Subject: [PATCH 222/326] useSubRefFromGetSet --- packages/example/src/routes/tests.tsx | 6 ++---- packages/reffuse/src/ReffuseNamespace.ts | 14 +++++++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 55faa45..def5d5c 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -3,8 +3,6 @@ import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" import { Console, Effect, Ref } from "effect" -import { useMemo } from "react" -import { SubscriptionSubRef } from "reffuse/types" export const Route = createFileRoute("/tests")({ @@ -13,11 +11,11 @@ export const Route = createFileRoute("/tests")({ function RouteComponent() { const deepRef = R.useRef({ value: "poulet" }) - const deepValueRef = useMemo(() => SubscriptionSubRef.makeFromGetSet( + const deepValueRef = R.useSubRefFromGetSet( deepRef, b => b.value, (b, a) => ({ ...b, value: a }), - ), [deepRef]) + ) // const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( // Effect.andThen(makeUuid4), diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index f4d6c06..1ad1d10 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -2,7 +2,7 @@ import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" -import { SetStateAction } from "./types/index.js" +import { SetStateAction, SubscriptionSubRef } from "./types/index.js" export interface RenderOptions { @@ -384,6 +384,18 @@ export abstract class ReffuseNamespace { ) } + useSubRefFromGetSet( + this: ReffuseNamespace, + parent: SubscriptionRef.SubscriptionRef, + getter: (parentValue: B) => A, + setter: (parentValue: B, value: A) => B, + ): SubscriptionSubRef.SubscriptionSubRef { + return React.useMemo( + () => SubscriptionSubRef.makeFromGetSet(parent, getter, setter), + [parent], + ) + } + useSubscribeRefs< const Refs extends readonly SubscriptionRef.SubscriptionRef[], R, -- 2.49.1 From ab441fe9827d01a4e394b1fc17a48808494207ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 21 Apr 2025 02:01:24 +0200 Subject: [PATCH 223/326] Fix --- .../reffuse/src/types/SubscriptionSubRef.ts | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/reffuse/src/types/SubscriptionSubRef.ts b/packages/reffuse/src/types/SubscriptionSubRef.ts index 151f515..cb7622e 100644 --- a/packages/reffuse/src/types/SubscriptionSubRef.ts +++ b/packages/reffuse/src/types/SubscriptionSubRef.ts @@ -1,21 +1,34 @@ -import { Effect, Effectable, Readable, Ref, Stream, Subscribable, SubscriptionRef, SynchronizedRef } from "effect" +import { Effect, Effectable, Readable, Ref, Stream, Subscribable, SubscriptionRef, SynchronizedRef, type Types } from "effect" -export interface SubscriptionSubRef extends SubscriptionRef.SubscriptionRef { +export const SubscriptionSubRefTypeId: unique symbol = Symbol.for("reffuse/types/SubscriptionSubRef") + +export interface SubscriptionSubRef extends SubscriptionSubRef.Variance, SubscriptionRef.SubscriptionRef { readonly parent: SubscriptionRef.SubscriptionRef } +export declare namespace SubscriptionSubRef { + export interface Variance { + readonly [SubscriptionSubRefTypeId]: { + readonly _A: Types.Invariant + readonly _B: Types.Invariant + } + } +} + const refVariance = { _A: (_: any) => _ } const synchronizedRefVariance = { _A: (_: any) => _ } const subscriptionRefVariance = { _A: (_: any) => _ } +const subscriptionSubRefVariance = { _A: (_: any) => _, _B: (_: any) => _ } class SubscriptionSubRefImpl extends Effectable.Class implements SubscriptionSubRef { readonly [Readable.TypeId]: Readable.TypeId = Readable.TypeId readonly [Subscribable.TypeId]: Subscribable.TypeId = Subscribable.TypeId - readonly [Ref.RefTypeId]: Ref.Ref.Variance[Ref.RefTypeId] = refVariance - readonly [SynchronizedRef.SynchronizedRefTypeId]: SynchronizedRef.SynchronizedRef.Variance[SynchronizedRef.SynchronizedRefTypeId] = synchronizedRefVariance - readonly [SubscriptionRef.SubscriptionRefTypeId]: SubscriptionRef.SubscriptionRef.Variance[SubscriptionRef.SubscriptionRefTypeId] = subscriptionRefVariance + readonly [Ref.RefTypeId] = refVariance + readonly [SynchronizedRef.SynchronizedRefTypeId] = synchronizedRefVariance + readonly [SubscriptionRef.SubscriptionRefTypeId] = subscriptionRefVariance + readonly [SubscriptionSubRefTypeId] = subscriptionSubRefVariance readonly get: Effect.Effect -- 2.49.1 From db783f174e3775baa0a989b85350f3f869b4a0e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 21 Apr 2025 02:52:50 +0200 Subject: [PATCH 224/326] Fix --- packages/reffuse/src/types/SubscriptionSubRef.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/reffuse/src/types/SubscriptionSubRef.ts b/packages/reffuse/src/types/SubscriptionSubRef.ts index cb7622e..4f818cc 100644 --- a/packages/reffuse/src/types/SubscriptionSubRef.ts +++ b/packages/reffuse/src/types/SubscriptionSubRef.ts @@ -1,10 +1,14 @@ -import { Effect, Effectable, Readable, Ref, Stream, Subscribable, SubscriptionRef, SynchronizedRef, type Types } from "effect" +import { Effect, Effectable, Readable, Ref, Stream, Subscribable, SubscriptionRef, SynchronizedRef, type Types, type Unify } from "effect" export const SubscriptionSubRefTypeId: unique symbol = Symbol.for("reffuse/types/SubscriptionSubRef") export interface SubscriptionSubRef extends SubscriptionSubRef.Variance, SubscriptionRef.SubscriptionRef { readonly parent: SubscriptionRef.SubscriptionRef + + readonly [Unify.typeSymbol]?: unknown + readonly [Unify.unifySymbol]?: SubscriptionSubRefUnify + readonly [Unify.ignoreSymbol]?: SubscriptionSubRefUnifyIgnore } export declare namespace SubscriptionSubRef { @@ -16,6 +20,14 @@ export declare namespace SubscriptionSubRef { } } +export interface SubscriptionSubRefUnify extends SubscriptionRef.SubscriptionRefUnify { + SubscriptionSubRef?: () => Extract> +} + +export interface SubscriptionSubRefUnifyIgnore extends SubscriptionRef.SubscriptionRefUnifyIgnore { + SynchronizedRef?: true +} + const refVariance = { _A: (_: any) => _ } const synchronizedRefVariance = { _A: (_: any) => _ } -- 2.49.1 From 6ae155de3497277da5153ed389852b5a6ecca408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 21 Apr 2025 02:53:31 +0200 Subject: [PATCH 225/326] Version bump --- packages/reffuse/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 907e111..4f34fb9 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -1,6 +1,6 @@ { "name": "reffuse", - "version": "0.1.8", + "version": "0.1.9", "type": "module", "files": [ "./README.md", -- 2.49.1 From e8f92c88b87ee76e7a83fadb210db3ceccb016cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 21 Apr 2025 03:17:41 +0200 Subject: [PATCH 226/326] Fix --- packages/reffuse/src/types/SubscriptionSubRef.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/src/types/SubscriptionSubRef.ts b/packages/reffuse/src/types/SubscriptionSubRef.ts index 4f818cc..b9cb31f 100644 --- a/packages/reffuse/src/types/SubscriptionSubRef.ts +++ b/packages/reffuse/src/types/SubscriptionSubRef.ts @@ -25,7 +25,7 @@ export interface SubscriptionSubRefUnify } export interface SubscriptionSubRefUnifyIgnore extends SubscriptionRef.SubscriptionRefUnifyIgnore { - SynchronizedRef?: true + SubscriptionRef?: true } -- 2.49.1 From 33cf4fbcbd5eb8f860cb8cc914bb0fc0e1571659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 21 Apr 2025 05:15:55 +0200 Subject: [PATCH 227/326] Tests --- packages/reffuse/src/types/SearchPaths.ts | 40 +++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 packages/reffuse/src/types/SearchPaths.ts diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts new file mode 100644 index 0000000..18371b3 --- /dev/null +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -0,0 +1,40 @@ +type SearchPathsV1 = T extends object + ? { + [K in keyof T]: [K] | [K, ...SearchPathsV1] + }[keyof T] + : [] + +type SearchPathsV2 = T extends object + ? { + [K in keyof T as K extends string | number | symbol ? K : never]: + | [K] + | [K, ...SearchPathsV2] + } extends infer O + ? O[keyof O] + : never + : [] + +type Get = + P extends [infer Head, ...infer Tail] + ? Head extends keyof T + ? Get + : T extends readonly any[] + ? Head extends number + ? Get + : never + : never + : T; + + +type Persons = { + name: string; +}[] + +type V = SearchPathsV2<[string, number]> + + +function getFromSearchPath>(obj: T, path: P): Get { + return path.reduce((acc: any, key: any) => acc?.[key], obj); +} + +const res = getFromSearchPath([{ name: "prout" }] as const, ["0", "name"]) -- 2.49.1 From ba362baf04f91a378185d9f1dd1e9c71efebea69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 22 Apr 2025 21:55:59 +0200 Subject: [PATCH 228/326] SearchPaths work --- packages/reffuse/src/types/SearchPaths.ts | 46 ++++++++++------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index 18371b3..ec4f762 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -1,40 +1,34 @@ -type SearchPathsV1 = T extends object - ? { - [K in keyof T]: [K] | [K, ...SearchPathsV1] - }[keyof T] - : [] - -type SearchPathsV2 = T extends object +export type Paths = T extends object ? { [K in keyof T as K extends string | number | symbol ? K : never]: | [K] - | [K, ...SearchPathsV2] + | [K, ...Paths] } extends infer O ? O[keyof O] : never : [] -type Get = - P extends [infer Head, ...infer Tail] +type ValueFromPath = P extends [infer Head, ...infer Tail] ? Head extends keyof T - ? Get - : T extends readonly any[] - ? Head extends number - ? Get - : never - : never - : T; + ? ValueFromPath + : T extends readonly any[] + ? Head extends number + ? ValueFromPath + : never + : never + : T -type Persons = { - name: string; -}[] - -type V = SearchPathsV2<[string, number]> +const persons = [ + { name: "Monsieur Poulet" }, + { name: "El Chanclador" }, + { name: "AAAYAYAYAYAAY" }, +] -function getFromSearchPath>(obj: T, path: P): Get { - return path.reduce((acc: any, key: any) => acc?.[key], obj); -} +const getFromPath = >(value: T, path: P): ValueFromPath => ( + path.reduce((acc: any, key: any) => acc?.[key], value) +) -const res = getFromSearchPath([{ name: "prout" }] as const, ["0", "name"]) +const res = getFromPath(persons, [1, "name"]) +console.log(res) -- 2.49.1 From 58752253b3705eca6a3d698990fadd5d88d05bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 22 Apr 2025 22:36:17 +0200 Subject: [PATCH 229/326] SearchPaths work --- packages/reffuse/src/types/SearchPaths.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index ec4f762..e23d672 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -1,3 +1,6 @@ +import { Option, Predicate } from "effect" + + export type Paths = T extends object ? { [K in keyof T as K extends string | number | symbol ? K : never]: @@ -26,9 +29,19 @@ const persons = [ ] -const getFromPath = >(value: T, path: P): ValueFromPath => ( - path.reduce((acc: any, key: any) => acc?.[key], value) +export const get = >(parent: T, path: P): Option.Option> => path.reduce( + (acc: Option.Option, key: any): Option.Option => Option.isSome(acc) + ? Predicate.hasProperty(acc.value, key) + ? Option.some(acc.value[key]) + : Option.none() + : acc, + + Option.some(parent), ) -const res = getFromPath(persons, [1, "name"]) +export const getOrUndefined = >(parent: T, path: P): ValueFromPath => ( + path.reduce((acc: any, key: any) => acc?.[key], parent) +) + +const res = get(persons, [1, "name"]) console.log(res) -- 2.49.1 From 8917f8495241ec2c6c8606c90cd75796fdf7c646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 22 Apr 2025 22:59:50 +0200 Subject: [PATCH 230/326] SearchPaths work --- packages/reffuse/src/types/SearchPaths.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index e23d672..e3e8bf3 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -29,6 +29,10 @@ const persons = [ ] +export const unsafeGet = >(parent: T, path: P): ValueFromPath => ( + path.reduce((acc: any, key: any) => acc?.[key], parent) +) + export const get = >(parent: T, path: P): Option.Option> => path.reduce( (acc: Option.Option, key: any): Option.Option => Option.isSome(acc) ? Predicate.hasProperty(acc.value, key) @@ -39,9 +43,18 @@ export const get = >(parent: T, path: P): Option.Opt Option.some(parent), ) -export const getOrUndefined = >(parent: T, path: P): ValueFromPath => ( - path.reduce((acc: any, key: any) => acc?.[key], parent) + +export const unsafeImmutableSet = >(parent: T, path: P): Option.Option> => path.reduce( + (acc: Option.Option, key: any): Option.Option => Option.isSome(acc) + ? Predicate.hasProperty(acc.value, key) + ? Option.some(acc.value[key]) + : Option.none() + : acc, + + Option.some(parent), ) + const res = get(persons, [1, "name"]) + console.log(res) -- 2.49.1 From 1163b83929692a22ab56fb246dcd6da692f6cd8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 23 Apr 2025 05:53:19 +0200 Subject: [PATCH 231/326] SearchPaths work --- packages/reffuse/src/types/SearchPaths.ts | 50 ++++++++++++++--------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index e3e8bf3..c49b20f 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -1,7 +1,10 @@ -import { Option, Predicate } from "effect" +import { Array, Option, Predicate } from "effect" -export type Paths = T extends object +export type Key = string | number | symbol +export type Path = readonly Key[] + +export type Paths = [] | (T extends object ? { [K in keyof T as K extends string | number | symbol ? K : never]: | [K] @@ -9,9 +12,9 @@ export type Paths = T extends object } extends infer O ? O[keyof O] : never - : [] + : never) -type ValueFromPath = P extends [infer Head, ...infer Tail] +export type ValueFromPath = P extends [infer Head, ...infer Tail] ? Head extends keyof T ? ValueFromPath : T extends readonly any[] @@ -22,13 +25,6 @@ type ValueFromPath = P extends [infer Head, ...infer Tail] : T -const persons = [ - { name: "Monsieur Poulet" }, - { name: "El Chanclador" }, - { name: "AAAYAYAYAYAAY" }, -] - - export const unsafeGet = >(parent: T, path: P): ValueFromPath => ( path.reduce((acc: any, key: any) => acc?.[key], parent) ) @@ -44,17 +40,31 @@ export const get = >(parent: T, path: P): Option.Opt ) -export const unsafeImmutableSet = >(parent: T, path: P): Option.Option> => path.reduce( - (acc: Option.Option, key: any): Option.Option => Option.isSome(acc) - ? Predicate.hasProperty(acc.value, key) - ? Option.some(acc.value[key]) - : Option.none() - : acc, +export const immutableSet = >( + parent: T, + path: P, + value: ValueFromPath, +): Option.Option => { + const key = Array.head(path as Path) + if (Option.isNone(key)) + return Option.some(value as T) + if (!Predicate.hasProperty(parent, key.value)) + return Option.none() - Option.some(parent), -) + const child = immutableSet(parent[key.value], Option.getOrThrow(Array.tail(path as Path)), value) + if (Array.isArray(parent) && typeof key === "number") { + + return Option.some([]) + } +} + + +const persons = [ + { name: "Monsieur Poulet" }, + { name: "El Chanclador" }, + { name: "AAAYAYAYAYAAY" }, +] const res = get(persons, [1, "name"]) - console.log(res) -- 2.49.1 From 6156baec4dcdcba60058b200df59e03be7a6b2f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 23 Apr 2025 06:47:11 +0200 Subject: [PATCH 232/326] SearchPaths work --- packages/reffuse/src/types/SearchPaths.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index c49b20f..0d00cea 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -52,11 +52,20 @@ export const immutableSet = >( return Option.none() const child = immutableSet(parent[key.value], Option.getOrThrow(Array.tail(path as Path)), value) + if (Option.isNone(child)) + return child - if (Array.isArray(parent) && typeof key === "number") { + if (Array.isArray(parent) && typeof key === "number") + return Option.some([ + ...parent.slice(0, key), + child.value, + ...parent.slice(key + 1), + ] as T) - return Option.some([]) - } + if (typeof parent === "object") + return Option.some({ ...parent, [key.value]: child.value }) + + return Option.none() } @@ -65,6 +74,11 @@ const persons = [ { name: "El Chanclador" }, { name: "AAAYAYAYAYAAY" }, ] +console.log(persons) const res = get(persons, [1, "name"]) console.log(res) + +const persons2 = Option.getOrThrow(immutableSet(persons, [1, "name"], "El Risitas")) +console.log(Array.isArray(persons2)) +console.log(get(persons2, [1, "name"])) -- 2.49.1 From 459f548c10770aa17b5ea53cbf8c02e9c7eec2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 23 Apr 2025 06:50:17 +0200 Subject: [PATCH 233/326] Fix --- packages/reffuse/src/types/SearchPaths.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index 0d00cea..47d7416 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -55,12 +55,13 @@ export const immutableSet = >( if (Option.isNone(child)) return child - if (Array.isArray(parent) && typeof key === "number") + if (Array.isArray(parent) && typeof key.value === "number") { return Option.some([ - ...parent.slice(0, key), + ...parent.slice(0, key.value), child.value, - ...parent.slice(key + 1), + ...parent.slice(key.value + 1), ] as T) + } if (typeof parent === "object") return Option.some({ ...parent, [key.value]: child.value }) @@ -80,5 +81,5 @@ const res = get(persons, [1, "name"]) console.log(res) const persons2 = Option.getOrThrow(immutableSet(persons, [1, "name"], "El Risitas")) -console.log(Array.isArray(persons2)) +console.log(persons2) console.log(get(persons2, [1, "name"])) -- 2.49.1 From df851cf9ee82706e25063e69447c4871591ba9fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 23 Apr 2025 07:06:32 +0200 Subject: [PATCH 234/326] SearchPaths work --- packages/reffuse/src/types/SearchPaths.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index 47d7416..1411449 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -55,16 +55,20 @@ export const immutableSet = >( if (Option.isNone(child)) return child - if (Array.isArray(parent) && typeof key.value === "number") { - return Option.some([ - ...parent.slice(0, key.value), - child.value, - ...parent.slice(key.value + 1), - ] as T) - } + if (Array.isArray(parent)) + return typeof key.value === "number" + ? Option.some([ + ...parent.slice(0, key.value), + child.value, + ...parent.slice(key.value + 1), + ] as T) + : Option.none() if (typeof parent === "object") - return Option.some({ ...parent, [key.value]: child.value }) + return Object.assign( + Object.create(Object.getPrototypeOf(parent)), + { ...parent, [key.value]: child.value }, + ) return Option.none() } -- 2.49.1 From 1de976aaa8f2845d6d0954b696642eaa8b6dea18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 24 Apr 2025 00:20:30 +0200 Subject: [PATCH 235/326] Fix --- packages/reffuse/src/types/SearchPaths.ts | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index 1411449..01b5cb2 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -1,4 +1,4 @@ -import { Array, Option, Predicate } from "effect" +import { Array, Option, Predicate, Schema } from "effect" export type Key = string | number | symbol @@ -65,25 +65,28 @@ export const immutableSet = >( : Option.none() if (typeof parent === "object") - return Object.assign( - Object.create(Object.getPrototypeOf(parent)), - { ...parent, [key.value]: child.value }, + return Option.some( + Object.assign( + Object.create(Object.getPrototypeOf(parent)), + { ...parent, [key.value]: child.value }, + ) ) return Option.none() } +class Person extends Schema.Class("Person")({ + name: Schema.String, +}) {} + const persons = [ - { name: "Monsieur Poulet" }, - { name: "El Chanclador" }, - { name: "AAAYAYAYAYAAY" }, + Person.make({ name: "Monsieur Poulet" }), + Person.make({ name: "El Chanclador" }), + Person.make({ name: "AAAYAYAYAYAAY" }), ] -console.log(persons) const res = get(persons, [1, "name"]) -console.log(res) - const persons2 = Option.getOrThrow(immutableSet(persons, [1, "name"], "El Risitas")) console.log(persons2) console.log(get(persons2, [1, "name"])) -- 2.49.1 From 691b28427deb8a326823dfdd3150f21acbe14388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 24 Apr 2025 00:52:18 +0200 Subject: [PATCH 236/326] SearchPaths work --- packages/reffuse/src/types/SearchPaths.ts | 32 ++++++++++++++++------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index 01b5cb2..806f1be 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -4,15 +4,27 @@ import { Array, Option, Predicate, Schema } from "effect" export type Key = string | number | symbol export type Path = readonly Key[] -export type Paths = [] | (T extends object - ? { - [K in keyof T as K extends string | number | symbol ? K : never]: - | [K] - | [K, ...Paths] - } extends infer O - ? O[keyof O] - : never - : never) +export type Paths = [] | ( + T extends readonly any[] ? ArrayPaths : + T extends object ? ObjectPaths : + never +) + +type ArrayPaths = { + [K in keyof T as K extends number ? K : never]: + | [K] + | [K, ...Paths] +} extends infer O + ? O[keyof O] + : never + +type ObjectPaths = { + [K in keyof T as K extends string | number | symbol ? K : never]: + | [K] + | [K, ...Paths] +} extends infer O + ? O[keyof O] + : never export type ValueFromPath = P extends [infer Head, ...infer Tail] ? Head extends keyof T @@ -86,7 +98,7 @@ const persons = [ Person.make({ name: "AAAYAYAYAYAAY" }), ] -const res = get(persons, [1, "name"]) +const res = get(persons, [0, "name"]) const persons2 = Option.getOrThrow(immutableSet(persons, [1, "name"], "El Risitas")) console.log(persons2) console.log(get(persons2, [1, "name"])) -- 2.49.1 From 04b2fad038da501232297e29ad2371a63a26c8f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 25 Apr 2025 07:40:21 +0200 Subject: [PATCH 237/326] PropertyPath --- .../types/{SearchPaths.ts => PropertyPath.ts} | 24 ++++++++++++------- packages/reffuse/src/types/index.ts | 1 + 2 files changed, 16 insertions(+), 9 deletions(-) rename packages/reffuse/src/types/{SearchPaths.ts => PropertyPath.ts} (82%) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/PropertyPath.ts similarity index 82% rename from packages/reffuse/src/types/SearchPaths.ts rename to packages/reffuse/src/types/PropertyPath.ts index 806f1be..6e76188 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/PropertyPath.ts @@ -1,16 +1,13 @@ import { Array, Option, Predicate, Schema } from "effect" -export type Key = string | number | symbol -export type Path = readonly Key[] - export type Paths = [] | ( T extends readonly any[] ? ArrayPaths : T extends object ? ObjectPaths : never ) -type ArrayPaths = { +export type ArrayPaths = { [K in keyof T as K extends number ? K : never]: | [K] | [K, ...Paths] @@ -18,7 +15,7 @@ type ArrayPaths = { ? O[keyof O] : never -type ObjectPaths = { +export type ObjectPaths = { [K in keyof T as K extends string | number | symbol ? K : never]: | [K] | [K, ...Paths] @@ -36,12 +33,21 @@ export type ValueFromPath = P extends [infer Head, ...infer : never : T +export type AnyKey = string | number | symbol +export type AnyPath = readonly AnyKey[] -export const unsafeGet = >(parent: T, path: P): ValueFromPath => ( + +export const unsafeGet = >( + parent: T, + path: P, +): ValueFromPath => ( path.reduce((acc: any, key: any) => acc?.[key], parent) ) -export const get = >(parent: T, path: P): Option.Option> => path.reduce( +export const get = >( + parent: T, + path: P, +): Option.Option> => path.reduce( (acc: Option.Option, key: any): Option.Option => Option.isSome(acc) ? Predicate.hasProperty(acc.value, key) ? Option.some(acc.value[key]) @@ -57,13 +63,13 @@ export const immutableSet = >( path: P, value: ValueFromPath, ): Option.Option => { - const key = Array.head(path as Path) + const key = Array.head(path as AnyPath) if (Option.isNone(key)) return Option.some(value as T) if (!Predicate.hasProperty(parent, key.value)) return Option.none() - const child = immutableSet(parent[key.value], Option.getOrThrow(Array.tail(path as Path)), value) + const child = immutableSet(parent[key.value], Option.getOrThrow(Array.tail(path as AnyPath)), value) if (Option.isNone(child)) return child diff --git a/packages/reffuse/src/types/index.ts b/packages/reffuse/src/types/index.ts index ec93c5f..e8b2633 100644 --- a/packages/reffuse/src/types/index.ts +++ b/packages/reffuse/src/types/index.ts @@ -1,2 +1,3 @@ +export * as PropertyPath from "./PropertyPath.js" export * as SetStateAction from "./SetStateAction.js" export * as SubscriptionSubRef from "./SubscriptionSubRef.js" -- 2.49.1 From a70ef27f75385efa9efc60233974bb1f6cd06c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 25 Apr 2025 07:56:56 +0200 Subject: [PATCH 238/326] PropertyPath done --- packages/reffuse/src/types/PropertyPath.ts | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/packages/reffuse/src/types/PropertyPath.ts b/packages/reffuse/src/types/PropertyPath.ts index 6e76188..8c1655d 100644 --- a/packages/reffuse/src/types/PropertyPath.ts +++ b/packages/reffuse/src/types/PropertyPath.ts @@ -1,4 +1,4 @@ -import { Array, Option, Predicate, Schema } from "effect" +import { Array, Option, Predicate } from "effect" export type Paths = [] | ( @@ -57,7 +57,6 @@ export const get = >( Option.some(parent), ) - export const immutableSet = >( parent: T, path: P, @@ -92,19 +91,3 @@ export const immutableSet = >( return Option.none() } - - -class Person extends Schema.Class("Person")({ - name: Schema.String, -}) {} - -const persons = [ - Person.make({ name: "Monsieur Poulet" }), - Person.make({ name: "El Chanclador" }), - Person.make({ name: "AAAYAYAYAYAAY" }), -] - -const res = get(persons, [0, "name"]) -const persons2 = Option.getOrThrow(immutableSet(persons, [1, "name"], "El Risitas")) -console.log(persons2) -console.log(get(persons2, [1, "name"])) -- 2.49.1 From 107ff1e79477d899b7cfdb3dcf3b9205451270eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 25 Apr 2025 08:12:34 +0200 Subject: [PATCH 239/326] SubscriptionSubRef.makeFromPath --- packages/reffuse/src/types/SubscriptionSubRef.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/reffuse/src/types/SubscriptionSubRef.ts b/packages/reffuse/src/types/SubscriptionSubRef.ts index b9cb31f..6567c55 100644 --- a/packages/reffuse/src/types/SubscriptionSubRef.ts +++ b/packages/reffuse/src/types/SubscriptionSubRef.ts @@ -1,4 +1,5 @@ -import { Effect, Effectable, Readable, Ref, Stream, Subscribable, SubscriptionRef, SynchronizedRef, type Types, type Unify } from "effect" +import { Effect, Effectable, Option, Readable, Ref, Stream, Subscribable, SubscriptionRef, SynchronizedRef, type Types, type Unify } from "effect" +import * as PropertyPath from "./PropertyPath.js" export const SubscriptionSubRefTypeId: unique symbol = Symbol.for("reffuse/types/SubscriptionSubRef") @@ -87,3 +88,12 @@ export const makeFromGetSet = ( getter: (parentValue: B) => A, setter: (parentValue: B, value: A) => B, ): SubscriptionSubRef => new SubscriptionSubRefImpl(parent, getter, setter) + +export const makeFromPath = >( + parent: SubscriptionRef.SubscriptionRef, + path: P, +): SubscriptionSubRef, B> => new SubscriptionSubRefImpl( + parent, + parentValue => PropertyPath.unsafeGet(parentValue, path), + (parentValue, value) => Option.getOrThrow(PropertyPath.immutableSet(parentValue, path, value)), +) -- 2.49.1 From 39d2176c615f58df8e6af8fee1e117ab9044935f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 25 Apr 2025 08:21:59 +0200 Subject: [PATCH 240/326] Working subref from path --- packages/example/src/routes/tests.tsx | 6 +----- packages/reffuse/src/ReffuseNamespace.ts | 13 ++++++++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index def5d5c..a2a073d 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -11,11 +11,7 @@ export const Route = createFileRoute("/tests")({ function RouteComponent() { const deepRef = R.useRef({ value: "poulet" }) - const deepValueRef = R.useSubRefFromGetSet( - deepRef, - b => b.value, - (b, a) => ({ ...b, value: a }), - ) + const deepValueRef = R.useSubRefFromPath(deepRef, ["value"]) // const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( // Effect.andThen(makeUuid4), diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 1ad1d10..98e80e3 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -2,7 +2,7 @@ import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" -import { SetStateAction, SubscriptionSubRef } from "./types/index.js" +import { PropertyPath, SetStateAction, SubscriptionSubRef } from "./types/index.js" export interface RenderOptions { @@ -396,6 +396,17 @@ export abstract class ReffuseNamespace { ) } + useSubRefFromPath, R>( + this: ReffuseNamespace, + parent: SubscriptionRef.SubscriptionRef, + path: P, + ): SubscriptionSubRef.SubscriptionSubRef, B> { + return React.useMemo( + () => SubscriptionSubRef.makeFromPath(parent, path), + [parent], + ) + } + useSubscribeRefs< const Refs extends readonly SubscriptionRef.SubscriptionRef[], R, -- 2.49.1 From 148c98acbdf67954440b353f99eb8bba55978f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 25 Apr 2025 08:30:17 +0200 Subject: [PATCH 241/326] Fix --- packages/reffuse/src/types/SubscriptionSubRef.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/src/types/SubscriptionSubRef.ts b/packages/reffuse/src/types/SubscriptionSubRef.ts index 6567c55..15baba7 100644 --- a/packages/reffuse/src/types/SubscriptionSubRef.ts +++ b/packages/reffuse/src/types/SubscriptionSubRef.ts @@ -94,6 +94,6 @@ export const makeFromPath = >( path: P, ): SubscriptionSubRef, B> => new SubscriptionSubRefImpl( parent, - parentValue => PropertyPath.unsafeGet(parentValue, path), + parentValue => Option.getOrThrow(PropertyPath.get(parentValue, path)), (parentValue, value) => Option.getOrThrow(PropertyPath.immutableSet(parentValue, path, value)), ) -- 2.49.1 From ea374d7e0fdd886bde5e1c4f0a7e081a4a885349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 25 Apr 2025 08:32:42 +0200 Subject: [PATCH 242/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 98e80e3..ae4b84e 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -2,7 +2,7 @@ import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" -import { PropertyPath, SetStateAction, SubscriptionSubRef } from "./types/index.js" +import { type PropertyPath, SetStateAction, SubscriptionSubRef } from "./types/index.js" export interface RenderOptions { -- 2.49.1 From 357e5aa56b98d02530caad96583bf166152e4b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 25 Apr 2025 10:16:04 +0200 Subject: [PATCH 243/326] useSubRef --- packages/reffuse/src/ReffuseNamespace.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index ae4b84e..3612520 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -384,19 +384,7 @@ export abstract class ReffuseNamespace { ) } - useSubRefFromGetSet( - this: ReffuseNamespace, - parent: SubscriptionRef.SubscriptionRef, - getter: (parentValue: B) => A, - setter: (parentValue: B, value: A) => B, - ): SubscriptionSubRef.SubscriptionSubRef { - return React.useMemo( - () => SubscriptionSubRef.makeFromGetSet(parent, getter, setter), - [parent], - ) - } - - useSubRefFromPath, R>( + useSubRef, R>( this: ReffuseNamespace, parent: SubscriptionRef.SubscriptionRef, path: P, -- 2.49.1 From fa0f8c6b248d673e7f30e14123102cae462b3e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 25 Apr 2025 13:38:42 +0200 Subject: [PATCH 244/326] Refactoring --- packages/example/src/routes/tests.tsx | 2 +- packages/reffuse/src/ReffuseNamespace.ts | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index a2a073d..440c904 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -11,7 +11,7 @@ export const Route = createFileRoute("/tests")({ function RouteComponent() { const deepRef = R.useRef({ value: "poulet" }) - const deepValueRef = R.useSubRefFromPath(deepRef, ["value"]) + const deepValueRef = R.useSubRef(deepRef, ["value"]) // const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( // Effect.andThen(makeUuid4), diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 3612520..50dbea1 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -14,6 +14,10 @@ export interface ScopeOptions { readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy } +export type RefsA[]> = { + [K in keyof T]: Effect.Effect.Success +} + export abstract class ReffuseNamespace { declare ["constructor"]: ReffuseNamespaceClass @@ -401,18 +405,18 @@ export abstract class ReffuseNamespace { >( this: ReffuseNamespace, ...refs: Refs - ): [...{ [K in keyof Refs]: Effect.Effect.Success }] { + ): RefsA { const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( () => Effect.all(refs as readonly SubscriptionRef.SubscriptionRef[]), [], { doNotReExecuteOnRuntimeOrContextChange: true }, - ) as [...{ [K in keyof Refs]: Effect.Effect.Success }]) + ) as RefsA) this.useFork(() => pipe( refs.map(ref => Stream.changesWith(ref.changes, (x, y) => x === y)), streams => Stream.zipLatestAll(...streams), Stream.runForEach(v => - Effect.sync(() => setReactStateValue(v as [...{ [K in keyof Refs]: Effect.Effect.Success }])) + Effect.sync(() => setReactStateValue(v as RefsA)) ), ), refs) @@ -486,7 +490,7 @@ export abstract class ReffuseNamespace { this: ReffuseNamespace, props: { readonly refs: Refs - readonly children: (...args: [...{ [K in keyof Refs]: Effect.Effect.Success }]) => React.ReactNode + readonly children: (...args: RefsA) => React.ReactNode }, ): React.ReactNode { return props.children(...this.useSubscribeRefs(...props.refs)) -- 2.49.1 From 1c7cef703b555927f3dda849231e842ae8d1fde7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 25 Apr 2025 13:50:54 +0200 Subject: [PATCH 245/326] SubRef --- packages/reffuse/src/ReffuseNamespace.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 50dbea1..c4e2b21 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -23,6 +23,7 @@ export abstract class ReffuseNamespace { declare ["constructor"]: ReffuseNamespaceClass constructor() { + this.SubRef = this.SubRef.bind(this as any) as any this.SubscribeRefs = this.SubscribeRefs.bind(this as any) as any this.RefState = this.RefState.bind(this as any) as any this.SubscribeStream = this.SubscribeStream.bind(this as any) as any @@ -483,6 +484,17 @@ export abstract class ReffuseNamespace { } + SubRef, R>( + this: ReffuseNamespace, + props: { + readonly parent: SubscriptionRef.SubscriptionRef, + readonly path: P, + readonly children: (subRef: SubscriptionSubRef.SubscriptionSubRef, B>) => React.ReactNode + }, + ): React.ReactNode { + return props.children(this.useSubRef(props.parent, props.path)) + } + SubscribeRefs< const Refs extends readonly SubscriptionRef.SubscriptionRef[], R, -- 2.49.1 From dd524e1aa55bcd9cb1bf8548f3edad8b1be27bfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 27 Apr 2025 18:46:33 +0200 Subject: [PATCH 246/326] Refactoring --- packages/reffuse/src/types/PropertyPath.ts | 61 +++++++++++----------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/packages/reffuse/src/types/PropertyPath.ts b/packages/reffuse/src/types/PropertyPath.ts index 8c1655d..5806f4e 100644 --- a/packages/reffuse/src/types/PropertyPath.ts +++ b/packages/reffuse/src/types/PropertyPath.ts @@ -1,4 +1,4 @@ -import { Array, Option, Predicate } from "effect" +import { Array, Function, Option, Predicate } from "effect" export type Paths = [] | ( @@ -37,57 +37,58 @@ export type AnyKey = string | number | symbol export type AnyPath = readonly AnyKey[] -export const unsafeGet = >( - parent: T, - path: P, -): ValueFromPath => ( - path.reduce((acc: any, key: any) => acc?.[key], parent) +export const unsafeGet: { + >(path: P): (self: T) => ValueFromPath + >(self: T, path: P): ValueFromPath +} = Function.dual(2, >(self: T, path: P): ValueFromPath => + path.reduce((acc: any, key: any) => acc?.[key], self) ) -export const get = >( - parent: T, - path: P, -): Option.Option> => path.reduce( - (acc: Option.Option, key: any): Option.Option => Option.isSome(acc) - ? Predicate.hasProperty(acc.value, key) - ? Option.some(acc.value[key]) - : Option.none() - : acc, +export const get: { + >(path: P): (self: T) => Option.Option> + >(self: T, path: P): Option.Option> +} = Function.dual(2, >(self: T, path: P): Option.Option> => + path.reduce( + (acc: Option.Option, key: any): Option.Option => Option.isSome(acc) + ? Predicate.hasProperty(acc.value, key) + ? Option.some(acc.value[key]) + : Option.none() + : acc, - Option.some(parent), + Option.some(self), + ) ) -export const immutableSet = >( - parent: T, - path: P, - value: ValueFromPath, -): Option.Option => { +export const immutableSet: { + >(path: P, value: ValueFromPath): (self: T) => ValueFromPath + >(self: T, path: P, value: ValueFromPath): Option.Option +} = Function.dual(3, >(self: T, path: P, value: ValueFromPath): Option.Option => { const key = Array.head(path as AnyPath) if (Option.isNone(key)) return Option.some(value as T) - if (!Predicate.hasProperty(parent, key.value)) + if (!Predicate.hasProperty(self, key.value)) return Option.none() - const child = immutableSet(parent[key.value], Option.getOrThrow(Array.tail(path as AnyPath)), value) + const child = immutableSet(self[key.value], Option.getOrThrow(Array.tail(path as AnyPath)), value) if (Option.isNone(child)) return child - if (Array.isArray(parent)) + if (Array.isArray(self)) return typeof key.value === "number" ? Option.some([ - ...parent.slice(0, key.value), + ...self.slice(0, key.value), child.value, - ...parent.slice(key.value + 1), + ...self.slice(key.value + 1), ] as T) : Option.none() - if (typeof parent === "object") + if (typeof self === "object") return Option.some( Object.assign( - Object.create(Object.getPrototypeOf(parent)), - { ...parent, [key.value]: child.value }, + Object.create(Object.getPrototypeOf(self)), + { ...self, [key.value]: child.value }, ) ) return Option.none() -} +}) -- 2.49.1 From 076007ec67e6b77804ca3f9a86898c395c97b935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 27 Apr 2025 18:52:08 +0200 Subject: [PATCH 247/326] Refactoring --- packages/reffuse/src/types/SubscriptionSubRef.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/reffuse/src/types/SubscriptionSubRef.ts b/packages/reffuse/src/types/SubscriptionSubRef.ts index 15baba7..4ea615d 100644 --- a/packages/reffuse/src/types/SubscriptionSubRef.ts +++ b/packages/reffuse/src/types/SubscriptionSubRef.ts @@ -3,6 +3,7 @@ import * as PropertyPath from "./PropertyPath.js" export const SubscriptionSubRefTypeId: unique symbol = Symbol.for("reffuse/types/SubscriptionSubRef") +export type SubscriptionSubRefTypeId = typeof SubscriptionSubRefTypeId export interface SubscriptionSubRef extends SubscriptionSubRef.Variance, SubscriptionRef.SubscriptionRef { readonly parent: SubscriptionRef.SubscriptionRef -- 2.49.1 From 1228c51694c2000d3af65353b09c4d4289eaa42e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 27 Apr 2025 19:09:30 +0200 Subject: [PATCH 248/326] Dependencies upgrade --- bun.lock | 274 +++++++++++++++++----------------- package.json | 6 +- packages/example/package.json | 34 ++--- 3 files changed, 161 insertions(+), 153 deletions(-) diff --git a/bun.lock b/bun.lock index 3d51717..4f670be 100644 --- a/bun.lock +++ b/bun.lock @@ -4,9 +4,9 @@ "": { "name": "@reffuse/monorepo", "devDependencies": { - "npm-check-updates": "^17.1.18", + "npm-check-updates": "^18.0.1", "npm-sort": "^0.0.4", - "turbo": "^2.5.0", + "turbo": "^2.5.2", "typescript": "^5.8.3", }, }, @@ -14,41 +14,41 @@ "name": "@reffuse/example", "version": "0.0.0", "dependencies": { - "@effect/platform": "^0.80.8", - "@effect/platform-browser": "^0.59.8", + "@effect/platform": "^0.80.14", + "@effect/platform-browser": "^0.60.5", "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", "@typed/async-data": "^0.13.1", "@typed/id": "^0.17.2", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.14.8", - "lucide-react": "^0.487.0", + "effect": "^3.14.14", + "lucide-react": "^0.503.0", "mobx": "^6.13.7", "reffuse": "workspace:*", }, "devDependencies": { - "@eslint/js": "^9.24.0", - "@tanstack/react-router": "^1.115.3", - "@tanstack/react-router-devtools": "^1.115.3", - "@tanstack/router-plugin": "^1.115.3", + "@eslint/js": "^9.25.1", + "@tanstack/react-router": "^1.117.1", + "@tanstack/react-router-devtools": "^1.117.1", + "@tanstack/router-plugin": "^1.117.2", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.1.1", + "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", - "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.24.0", + "@vitejs/plugin-react": "^4.4.1", + "eslint": "^9.25.1", "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.19", + "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.0.0", "react": "^19.1.0", "react-dom": "^19.1.0", - "typescript-eslint": "^8.29.1", - "vite": "^6.2.6", + "typescript-eslint": "^8.31.0", + "vite": "^6.3.3", }, }, "packages/extension-lazyref": { "name": "@reffuse/extension-lazyref", - "version": "0.1.1", + "version": "0.1.4", "devDependencies": { "reffuse": "workspace:*", }, @@ -57,12 +57,12 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.4", + "reffuse": "^0.1.8", }, }, "packages/extension-query": { "name": "@reffuse/extension-query", - "version": "0.1.2", + "version": "0.1.3", "devDependencies": { "reffuse": "workspace:*", }, @@ -73,12 +73,12 @@ "@types/react": "^19.0.0", "effect": "^3.13.0", "react": "^19.0.0", - "reffuse": "^0.1.4", + "reffuse": "^0.1.6", }, }, "packages/reffuse": { "name": "reffuse", - "version": "0.1.5", + "version": "0.1.9", "peerDependencies": { "@types/react": "^19.0.0", "effect": "^3.13.0", @@ -129,61 +129,61 @@ "@babel/types": ["@babel/types@7.27.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg=="], - "@effect/platform": ["@effect/platform@0.80.8", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.14.8" } }, "sha512-iNHMioRWJSBGElFVhKiE23eO16N2tyDQBvYFKwqxg1/O+aGeOeo1EA7BI0YTyUcQ4pBvMI+1QiLJlskB+UV/6g=="], + "@effect/platform": ["@effect/platform@0.80.14", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.14.14" } }, "sha512-yUFeqSzL6Pu66XOmNkvcqGeEkmQit13Ei0jXlumU8YEpAweRe2pmiOZqYoGTzsIn0BJhepx7O6cjmkKSi/PQ4Q=="], - "@effect/platform-browser": ["@effect/platform-browser@0.59.8", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.80.8", "effect": "^3.14.8" } }, "sha512-PRRSXoT3s/zrLNKKLujvhQ1vH6P88rXSCW0Jc8RNRXN/3DVSCE1WfvAZ8lYD05r6Crj5eTpDctJbUuGvIFuSOw=="], + "@effect/platform-browser": ["@effect/platform-browser@0.60.5", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.80.14", "effect": "^3.14.14" } }, "sha512-gFU40vM470nbr3n+5w66+drQxp7KDUXkIm+q8XGp9csdaxBdJ+hhurNJrR0kOWVxMd/SD3k7QdIxB+JN8Jo5hg=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.2", "", { "os": "android", "cpu": "arm" }, "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.3", "", { "os": "android", "cpu": "arm" }, "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.3", "", { "os": "android", "cpu": "arm64" }, "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.2", "", { "os": "android", "cpu": "x64" }, "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.3", "", { "os": "android", "cpu": "x64" }, "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.2", "", { "os": "linux", "cpu": "arm" }, "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.3", "", { "os": "linux", "cpu": "arm" }, "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.3", "", { "os": "linux", "cpu": "none" }, "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.3", "", { "os": "linux", "cpu": "none" }, "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.3", "", { "os": "linux", "cpu": "none" }, "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.2", "", { "os": "linux", "cpu": "x64" }, "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.3", "", { "os": "linux", "cpu": "x64" }, "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.2", "", { "os": "none", "cpu": "arm64" }, "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.3", "", { "os": "none", "cpu": "arm64" }, "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.2", "", { "os": "none", "cpu": "x64" }, "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.3", "", { "os": "none", "cpu": "x64" }, "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.2", "", { "os": "win32", "cpu": "x64" }, "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.3", "", { "os": "win32", "cpu": "x64" }, "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.6.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.6.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], @@ -191,11 +191,11 @@ "@eslint/config-helpers": ["@eslint/config-helpers@0.2.1", "", {}, "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw=="], - "@eslint/core": ["@eslint/core@0.12.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg=="], + "@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="], "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - "@eslint/js": ["@eslint/js@9.24.0", "", {}, "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA=="], + "@eslint/js": ["@eslint/js@9.25.1", "", {}, "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], @@ -251,102 +251,108 @@ "@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], - "@radix-ui/react-accessible-icon": ["@radix-ui/react-accessible-icon@1.1.3", "", { "dependencies": { "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-givBUIlhucV212j05wJCzXtcUtQnAwoUF9eAyUyOB2YwKHnWyme817trCtAzLjo0OndPr09kbkFe2onKRxLWdg=="], + "@radix-ui/react-accessible-icon": ["@radix-ui/react-accessible-icon@1.1.4", "", { "dependencies": { "@radix-ui/react-visually-hidden": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-J8pIt7l32A9fGIn86vwccQzik5MgIOTtceeTxi6EiiFYwWHLxsTHwiOW4pI5sQhQJWd3MOEkumFBIHwIU038Cw=="], - "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collapsible": "1.1.4", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-SGCxlSBaMvEzDROzyZjsVNzu9XY5E28B3k8jOENyrz6csOv/pG1eHyYfLJai1n9tRjwG61coXDhfpgtxKxUv5g=="], + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collapsible": "1.1.8", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-c7OKBvO36PfQIUGIjj1Wko0hH937pYFU2tR5zbIJDUsmTzHoZVHHt4bmb7OOJbzTaWJtVELKWojBHa7OcnUHmQ=="], - "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dialog": "1.1.7", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7Gx1gcoltd0VxKoR8mc+TAVbzvChJyZryZsTam0UhoL92z0L+W8ovxvcgvd+nkz24y7Qc51JQKBAGe4+825tYw=="], + "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dialog": "1.1.11", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-4KfkwrFnAw3Y5Jeoq6G+JYSKW0JfIS3uDdFC/79Jw9AsMayZMizSSMxk1gkrolYXsa/WzbbDfOA7/D8N5D+l1g=="], - "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2dvVU4jva0qkNZH6HHWuSz5FN5GeU5tymvCgutF8WaXz9WnD1NgUhy73cqzkjkN4Zkn8lfTPv5JIfrC221W+Nw=="], + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-qz+fxrqgNxG0dYew5l7qR3c7wdgRu1XVUHGnGYX7rg5HM4p9SWaRmJwfgR3J0SgyUKayLmzQIun+N6rWRgiRKw=="], - "@radix-ui/react-aspect-ratio": ["@radix-ui/react-aspect-ratio@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yIrYZUc2e/JtRkDpuJCmaR6kj/jzekDfQLcPFdEWzSOygCPy8poR4YcszaHP5A7mh25ncofHEpeTwfhxEuBv8Q=="], + "@radix-ui/react-aspect-ratio": ["@radix-ui/react-aspect-ratio@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ie2mUDtM38LBqVU+Xn+GIY44tWM5yVbT5uXO+th85WZxUUsgEdWNNZWecqqGzkQ4Af+Fq1mYT6TyQ/uUf5gfcw=="], - "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.4", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+kBesLBzwqyDiYCtYFK+6Ktf+N7+Y6QOTUueLGLIbLZ/YeyFW6bsBGDsN+5HxHpM55C90u5fxsg0ErxzXTcwKA=="], + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.7", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-V7ODUt4mUoJTe3VUxZw6nfURxaPALVqmDQh501YmaQsk3D8AZQrOPRnfKn4H7JGDLBc0KqLhT94H79nV88ppNg=="], - "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-B0gYIVxl77KYDR25AY9EGe/G//ef85RVBIxQvK+m5pxAC7XihAc/8leMHhDvjvhDu02SBSb6BuytlWr/G7F3+g=="], + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.2.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pHVzDYsnaDmBlAuwim45y3soIN8H4R7KbkSVirGhXO+R/kO2OLCe0eucUEbddaTcdMHHdzcIGHtZSMSQlA+apw=="], - "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-u7LCw1EYInQtBNLGjm9nZ89S/4GcvX1UR5XbekEgnQae2Hkpq39ycJ1OhdeN1/JDfVNG91kWaWoest127TaEKQ=="], + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-hxEsLvK9WxIAPyxdDRULL4hcaSjMZCfP7fHB0Z1uUnDoDBat1Zh46hwYfa69DeZAbJrPckjf0AGAtEZyvDyJbw=="], - "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-mM2pxoQw5HJ49rkzwOs7Y6J4oYH22wS8BfK2/bBxROlI4xuR0c4jEenQP63LlTlDkO6Buj2Vt+QYAYcOgqtrXA=="], + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-cv4vSf7HttqXilDnAnvINd53OTl1/bjUYVZrkFnA7nwmY9Ob2POUy0WY0sfqBAe1s5FyKsyceQlqiEGPYNTadg=="], "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], - "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.2.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-menu": "2.1.7", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-EwO3tyyqwGaLPg0P64jmIKJnBywD0yjiL1eRuMPyhUXPkWWpa5JPDS+oyeIWHy2JbhF+NUlfUPVq6vE7OqgZww=="], + "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.2.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-menu": "2.1.12", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-5UFKuTMX8F2/KjHvyqu9IYT8bEtDSCJwwIx1PghBo4jh9S6jJVsceq9xIjqsOVcxsynGwV5eaqPE3n/Cu+DrSA=="], - "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.3", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-EIdma8C0C/I6kL6sO02avaCRqi3fmWJpxH6mqbVScorW6nNktzKJT/le7VPho3o/7wCsyRg3z0+Q+Obr0Gy/VQ=="], + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yI7S1ipkP5/+99qhSI6nthfo/tR6bL6Zgxi/+1UO6qPa6UeM6nlafWcQ65vB4rU2XjgjMfMhI3k9Y5MztA62VQ=="], "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], - "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7gpgMT2gyKym9Jz2ZhlRXSg2y6cNQIK8d/cqBZ0RBCaps8pFryCWXiUKI+uHGFrhMrbGUP7U6PWgiXzIxoyF3Q=="], + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-j5+WBUdhccJsmH5/H0K6RncjDtoALSEr6jbkaZu+bjw6hOPOhHycr6vEUujl+HBK8kjUfWcoCJXxP6e4lUlMZw=="], - "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.7", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7/1LiuNZuCQE3IzdicGoHdQOHkS2Q08+7p8w6TXZ6ZjgAULaCI85ZY15yPl4o4FVgoKLRT43/rsfNVN8osClQQ=="], + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.12", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-VJoMs+BWWE7YhzEQyVwvF9n22Eiyr83HotCVrMQzla/OwRovXCgah7AcaEr4hMNj4gJxSdtIbcHGvmJXOoJVHA=="], "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA=="], - "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-4XaDlq0bPt7oJwR+0k0clCiCO/7lO7NKZTAaJBYxDNQT/vj4ig0/UvctrRscZaFREpRvUTkpKR96ov1e6jptQg=="], + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-r2annK27lIW5w9Ho5NyQgqs0MmgZSTIKXWpVCJaLC1q2kZrZkcqnmHkCHMEmv8XLvsLlurKMPT+kbKkRkm/xVA=="], - "@radix-ui/react-form": ["@radix-ui/react-form@0.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-label": "2.1.3", "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-fVxaewKm9+oKL5q+E1+tIKNEkAeh8waJ+MsFNhLFAmpF8VG6nrNXYd2FFU8J7P3gIGNr023Sp+dD0xflqI84mA=="], + "@radix-ui/react-form": ["@radix-ui/react-form@0.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-label": "2.1.4", "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-97Q7Hb0///sMF2X8XvyVx3Aub7WG/ybIofoDVUo8utG/z/6TBzWGjgai7ZjECXYLbKip88t9/ibyQJvYe5k6SA=="], - "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HwM03kP8psrv21J1+9T/hhxi0f5rARVbqIZl9+IAq13l4j4fX+oGIuxisukZZmebO7J35w9gpoILvtG8bbph0w=="], + "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-q9h9grUpGZKR3MNhtVCLVnPGmx1YnzBgGR+O40mhSNGsUnkR+LChVH8c7FB0mkS+oudhd8KAkZGTJPJCjdAPIg=="], "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], - "@radix-ui/react-label": ["@radix-ui/react-label@2.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zwSQ1NzSKG95yA0tvBMgv6XPHoqapJCcg9nsUBaQQ66iRBhZNhlpaQG2ERYYX4O4stkYFK5rxj5NsWfO9CS+Hg=="], + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wy3dqizZnZVV4ja0FNnUhIWNwWdoldXrneEyUcVtLYDAt8ovGS4ridtMAOGgXBBIfggL4BOveVWsjXDORdGEQg=="], - "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.3", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tBODsrk68rOi1/iQzbM54toFF+gSw/y+eQgttFflqlGekuSebNqvFNHjJgjqPhiMb4Fw9A0zNFly1QT6ZFdQ+Q=="], + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+qYq6LfbiGo97Zz9fioX83HCiIYYFNs8zAsVCMQrIakoNYylIzWuoD/anAD3UzvvR6cnswmfRFJFq/zYYq/k7Q=="], - "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.7", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YB2zFhGdZ5SWEgRS+PgrF7EkwpsjEHntIFB/LRbT49LJdnIeK/xQQyuwLiRcOCgTDN+ALlPXQ08f0P0+TfR41g=="], + "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.12", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bM2vT5nxRqJH/d1vFQ9jLsW4qR70yFQw2ZD1TUPWUNskDsV0eYeMbbNJqxNjGMOVogEkOJaHtu11kzYdTJvVJg=="], - "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HJqyzqG74Lj7KV58rk73i/B1nnopVyCfUmKgeGWWrZZiCuMNcY0KKugTrmqMbIeMliUnkBUDKCy9J6Mzl6xeWw=="], + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kGDqMVPj2SRB1vJmXN/jnhC66REAXNyDmDRubbbmJ+360zSIJUDmWGMKIJOf72PHMwPENrbtJVb3CMAUJDjEIA=="], - "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.3", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-I38OYWDmJF2kbO74LX8UsFydSHWOJuQ7LxPnTefjxxvdvPLempvAnmsyX9UsBlywcbSGpRH7oMLfkUf+ij4nrw=="], + "@radix-ui/react-one-time-password-field": ["@radix-ui/react-one-time-password-field@0.1.4", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-CygYLHY8kO1De5iAZBn7gQbIoRNVGYx1paIyqbmwlxP6DF7sF1LLW3chXo/qxc4IWUQnsgAhfl9u6IoLXTndqQ=="], - "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.3", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-iNb9LYUMkne9zIahukgQmHlSBp9XWGeQQ7FvUGNk45ywzOb6kQa+Ca38OphXlWDiKvyneo9S+KSJsLfLt8812A=="], + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yFMfZkVA5G3GJnBgb2PxrrcLKm1ZLWXrbYVgdyTl//0TYEIHS9LJbnyz7WWcZ0qCq7hIlJZpRtxeSeIG5T5oJw=="], - "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.5", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ps/67ZqsFm+Mb6lSPJpfhRLrVL2i2fntgCmGMqqth4eaGUf+knAuuRtWVJrNjUhExgmdRqftSgzpf0DF0n6yXA=="], + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.4", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3p2Rgm/a1cK0r/UVkx5F/K9v/EplfjAeIFCGOPYPO4lZ0jtg4iSQXt/YGTSLWaf4x7NG6Z4+uKFcylcTZjeqDA=="], - "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA=="], + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.6", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XmsIl2z1n/TsYFLIdYam2rmFwf9OC/Sh2avkbmVMDuBZIe7hSpM0cYnWPAo7nHOVx8zTuwDZGByfcqLdnzp3Vw=="], - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g=="], + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA=="], - "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.3", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F56aZPGTPb4qJQ/vDjnAq63oTu/DRoIG/Asb5XKOWj8rpefNLtUllR969j5QDN2sRrTk9VXIqQDRj5VvAuquaw=="], + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="], - "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.2.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oLz7ATfKgVTUbpr5OBu6Q7hQcnV22uPT306bmG0QwgnKqBStR98RfWfJGCfW/MmhL4ISmrmmBPBW+c77SDwV9g=="], + "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.4", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-8rl9w7lJdcVPor47Dhws9mUHRHLE+8JEgyJRdNWCpGPa6HIlr3eh+Yn9gyx1CnCLbw5naHsI2gaO9dBWO50vzw=="], - "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ufbpLUjZiOg4iYgb2hQrWXEPYX6jOLBbR27bDyAff5GYMRrCzcze8lukjuXVUQvJ6HZe8+oL+hhswDcjmcgVyg=="], + "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.3.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-N4J9QFdW5zcJNxxY/zwTXBN4Uc5VEuRM7ZLjNfnWoKmNvgrPtNNw4P8zY532O3qL6aPkaNO+gY9y6bfzmH4U1g=="], - "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.4", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-G9rdWTQjOR4sk76HwSdROhPU0jZWpfozn9skU1v4N0/g9k7TmswrJn8W8WMU+aYktnLLpk5LX6fofj2bGe5NFQ=="], + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-C6oAg451/fQT3EGbWHbCQjYTtbyjNO1uzQgMzwyivcHT3GKNEmu1q3UuREhN+HzHAVtv3ivMVK08QlC+PkYw9Q=="], - "@radix-ui/react-select": ["@radix-ui/react-select@2.1.7", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.3", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.1.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-exzGIRtc7S8EIM2KjFg+7lJZsH7O7tpaBaJbBNVDnOZNhtoQ2iV+iSNfi2Wth0m6h3trJkMVvzAehB3c6xj/3Q=="], + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lj8OMlpPERXrQIHlEQdlXHJoRT52AMpBrgyPYylOhXYq5e/glsEdtOc/kCQlsTdtgN5U0iDbrrolDadvektJGQ=="], - "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2omrWKJvxR0U/tkIXezcc1nFMwtLU0+b/rDK40gnzJqTLWQ/TD/D5IYVefp9sC3QWfeQbpSbEA6op9MQKyaALQ=="], + "@radix-ui/react-select": ["@radix-ui/react-select@2.2.2", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HjkVHtBkuq+r3zUAZ/CvNWUGKPfuicGDbgtZgiQuFmNcV5F+Tgy24ep2nsAW2nFgvhGPJVqeBZa6KyVN0EyrBA=="], - "@radix-ui/react-slider": ["@radix-ui/react-slider@1.2.4", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Vr/OgNejNJPAghIhjS7Mf/2F/EXGDT0qgtiHf2BHz71+KqgN+jndFLKq5xAB9JOGejGzejfJLIvT04Do+yzhcg=="], + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2fTm6PSiUm8YPq9W0E4reYuv01EE3aFSzt8edBiXqPHshF8N9+Kymt/k0/R+F3dkY5lQyB/zPtrP82phskLi7w=="], + + "@radix-ui/react-slider": ["@radix-ui/react-slider@1.3.2", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oQnqfgSiYkxZ1MrF6672jw2/zZvpB+PJsrIc3Zm1zof1JHf/kj7WhmROw7JahLfOwYQ5/+Ip0rFORgF1tjSiaQ=="], "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], - "@radix-ui/react-switch": ["@radix-ui/react-switch@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zGP6W8plLeogoeGMiTHJ/uvf+TE1C2chVsEwfP8YlvpQKJHktG+iCkUtCLGPAuDV8/qDSmIRPm4NggaTxFMVBQ=="], + "@radix-ui/react-switch": ["@radix-ui/react-switch@1.2.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7Z8n6L+ifMIIYZ83f28qWSceUpkXuslI2FJ34+kDMTiyj91ENdpdQ7VCidrzj5JfwfZTeano/BnGBbu/jqa5rQ=="], - "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-fuHMHWSf5SRhXke+DbHXj2wVMo+ghVH30vhX3XVacdXqDl+J4XWafMIGOOER861QpBx1jxgwKXL2dQnfrsd8MQ=="], + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.9", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-KIjtwciYvquiW/wAFkELZCVnaNLBsYNhTNcvl+zfMAbMhRkcvNuCLXDDd22L0j7tagpzVh/QwbFpwAATg7ILPw=="], - "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0IWTbAUKvzdpOaWDMZisXZvScXzF0phaQjWspK8RUMEUxjLbli+886mB/kXTIC3F+t5vQ0n0vYn+dsX8s+WdfA=="], + "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ed2mlOmT+tktOsu2NZBK1bCSHh/uqULu1vWOkpQTVq53EoOuZUZw7FInQoDB3uil5wZc2oe0XN9a7uVZB7/6AQ=="], - "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Za5HHd9nvsiZ2t3EI/dVd4Bm/JydK+D22uHKk46fPtvuPxVCJBUo5mQybN+g5sZe35y7I6GDTTfdkVv5SnxlFg=="], + "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3SeJxKeO3TO1zVw1Nl++Cp0krYk6zHDHMCUXXVkosIzl6Nxcvb07EerQpyD2wXQSJ5RZajrYAmPaydU8Hk1IyQ=="], - "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-toggle": "1.1.3", "@radix-ui/react-use-controllable-state": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-khTzdGIxy8WurYUEUrapvj5aOev/tUA8TDEFi1D0Dn3yX+KR5AqjX0b7E5sL9ngRRpxDN2RRJdn5siasu5jtcg=="], + "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-toggle": "1.1.6", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-GRaPJhxrRSOqAcmcX3MwRL/SZACkoYdmoY9/sg7Bd5DhBYsB2t4co0NxTvVW8H7jUmieQDQwRtUlZ5Ta8UbgJA=="], - "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-separator": "1.1.3", "@radix-ui/react-toggle-group": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yTZ8ooxlBqljSiruO6y6azKXSXYBpnzd23yohjyFesun4nm8yh+D91J1yCqhtnRtSjRWuAmr9vFgGxmGwLjTfg=="], + "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-separator": "1.1.4", "@radix-ui/react-toggle-group": "1.1.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-cL/3snRskM0f955waP+m4Pmr8+QOPpPsfoY5kM06k7eWP41diOcyjLEqSxpd/K9S7fpsV66yq4R6yN2sMwXc6Q=="], - "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.0", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-b1Sdc75s7zN9B8ONQTGBSHL3XS8+IcjcOIY51fhM4R1Hx8s0YbgqgyNZiri4qcYMVZK8hfCZVBiyCm7N9rs0rw=="], + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-DyW8VVeeMSSLFvAmnVnCwvI3H+1tpJFHT50r+tdOoMse9XqYDBCcyux8u3G2y+LOpt7fPQ6KKH0mhs+ce1+Z5w=="], "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], - "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-YnEXIy8/ga01Y1PN0VfaNH//MhA91JlEGVBDxDzROqwrAtG5Yr2QGEPz8A/rJA3C7ZAHryOYGaUv8fLSW2H/mg=="], + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], + "@radix-ui/react-use-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.0", "", { "dependencies": { "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA=="], + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], @@ -355,7 +361,7 @@ "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], - "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oXSF3ZQRd5fvomd9hmUCb2EHSZbPp3ZSHAHJJU/DlF9XoFkJBBW8RHU/E8WEH+RbSfJd/QFA0sl8ClJXknBwHQ=="], + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.0", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-rQj0aAWOpCdCMRbI6pLQm8r7S2BM3YhTa0SzOYD55k+hJA8oo9J+H+9wLM9oMlZWOX/wJWPTzfDfmZkf7LvCfg=="], "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], @@ -411,19 +417,19 @@ "@tanstack/history": ["@tanstack/history@1.115.0", "", {}, "sha512-K7JJNrRVvyjAVnbXOH2XLRhFXDkeP54Kt2P4FR1Kl2KDGlIbkua5VqZQD2rot3qaDrpufyUa63nuLai1kOLTsQ=="], - "@tanstack/react-router": ["@tanstack/react-router@1.115.3", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "1.115.3", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-5mV9t0hW/gMdUeBabY+/lU3HuvGdaYUMDvlLpCG5dQJXBU0UzHwPAM2xy2UTte9Ty1tqxJqeA7DQoyNe/u5SEw=="], + "@tanstack/react-router": ["@tanstack/react-router@1.117.1", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "1.117.1", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-w4TwKzPZgUM9m+yCvaWa4dw0kVn15Cy9iZivkakQaYU2psqKE6q0OXUrIejRMThkerqK64OZeAKtPToyT8K9bA=="], - "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.115.3", "", { "dependencies": { "@tanstack/router-devtools-core": "^1.115.3", "solid-js": "^1.9.5" }, "peerDependencies": { "@tanstack/react-router": "^1.115.3", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-aAeS/Q4Dz5sOKlFK9jptU7ugfpmQcfEOlSI/bIifUugp2VVtKvyZIQ7k27YiTOMQpsmo/hifqxAhR/DSXm4dWw=="], + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.117.1", "", { "dependencies": { "@tanstack/router-devtools-core": "^1.117.1", "solid-js": "^1.9.5" }, "peerDependencies": { "@tanstack/react-router": "^1.117.1", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-kPrZzvumawTRPQjVBazAmZKdQcTRGnGwhN+amxwKiRwyiw7mjuW7rwkqtcwTT+ASPIh1mKKbvzoDQvE5IAgZ8g=="], "@tanstack/react-store": ["@tanstack/react-store@0.7.0", "", { "dependencies": { "@tanstack/store": "0.7.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng=="], - "@tanstack/router-core": ["@tanstack/router-core@1.115.3", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/store": "^0.7.0", "tiny-invariant": "^1.3.3" } }, "sha512-gynHs72LHVg05fuJTwZZYhDL4VNEAK0sXz7IqiBv7a3qsYeEmIZsGaFr9sVjTkuF1kbrFBdJd5JYutzBh9Uuhw=="], + "@tanstack/router-core": ["@tanstack/router-core@1.117.1", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/store": "^0.7.0", "tiny-invariant": "^1.3.3" } }, "sha512-z7njzO6yn8kwJP0fDh43mXuO/zlYs0cexjd0M+0RKf6W4mfMuPvFAiUeD4CZEk+kBLgZxtaJxBUkhpZCN8Zecw=="], - "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.115.3", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.115.3", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" }, "optionalPeers": ["csstype"] }, "sha512-VBdgw1qxeOD/6FlZ9gitrWPUKGW83CuAW31gf32E0dxL7sIXP+yEFyPlNsVlENan1oSaEuV8tjKkuq5s4MfaPw=="], + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.117.1", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.117.1", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" }, "optionalPeers": ["csstype"] }, "sha512-C4h6u8c2AkBShPv1OoKK3JEsrn2Quf2LFy7tH6aJFDxFa+JL1w37NDDxVC8/JEtF/8dQYV1Mmocvs78mpUVFXA=="], - "@tanstack/router-generator": ["@tanstack/router-generator@1.115.3", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.115.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.2" }, "peerDependencies": { "@tanstack/react-router": "^1.115.3" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-DnhC49ZtLRdEweUSEvVGVQtM/6Lpe8CqzRyqJGq4XSYodaoLhcOdICDVBuuwCBAJjMXAOH97rNxfL8PPPEvUJA=="], + "@tanstack/router-generator": ["@tanstack/router-generator@1.117.1", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.115.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.2" }, "peerDependencies": { "@tanstack/react-router": "^1.117.1" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-1V6Y8TibqnMpwizxchzJgE7FUhbSlAIvnrnUwmQhvFhMFtYOdvNkrdZzBD625fcTA/jLs9zUtSeWyiRMKTSPFQ=="], - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.115.3", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.115.3", "@tanstack/router-generator": "^1.115.3", "@tanstack/router-utils": "^1.115.0", "@tanstack/virtual-file-routes": "^1.115.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.115.3", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-lqX467nCZbXZgqvLGKkfDhw7TIBSU2aDvKycaaVncPenrl12yrFb1B/EPZzfyfMD7ztsCD+kJ1xhnUPoSxzw0g=="], + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.117.2", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.117.1", "@tanstack/router-generator": "^1.117.1", "@tanstack/router-utils": "^1.115.0", "@tanstack/virtual-file-routes": "^1.115.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.117.1", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-QgiFW4HVnxYbMz8AUg+IZdPBqZx7u02D4j71uw6q+aWEDU5qYLB0RzdtBRvvb2cB7ZSzXLGbtDqiMN5mHcww2w=="], "@tanstack/router-utils": ["@tanstack/router-utils@1.115.0", "", { "dependencies": { "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "ansis": "^3.11.0", "diff": "^7.0.0" } }, "sha512-Dng4y+uLR9b5zPGg7dHReHOTHQa6x+G6nCoZshsDtWrYsrdCcJEtLyhwZ5wG8OyYS6dVr/Cn+E5Bd2b6BhJ89w=="], @@ -451,27 +457,27 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/react": ["@types/react@19.1.1", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-ePapxDL7qrgqSF67s0h9m412d9DbXyC1n59O2st+9rjuuamWsZuD2w55rqY12CbzsZ7uVXb5Nw0gEp9Z8MMutQ=="], + "@types/react": ["@types/react@19.1.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw=="], "@types/react-dom": ["@types/react-dom@19.1.2", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.29.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.29.1", "@typescript-eslint/type-utils": "8.29.1", "@typescript-eslint/utils": "8.29.1", "@typescript-eslint/visitor-keys": "8.29.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.31.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.31.0", "@typescript-eslint/type-utils": "8.31.0", "@typescript-eslint/utils": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.29.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.29.1", "@typescript-eslint/types": "8.29.1", "@typescript-eslint/typescript-estree": "8.29.1", "@typescript-eslint/visitor-keys": "8.29.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.31.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.31.0", "@typescript-eslint/types": "8.31.0", "@typescript-eslint/typescript-estree": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.29.1", "", { "dependencies": { "@typescript-eslint/types": "8.29.1", "@typescript-eslint/visitor-keys": "8.29.1" } }, "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.31.0", "", { "dependencies": { "@typescript-eslint/types": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0" } }, "sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.29.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.29.1", "@typescript-eslint/utils": "8.29.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.31.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.31.0", "@typescript-eslint/utils": "8.31.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.29.1", "", {}, "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.31.0", "", {}, "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.29.1", "", { "dependencies": { "@typescript-eslint/types": "8.29.1", "@typescript-eslint/visitor-keys": "8.29.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.31.0", "", { "dependencies": { "@typescript-eslint/types": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.29.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.29.1", "@typescript-eslint/types": "8.29.1", "@typescript-eslint/typescript-estree": "8.29.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.31.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.31.0", "@typescript-eslint/types": "8.31.0", "@typescript-eslint/typescript-estree": "8.31.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.29.1", "", { "dependencies": { "@typescript-eslint/types": "8.29.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.31.0", "", { "dependencies": { "@typescript-eslint/types": "8.31.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ=="], - "@vitejs/plugin-react": ["@vitejs/plugin-react@4.3.4", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug=="], + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.4.1", "", { "dependencies": { "@babel/core": "^7.26.10", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w=="], "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], @@ -503,7 +509,7 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001713", "", {}, "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q=="], + "caniuse-lite": ["caniuse-lite@1.0.30001715", "", {}, "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -529,27 +535,27 @@ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], - "detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], "diff": ["diff@7.0.0", "", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="], - "effect": ["effect@3.14.8", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-cHV6Mc2gb1e6l+CxhCeZm1JOzE4C9Mp7MhqHNFuAcSds2c2f23ZAb1ef4gBRHMIcdJ5sr3KGm+Xn+4z/UByE8w=="], + "effect": ["effect@3.14.14", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-Dbt9MAZHqM1UAip41RrZnypzLa/hJJGHXIVS9MbgU0L+UoJTFXToWIwWmHY/OcaQVNlf/1YxpMrD3xtxoDP/qw=="], - "electron-to-chromium": ["electron-to-chromium@1.5.136", "", {}, "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ=="], + "electron-to-chromium": ["electron-to-chromium@1.5.143", "", {}, "sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g=="], - "esbuild": ["esbuild@0.25.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.2", "@esbuild/android-arm": "0.25.2", "@esbuild/android-arm64": "0.25.2", "@esbuild/android-x64": "0.25.2", "@esbuild/darwin-arm64": "0.25.2", "@esbuild/darwin-x64": "0.25.2", "@esbuild/freebsd-arm64": "0.25.2", "@esbuild/freebsd-x64": "0.25.2", "@esbuild/linux-arm": "0.25.2", "@esbuild/linux-arm64": "0.25.2", "@esbuild/linux-ia32": "0.25.2", "@esbuild/linux-loong64": "0.25.2", "@esbuild/linux-mips64el": "0.25.2", "@esbuild/linux-ppc64": "0.25.2", "@esbuild/linux-riscv64": "0.25.2", "@esbuild/linux-s390x": "0.25.2", "@esbuild/linux-x64": "0.25.2", "@esbuild/netbsd-arm64": "0.25.2", "@esbuild/netbsd-x64": "0.25.2", "@esbuild/openbsd-arm64": "0.25.2", "@esbuild/openbsd-x64": "0.25.2", "@esbuild/sunos-x64": "0.25.2", "@esbuild/win32-arm64": "0.25.2", "@esbuild/win32-ia32": "0.25.2", "@esbuild/win32-x64": "0.25.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ=="], + "esbuild": ["esbuild@0.25.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.3", "@esbuild/android-arm": "0.25.3", "@esbuild/android-arm64": "0.25.3", "@esbuild/android-x64": "0.25.3", "@esbuild/darwin-arm64": "0.25.3", "@esbuild/darwin-x64": "0.25.3", "@esbuild/freebsd-arm64": "0.25.3", "@esbuild/freebsd-x64": "0.25.3", "@esbuild/linux-arm": "0.25.3", "@esbuild/linux-arm64": "0.25.3", "@esbuild/linux-ia32": "0.25.3", "@esbuild/linux-loong64": "0.25.3", "@esbuild/linux-mips64el": "0.25.3", "@esbuild/linux-ppc64": "0.25.3", "@esbuild/linux-riscv64": "0.25.3", "@esbuild/linux-s390x": "0.25.3", "@esbuild/linux-x64": "0.25.3", "@esbuild/netbsd-arm64": "0.25.3", "@esbuild/netbsd-x64": "0.25.3", "@esbuild/openbsd-arm64": "0.25.3", "@esbuild/openbsd-x64": "0.25.3", "@esbuild/sunos-x64": "0.25.3", "@esbuild/win32-arm64": "0.25.3", "@esbuild/win32-ia32": "0.25.3", "@esbuild/win32-x64": "0.25.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.24.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.0", "@eslint/core": "^0.12.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.24.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ=="], + "eslint": ["eslint@9.25.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.25.1", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ=="], "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], - "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.19", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ=="], + "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.20", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA=="], "eslint-scope": ["eslint-scope@8.3.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ=="], @@ -577,6 +583,8 @@ "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + "fdir": ["fdir@6.4.4", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg=="], + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], @@ -647,7 +655,7 @@ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "lucide-react": ["lucide-react@0.487.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-aKqhOQ+YmFnwq8dWgGjOuLc8V1R9/c/yOd+zDY4+ohsR2Jo05lSGc3WsstYPIzcTpeosN7LoCkLReUUITvaIvw=="], + "lucide-react": ["lucide-react@0.503.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-HGGkdlPWQ0vTF8jJ5TdIqhQXZi6uh3LnNgfZ8MHiuxFfX3RZeA79r2MW2tHAZKlAVfoNE8esm3p+O6VkIvpj6w=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], @@ -675,7 +683,7 @@ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - "npm-check-updates": ["npm-check-updates@17.1.18", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-bkUy2g4v1i+3FeUf5fXMLbxmV95eG4/sS7lYE32GrUeVgQRfQEk39gpskksFunyaxQgTIdrvYbnuNbO/pSUSqw=="], + "npm-check-updates": ["npm-check-updates@18.0.1", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-MO7mLp/8nm6kZNLLyPgz4gHmr9tLoU+pWPLdXuGAx+oZydBHkHWN0ibTonsrfwC2WEQNIQxuZagYwB67JQpAuw=="], "npm-sort": ["npm-sort@0.0.4", "", { "bin": { "npm-sort": "./index.js" } }, "sha512-S5Id/3Jvr7Cf/QnWjRteprngERCBhhEFOM+wMhUrAYP060/HUBC1aL5GoXS3xITlgacJCWaSmP4HQaAt91nNYQ=="], @@ -707,13 +715,13 @@ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - "radix-ui": ["radix-ui@1.2.0", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-accessible-icon": "1.1.3", "@radix-ui/react-accordion": "1.2.4", "@radix-ui/react-alert-dialog": "1.1.7", "@radix-ui/react-aspect-ratio": "1.1.3", "@radix-ui/react-avatar": "1.1.4", "@radix-ui/react-checkbox": "1.1.5", "@radix-ui/react-collapsible": "1.1.4", "@radix-ui/react-collection": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.7", "@radix-ui/react-dialog": "1.1.7", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.6", "@radix-ui/react-dropdown-menu": "2.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.3", "@radix-ui/react-form": "0.1.3", "@radix-ui/react-hover-card": "1.1.7", "@radix-ui/react-label": "2.1.3", "@radix-ui/react-menu": "2.1.7", "@radix-ui/react-menubar": "1.1.7", "@radix-ui/react-navigation-menu": "1.2.6", "@radix-ui/react-popover": "1.1.7", "@radix-ui/react-popper": "1.2.3", "@radix-ui/react-portal": "1.1.5", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.0.3", "@radix-ui/react-progress": "1.1.3", "@radix-ui/react-radio-group": "1.2.4", "@radix-ui/react-roving-focus": "1.1.3", "@radix-ui/react-scroll-area": "1.2.4", "@radix-ui/react-select": "2.1.7", "@radix-ui/react-separator": "1.1.3", "@radix-ui/react-slider": "1.2.4", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-switch": "1.1.4", "@radix-ui/react-tabs": "1.1.4", "@radix-ui/react-toast": "1.2.7", "@radix-ui/react-toggle": "1.1.3", "@radix-ui/react-toggle-group": "1.1.3", "@radix-ui/react-toolbar": "1.1.3", "@radix-ui/react-tooltip": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-05auM88p3yNwAarx3JQGnRHbtzDNATbMx6/Qkr2gXg5QNLPUjdeduJvlhhVzlGxfUMBnwzYmydUIzAdrOz3J5w=="], + "radix-ui": ["radix-ui@1.3.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-accessible-icon": "1.1.4", "@radix-ui/react-accordion": "1.2.8", "@radix-ui/react-alert-dialog": "1.1.11", "@radix-ui/react-arrow": "1.1.4", "@radix-ui/react-aspect-ratio": "1.1.4", "@radix-ui/react-avatar": "1.1.7", "@radix-ui/react-checkbox": "1.2.3", "@radix-ui/react-collapsible": "1.1.8", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.12", "@radix-ui/react-dialog": "1.1.11", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-dropdown-menu": "2.1.12", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-form": "0.1.4", "@radix-ui/react-hover-card": "1.1.11", "@radix-ui/react-label": "2.1.4", "@radix-ui/react-menu": "2.1.12", "@radix-ui/react-menubar": "1.1.12", "@radix-ui/react-navigation-menu": "1.2.10", "@radix-ui/react-one-time-password-field": "0.1.4", "@radix-ui/react-popover": "1.1.11", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-progress": "1.1.4", "@radix-ui/react-radio-group": "1.3.4", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-scroll-area": "1.2.6", "@radix-ui/react-select": "2.2.2", "@radix-ui/react-separator": "1.1.4", "@radix-ui/react-slider": "1.3.2", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-switch": "1.2.2", "@radix-ui/react-tabs": "1.1.9", "@radix-ui/react-toast": "1.2.11", "@radix-ui/react-toggle": "1.1.6", "@radix-ui/react-toggle-group": "1.1.7", "@radix-ui/react-toolbar": "1.1.7", "@radix-ui/react-tooltip": "1.2.4", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-uHJD4yRGjxbEWhkVU+w9d8d+X6HUlmbesHGsE9tRWKX62FqDD3Z3hfEtVS9W+DpZAPvKSCLfz03O7un8xZT3pg=="], "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], - "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], + "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], "react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="], @@ -725,7 +733,7 @@ "reffuse": ["reffuse@workspace:packages/reffuse"], - "remeda": ["remeda@2.21.2", "", { "dependencies": { "type-fest": "^4.37.0" } }, "sha512-wdhkMDou8HRpD7RnxKJ/FHJWEGXRH7jV/pb0NsdLLSoBo+G9RjtxcY41hVhogLfEMkThk6aySKjs+Yd6PnpzBA=="], + "remeda": ["remeda@2.21.3", "", { "dependencies": { "type-fest": "^4.39.1" } }, "sha512-XXrZdLA10oEOQhLLzEJEiFFSKi21REGAkHdImIb4rt/XXy8ORGXh5HCcpUOsElfPNDb+X6TA/+wkh+p2KffYmg=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -761,6 +769,8 @@ "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], + "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], @@ -769,27 +779,27 @@ "tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="], - "turbo": ["turbo@2.5.0", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.0", "turbo-darwin-arm64": "2.5.0", "turbo-linux-64": "2.5.0", "turbo-linux-arm64": "2.5.0", "turbo-windows-64": "2.5.0", "turbo-windows-arm64": "2.5.0" }, "bin": { "turbo": "bin/turbo" } }, "sha512-PvSRruOsitjy6qdqwIIyolv99+fEn57gP6gn4zhsHTEcCYgXPhv6BAxzAjleS8XKpo+Y582vTTA9nuqYDmbRuA=="], + "turbo": ["turbo@2.5.2", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.2", "turbo-darwin-arm64": "2.5.2", "turbo-linux-64": "2.5.2", "turbo-linux-arm64": "2.5.2", "turbo-windows-64": "2.5.2", "turbo-windows-arm64": "2.5.2" }, "bin": { "turbo": "bin/turbo" } }, "sha512-Qo5lfuStr6LQh3sPQl7kIi243bGU4aHGDQJUf6ylAdGwks30jJFloc9NYHP7Y373+gGU9OS0faA4Mb5Sy8X9Xw=="], - "turbo-darwin-64": ["turbo-darwin-64@2.5.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fP1hhI9zY8hv0idym3hAaXdPi80TLovmGmgZFocVAykFtOxF+GlfIgM/l4iLAV9ObIO4SUXPVWHeBZQQ+Hpjag=="], + "turbo-darwin-64": ["turbo-darwin-64@2.5.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-2aIl0Sx230nLk+Cg2qSVxvPOBWCZpwKNuAMKoROTvWKif6VMpkWWiR9XEPoz7sHeLmCOed4GYGMjL1bqAiIS/g=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-p9sYq7kXH7qeJwIQE86cOWv/xNqvow846l6c/qWc26Ib1ci5W7V0sI5thsrP3eH+VA0d+SHalTKg5SQXgNQBWA=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MrFYhK/jYu8N6QlqZtqSHi3e4QVxlzqU3ANHTKn3/tThuwTLbNHEvzBPWSj5W7nZcM58dCqi6gYrfRz6bJZyAA=="], - "turbo-linux-64": ["turbo-linux-64@2.5.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1iEln2GWiF3iPPPS1HQJT6ZCFXynJPd89gs9SkggH2EJsj3eRUSVMmMC8y6d7bBbhBFsiGGazwFIYrI12zs6uQ=="], + "turbo-linux-64": ["turbo-linux-64@2.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-LxNqUE2HmAJQ/8deoLgMUDzKxd5bKxqH0UBogWa+DF+JcXhtze3UTMr6lEr0dEofdsEUYK1zg8FRjglmwlN5YA=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.5.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-bKBcbvuQHmsX116KcxHJuAcppiiBOfivOObh2O5aXNER6mce7YDDQJy00xQQNp1DhEfcSV2uOsvb3O3nN2cbcA=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-0MI1Ao1q8zhd+UUbIEsrM+yLq1BsrcJQRGZkxIsHFlGp7WQQH1oR3laBgfnUCNdCotCMD6w4moc9pUbXdOR3bg=="], - "turbo-windows-64": ["turbo-windows-64@2.5.0", "", { "os": "win32", "cpu": "x64" }, "sha512-9BCo8oQ7BO7J0K913Czbc3tw8QwLqn2nTe4E47k6aVYkM12ASTScweXPTuaPFP5iYXAT6z5Dsniw704Ixa5eGg=="], + "turbo-windows-64": ["turbo-windows-64@2.5.2", "", { "os": "win32", "cpu": "x64" }, "sha512-hOLcbgZzE5ttACHHyc1ajmWYq4zKT42IC3G6XqgiXxMbS+4eyVYTL+7UvCZBd3Kca1u4TLQdLQjeO76zyDJc2A=="], - "turbo-windows-arm64": ["turbo-windows-arm64@2.5.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-OUHCV+ueXa3UzfZ4co/ueIHgeq9B2K48pZwIxKSm5VaLVuv8M13MhM7unukW09g++dpdrrE1w4IOVgxKZ0/exg=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.5.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-fMU41ABhSLa18H8V3Z7BMCGynQ8x+wj9WyBMvWm1jeyRKgkvUYJsO2vkIsy8m0vrwnIeVXKOIn6eSe1ddlBVqw=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@4.39.1", "", {}, "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w=="], + "type-fest": ["type-fest@4.40.1", "", {}, "sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA=="], "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], - "typescript-eslint": ["typescript-eslint@8.29.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.29.1", "@typescript-eslint/parser": "8.29.1", "@typescript-eslint/utils": "8.29.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w=="], + "typescript-eslint": ["typescript-eslint@8.31.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.31.0", "@typescript-eslint/parser": "8.31.0", "@typescript-eslint/utils": "8.31.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-u+93F0sB0An8WEAPtwxVhFby573E8ckdjwUUQUj9QA4v8JAvgtoDdIyYR3XFwFHq2W1KJ1AurwJCO+w+Y1ixyQ=="], "unplugin": ["unplugin@2.3.2", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w=="], @@ -803,7 +813,7 @@ "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], - "vite": ["vite@6.2.6", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw=="], + "vite": ["vite@6.3.3", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], @@ -815,7 +825,7 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], + "zod": ["zod@3.24.3", "", {}, "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg=="], "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], @@ -823,8 +833,6 @@ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="], - "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], diff --git a/package.json b/package.json index d63fe62..8e3e2de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/monorepo", - "packageManager": "bun@1.2.9", + "packageManager": "bun@1.2.10", "private": true, "workspaces": [ "./packages/*" @@ -15,9 +15,9 @@ "clean:node": "rm -rf node_modules" }, "devDependencies": { - "npm-check-updates": "^17.1.18", + "npm-check-updates": "^18.0.1", "npm-sort": "^0.0.4", - "turbo": "^2.5.0", + "turbo": "^2.5.2", "typescript": "^5.8.3" } } diff --git a/packages/example/package.json b/packages/example/package.json index 47054ba..983cce2 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -11,41 +11,41 @@ "preview": "vite preview" }, "devDependencies": { - "@eslint/js": "^9.24.0", - "@tanstack/react-router": "^1.115.3", - "@tanstack/react-router-devtools": "^1.115.3", - "@tanstack/router-plugin": "^1.115.3", + "@eslint/js": "^9.25.1", + "@tanstack/react-router": "^1.117.1", + "@tanstack/react-router-devtools": "^1.117.1", + "@tanstack/router-plugin": "^1.117.2", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.1.1", + "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", - "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.24.0", + "@vitejs/plugin-react": "^4.4.1", + "eslint": "^9.25.1", "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.19", + "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.0.0", "react": "^19.1.0", "react-dom": "^19.1.0", - "typescript-eslint": "^8.29.1", - "vite": "^6.2.6" + "typescript-eslint": "^8.31.0", + "vite": "^6.3.3" }, "dependencies": { - "@effect/platform": "^0.80.8", - "@effect/platform-browser": "^0.59.8", + "@effect/platform": "^0.80.14", + "@effect/platform-browser": "^0.60.5", "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", "@typed/async-data": "^0.13.1", "@typed/id": "^0.17.2", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.14.8", - "lucide-react": "^0.487.0", + "effect": "^3.14.14", + "lucide-react": "^0.503.0", "mobx": "^6.13.7", "reffuse": "workspace:*" }, "overrides": { - "effect": "^3.14.8", - "@effect/platform": "^0.80.8", - "@effect/platform-browser": "^0.59.8", + "effect": "^3.14.14", + "@effect/platform": "^0.80.14", + "@effect/platform-browser": "^0.60.5", "@typed/lazy-ref": "^0.3.3", "@typed/async-data": "^0.13.1" } -- 2.49.1 From ff5503cfd153e42a2cd22eea229961301ba0fceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 29 Apr 2025 19:47:09 +0200 Subject: [PATCH 249/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index c4e2b21..d052aac 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -380,10 +380,10 @@ export abstract class ReffuseNamespace { useRef( this: ReffuseNamespace, - value: A, + initialValue: A, ): SubscriptionRef.SubscriptionRef { return this.useMemo( - () => SubscriptionRef.make(value), + () => SubscriptionRef.make(initialValue), [], { doNotReExecuteOnRuntimeOrContextChange: true }, // Do not recreate the ref when the context changes ) -- 2.49.1 From da7044ee9fd7d983ecbd7f4891442b59d11eb864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 30 Apr 2025 13:33:21 +0200 Subject: [PATCH 250/326] useRefFromValue --- packages/reffuse/src/ReffuseNamespace.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index d052aac..58e3ed2 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -389,6 +389,15 @@ export abstract class ReffuseNamespace { ) } + useRefFromValue( + this: ReffuseNamespace, + value: A, + ): SubscriptionRef.SubscriptionRef { + const ref = this.useRef(value) + this.useEffect(() => Ref.set(ref, value), [value]) + return ref + } + useSubRef, R>( this: ReffuseNamespace, parent: SubscriptionRef.SubscriptionRef, -- 2.49.1 From 43a3793dbf14567fce55f8c3c370dc06f1de0cf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 30 Apr 2025 16:27:08 +0200 Subject: [PATCH 251/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 58e3ed2..5a78367 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -389,12 +389,12 @@ export abstract class ReffuseNamespace { ) } - useRefFromValue( + useRefFromReactiveValue( this: ReffuseNamespace, value: A, ): SubscriptionRef.SubscriptionRef { const ref = this.useRef(value) - this.useEffect(() => Ref.set(ref, value), [value]) + this.useEffect(() => Ref.set(ref, value), [value], { doNotReExecuteOnRuntimeOrContextChange: true }) return ref } -- 2.49.1 From 3980c107479a295f06a74feeb6497ce86cf45e0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 30 Apr 2025 21:41:58 +0200 Subject: [PATCH 252/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 5a78367..e1890bb 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -378,12 +378,15 @@ export abstract class ReffuseNamespace { ]) } - useRef( + useRef( this: ReffuseNamespace, - initialValue: A, + initialValue: () => A | Effect.Effect, ): SubscriptionRef.SubscriptionRef { return this.useMemo( - () => SubscriptionRef.make(initialValue), + () => pipe(initialValue(), + v => Effect.isEffect(v) ? v : Effect.succeed(v), + Effect.flatMap(SubscriptionRef.make), + ), [], { doNotReExecuteOnRuntimeOrContextChange: true }, // Do not recreate the ref when the context changes ) @@ -393,7 +396,7 @@ export abstract class ReffuseNamespace { this: ReffuseNamespace, value: A, ): SubscriptionRef.SubscriptionRef { - const ref = this.useRef(value) + const ref = this.useRef(() => value) this.useEffect(() => Ref.set(ref, value), [value], { doNotReExecuteOnRuntimeOrContextChange: true }) return ref } -- 2.49.1 From dce81be2691ea7003d798488c67c38a688ef786a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 30 Apr 2025 22:52:38 +0200 Subject: [PATCH 253/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index e1890bb..6d994ae 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -380,13 +380,10 @@ export abstract class ReffuseNamespace { useRef( this: ReffuseNamespace, - initialValue: () => A | Effect.Effect, + initialValue: () => Effect.Effect, ): SubscriptionRef.SubscriptionRef { return this.useMemo( - () => pipe(initialValue(), - v => Effect.isEffect(v) ? v : Effect.succeed(v), - Effect.flatMap(SubscriptionRef.make), - ), + () => Effect.flatMap(initialValue(), SubscriptionRef.make), [], { doNotReExecuteOnRuntimeOrContextChange: true }, // Do not recreate the ref when the context changes ) @@ -396,7 +393,7 @@ export abstract class ReffuseNamespace { this: ReffuseNamespace, value: A, ): SubscriptionRef.SubscriptionRef { - const ref = this.useRef(() => value) + const ref = this.useRef(() => Effect.succeed(value)) this.useEffect(() => Ref.set(ref, value), [value], { doNotReExecuteOnRuntimeOrContextChange: true }) return ref } -- 2.49.1 From db3cd0585126497ee68726bafd6af82c2cf5df4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 30 Apr 2025 23:00:37 +0200 Subject: [PATCH 254/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 6d994ae..c17b3d2 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -464,7 +464,7 @@ export abstract class ReffuseNamespace { return [reactStateValue, setValue] } - useStreamFromValues( + useStreamFromReactiveValues( this: ReffuseNamespace, values: A, ): Stream.Stream { -- 2.49.1 From ba993098770c68158484349b62f8e81d5e83fb3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 30 Apr 2025 23:41:03 +0200 Subject: [PATCH 255/326] useSubscribePullStream --- packages/reffuse/src/ReffuseNamespace.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index c17b3d2..0066cfb 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -492,6 +492,21 @@ export abstract class ReffuseNamespace { return reactStateValue as InitialA extends A ? Option.Some : Option.Option } + useSubscribePullStream( + this: ReffuseNamespace, + stream: Stream.Stream, + initialValue?: InitialA, + ): [latest: InitialA extends A ? Option.Some : Option.Option, pull: () => void] { + const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) + + this.useFork(() => Stream.runForEach( + Stream.changesWith(stream, (x, y) => x === y), + v => Effect.sync(() => setReactStateValue(Option.some(v))), + ), [stream]) + + return reactStateValue as InitialA extends A ? Option.Some : Option.Option + } + SubRef, R>( this: ReffuseNamespace, -- 2.49.1 From 3c604abcefa84cc21cf7d7dff2a78a36e637a107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 1 May 2025 03:01:18 +0200 Subject: [PATCH 256/326] useScope --- packages/reffuse/src/ReffuseNamespace.ts | 60 ++++++++++++++++++------ 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 0066cfb..e4f348e 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -88,6 +88,39 @@ export abstract class ReffuseNamespace { ), [runtime, context]) } + useScope( + this: ReffuseNamespace, + deps: React.DependencyList = [], + options?: ScopeOptions, + ): Scope.Scope { + const runSync = this.useRunSync() + + const [isInitialRun, initialScope] = React.useMemo(() => runSync(Effect.all([ + Ref.make(true), + Scope.make(options?.finalizerExecutionStrategy), + ])), []) + + const [scope, setScope] = React.useState(initialScope) + + React.useEffect(() => isInitialRun.pipe( + Effect.if({ + onTrue: () => Effect.as( + Ref.set(isInitialRun, false), + () => runSync(Scope.close(initialScope, Exit.void)), + ), + + onFalse: () => Scope.make(options?.finalizerExecutionStrategy).pipe( + Effect.tap(v => Effect.sync(() => setScope(v))), + Effect.map(v => () => runSync(Scope.close(v, Exit.void))), + ), + }), + + runSync, + ), [runSync, ...deps]) + + return scope + } + /** * Reffuse equivalent to `React.useMemo`. * @@ -119,11 +152,10 @@ export abstract class ReffuseNamespace { ): A { const runSync = this.useRunSync() - const [isInitialRun, initialScope, initialValue] = React.useMemo(() => Effect.Do.pipe( + const { isInitialRun, initialScope, initialValue } = React.useMemo(() => Effect.Do.pipe( Effect.bind("isInitialRun", () => Ref.make(true)), - Effect.bind("scope", () => Scope.make(options?.finalizerExecutionStrategy)), - Effect.bind("value", ({ scope }) => Effect.provideService(effect(), Scope.Scope, scope)), - Effect.map(({ isInitialRun, scope, value }) => [isInitialRun, scope, value] as const), + Effect.bind("initialScope", () => Scope.make(options?.finalizerExecutionStrategy)), + Effect.bind("initialValue", ({ initialScope }) => Effect.provideService(effect(), Scope.Scope, initialScope)), runSync, ), []) @@ -131,10 +163,9 @@ export abstract class ReffuseNamespace { React.useEffect(() => isInitialRun.pipe( Effect.if({ - onTrue: () => Ref.set(isInitialRun, false).pipe( - Effect.map(() => - () => runSync(Scope.close(initialScope, Exit.void)) - ) + onTrue: () => Effect.as( + Ref.set(isInitialRun, false), + () => runSync(Scope.close(initialScope, Exit.void)), ), onFalse: () => Effect.Do.pipe( @@ -492,17 +523,16 @@ export abstract class ReffuseNamespace { return reactStateValue as InitialA extends A ? Option.Some : Option.Option } - useSubscribePullStream( + usePullStream( this: ReffuseNamespace, stream: Stream.Stream, initialValue?: InitialA, - ): [latest: InitialA extends A ? Option.Some : Option.Option, pull: () => void] { + ): [ + latestValue: InitialA extends A ? Option.Some : Option.Option, + pull: () => void, + ] { const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) - - this.useFork(() => Stream.runForEach( - Stream.changesWith(stream, (x, y) => x === y), - v => Effect.sync(() => setReactStateValue(Option.some(v))), - ), [stream]) + const pull = this.useMemo(() => Stream.toPull(stream), [stream]) return reactStateValue as InitialA extends A ? Option.Some : Option.Option } -- 2.49.1 From d5ac84b2cc532ee5169d166a6a5f1e1d8b3203f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 1 May 2025 16:17:01 +0200 Subject: [PATCH 257/326] Fix --- packages/example/src/routes/count.tsx | 4 ++-- packages/example/src/routes/query/service.tsx | 2 +- .../example/src/routes/query/usequery.tsx | 2 +- packages/example/src/routes/tests.tsx | 6 ++--- packages/example/src/todos/views/VTodos.tsx | 2 +- packages/reffuse/src/ReffuseNamespace.ts | 24 +++++++++---------- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/example/src/routes/count.tsx b/packages/example/src/routes/count.tsx index 77aedc7..38da28a 100644 --- a/packages/example/src/routes/count.tsx +++ b/packages/example/src/routes/count.tsx @@ -1,6 +1,6 @@ import { R } from "@/reffuse" import { createFileRoute } from "@tanstack/react-router" -import { Ref } from "effect" +import { Effect, Ref } from "effect" export const Route = createFileRoute("/count")({ @@ -11,7 +11,7 @@ function Count() { const runSync = R.useRunSync() - const countRef = R.useRef(0) + const countRef = R.useRef(() => Effect.succeed(0)) const [count] = R.useRefState(countRef) diff --git a/packages/example/src/routes/query/service.tsx b/packages/example/src/routes/query/service.tsx index 6a926a8..8211667 100644 --- a/packages/example/src/routes/query/service.tsx +++ b/packages/example/src/routes/query/service.tsx @@ -14,7 +14,7 @@ export const Route = createFileRoute("/query/service")({ function RouteComponent() { const query = R.useQuery({ - key: R.useStreamFromValues(["uuid4", 10 as number]), + key: R.useStreamFromReactiveValues(["uuid4", 10 as number]), query: ([, count]) => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), diff --git a/packages/example/src/routes/query/usequery.tsx b/packages/example/src/routes/query/usequery.tsx index 535c25b..4782a49 100644 --- a/packages/example/src/routes/query/usequery.tsx +++ b/packages/example/src/routes/query/usequery.tsx @@ -20,7 +20,7 @@ function RouteComponent() { const [count, setCount] = useState(1) const query = R.useQuery({ - key: R.useStreamFromValues(["uuid4", count]), + key: R.useStreamFromReactiveValues(["uuid4", count]), query: ([, count]) => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 440c904..3ee0fe9 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -10,7 +10,7 @@ export const Route = createFileRoute("/tests")({ }) function RouteComponent() { - const deepRef = R.useRef({ value: "poulet" }) + const deepRef = R.useRef(() => Effect.succeed({ value: "poulet" })) const deepValueRef = R.useSubRef(deepRef, ["value"]) // const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( @@ -25,8 +25,8 @@ function RouteComponent() { ), []) - const uuidRef = R.useRef("none") - const anotherRef = R.useRef(69) + const uuidRef = R.useRef(() => Effect.succeed("none")) + const anotherRef = R.useRef(() => Effect.succeed(69)) const logValue = R.useCallbackSync(Effect.fn(function*(value: string) { diff --git a/packages/example/src/todos/views/VTodos.tsx b/packages/example/src/todos/views/VTodos.tsx index 27229aa..013fa3e 100644 --- a/packages/example/src/todos/views/VTodos.tsx +++ b/packages/example/src/todos/views/VTodos.tsx @@ -16,7 +16,7 @@ export function VTodos() { ), []) const todosRef = R.useMemo(() => TodosState.TodosState.pipe(Effect.map(state => state.todos)), []) - const [todos] = R.useRefState(todosRef) + const [todos] = R.useSubscribeRefs(todosRef) return ( diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index e4f348e..5acbb3f 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -523,19 +523,19 @@ export abstract class ReffuseNamespace { return reactStateValue as InitialA extends A ? Option.Some : Option.Option } - usePullStream( - this: ReffuseNamespace, - stream: Stream.Stream, - initialValue?: InitialA, - ): [ - latestValue: InitialA extends A ? Option.Some : Option.Option, - pull: () => void, - ] { - const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) - const pull = this.useMemo(() => Stream.toPull(stream), [stream]) + // usePullStream( + // this: ReffuseNamespace, + // stream: Stream.Stream, + // initialValue?: InitialA, + // ): [ + // latestValue: InitialA extends A ? Option.Some : Option.Option, + // pull: () => void, + // ] { + // const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) + // const pull = this.useMemo(() => Stream.toPull(stream), [stream]) - return reactStateValue as InitialA extends A ? Option.Some : Option.Option - } + // return reactStateValue as InitialA extends A ? Option.Some : Option.Option + // } SubRef, R>( -- 2.49.1 From aa6c4a8008e77de8c225ae540d16ab0d5e58e6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 1 May 2025 16:19:42 +0200 Subject: [PATCH 258/326] Fix --- packages/example/src/routes/count.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/example/src/routes/count.tsx b/packages/example/src/routes/count.tsx index 38da28a..ab6d802 100644 --- a/packages/example/src/routes/count.tsx +++ b/packages/example/src/routes/count.tsx @@ -12,13 +12,12 @@ function Count() { const runSync = R.useRunSync() const countRef = R.useRef(() => Effect.succeed(0)) - const [count] = R.useRefState(countRef) + const [count] = R.useSubscribeRefs(countRef) return (
- {/*
-- 2.49.1 From 1902ad373f8df49787737724361401f76a50a055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 1 May 2025 16:48:37 +0200 Subject: [PATCH 259/326] useScope tests --- packages/example/src/routes/tests.tsx | 51 ++++++--------------------- 1 file changed, 10 insertions(+), 41 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 3ee0fe9..be24b3e 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -1,8 +1,8 @@ import { R } from "@/reffuse" -import { Button, Flex, Text } from "@radix-ui/themes" +import { Flex } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" -import { GetRandomValues, makeUuid4 } from "@typed/id" -import { Console, Effect, Ref } from "effect" +import { Console, Effect, Scope } from "effect" +import { useEffect } from "react" export const Route = createFileRoute("/tests")({ @@ -10,48 +10,17 @@ export const Route = createFileRoute("/tests")({ }) function RouteComponent() { - const deepRef = R.useRef(() => Effect.succeed({ value: "poulet" })) - const deepValueRef = R.useSubRef(deepRef, ["value"]) - - // const value = R.useMemoScoped(Effect.addFinalizer(() => Console.log("cleanup")).pipe( - // Effect.andThen(makeUuid4), - // Effect.provide(GetRandomValues.CryptoRandom), - // ), []) - // console.log(value) - - R.useFork(() => Effect.addFinalizer(() => Console.log("cleanup")).pipe( - Effect.andThen(Console.log("ouient")), - Effect.delay("1 second"), - ), []) - - - const uuidRef = R.useRef(() => Effect.succeed("none")) - const anotherRef = R.useRef(() => Effect.succeed(69)) - - - const logValue = R.useCallbackSync(Effect.fn(function*(value: string) { - yield* Effect.log(value) - }), []) - - const generateUuid = R.useCallbackSync(() => makeUuid4.pipe( - Effect.provide(GetRandomValues.CryptoRandom), - Effect.tap(v => Ref.set(uuidRef, v)), - Effect.tap(v => Ref.set(deepValueRef, v)), - ), []) + const runSync = R.useRunSync() + const componentScope = R.useScope() + useEffect(() => Effect.addFinalizer(() => Console.log("Component scope cleanup!")).pipe( + Effect.andThen(Console.log("Component mounted")), + Effect.provideService(Scope.Scope, componentScope), + runSync, + ), [componentScope, runSync]) return ( - - {(uuid, anotherRef) => {uuid} / {anotherRef}} - - - - {(deep, deepValue) => {JSON.stringify(deep)} / {deepValue}} - - - - ) } -- 2.49.1 From 24853561f186b6f51f17ce8ea23bcd54b3938c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 1 May 2025 17:10:45 +0200 Subject: [PATCH 260/326] Working useScope --- packages/example/src/routes/tests.tsx | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index be24b3e..9b859ea 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -1,8 +1,12 @@ import { R } from "@/reffuse" -import { Flex } from "@radix-ui/themes" +import { Button, Flex } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" +import { GetRandomValues, makeUuid4 } from "@typed/id" import { Console, Effect, Scope } from "effect" -import { useEffect } from "react" +import { useEffect, useState } from "react" + + +const makeUuid = Effect.provide(makeUuid4, GetRandomValues.CryptoRandom) export const Route = createFileRoute("/tests")({ @@ -11,16 +15,23 @@ export const Route = createFileRoute("/tests")({ function RouteComponent() { const runSync = R.useRunSync() - const componentScope = R.useScope() - useEffect(() => Effect.addFinalizer(() => Console.log("Component scope cleanup!")).pipe( - Effect.andThen(Console.log("Component mounted")), - Effect.provideService(Scope.Scope, componentScope), + const [uuid, setUuid] = useState(R.useMemo(() => makeUuid, [])) + const generateUuid = R.useCallbackSync(() => makeUuid.pipe( + Effect.tap(v => Effect.sync(() => setUuid(v))) + ), []) + + const scope = R.useScope([uuid]) + + useEffect(() => Effect.addFinalizer(() => Console.log("Scope cleanup!")).pipe( + Effect.andThen(Console.log("Scope changed")), + Effect.provideService(Scope.Scope, scope), runSync, - ), [componentScope, runSync]) + ), [scope, runSync]) return ( + ) } -- 2.49.1 From 87d27dd48ddaa8d9581795489aa174f0dcf2892c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 1 May 2025 19:18:54 +0200 Subject: [PATCH 261/326] useScope work --- packages/reffuse/src/ReffuseNamespace.ts | 72 ++++++++---------------- 1 file changed, 22 insertions(+), 50 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 5acbb3f..54e22f4 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -1,4 +1,4 @@ -import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, Option, pipe, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, Match, Option, pipe, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -14,6 +14,10 @@ export interface ScopeOptions { readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy } +export interface UseScopeOptions extends ScopeOptions { + readonly finalizerExecutionMode?: "sync" | "fork" +} + export type RefsA[]> = { [K in keyof T]: Effect.Effect.Success } @@ -91,9 +95,10 @@ export abstract class ReffuseNamespace { useScope( this: ReffuseNamespace, deps: React.DependencyList = [], - options?: ScopeOptions, + options?: UseScopeOptions, ): Scope.Scope { const runSync = this.useRunSync() + const runFork = this.useRunFork() const [isInitialRun, initialScope] = React.useMemo(() => runSync(Effect.all([ Ref.make(true), @@ -106,17 +111,29 @@ export abstract class ReffuseNamespace { Effect.if({ onTrue: () => Effect.as( Ref.set(isInitialRun, false), - () => runSync(Scope.close(initialScope, Exit.void)), + () => Scope.close(initialScope, Exit.void).pipe( + effect => Match.value(options?.finalizerExecutionMode ?? "sync").pipe( + Match.when("sync", () => { runSync(effect) }), + Match.when("fork", () => { runFork(effect) }), + Match.exhaustive, + ) + ), ), onFalse: () => Scope.make(options?.finalizerExecutionStrategy).pipe( Effect.tap(v => Effect.sync(() => setScope(v))), - Effect.map(v => () => runSync(Scope.close(v, Exit.void))), + Effect.map(v => () => Scope.close(v, Exit.void).pipe( + effect => Match.value(options?.finalizerExecutionMode ?? "sync").pipe( + Match.when("sync", () => { runSync(effect) }), + Match.when("fork", () => { runFork(effect) }), + Match.exhaustive, + ) + )), ), }), runSync, - ), [runSync, ...deps]) + ), [runSync, runFork, ...deps]) return scope } @@ -144,51 +161,6 @@ export abstract class ReffuseNamespace { ]) } - useMemoScoped( - this: ReffuseNamespace, - effect: () => Effect.Effect, - deps: React.DependencyList, - options?: RenderOptions & ScopeOptions, - ): A { - const runSync = this.useRunSync() - - const { isInitialRun, initialScope, initialValue } = React.useMemo(() => Effect.Do.pipe( - Effect.bind("isInitialRun", () => Ref.make(true)), - Effect.bind("initialScope", () => Scope.make(options?.finalizerExecutionStrategy)), - Effect.bind("initialValue", ({ initialScope }) => Effect.provideService(effect(), Scope.Scope, initialScope)), - runSync, - ), []) - - const [value, setValue] = React.useState(initialValue) - - React.useEffect(() => isInitialRun.pipe( - Effect.if({ - onTrue: () => Effect.as( - Ref.set(isInitialRun, false), - () => runSync(Scope.close(initialScope, Exit.void)), - ), - - onFalse: () => Effect.Do.pipe( - Effect.bind("scope", () => Scope.make(options?.finalizerExecutionStrategy)), - Effect.bind("value", ({ scope }) => Effect.provideService(effect(), Scope.Scope, scope)), - Effect.tap(({ value }) => - Effect.sync(() => setValue(value)) - ), - Effect.map(({ scope }) => - () => runSync(Scope.close(scope, Exit.void)) - ), - ), - }), - - runSync, - ), [ - ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync], - ...deps, - ]) - - return value - } - /** * Reffuse equivalent to `React.useEffect`. * -- 2.49.1 From 284a080f19508006c876fda8a023f15f0b766153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 1 May 2025 20:27:11 +0200 Subject: [PATCH 262/326] usePullStream --- packages/reffuse/src/ReffuseNamespace.ts | 41 ++++++++++++++++-------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 54e22f4..081d88e 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -1,4 +1,4 @@ -import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, Match, Option, pipe, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { Chunk, type Context, Effect, ExecutionStrategy, Exit, type Fiber, flow, type Layer, Match, Option, pipe, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -495,19 +495,34 @@ export abstract class ReffuseNamespace { return reactStateValue as InitialA extends A ? Option.Some
: Option.Option } - // usePullStream( - // this: ReffuseNamespace, - // stream: Stream.Stream, - // initialValue?: InitialA, - // ): [ - // latestValue: InitialA extends A ? Option.Some : Option.Option, - // pull: () => void, - // ] { - // const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) - // const pull = this.useMemo(() => Stream.toPull(stream), [stream]) + usePullStream( + this: ReffuseNamespace, + stream: Stream.Stream, + initialValue?: InitialA, + ): [ + latestValue: InitialA extends A ? Option.Some : Option.Option, + pull: Effect.Effect, Option.Option, R>, + ] { + const scope = this.useScope([stream]) - // return reactStateValue as InitialA extends A ? Option.Some : Option.Option - // } + const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) + const pull = this.useMemo(() => Stream.toPull(stream).pipe( + Effect.map(Effect.tap(flow( + Chunk.last, + v => Option.match(v, { + onSome: () => Effect.sync(() => setReactStateValue(v)), + onNone: () => Effect.void, + }), + ))), + + Effect.provideService(Scope.Scope, scope), + ), [stream, scope]) + + return [ + reactStateValue as InitialA extends A ? Option.Some : Option.Option, + pull, + ] + } SubRef, R>( -- 2.49.1 From c34629e20dd2649907a15eb25e6974cf4e554626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 1 May 2025 21:08:52 +0200 Subject: [PATCH 263/326] usePullStream --- packages/example/src/routeTree.gen.ts | 28 ++++++++++++++++++- packages/example/src/routes/streams/pull.tsx | 14 ++++++++++ packages/reffuse/src/ReffuseNamespace.ts | 29 ++++++++++++-------- 3 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 packages/example/src/routes/streams/pull.tsx diff --git a/packages/example/src/routeTree.gen.ts b/packages/example/src/routeTree.gen.ts index 7080a30..2d2bd51 100644 --- a/packages/example/src/routeTree.gen.ts +++ b/packages/example/src/routeTree.gen.ts @@ -19,6 +19,7 @@ import { Route as LazyrefImport } from './routes/lazyref' import { Route as CountImport } from './routes/count' import { Route as BlankImport } from './routes/blank' import { Route as IndexImport } from './routes/index' +import { Route as StreamsPullImport } from './routes/streams/pull' import { Route as QueryUsequeryImport } from './routes/query/usequery' import { Route as QueryUsemutationImport } from './routes/query/usemutation' import { Route as QueryServiceImport } from './routes/query/service' @@ -73,6 +74,12 @@ const IndexRoute = IndexImport.update({ getParentRoute: () => rootRoute, } as any) +const StreamsPullRoute = StreamsPullImport.update({ + id: '/streams/pull', + path: '/streams/pull', + getParentRoute: () => rootRoute, +} as any) + const QueryUsequeryRoute = QueryUsequeryImport.update({ id: '/query/usequery', path: '/query/usequery', @@ -172,6 +179,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof QueryUsequeryImport parentRoute: typeof rootRoute } + '/streams/pull': { + id: '/streams/pull' + path: '/streams/pull' + fullPath: '/streams/pull' + preLoaderRoute: typeof StreamsPullImport + parentRoute: typeof rootRoute + } } } @@ -189,6 +203,7 @@ export interface FileRoutesByFullPath { '/query/service': typeof QueryServiceRoute '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute + '/streams/pull': typeof StreamsPullRoute } export interface FileRoutesByTo { @@ -203,6 +218,7 @@ export interface FileRoutesByTo { '/query/service': typeof QueryServiceRoute '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute + '/streams/pull': typeof StreamsPullRoute } export interface FileRoutesById { @@ -218,6 +234,7 @@ export interface FileRoutesById { '/query/service': typeof QueryServiceRoute '/query/usemutation': typeof QueryUsemutationRoute '/query/usequery': typeof QueryUsequeryRoute + '/streams/pull': typeof StreamsPullRoute } export interface FileRouteTypes { @@ -234,6 +251,7 @@ export interface FileRouteTypes { | '/query/service' | '/query/usemutation' | '/query/usequery' + | '/streams/pull' fileRoutesByTo: FileRoutesByTo to: | '/' @@ -247,6 +265,7 @@ export interface FileRouteTypes { | '/query/service' | '/query/usemutation' | '/query/usequery' + | '/streams/pull' id: | '__root__' | '/' @@ -260,6 +279,7 @@ export interface FileRouteTypes { | '/query/service' | '/query/usemutation' | '/query/usequery' + | '/streams/pull' fileRoutesById: FileRoutesById } @@ -275,6 +295,7 @@ export interface RootRouteChildren { QueryServiceRoute: typeof QueryServiceRoute QueryUsemutationRoute: typeof QueryUsemutationRoute QueryUsequeryRoute: typeof QueryUsequeryRoute + StreamsPullRoute: typeof StreamsPullRoute } const rootRouteChildren: RootRouteChildren = { @@ -289,6 +310,7 @@ const rootRouteChildren: RootRouteChildren = { QueryServiceRoute: QueryServiceRoute, QueryUsemutationRoute: QueryUsemutationRoute, QueryUsequeryRoute: QueryUsequeryRoute, + StreamsPullRoute: StreamsPullRoute, } export const routeTree = rootRoute @@ -311,7 +333,8 @@ export const routeTree = rootRoute "/todos", "/query/service", "/query/usemutation", - "/query/usequery" + "/query/usequery", + "/streams/pull" ] }, "/": { @@ -346,6 +369,9 @@ export const routeTree = rootRoute }, "/query/usequery": { "filePath": "query/usequery.tsx" + }, + "/streams/pull": { + "filePath": "streams/pull.tsx" } } } diff --git a/packages/example/src/routes/streams/pull.tsx b/packages/example/src/routes/streams/pull.tsx new file mode 100644 index 0000000..7abcea5 --- /dev/null +++ b/packages/example/src/routes/streams/pull.tsx @@ -0,0 +1,14 @@ +import { R } from "@/reffuse" +import { createFileRoute } from "@tanstack/react-router" +import { Stream } from "effect" + + +export const Route = createFileRoute("/streams/pull")({ + component: RouteComponent, +}) + +function RouteComponent() { + const stream = R.useMemo(() => Stream.) + + return
Hello "/streams/pull"!
+} diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 081d88e..959d32b 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -495,27 +495,32 @@ export abstract class ReffuseNamespace { return reactStateValue as InitialA extends A ? Option.Some
: Option.Option } - usePullStream( - this: ReffuseNamespace, + usePullStream( + this: ReffuseNamespace, stream: Stream.Stream, initialValue?: InitialA, ): [ latestValue: InitialA extends A ? Option.Some : Option.Option, - pull: Effect.Effect, Option.Option, R>, + pull: Effect.Effect, Option.Option>, ] { const scope = this.useScope([stream]) const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) - const pull = this.useMemo(() => Stream.toPull(stream).pipe( - Effect.map(Effect.tap(flow( - Chunk.last, - v => Option.match(v, { - onSome: () => Effect.sync(() => setReactStateValue(v)), - onNone: () => Effect.void, - }), - ))), + const pull = this.useMemo(() => Effect.context().pipe( + Effect.flatMap(context => Stream.toPull(stream).pipe( + Effect.map(effect => effect.pipe( + Effect.tap(flow( + Chunk.last, + v => Option.match(v, { + onSome: () => Effect.sync(() => setReactStateValue(v)), + onNone: () => Effect.void, + }), + )), + Effect.provide(context), + )), - Effect.provideService(Scope.Scope, scope), + Effect.provideService(Scope.Scope, scope), + )) ), [stream, scope]) return [ -- 2.49.1 From 032f283ac88fa4ae72aba0e91ca551085d656ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 1 May 2025 21:56:58 +0200 Subject: [PATCH 264/326] Pull example --- packages/example/src/routes/streams/pull.tsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/example/src/routes/streams/pull.tsx b/packages/example/src/routes/streams/pull.tsx index 7abcea5..0524b53 100644 --- a/packages/example/src/routes/streams/pull.tsx +++ b/packages/example/src/routes/streams/pull.tsx @@ -1,6 +1,8 @@ import { R } from "@/reffuse" +import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" -import { Stream } from "effect" +import { Option, Random, Stream } from "effect" +import { useMemo } from "react" export const Route = createFileRoute("/streams/pull")({ @@ -8,7 +10,14 @@ export const Route = createFileRoute("/streams/pull")({ }) function RouteComponent() { - const stream = R.useMemo(() => Stream.) + const stream = useMemo(() => Stream.repeatEffect(Random.nextInt), []) + const [value, pull] = R.usePullStream(stream) + const pullNext = R.useCallbackSync(() => pull, [pull]) - return
Hello "/streams/pull"!
+ return ( + + {Option.isSome(value) && {value.value}} + + + ) } -- 2.49.1 From 198a7cee03a2c90a8478333f1337ab3e8f89a669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 1 May 2025 21:59:51 +0200 Subject: [PATCH 265/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 959d32b..d3c4e0b 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -507,7 +507,7 @@ export abstract class ReffuseNamespace { const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) const pull = this.useMemo(() => Effect.context().pipe( - Effect.flatMap(context => Stream.toPull(stream).pipe( + Effect.flatMap(context => Stream.toPull(Stream.changesWith(stream, (x, y) => x === y)).pipe( Effect.map(effect => effect.pipe( Effect.tap(flow( Chunk.last, -- 2.49.1 From cf6c84ff8e3c19a8d6a15152f7134a0ef7bdf329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 2 May 2025 21:56:46 +0200 Subject: [PATCH 266/326] useScope fix --- packages/reffuse/src/ReffuseNamespace.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index d3c4e0b..9de86e3 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -14,7 +14,7 @@ export interface ScopeOptions { readonly finalizerExecutionStrategy?: ExecutionStrategy.ExecutionStrategy } -export interface UseScopeOptions extends ScopeOptions { +export interface UseScopeOptions extends RenderOptions, ScopeOptions { readonly finalizerExecutionMode?: "sync" | "fork" } @@ -102,7 +102,7 @@ export abstract class ReffuseNamespace { const [isInitialRun, initialScope] = React.useMemo(() => runSync(Effect.all([ Ref.make(true), - Scope.make(options?.finalizerExecutionStrategy), + Scope.make(options?.finalizerExecutionStrategy ?? ExecutionStrategy.sequential), ])), []) const [scope, setScope] = React.useState(initialScope) @@ -133,7 +133,10 @@ export abstract class ReffuseNamespace { }), runSync, - ), [runSync, runFork, ...deps]) + ), [ + ...options?.doNotReExecuteOnRuntimeOrContextChange ? [] : [runSync, runFork], + ...deps, + ]) return scope } -- 2.49.1 From d6256a7cfd825c0b2f464758c9f7a051097a59b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 4 May 2025 01:18:29 +0200 Subject: [PATCH 267/326] Stream hooks work --- packages/reffuse/src/ReffuseNamespace.ts | 29 +++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 9de86e3..b7ac754 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -483,12 +483,18 @@ export abstract class ReffuseNamespace { return stream } - useSubscribeStream( + useSubscribeStream( this: ReffuseNamespace, stream: Stream.Stream, - initialValue?: InitialA, + initialValue?: () => Effect.Effect, ): InitialA extends A ? Option.Some
: Option.Option { - const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) + const [reactStateValue, setReactStateValue] = React.useState>(this.useMemo( + () => initialValue + ? Effect.map(initialValue(), v => Option.some(v as A)) + : Effect.succeed(Option.none()), + [], + { doNotReExecuteOnRuntimeOrContextChange: true }, + )) this.useFork(() => Stream.runForEach( Stream.changesWith(stream, (x, y) => x === y), @@ -498,17 +504,24 @@ export abstract class ReffuseNamespace { return reactStateValue as InitialA extends A ? Option.Some : Option.Option } - usePullStream( + usePullStream( this: ReffuseNamespace, stream: Stream.Stream, - initialValue?: InitialA, + initialValue?: () => Effect.Effect, ): [ latestValue: InitialA extends A ? Option.Some : Option.Option, pull: Effect.Effect, Option.Option>, ] { const scope = this.useScope([stream]) - const [reactStateValue, setReactStateValue] = React.useState>(Option.fromNullable(initialValue)) + const [reactStateValue, setReactStateValue] = React.useState>(this.useMemo( + () => initialValue + ? Effect.map(initialValue(), v => Option.some(v as A)) + : Effect.succeed(Option.none()), + [], + { doNotReExecuteOnRuntimeOrContextChange: true }, + )) + const pull = this.useMemo(() => Effect.context().pipe( Effect.flatMap(context => Stream.toPull(Stream.changesWith(stream, (x, y) => x === y)).pipe( Effect.map(effect => effect.pipe( @@ -567,11 +580,11 @@ export abstract class ReffuseNamespace { return props.children(this.useRefState(props.ref)) } - SubscribeStream( + SubscribeStream( this: ReffuseNamespace, props: { readonly stream: Stream.Stream - readonly initialValue?: InitialA + readonly initialValue?: () => Effect.Effect readonly children: (latestValue: InitialA extends A ? Option.Some : Option.Option) => React.ReactNode }, ): React.ReactNode { -- 2.49.1 From 5b3637afd867b9b05d7a269761c4f548efdbe9f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 5 May 2025 02:39:12 +0200 Subject: [PATCH 268/326] useSubscribeStream work --- packages/example/src/VQueryErrorHandler.tsx | 14 +++++++ packages/reffuse/src/ReffuseNamespace.ts | 43 +++++++++++++-------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/packages/example/src/VQueryErrorHandler.tsx b/packages/example/src/VQueryErrorHandler.tsx index 0b9fa57..d492f4f 100644 --- a/packages/example/src/VQueryErrorHandler.tsx +++ b/packages/example/src/VQueryErrorHandler.tsx @@ -18,6 +18,20 @@ export function VQueryErrorHandler() { ), []) ) + const error2 = R.useSubscribeStream( + R.useMemo(() => AppQueryErrorHandler.pipe( + Effect.flatMap() + + Effect.map(handler => handler.errors.pipe( + Stream.changes, + Stream.tap(Console.error), + Stream.tap(() => Effect.sync(() => setOpen(true))), + )) + ), []), + + () => Effect.fail(new Error()), + ) + if (Option.isNone(error)) return <> diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index b7ac754..0a12773 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -30,7 +30,7 @@ export abstract class ReffuseNamespace { this.SubRef = this.SubRef.bind(this as any) as any this.SubscribeRefs = this.SubscribeRefs.bind(this as any) as any this.RefState = this.RefState.bind(this as any) as any - this.SubscribeStream = this.SubscribeStream.bind(this as any) as any + // this.SubscribeStream = this.SubscribeStream.bind(this as any) as any } @@ -483,14 +483,23 @@ export abstract class ReffuseNamespace { return stream } - useSubscribeStream( + useSubscribeStream( this: ReffuseNamespace, stream: Stream.Stream, - initialValue?: () => Effect.Effect, - ): InitialA extends A ? Option.Some : Option.Option { - const [reactStateValue, setReactStateValue] = React.useState>(this.useMemo( + ): Option.Option + useSubscribeStream( + this: ReffuseNamespace, + stream: Stream.Stream, + initialValue: () => Effect.Effect, + ): Option.Some + useSubscribeStream( + this: ReffuseNamespace, + stream: Stream.Stream, + initialValue?: () => Effect.Effect, + ): Option.Option { + const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( () => initialValue - ? Effect.map(initialValue(), v => Option.some(v as A)) + ? Effect.map(initialValue(), Option.some) : Effect.succeed(Option.none()), [], { doNotReExecuteOnRuntimeOrContextChange: true }, @@ -501,7 +510,7 @@ export abstract class ReffuseNamespace { v => Effect.sync(() => setReactStateValue(Option.some(v))), ), [stream]) - return reactStateValue as InitialA extends A ? Option.Some : Option.Option + return reactStateValue } usePullStream( @@ -580,16 +589,16 @@ export abstract class ReffuseNamespace { return props.children(this.useRefState(props.ref)) } - SubscribeStream( - this: ReffuseNamespace, - props: { - readonly stream: Stream.Stream - readonly initialValue?: () => Effect.Effect - readonly children: (latestValue: InitialA extends A ? Option.Some : Option.Option) => React.ReactNode - }, - ): React.ReactNode { - return props.children(this.useSubscribeStream(props.stream, props.initialValue)) - } + // SubscribeStream( + // this: ReffuseNamespace, + // props: { + // readonly stream: Stream.Stream + // readonly initialValue?: () => Effect.Effect + // readonly children: (latestValue: InitialA extends A ? Option.Some : Option.Option) => React.ReactNode + // }, + // ): React.ReactNode { + // return props.children(this.useSubscribeStream(props.stream, props.initialValue)) + // } } -- 2.49.1 From 882ec9591c4a0a5cd6dc29c5766633f283504c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 5 May 2025 03:09:17 +0200 Subject: [PATCH 269/326] Fix --- packages/example/src/VQueryErrorHandler.tsx | 14 --------- packages/reffuse/src/ReffuseNamespace.ts | 35 +++++++++++---------- 2 files changed, 19 insertions(+), 30 deletions(-) diff --git a/packages/example/src/VQueryErrorHandler.tsx b/packages/example/src/VQueryErrorHandler.tsx index d492f4f..0b9fa57 100644 --- a/packages/example/src/VQueryErrorHandler.tsx +++ b/packages/example/src/VQueryErrorHandler.tsx @@ -18,20 +18,6 @@ export function VQueryErrorHandler() { ), []) ) - const error2 = R.useSubscribeStream( - R.useMemo(() => AppQueryErrorHandler.pipe( - Effect.flatMap() - - Effect.map(handler => handler.errors.pipe( - Stream.changes, - Stream.tap(Console.error), - Stream.tap(() => Effect.sync(() => setOpen(true))), - )) - ), []), - - () => Effect.fail(new Error()), - ) - if (Option.isNone(error)) return <> diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 0a12773..66b3400 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -487,15 +487,15 @@ export abstract class ReffuseNamespace { this: ReffuseNamespace, stream: Stream.Stream, ): Option.Option - useSubscribeStream( + useSubscribeStream( this: ReffuseNamespace, stream: Stream.Stream, - initialValue: () => Effect.Effect, + initialValue: () => Effect.Effect, ): Option.Some - useSubscribeStream( + useSubscribeStream( this: ReffuseNamespace, stream: Stream.Stream, - initialValue?: () => Effect.Effect, + initialValue?: () => Effect.Effect, ): Option.Option { const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( () => initialValue @@ -513,19 +513,25 @@ export abstract class ReffuseNamespace { return reactStateValue } - usePullStream( + usePullStream( this: ReffuseNamespace, stream: Stream.Stream, - initialValue?: () => Effect.Effect, - ): [ - latestValue: InitialA extends A ? Option.Some : Option.Option, - pull: Effect.Effect, Option.Option>, - ] { + ): [latestValue: Option.Option, pull: Effect.Effect, Option.Option>] + usePullStream( + this: ReffuseNamespace, + stream: Stream.Stream, + initialValue: () => Effect.Effect, + ): [latestValue: Option.Some, pull: Effect.Effect, Option.Option>] + usePullStream( + this: ReffuseNamespace, + stream: Stream.Stream, + initialValue?: () => Effect.Effect, + ): [latestValue: Option.Option, pull: Effect.Effect, Option.Option>] { const scope = this.useScope([stream]) - const [reactStateValue, setReactStateValue] = React.useState>(this.useMemo( + const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( () => initialValue - ? Effect.map(initialValue(), v => Option.some(v as A)) + ? Effect.map(initialValue(), Option.some) : Effect.succeed(Option.none()), [], { doNotReExecuteOnRuntimeOrContextChange: true }, @@ -548,10 +554,7 @@ export abstract class ReffuseNamespace { )) ), [stream, scope]) - return [ - reactStateValue as InitialA extends A ? Option.Some : Option.Option, - pull, - ] + return [reactStateValue, pull] } -- 2.49.1 From c8b675d93e73b902421fab4a8f67e6fa573c2676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 5 May 2025 03:33:50 +0200 Subject: [PATCH 270/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 37 +++++++++++++++++------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 66b3400..d768eb5 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -30,7 +30,7 @@ export abstract class ReffuseNamespace { this.SubRef = this.SubRef.bind(this as any) as any this.SubscribeRefs = this.SubscribeRefs.bind(this as any) as any this.RefState = this.RefState.bind(this as any) as any - // this.SubscribeStream = this.SubscribeStream.bind(this as any) as any + this.SubscribeStream = this.SubscribeStream.bind(this as any) as any } @@ -592,16 +592,31 @@ export abstract class ReffuseNamespace { return props.children(this.useRefState(props.ref)) } - // SubscribeStream( - // this: ReffuseNamespace, - // props: { - // readonly stream: Stream.Stream - // readonly initialValue?: () => Effect.Effect - // readonly children: (latestValue: InitialA extends A ? Option.Some : Option.Option) => React.ReactNode - // }, - // ): React.ReactNode { - // return props.children(this.useSubscribeStream(props.stream, props.initialValue)) - // } + SubscribeStream( + this: ReffuseNamespace, + props: { + readonly stream: Stream.Stream + readonly children: (latestValue: Option.Option) => React.ReactNode + }, + ): React.ReactNode + SubscribeStream( + this: ReffuseNamespace, + props: { + readonly stream: Stream.Stream + readonly initialValue: () => Effect.Effect + readonly children: (latestValue: Option.Some) => React.ReactNode + }, + ): React.ReactNode + SubscribeStream( + this: ReffuseNamespace, + props: { + readonly stream: Stream.Stream + readonly initialValue?: () => Effect.Effect + readonly children: (latestValue: Option.Some) => React.ReactNode + }, + ): React.ReactNode { + return props.children(this.useSubscribeStream(props.stream, props.initialValue as () => Effect.Effect)) + } } -- 2.49.1 From 53fc1ef505a2b8a9a1fbb9edd441297f7ee8327a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 5 May 2025 20:38:39 +0200 Subject: [PATCH 271/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index d768eb5..56d5e54 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -479,7 +479,6 @@ export abstract class ReffuseNamespace { ), []) this.useEffect(() => Queue.offer(queue, values), values) - return stream } -- 2.49.1 From 4b9bfd06379b631e5e76596b91861d00587bbf70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 5 May 2025 21:52:55 +0200 Subject: [PATCH 272/326] Stream PubSub --- packages/reffuse/src/ReffuseNamespace.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 56d5e54..f1717e6 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -1,4 +1,4 @@ -import { Chunk, type Context, Effect, ExecutionStrategy, Exit, type Fiber, flow, type Layer, Match, Option, pipe, Pipeable, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { Chunk, type Context, Effect, ExecutionStrategy, Exit, type Fiber, flow, type Layer, Match, Option, pipe, Pipeable, PubSub, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -474,11 +474,11 @@ export abstract class ReffuseNamespace { this: ReffuseNamespace, values: A, ): Stream.Stream { - const [queue, stream] = this.useMemo(() => Queue.unbounded().pipe( - Effect.map(queue => [queue, Stream.fromQueue(queue)] as const) + const [pubsub, stream] = this.useMemo(() => PubSub.unbounded().pipe( + Effect.map(pubsub => [pubsub, Stream.fromPubSub(pubsub)] as const) ), []) - this.useEffect(() => Queue.offer(queue, values), values) + this.useEffect(() => PubSub.publish(pubsub, values), values) return stream } -- 2.49.1 From c13a8d549fd30ffae157f28f2a73f61bd2f5a230 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 7 May 2025 02:07:50 +0200 Subject: [PATCH 273/326] useStreamFromReactiveValues --- packages/reffuse/src/ReffuseNamespace.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index f1717e6..37aee55 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -474,11 +474,23 @@ export abstract class ReffuseNamespace { this: ReffuseNamespace, values: A, ): Stream.Stream { - const [pubsub, stream] = this.useMemo(() => PubSub.unbounded().pipe( - Effect.map(pubsub => [pubsub, Stream.fromPubSub(pubsub)] as const) + const { latest, pubsub, stream } = this.useMemo(() => Effect.Do.pipe( + Effect.bind("latest", () => Ref.make(values)), + Effect.bind("pubsub", () => PubSub.unbounded()), + Effect.let("stream", ({ latest, pubsub }) => Ref.get(latest).pipe( + Effect.flatMap(a => Effect.map( + Stream.fromPubSub(pubsub, { scoped: true }), + s => Stream.concat(Stream.make(a), s), + )), + Stream.unwrapScoped, + )), ), []) - this.useEffect(() => PubSub.publish(pubsub, values), values) + this.useEffect(() => Effect.andThen( + Ref.set(latest, values), + PubSub.publish(pubsub, values), + ), values) + return stream } -- 2.49.1 From 606dd2c00fc7e94c6dc500148dad56b8df61a7d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 7 May 2025 02:15:46 +0200 Subject: [PATCH 274/326] useStreamFromReactiveValues --- packages/reffuse/src/ReffuseNamespace.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 37aee55..6c637eb 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -474,9 +474,11 @@ export abstract class ReffuseNamespace { this: ReffuseNamespace, values: A, ): Stream.Stream { + const scope = this.useScope() + const { latest, pubsub, stream } = this.useMemo(() => Effect.Do.pipe( Effect.bind("latest", () => Ref.make(values)), - Effect.bind("pubsub", () => PubSub.unbounded()), + Effect.bind("pubsub", () => Effect.acquireRelease(PubSub.unbounded(), PubSub.shutdown)), Effect.let("stream", ({ latest, pubsub }) => Ref.get(latest).pipe( Effect.flatMap(a => Effect.map( Stream.fromPubSub(pubsub, { scoped: true }), @@ -484,7 +486,8 @@ export abstract class ReffuseNamespace { )), Stream.unwrapScoped, )), - ), []) + Effect.provideService(Scope.Scope, scope), + ), [scope]) this.useEffect(() => Effect.andThen( Ref.set(latest, values), -- 2.49.1 From 04e78e1ea389f90650a21dff7761dde44d2218f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 7 May 2025 04:53:40 +0200 Subject: [PATCH 275/326] Tests --- packages/reffuse/src/tests.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 packages/reffuse/src/tests.ts diff --git a/packages/reffuse/src/tests.ts b/packages/reffuse/src/tests.ts new file mode 100644 index 0000000..c5c9791 --- /dev/null +++ b/packages/reffuse/src/tests.ts @@ -0,0 +1,23 @@ +import { Console, Effect, Fiber, Ref, Stream, SubscriptionRef } from "effect" + + +await Effect.gen(function*() { + const ref = yield* SubscriptionRef.make("juif") + const stream = ref.changes + + const f1 = yield* Stream.runForEach(stream, v => Console.log(`observer 1: ${ v }`)).pipe( + Effect.fork, + ) + const f2 = yield* Effect.sleep("200 millis").pipe( + Effect.andThen(Stream.runForEach(stream, v => Console.log(`observer 2: ${ v }`))), + Effect.fork, + ) + const f3 = yield* Effect.sleep("100 millis").pipe( + Effect.andThen(Ref.set(ref, "adolf")), + Effect.fork, + ) + + yield* Fiber.joinAll([f1, f2, f3]) +}).pipe( + Effect.runPromise +) -- 2.49.1 From 39765102dbb81298d4774f3267186ff78fa1f9b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 8 May 2025 01:15:35 +0200 Subject: [PATCH 276/326] useStreamFromReactiveValues --- packages/reffuse/src/ReffuseNamespace.ts | 6 +++--- packages/reffuse/src/tests.ts | 23 ----------------------- 2 files changed, 3 insertions(+), 26 deletions(-) delete mode 100644 packages/reffuse/src/tests.ts diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 6c637eb..9f43f92 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -489,9 +489,9 @@ export abstract class ReffuseNamespace { Effect.provideService(Scope.Scope, scope), ), [scope]) - this.useEffect(() => Effect.andThen( - Ref.set(latest, values), - PubSub.publish(pubsub, values), + this.useEffect(() => Ref.set(latest, values).pipe( + Effect.andThen(PubSub.publish(pubsub, values)), + Effect.unlessEffect(PubSub.isShutdown(pubsub)), ), values) return stream diff --git a/packages/reffuse/src/tests.ts b/packages/reffuse/src/tests.ts deleted file mode 100644 index c5c9791..0000000 --- a/packages/reffuse/src/tests.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Console, Effect, Fiber, Ref, Stream, SubscriptionRef } from "effect" - - -await Effect.gen(function*() { - const ref = yield* SubscriptionRef.make("juif") - const stream = ref.changes - - const f1 = yield* Stream.runForEach(stream, v => Console.log(`observer 1: ${ v }`)).pipe( - Effect.fork, - ) - const f2 = yield* Effect.sleep("200 millis").pipe( - Effect.andThen(Stream.runForEach(stream, v => Console.log(`observer 2: ${ v }`))), - Effect.fork, - ) - const f3 = yield* Effect.sleep("100 millis").pipe( - Effect.andThen(Ref.set(ref, "adolf")), - Effect.fork, - ) - - yield* Fiber.joinAll([f1, f2, f3]) -}).pipe( - Effect.runPromise -) -- 2.49.1 From 10f23d4cb489f672e5225c5af1dd4808e8398818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 8 May 2025 01:28:41 +0200 Subject: [PATCH 277/326] Fix --- packages/reffuse/src/ReffuseNamespace.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 9f43f92..0250fdc 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -487,12 +487,12 @@ export abstract class ReffuseNamespace { Stream.unwrapScoped, )), Effect.provideService(Scope.Scope, scope), - ), [scope]) + ), [scope], { doNotReExecuteOnRuntimeOrContextChange: true }) this.useEffect(() => Ref.set(latest, values).pipe( Effect.andThen(PubSub.publish(pubsub, values)), Effect.unlessEffect(PubSub.isShutdown(pubsub)), - ), values) + ), values, { doNotReExecuteOnRuntimeOrContextChange: true }) return stream } -- 2.49.1 From 31b07f842b0aaacb8d07f1cc07e6196c537f2405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 8 May 2025 04:42:24 +0200 Subject: [PATCH 278/326] Fix --- packages/example/src/VQueryErrorHandler.tsx | 6 +++--- packages/example/src/reffuse.ts | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/example/src/VQueryErrorHandler.tsx b/packages/example/src/VQueryErrorHandler.tsx index 0b9fa57..1c4ca27 100644 --- a/packages/example/src/VQueryErrorHandler.tsx +++ b/packages/example/src/VQueryErrorHandler.tsx @@ -1,7 +1,7 @@ import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" import { Cause, Console, Effect, Either, flow, Match, Option, Stream } from "effect" import { useState } from "react" -import { AppQueryErrorHandler } from "./query" +import { AppQueryClient } from "./query" import { R } from "./reffuse" @@ -9,8 +9,8 @@ export function VQueryErrorHandler() { const [open, setOpen] = useState(false) const error = R.useSubscribeStream( - R.useMemo(() => AppQueryErrorHandler.pipe( - Effect.map(handler => handler.errors.pipe( + R.useMemo(() => AppQueryClient.pipe( + Effect.map(client => client.errorHandler.errors.pipe( Stream.changes, Stream.tap(Console.error), Stream.tap(() => Effect.sync(() => setOpen(true))), diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index 25a8fa7..3a08e53 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -3,12 +3,11 @@ import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" import { LazyRefExtension } from "@reffuse/extension-lazyref" import { QueryExtension } from "@reffuse/extension-query" import { Reffuse, ReffuseContext } from "reffuse" -import { AppQueryClient, AppQueryErrorHandler } from "./query" +import { AppQueryClient } from "./query" export const RootContext = ReffuseContext.make< | AppQueryClient - | AppQueryErrorHandler | Clipboard.Clipboard | Geolocation.Geolocation | Permissions.Permissions -- 2.49.1 From 70e9b9218db1ff753111eedf57592db706ad7170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 8 May 2025 04:51:41 +0200 Subject: [PATCH 279/326] Queue -> PubSub --- packages/extension-query/src/QueryErrorHandler.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/extension-query/src/QueryErrorHandler.ts b/packages/extension-query/src/QueryErrorHandler.ts index 733b7e1..da64787 100644 --- a/packages/extension-query/src/QueryErrorHandler.ts +++ b/packages/extension-query/src/QueryErrorHandler.ts @@ -1,4 +1,4 @@ -import { Cause, Context, Effect, identity, Layer, Queue, Stream } from "effect" +import { Cause, Context, Effect, identity, Layer, PubSub, Stream } from "effect" import type { Mutable } from "effect/Types" @@ -36,17 +36,17 @@ export const Service = () => ( const TagClass = Context.Tag(id)() as ServiceResult (TagClass as Mutable).Live = Layer.effect(TagClass, Effect.gen(function*() { - const queue = yield* Queue.unbounded>() - const errors = Stream.fromQueue(queue) + const pubsub = yield* PubSub.unbounded>() + const errors = Stream.fromPubSub(pubsub) const handle = ( self: Effect.Effect ): Effect.Effect, R> => f( self as unknown as Effect.Effect, - (failure: HandledE) => Queue.offer(queue, Cause.fail(failure)).pipe( + (failure: HandledE) => PubSub.publish(pubsub, Cause.fail(failure)).pipe( Effect.andThen(Effect.failCause(Cause.empty)) ), - (defect: unknown) => Queue.offer(queue, Cause.die(defect)).pipe( + (defect: unknown) => PubSub.publish(pubsub, Cause.die(defect)).pipe( Effect.andThen(Effect.failCause(Cause.empty)) ), ) -- 2.49.1 From 6bc07d5b2a0ba984ef53019ddd41a749b6085c1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 8 May 2025 05:59:36 +0200 Subject: [PATCH 280/326] Tests --- packages/reffuse/src/tests.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 packages/reffuse/src/tests.ts diff --git a/packages/reffuse/src/tests.ts b/packages/reffuse/src/tests.ts new file mode 100644 index 0000000..cbb2db7 --- /dev/null +++ b/packages/reffuse/src/tests.ts @@ -0,0 +1,17 @@ +import { Effect, Exit, PubSub, Scope, Stream } from "effect" + + +await Effect.gen(function*() { + const scope = yield* Scope.make() + + const pubsub = yield* PubSub.unbounded() + console.log(yield* PubSub.isShutdown(pubsub)) + const stream = yield* Stream.fromPubSub(pubsub, { scoped: true, shutdown: true }).pipe( + Effect.provideService(Scope.Scope, scope) + ) + + yield* Scope.close(scope, Exit.void) + console.log(yield* PubSub.isShutdown(pubsub)) +}).pipe( + Effect.runPromise, +) -- 2.49.1 From 73dd7bc160fd5ef79394ef1b53485db8d8c8b1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 8 May 2025 19:22:50 +0200 Subject: [PATCH 281/326] Cleanup --- packages/reffuse/src/tests.ts | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 packages/reffuse/src/tests.ts diff --git a/packages/reffuse/src/tests.ts b/packages/reffuse/src/tests.ts deleted file mode 100644 index cbb2db7..0000000 --- a/packages/reffuse/src/tests.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Effect, Exit, PubSub, Scope, Stream } from "effect" - - -await Effect.gen(function*() { - const scope = yield* Scope.make() - - const pubsub = yield* PubSub.unbounded() - console.log(yield* PubSub.isShutdown(pubsub)) - const stream = yield* Stream.fromPubSub(pubsub, { scoped: true, shutdown: true }).pipe( - Effect.provideService(Scope.Scope, scope) - ) - - yield* Scope.close(scope, Exit.void) - console.log(yield* PubSub.isShutdown(pubsub)) -}).pipe( - Effect.runPromise, -) -- 2.49.1 From 904b72575322c8c960eba203712c0cf7a3197b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 8 May 2025 21:09:55 +0200 Subject: [PATCH 282/326] Dependencies upgrade --- bun.lock | 486 ++++++++++++++++++++++------------ package.json | 4 +- packages/example/package.json | 34 +-- 3 files changed, 335 insertions(+), 189 deletions(-) diff --git a/bun.lock b/bun.lock index 4f670be..063145d 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "devDependencies": { "npm-check-updates": "^18.0.1", "npm-sort": "^0.0.4", - "turbo": "^2.5.2", + "turbo": "^2.5.3", "typescript": "^5.8.3", }, }, @@ -14,36 +14,36 @@ "name": "@reffuse/example", "version": "0.0.0", "dependencies": { - "@effect/platform": "^0.80.14", - "@effect/platform-browser": "^0.60.5", + "@effect/platform": "^0.80.21", + "@effect/platform-browser": "^0.60.12", "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", "@typed/async-data": "^0.13.1", "@typed/id": "^0.17.2", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.14.14", - "lucide-react": "^0.503.0", + "effect": "^3.14.21", + "lucide-react": "^0.508.0", "mobx": "^6.13.7", "reffuse": "workspace:*", }, "devDependencies": { - "@eslint/js": "^9.25.1", - "@tanstack/react-router": "^1.117.1", - "@tanstack/react-router-devtools": "^1.117.1", - "@tanstack/router-plugin": "^1.117.2", + "@eslint/js": "^9.26.0", + "@tanstack/react-router": "^1.120.2", + "@tanstack/react-router-devtools": "^1.120.2", + "@tanstack/router-plugin": "^1.120.2", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.2", + "@types/react": "^19.1.3", + "@types/react-dom": "^19.1.3", "@vitejs/plugin-react": "^4.4.1", - "eslint": "^9.25.1", + "eslint": "^9.26.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", - "globals": "^16.0.0", + "globals": "^16.1.0", "react": "^19.1.0", "react-dom": "^19.1.0", - "typescript-eslint": "^8.31.0", - "vite": "^6.3.3", + "typescript-eslint": "^8.32.0", + "vite": "^6.3.5", }, }, "packages/extension-lazyref": { @@ -89,121 +89,121 @@ "packages": { "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], - "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "@babel/compat-data": ["@babel/compat-data@7.26.8", "", {}, "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ=="], + "@babel/compat-data": ["@babel/compat-data@7.27.2", "", {}, "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ=="], - "@babel/core": ["@babel/core@7.26.10", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.10", "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ=="], + "@babel/core": ["@babel/core@7.27.1", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.1", "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-module-transforms": "^7.27.1", "@babel/helpers": "^7.27.1", "@babel/parser": "^7.27.1", "@babel/template": "^7.27.1", "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ=="], - "@babel/generator": ["@babel/generator@7.27.0", "", { "dependencies": { "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw=="], + "@babel/generator": ["@babel/generator@7.27.1", "", { "dependencies": { "@babel/parser": "^7.27.1", "@babel/types": "^7.27.1", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w=="], - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.0", "", { "dependencies": { "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA=="], + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="], + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g=="], - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="], + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="], + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/helpers": ["@babel/helpers@7.27.0", "", { "dependencies": { "@babel/template": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg=="], + "@babel/helpers": ["@babel/helpers@7.27.1", "", { "dependencies": { "@babel/template": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ=="], - "@babel/parser": ["@babel/parser@7.27.0", "", { "dependencies": { "@babel/types": "^7.27.0" }, "bin": "./bin/babel-parser.js" }, "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg=="], + "@babel/parser": ["@babel/parser@7.27.2", "", { "dependencies": { "@babel/types": "^7.27.1" }, "bin": "./bin/babel-parser.js" }, "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw=="], - "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA=="], + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], - "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ=="], + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], - "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg=="], + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], - "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg=="], + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], - "@babel/template": ["@babel/template@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA=="], + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], - "@babel/traverse": ["@babel/traverse@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.27.0", "@babel/parser": "^7.27.0", "@babel/template": "^7.27.0", "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA=="], + "@babel/traverse": ["@babel/traverse@7.27.1", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.1", "@babel/parser": "^7.27.1", "@babel/template": "^7.27.1", "@babel/types": "^7.27.1", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg=="], - "@babel/types": ["@babel/types@7.27.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg=="], + "@babel/types": ["@babel/types@7.27.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q=="], - "@effect/platform": ["@effect/platform@0.80.14", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.14.14" } }, "sha512-yUFeqSzL6Pu66XOmNkvcqGeEkmQit13Ei0jXlumU8YEpAweRe2pmiOZqYoGTzsIn0BJhepx7O6cjmkKSi/PQ4Q=="], + "@effect/platform": ["@effect/platform@0.80.21", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.14.21" } }, "sha512-c6pDar/1TYqeFc8Z6uxNC+065ElSJ4A0AuACZi0CT1riLAfGLCFIpejonkJ1tz6rsBTDyBm0JPdyb0aqyGAYAA=="], - "@effect/platform-browser": ["@effect/platform-browser@0.60.5", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.80.14", "effect": "^3.14.14" } }, "sha512-gFU40vM470nbr3n+5w66+drQxp7KDUXkIm+q8XGp9csdaxBdJ+hhurNJrR0kOWVxMd/SD3k7QdIxB+JN8Jo5hg=="], + "@effect/platform-browser": ["@effect/platform-browser@0.60.12", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.80.21", "effect": "^3.14.21" } }, "sha512-4E+6SvGwSa3kIwuQNwk44vg7vZoZz7Q9d8VFvldz8zzv3+XZYMAhy+qaFQWmrqMoRP4n10xBE7MJJ2rIEtZYPw=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.3", "", { "os": "android", "cpu": "arm" }, "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.3", "", { "os": "android", "cpu": "arm64" }, "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.3", "", { "os": "android", "cpu": "x64" }, "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.3", "", { "os": "linux", "cpu": "arm" }, "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.3", "", { "os": "linux", "cpu": "none" }, "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.3", "", { "os": "linux", "cpu": "none" }, "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.3", "", { "os": "linux", "cpu": "none" }, "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.3", "", { "os": "linux", "cpu": "x64" }, "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.3", "", { "os": "none", "cpu": "arm64" }, "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.3", "", { "os": "none", "cpu": "x64" }, "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.3", "", { "os": "win32", "cpu": "x64" }, "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.6.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], "@eslint/config-array": ["@eslint/config-array@0.20.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.2.1", "", {}, "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.2", "", {}, "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg=="], "@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="], "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - "@eslint/js": ["@eslint/js@9.25.1", "", {}, "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg=="], + "@eslint/js": ["@eslint/js@9.26.0", "", {}, "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.8", "", { "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" } }, "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA=="], - "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], + "@floating-ui/core": ["@floating-ui/core@1.7.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA=="], - "@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="], + "@floating-ui/dom": ["@floating-ui/dom@1.7.0", "", { "dependencies": { "@floating-ui/core": "^1.7.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg=="], "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.2", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A=="], @@ -215,7 +215,7 @@ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.2", "", {}, "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ=="], + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], @@ -227,6 +227,8 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.11.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.3", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ=="], + "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw=="], "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw=="], @@ -251,97 +253,99 @@ "@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], - "@radix-ui/react-accessible-icon": ["@radix-ui/react-accessible-icon@1.1.4", "", { "dependencies": { "@radix-ui/react-visually-hidden": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-J8pIt7l32A9fGIn86vwccQzik5MgIOTtceeTxi6EiiFYwWHLxsTHwiOW4pI5sQhQJWd3MOEkumFBIHwIU038Cw=="], + "@radix-ui/react-accessible-icon": ["@radix-ui/react-accessible-icon@1.1.6", "", { "dependencies": { "@radix-ui/react-visually-hidden": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Eh+3JK1ApmX7DYGMquj6gctxmbLX4JD+5kn1Pi/VlFGdHvod+dtoFoAGEkz3Muy/E+MVC7P77MPC5zqAaxrHxg=="], - "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collapsible": "1.1.8", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-c7OKBvO36PfQIUGIjj1Wko0hH937pYFU2tR5zbIJDUsmTzHoZVHHt4bmb7OOJbzTaWJtVELKWojBHa7OcnUHmQ=="], + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collapsible": "1.1.10", "@radix-ui/react-collection": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-x+URzV1siKmeXPSUIQ22L81qp2eOhjpy3tgteF+zOr4d1u0qJnFuyBF4MoQRhmKP6ivDxlvDAvqaF77gh7DOIw=="], - "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dialog": "1.1.11", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-4KfkwrFnAw3Y5Jeoq6G+JYSKW0JfIS3uDdFC/79Jw9AsMayZMizSSMxk1gkrolYXsa/WzbbDfOA7/D8N5D+l1g=="], + "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dialog": "1.1.13", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-slot": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/uPs78OwxGxslYOG5TKeUsv9fZC0vo376cXSADdKirTmsLJU2au6L3n34c3p6W26rFDDDze/hwy4fYeNd0qdGA=="], - "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-qz+fxrqgNxG0dYew5l7qR3c7wdgRu1XVUHGnGYX7rg5HM4p9SWaRmJwfgR3J0SgyUKayLmzQIun+N6rWRgiRKw=="], + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.6", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2JMfHJf/eVnwq+2dewT3C0acmCWD3XiVA1Da+jTDqo342UlU13WvXtqHhG+yJw5JeQmu4ue2eMy6gcEArLBlcw=="], - "@radix-ui/react-aspect-ratio": ["@radix-ui/react-aspect-ratio@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ie2mUDtM38LBqVU+Xn+GIY44tWM5yVbT5uXO+th85WZxUUsgEdWNNZWecqqGzkQ4Af+Fq1mYT6TyQ/uUf5gfcw=="], + "@radix-ui/react-aspect-ratio": ["@radix-ui/react-aspect-ratio@1.1.6", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-cZvNiIKqWQjf3DsQk1+wktF3DD73kUbWQ2E/XSh8m2IcpFGwg4IiIvGlVNdovxuozK/9+4QXd2zVlzUMiexSDg=="], - "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.7", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-V7ODUt4mUoJTe3VUxZw6nfURxaPALVqmDQh501YmaQsk3D8AZQrOPRnfKn4H7JGDLBc0KqLhT94H79nV88ppNg=="], + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.9", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-10tQokfvZdFvnvDkcOJPjm2pWiP8A0R4T83MoD7tb15bC/k2GU7B1YBuzJi8lNQ8V1QqhP8ocNqp27ByZaNagQ=="], - "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.2.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pHVzDYsnaDmBlAuwim45y3soIN8H4R7KbkSVirGhXO+R/kO2OLCe0eucUEbddaTcdMHHdzcIGHtZSMSQlA+apw=="], + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.1", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-xTaLKAO+XXMPK/BpVTSaAAhlefmvMSACjIhK9mGsImvX2ljcTDm8VGR1CuS1uYcNdR5J+oiOhoJZc5un6bh3VQ=="], - "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-hxEsLvK9WxIAPyxdDRULL4hcaSjMZCfP7fHB0Z1uUnDoDBat1Zh46hwYfa69DeZAbJrPckjf0AGAtEZyvDyJbw=="], + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-O2mcG3gZNkJ/Ena34HurA3llPOEA/M4dJtIRMa6y/cknRDC8XY5UZBInKTsUwW5cUue9A4k0wi1XU5fKBzKe1w=="], - "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-cv4vSf7HttqXilDnAnvINd53OTl1/bjUYVZrkFnA7nwmY9Ob2POUy0WY0sfqBAe1s5FyKsyceQlqiEGPYNTadg=="], + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.6", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-slot": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-PbhRFK4lIEw9ADonj48tiYWzkllz81TM7KVYyyMMw2cwHO7D5h4XKEblL8NlaRisTK3QTe6tBEhDccFUryxHBQ=="], "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], - "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.2.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-menu": "2.1.12", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-5UFKuTMX8F2/KjHvyqu9IYT8bEtDSCJwwIx1PghBo4jh9S6jJVsceq9xIjqsOVcxsynGwV5eaqPE3n/Cu+DrSA=="], + "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-menu": "2.1.14", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-RUHvrJE2qKAd9pQ50HZZsePio4SMWEh8v6FWQwg/4t6K1fuxfb4Ec40VEVvni6V7nFxmj9srU4UZc7aYp8x0LQ=="], - "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yI7S1ipkP5/+99qhSI6nthfo/tR6bL6Zgxi/+1UO6qPa6UeM6nlafWcQ65vB4rU2XjgjMfMhI3k9Y5MztA62VQ=="], + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.9", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.6", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.8", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-slot": "1.2.2", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA=="], "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], - "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-j5+WBUdhccJsmH5/H0K6RncjDtoALSEr6jbkaZu+bjw6hOPOhHycr6vEUujl+HBK8kjUfWcoCJXxP6e4lUlMZw=="], + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.9", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ=="], - "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.12", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-VJoMs+BWWE7YhzEQyVwvF9n22Eiyr83HotCVrMQzla/OwRovXCgah7AcaEr4hMNj4gJxSdtIbcHGvmJXOoJVHA=="], + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.14", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lzuyNjoWOoaMFE/VC5FnAAYM16JmQA8ZmucOXtlhm2kKR5TSU95YLAueQ4JYuRmUJmBvSqXaVFGIfuukybwZJQ=="], "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA=="], - "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-r2annK27lIW5w9Ho5NyQgqs0MmgZSTIKXWpVCJaLC1q2kZrZkcqnmHkCHMEmv8XLvsLlurKMPT+kbKkRkm/xVA=="], + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.6", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw=="], - "@radix-ui/react-form": ["@radix-ui/react-form@0.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-label": "2.1.4", "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-97Q7Hb0///sMF2X8XvyVx3Aub7WG/ybIofoDVUo8utG/z/6TBzWGjgai7ZjECXYLbKip88t9/ibyQJvYe5k6SA=="], + "@radix-ui/react-form": ["@radix-ui/react-form@0.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-label": "2.1.6", "@radix-ui/react-primitive": "2.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7AMSeVvepeJU8dIUSDlR92Pm8mScmqWBaiYw0oIAcN8wU/H5muJGcZdU/sYRHNws3b7eCoHyq4FTLrstVtCacQ=="], - "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-q9h9grUpGZKR3MNhtVCLVnPGmx1YnzBgGR+O40mhSNGsUnkR+LChVH8c7FB0mkS+oudhd8KAkZGTJPJCjdAPIg=="], + "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.9", "@radix-ui/react-popper": "1.2.6", "@radix-ui/react-portal": "1.1.8", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Wtjvx0d/6Bgd/jAYS1mW6IPSUQ25y0hkUSOS1z5/4+U8+DJPwKroqJlM/AlVFl3LywGoruiPmcvB9Aks9mSOQw=="], "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], - "@radix-ui/react-label": ["@radix-ui/react-label@2.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wy3dqizZnZVV4ja0FNnUhIWNwWdoldXrneEyUcVtLYDAt8ovGS4ridtMAOGgXBBIfggL4BOveVWsjXDORdGEQg=="], + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.6", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-S/hv1mTlgcPX2gCTJrWuTjSXf7ER3Zf7zWGtOprxhIIY93Qin3n5VgNA0Ez9AgrK/lEtlYgzLd4f5x6AVar4Yw=="], - "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+qYq6LfbiGo97Zz9fioX83HCiIYYFNs8zAsVCMQrIakoNYylIzWuoD/anAD3UzvvR6cnswmfRFJFq/zYYq/k7Q=="], + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.9", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.6", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.6", "@radix-ui/react-portal": "1.1.8", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-roving-focus": "1.1.9", "@radix-ui/react-slot": "1.2.2", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0zSiBAIFq9GSKoSH5PdEaQeRB3RnEGxC+H2P0egtnKoKKLNBH8VBHyVO6/jskhjAezhOIplyRUj7U2lds9A+Yg=="], - "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.12", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bM2vT5nxRqJH/d1vFQ9jLsW4qR70yFQw2ZD1TUPWUNskDsV0eYeMbbNJqxNjGMOVogEkOJaHtu11kzYdTJvVJg=="], + "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.14", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-roving-focus": "1.1.9", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-nWLOS7EG3iYhT/zlE/Pbip17rrMnV/0AS7ueb3pKHTSAnpA6/N9rXQYowulZw4owZ9P+qSilHsFzSx/kU7yplQ=="], - "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kGDqMVPj2SRB1vJmXN/jnhC66REAXNyDmDRubbbmJ+360zSIJUDmWGMKIJOf72PHMwPENrbtJVb3CMAUJDjEIA=="], + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.9", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-iExvawdu7n6DidDJRU5pMTdi+Z3DaVPN4UZbAGuTs7nJA8P4RvvkEz+XYI2UJjb/Hh23RrH19DakgZNLdaq9Bw=="], - "@radix-ui/react-one-time-password-field": ["@radix-ui/react-one-time-password-field@0.1.4", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-CygYLHY8kO1De5iAZBn7gQbIoRNVGYx1paIyqbmwlxP6DF7sF1LLW3chXo/qxc4IWUQnsgAhfl9u6IoLXTndqQ=="], + "@radix-ui/react-one-time-password-field": ["@radix-ui/react-one-time-password-field@0.1.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-roving-focus": "1.1.9", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-hLjEmrZ7Ld++eL/hUOqfmBA4pEk78Sf7iXvEWs9t3aAuvWmtI24FuEfiMYbiXVJuUjzpo3vND6eUTAPFvG44Gg=="], - "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yFMfZkVA5G3GJnBgb2PxrrcLKm1ZLWXrbYVgdyTl//0TYEIHS9LJbnyz7WWcZ0qCq7hIlJZpRtxeSeIG5T5oJw=="], + "@radix-ui/react-password-toggle-field": ["@radix-ui/react-password-toggle-field@0.1.1", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-is-hydrated": "0.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-p5IJUTuyknUMv5VPGEa3fZvjb77cPzCK9w+Em/xHLaTqCVfIhykvdzAe8+X5BmboE9NwxDEBmbWnceFVw4tDdg=="], - "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.4", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3p2Rgm/a1cK0r/UVkx5F/K9v/EplfjAeIFCGOPYPO4lZ0jtg4iSQXt/YGTSLWaf4x7NG6Z4+uKFcylcTZjeqDA=="], + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.9", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.6", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.6", "@radix-ui/react-portal": "1.1.8", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-slot": "1.2.2", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-84uqQV3omKDR076izYgcha6gdpN8m3z6w/AeJ83MSBJYVG/AbOHdLjAgsPZkeC/kt+k64moXFCnio8BbqXszlw=="], - "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.6", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XmsIl2z1n/TsYFLIdYam2rmFwf9OC/Sh2avkbmVMDuBZIe7hSpM0cYnWPAo7nHOVx8zTuwDZGByfcqLdnzp3Vw=="], + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.6", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7iqXaOWIjDBfIG7aq8CUEeCSsQMLFdn7VEE8TaFz704DtEzpPHR7w/uuzRflvKgltqSAImgcmxQ7fFX3X7wasg=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg=="], "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA=="], - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="], + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.2", "", { "dependencies": { "@radix-ui/react-slot": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw=="], - "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.4", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-8rl9w7lJdcVPor47Dhws9mUHRHLE+8JEgyJRdNWCpGPa6HIlr3eh+Yn9gyx1CnCLbw5naHsI2gaO9dBWO50vzw=="], + "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.6", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-QzN9a36nKk2eZKMf9EBCia35x3TT+SOgZuzQBVIHyRrmYYi73VYBRK3zKwdJ6az/F5IZ6QlacGJBg7zfB85liA=="], - "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.3.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-N4J9QFdW5zcJNxxY/zwTXBN4Uc5VEuRM7ZLjNfnWoKmNvgrPtNNw4P8zY532O3qL6aPkaNO+gY9y6bfzmH4U1g=="], + "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.3.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-roving-focus": "1.1.9", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1tfTAqnYZNVwSpFhCT273nzK8qGBReeYnNTPspCggqk1fvIrfVxJekIuBFidNivzpdiMqDwVGnQvHqXrRPM4Og=="], - "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-C6oAg451/fQT3EGbWHbCQjYTtbyjNO1uzQgMzwyivcHT3GKNEmu1q3UuREhN+HzHAVtv3ivMVK08QlC+PkYw9Q=="], + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.9", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ZzrIFnMYHHCNqSNCsuN6l7wlewBEq0O0BCSBkabJMFXVO51LRUTq71gLP1UxFvmrXElqmPjA5VX7IqC9VpazAQ=="], - "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lj8OMlpPERXrQIHlEQdlXHJoRT52AMpBrgyPYylOhXYq5e/glsEdtOc/kCQlsTdtgN5U0iDbrrolDadvektJGQ=="], + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.8", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-K5h1RkYA6M0Sn61BV5LQs686zqBsSC0sGzL4/Gw4mNnjzrQcGSc6YXfC6CRFNaGydSdv5+M8cb0eNsOGo0OXtQ=="], - "@radix-ui/react-select": ["@radix-ui/react-select@2.2.2", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HjkVHtBkuq+r3zUAZ/CvNWUGKPfuicGDbgtZgiQuFmNcV5F+Tgy24ep2nsAW2nFgvhGPJVqeBZa6KyVN0EyrBA=="], + "@radix-ui/react-select": ["@radix-ui/react-select@2.2.4", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.9", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.6", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.6", "@radix-ui/react-portal": "1.1.8", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-slot": "1.2.2", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/OOm58Gil4Ev5zT8LyVzqfBcij4dTHYdeyuF5lMHZ2bIp0Lk9oETocYiJ5QC0dHekEQnK6L/FNJCceeb4AkZ6Q=="], - "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2fTm6PSiUm8YPq9W0E4reYuv01EE3aFSzt8edBiXqPHshF8N9+Kymt/k0/R+F3dkY5lQyB/zPtrP82phskLi7w=="], + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.6", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Izof3lPpbCfTM7WDta+LRkz31jem890VjEvpVRoWQNKpDUMMVffuyq854XPGP1KYGWWmjmYvHvPFeocWhFCy1w=="], - "@radix-ui/react-slider": ["@radix-ui/react-slider@1.3.2", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oQnqfgSiYkxZ1MrF6672jw2/zZvpB+PJsrIc3Zm1zof1JHf/kj7WhmROw7JahLfOwYQ5/+Ip0rFORgF1tjSiaQ=="], + "@radix-ui/react-slider": ["@radix-ui/react-slider@1.3.4", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Cp6hEmQtRJFci285vkdIJ+HCDLTRDk+25VhFwa1fcubywjMUE3PynBgtN5RLudOgSCYMlT4jizCXdmV+8J7Y2w=="], - "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ=="], - "@radix-ui/react-switch": ["@radix-ui/react-switch@1.2.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7Z8n6L+ifMIIYZ83f28qWSceUpkXuslI2FJ34+kDMTiyj91ENdpdQ7VCidrzj5JfwfZTeano/BnGBbu/jqa5rQ=="], + "@radix-ui/react-switch": ["@radix-ui/react-switch@1.2.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yZCky6XZFnR7pcGonJkr9VyNRu46KcYAbyg1v/gVVCZUr8UJ4x+RpncC27hHtiZ15jC+3WS8Yg/JSgyIHnYYsQ=="], - "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.9", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-KIjtwciYvquiW/wAFkELZCVnaNLBsYNhTNcvl+zfMAbMhRkcvNuCLXDDd22L0j7tagpzVh/QwbFpwAATg7ILPw=="], + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-roving-focus": "1.1.9", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-4FiKSVoXqPP/KfzlB7lwwqoFV6EPwkrrqGp9cUYXjwDYHhvpnqq79P+EPHKcdoTE7Rl8w/+6s9rTlsfXHES9GA=="], - "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ed2mlOmT+tktOsu2NZBK1bCSHh/uqULu1vWOkpQTVq53EoOuZUZw7FInQoDB3uil5wZc2oe0XN9a7uVZB7/6AQ=="], + "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.9", "@radix-ui/react-portal": "1.1.8", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-e/e43mQAwgYs8BY4y9l99xTK6ig1bK2uXsFLOMn9IZ16lAgulSTsotcPHVT2ZlSb/ye6Sllq7IgyDB8dGhpeXQ=="], - "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3SeJxKeO3TO1zVw1Nl++Cp0krYk6zHDHMCUXXVkosIzl6Nxcvb07EerQpyD2wXQSJ5RZajrYAmPaydU8Hk1IyQ=="], + "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-hrpa59m3zDnsa35LrTOH5s/a3iGv/VD+KKQjjiCTo/W4r0XwPpiWQvAv6Xl1nupSoaZeNNxW6sJH9ZydsjKdYQ=="], - "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-toggle": "1.1.6", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-GRaPJhxrRSOqAcmcX3MwRL/SZACkoYdmoY9/sg7Bd5DhBYsB2t4co0NxTvVW8H7jUmieQDQwRtUlZ5Ta8UbgJA=="], + "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.9", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-roving-focus": "1.1.9", "@radix-ui/react-toggle": "1.1.8", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HJ6gXdYVN38q/5KDdCcd+JTuXUyFZBMJbwXaU/82/Gi+V2ps6KpiZ2sQecAeZCV80POGRfkUBdUIj6hIdF6/MQ=="], - "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-separator": "1.1.4", "@radix-ui/react-toggle-group": "1.1.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-cL/3snRskM0f955waP+m4Pmr8+QOPpPsfoY5kM06k7eWP41diOcyjLEqSxpd/K9S7fpsV66yq4R6yN2sMwXc6Q=="], + "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.9", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-roving-focus": "1.1.9", "@radix-ui/react-separator": "1.1.6", "@radix-ui/react-toggle-group": "1.1.9" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-qqGkE9h018CSbpO4ag4rR6ZuOc/A9wM3dUv2jHrkfwUqspuvZmPegBPElVimH0FPWrYn4Alt4QTOptRjbwJnKw=="], - "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-DyW8VVeeMSSLFvAmnVnCwvI3H+1tpJFHT50r+tdOoMse9XqYDBCcyux8u3G2y+LOpt7fPQ6KKH0mhs+ce1+Z5w=="], + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.9", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.6", "@radix-ui/react-portal": "1.1.8", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-slot": "1.2.2", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zYb+9dc9tkoN2JjBDIIPLQtk3gGyz8FMKoqYTb8EMVQ5a5hBcdHPECrsZVI4NpPAUOixhkoqg7Hj5ry5USowfA=="], "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], @@ -361,7 +365,7 @@ "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], - "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.0", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-rQj0aAWOpCdCMRbI6pLQm8r7S2BM3YhTa0SzOYD55k+hJA8oo9J+H+9wLM9oMlZWOX/wJWPTzfDfmZkf7LvCfg=="], + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ORCmRUbNiZIv6uV5mhFrhsIKw4UX/N3syZtyqvry61tbGm4JlgQuSn0hk5TwCARsCjkcnuRkSdCE3xfb+ADHew=="], "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], @@ -373,63 +377,63 @@ "@reffuse/extension-query": ["@reffuse/extension-query@workspace:packages/extension-query"], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.40.0", "", { "os": "android", "cpu": "arm" }, "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.40.2", "", { "os": "android", "cpu": "arm" }, "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.40.0", "", { "os": "android", "cpu": "arm64" }, "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.40.2", "", { "os": "android", "cpu": "arm64" }, "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.40.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.40.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.40.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.40.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.40.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.40.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.40.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.40.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.40.0", "", { "os": "linux", "cpu": "arm" }, "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.40.2", "", { "os": "linux", "cpu": "arm" }, "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.40.0", "", { "os": "linux", "cpu": "arm" }, "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.40.2", "", { "os": "linux", "cpu": "arm" }, "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.40.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.40.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.40.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.40.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg=="], - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg=="], + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.40.2", "", { "os": "linux", "cpu": "none" }, "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw=="], - "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.40.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw=="], + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.40.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.40.2", "", { "os": "linux", "cpu": "none" }, "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.40.2", "", { "os": "linux", "cpu": "none" }, "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.40.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.40.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.40.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.40.2", "", { "os": "linux", "cpu": "x64" }, "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.40.0", "", { "os": "linux", "cpu": "x64" }, "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.40.2", "", { "os": "linux", "cpu": "x64" }, "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.40.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.40.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.40.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.40.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.40.0", "", { "os": "win32", "cpu": "x64" }, "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.40.2", "", { "os": "win32", "cpu": "x64" }, "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA=="], "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], "@tanstack/history": ["@tanstack/history@1.115.0", "", {}, "sha512-K7JJNrRVvyjAVnbXOH2XLRhFXDkeP54Kt2P4FR1Kl2KDGlIbkua5VqZQD2rot3qaDrpufyUa63nuLai1kOLTsQ=="], - "@tanstack/react-router": ["@tanstack/react-router@1.117.1", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "1.117.1", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-w4TwKzPZgUM9m+yCvaWa4dw0kVn15Cy9iZivkakQaYU2psqKE6q0OXUrIejRMThkerqK64OZeAKtPToyT8K9bA=="], + "@tanstack/react-router": ["@tanstack/react-router@1.120.2", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "1.119.0", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-CNduh/O3miW6A/WDMd2cfca8D8x+kVJTYwG5fMaBfcEF/bfjneDnEWXsmKLMdB2iLc6miaRQu66ryPSMdIBUAw=="], - "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.117.1", "", { "dependencies": { "@tanstack/router-devtools-core": "^1.117.1", "solid-js": "^1.9.5" }, "peerDependencies": { "@tanstack/react-router": "^1.117.1", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-kPrZzvumawTRPQjVBazAmZKdQcTRGnGwhN+amxwKiRwyiw7mjuW7rwkqtcwTT+ASPIh1mKKbvzoDQvE5IAgZ8g=="], + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.120.2", "", { "dependencies": { "@tanstack/router-devtools-core": "^1.119.0", "solid-js": "^1.9.5" }, "peerDependencies": { "@tanstack/react-router": "^1.120.2", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-89qY5pKdIN6r5G0pHP92mLvorzd7rUlHjvCkjNYOyYduxGQ8a703Y7Fp/RqXibwhjvZcet6BR2IrEhIqg9Yjhw=="], "@tanstack/react-store": ["@tanstack/react-store@0.7.0", "", { "dependencies": { "@tanstack/store": "0.7.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng=="], - "@tanstack/router-core": ["@tanstack/router-core@1.117.1", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/store": "^0.7.0", "tiny-invariant": "^1.3.3" } }, "sha512-z7njzO6yn8kwJP0fDh43mXuO/zlYs0cexjd0M+0RKf6W4mfMuPvFAiUeD4CZEk+kBLgZxtaJxBUkhpZCN8Zecw=="], + "@tanstack/router-core": ["@tanstack/router-core@1.119.0", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/store": "^0.7.0", "tiny-invariant": "^1.3.3" } }, "sha512-3dZYP5cCq3jJYgnRDzKR3w4sYzrXP5sw1st303ye87VV26r31I8UaIuUEs7kiJaxgWBvqHglWCiygBWQODZXVw=="], - "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.117.1", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.117.1", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" }, "optionalPeers": ["csstype"] }, "sha512-C4h6u8c2AkBShPv1OoKK3JEsrn2Quf2LFy7tH6aJFDxFa+JL1w37NDDxVC8/JEtF/8dQYV1Mmocvs78mpUVFXA=="], + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.119.0", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.119.0", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" }, "optionalPeers": ["csstype"] }, "sha512-CH2Hx4J2UOigFtKR0anQfNiWQfidV2S7AZafkeo/S885IxwoFK7xXWzYxNbUhCDJC2tsBJ+XKjgxeBv5wGi62Q=="], - "@tanstack/router-generator": ["@tanstack/router-generator@1.117.1", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.115.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.2" }, "peerDependencies": { "@tanstack/react-router": "^1.117.1" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-1V6Y8TibqnMpwizxchzJgE7FUhbSlAIvnrnUwmQhvFhMFtYOdvNkrdZzBD625fcTA/jLs9zUtSeWyiRMKTSPFQ=="], + "@tanstack/router-generator": ["@tanstack/router-generator@1.120.2", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.115.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.2" }, "peerDependencies": { "@tanstack/react-router": "^1.120.2" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-rI+hQjUtsAZs5K2292zM6OE/fHAVRZxejAkrLlaQlunphqJYtHBizXk15SP9QsP3i+QvS1D8YnioMPvSlVPEOw=="], - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.117.2", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.117.1", "@tanstack/router-generator": "^1.117.1", "@tanstack/router-utils": "^1.115.0", "@tanstack/virtual-file-routes": "^1.115.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.117.1", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-QgiFW4HVnxYbMz8AUg+IZdPBqZx7u02D4j71uw6q+aWEDU5qYLB0RzdtBRvvb2cB7ZSzXLGbtDqiMN5mHcww2w=="], + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.120.2", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.119.0", "@tanstack/router-generator": "^1.120.2", "@tanstack/router-utils": "^1.115.0", "@tanstack/virtual-file-routes": "^1.115.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.120.2", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-LVwvd/QKFrxtsKfm1Oiv6+NzAB79hcuhlbu14NwmRfdexPYmfjvJJPK0E3IlLmh/mRlEHmfYajutwuqvBONM9w=="], "@tanstack/router-utils": ["@tanstack/router-utils@1.115.0", "", { "dependencies": { "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "ansis": "^3.11.0", "diff": "^7.0.0" } }, "sha512-Dng4y+uLR9b5zPGg7dHReHOTHQa6x+G6nCoZshsDtWrYsrdCcJEtLyhwZ5wG8OyYS6dVr/Cn+E5Bd2b6BhJ89w=="], @@ -457,28 +461,30 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/react": ["@types/react@19.1.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw=="], + "@types/react": ["@types/react@19.1.3", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ=="], - "@types/react-dom": ["@types/react-dom@19.1.2", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw=="], + "@types/react-dom": ["@types/react-dom@19.1.3", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.31.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.31.0", "@typescript-eslint/type-utils": "8.31.0", "@typescript-eslint/utils": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.32.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/type-utils": "8.32.0", "@typescript-eslint/utils": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.31.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.31.0", "@typescript-eslint/types": "8.31.0", "@typescript-eslint/typescript-estree": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.32.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/types": "8.32.0", "@typescript-eslint/typescript-estree": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.31.0", "", { "dependencies": { "@typescript-eslint/types": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0" } }, "sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0" } }, "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.31.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.31.0", "@typescript-eslint/utils": "8.31.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.32.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.32.0", "@typescript-eslint/utils": "8.32.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.31.0", "", {}, "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.31.0", "", { "dependencies": { "@typescript-eslint/types": "8.31.0", "@typescript-eslint/visitor-keys": "8.31.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.31.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.31.0", "@typescript-eslint/types": "8.31.0", "@typescript-eslint/typescript-estree": "8.31.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/types": "8.32.0", "@typescript-eslint/typescript-estree": "8.32.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.31.0", "", { "dependencies": { "@typescript-eslint/types": "8.31.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@4.4.1", "", { "dependencies": { "@babel/core": "^7.26.10", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w=="], + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], @@ -501,15 +507,23 @@ "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + "body-parser": ["body-parser@2.2.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg=="], + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], + "browserslist": ["browserslist@4.24.5", "", { "dependencies": { "caniuse-lite": "^1.0.30001716", "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001715", "", {}, "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001717", "", {}, "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -525,8 +539,18 @@ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], @@ -535,23 +559,39 @@ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], "diff": ["diff@7.0.0", "", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="], - "effect": ["effect@3.14.14", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-Dbt9MAZHqM1UAip41RrZnypzLa/hJJGHXIVS9MbgU0L+UoJTFXToWIwWmHY/OcaQVNlf/1YxpMrD3xtxoDP/qw=="], + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - "electron-to-chromium": ["electron-to-chromium@1.5.143", "", {}, "sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g=="], + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "esbuild": ["esbuild@0.25.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.3", "@esbuild/android-arm": "0.25.3", "@esbuild/android-arm64": "0.25.3", "@esbuild/android-x64": "0.25.3", "@esbuild/darwin-arm64": "0.25.3", "@esbuild/darwin-x64": "0.25.3", "@esbuild/freebsd-arm64": "0.25.3", "@esbuild/freebsd-x64": "0.25.3", "@esbuild/linux-arm": "0.25.3", "@esbuild/linux-arm64": "0.25.3", "@esbuild/linux-ia32": "0.25.3", "@esbuild/linux-loong64": "0.25.3", "@esbuild/linux-mips64el": "0.25.3", "@esbuild/linux-ppc64": "0.25.3", "@esbuild/linux-riscv64": "0.25.3", "@esbuild/linux-s390x": "0.25.3", "@esbuild/linux-x64": "0.25.3", "@esbuild/netbsd-arm64": "0.25.3", "@esbuild/netbsd-x64": "0.25.3", "@esbuild/openbsd-arm64": "0.25.3", "@esbuild/openbsd-x64": "0.25.3", "@esbuild/sunos-x64": "0.25.3", "@esbuild/win32-arm64": "0.25.3", "@esbuild/win32-ia32": "0.25.3", "@esbuild/win32-x64": "0.25.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q=="], + "effect": ["effect@3.14.21", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-TKR7zfWcuZgEdWd+oIGA8LdREj/c+1Q0wz4pWqQtYT7VHnkW/QQEYCXgrDI5dT6lJgRTgyQAC1bAnpAf6MdjIA=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.151", "", {}, "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.25.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.25.1", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ=="], + "eslint": ["eslint@9.26.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.26.0", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "zod": "^3.24.2" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ=="], "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], @@ -571,6 +611,16 @@ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "eventsource": ["eventsource@3.0.6", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA=="], + + "eventsource-parser": ["eventsource-parser@3.0.1", "", {}, "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA=="], + + "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], + + "express-rate-limit": ["express-rate-limit@7.5.0", "", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="], + "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], @@ -589,6 +639,8 @@ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + "finalhandler": ["finalhandler@2.1.0", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="], + "find-my-way-ts": ["find-my-way-ts@0.1.5", "", {}, "sha512-4GOTMrpGQVzsCH2ruUn2vmwzV/02zF4q+ybhCIrw/Rkt3L8KWcycdC6aJMctJzwN4fXD4SD5F/4B9Sksh5rE0A=="], "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], @@ -597,30 +649,54 @@ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@16.0.0", "", {}, "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A=="], + "globals": ["globals@16.1.0", "", {}, "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g=="], "goober": ["goober@2.1.16", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g=="], + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -629,6 +705,8 @@ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], @@ -655,12 +733,22 @@ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "lucide-react": ["lucide-react@0.503.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-HGGkdlPWQ0vTF8jJ5TdIqhQXZi6uh3LnNgfZ8MHiuxFfX3RZeA79r2MW2tHAZKlAVfoNE8esm3p+O6VkIvpj6w=="], + "lucide-react": ["lucide-react@0.508.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-gcP16PnexqtOFrTtv98kVsGzTfnbPekzZiQfByi2S89xfk7E/4uKE1USZqccIp58v42LqkO7MuwpCqshwSrJCg=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "mobx": ["mobx@6.13.7", "", {}, "sha512-aChaVU/DO5aRPmk1GX8L+whocagUUpBQqoPtJk+cm7UOXUk87J4PeWCh6nNmTTIfEhiR9DI/+FnA8dln/hTK7g=="], @@ -677,6 +765,8 @@ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], @@ -687,6 +777,14 @@ "npm-sort": ["npm-sort@0.0.4", "", { "bin": { "npm-sort": "./index.js" } }, "sha512-S5Id/3Jvr7Cf/QnWjRteprngERCBhhEFOM+wMhUrAYP060/HUBC1aL5GoXS3xITlgacJCWaSmP4HQaAt91nNYQ=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], @@ -695,27 +793,41 @@ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + "path-to-regexp": ["path-to-regexp@8.2.0", "", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="], + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "pkce-challenge": ["pkce-challenge@5.0.0", "", {}, "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ=="], + "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - "radix-ui": ["radix-ui@1.3.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-accessible-icon": "1.1.4", "@radix-ui/react-accordion": "1.2.8", "@radix-ui/react-alert-dialog": "1.1.11", "@radix-ui/react-arrow": "1.1.4", "@radix-ui/react-aspect-ratio": "1.1.4", "@radix-ui/react-avatar": "1.1.7", "@radix-ui/react-checkbox": "1.2.3", "@radix-ui/react-collapsible": "1.1.8", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.12", "@radix-ui/react-dialog": "1.1.11", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.7", "@radix-ui/react-dropdown-menu": "2.1.12", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.4", "@radix-ui/react-form": "0.1.4", "@radix-ui/react-hover-card": "1.1.11", "@radix-ui/react-label": "2.1.4", "@radix-ui/react-menu": "2.1.12", "@radix-ui/react-menubar": "1.1.12", "@radix-ui/react-navigation-menu": "1.2.10", "@radix-ui/react-one-time-password-field": "0.1.4", "@radix-ui/react-popover": "1.1.11", "@radix-ui/react-popper": "1.2.4", "@radix-ui/react-portal": "1.1.6", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-progress": "1.1.4", "@radix-ui/react-radio-group": "1.3.4", "@radix-ui/react-roving-focus": "1.1.7", "@radix-ui/react-scroll-area": "1.2.6", "@radix-ui/react-select": "2.2.2", "@radix-ui/react-separator": "1.1.4", "@radix-ui/react-slider": "1.3.2", "@radix-ui/react-slot": "1.2.0", "@radix-ui/react-switch": "1.2.2", "@radix-ui/react-tabs": "1.1.9", "@radix-ui/react-toast": "1.2.11", "@radix-ui/react-toggle": "1.1.6", "@radix-ui/react-toggle-group": "1.1.7", "@radix-ui/react-toolbar": "1.1.7", "@radix-ui/react-tooltip": "1.2.4", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-uHJD4yRGjxbEWhkVU+w9d8d+X6HUlmbesHGsE9tRWKX62FqDD3Z3hfEtVS9W+DpZAPvKSCLfz03O7un8xZT3pg=="], + "radix-ui": ["radix-ui@1.4.1", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-accessible-icon": "1.1.6", "@radix-ui/react-accordion": "1.2.10", "@radix-ui/react-alert-dialog": "1.1.13", "@radix-ui/react-arrow": "1.1.6", "@radix-ui/react-aspect-ratio": "1.1.6", "@radix-ui/react-avatar": "1.1.9", "@radix-ui/react-checkbox": "1.3.1", "@radix-ui/react-collapsible": "1.1.10", "@radix-ui/react-collection": "1.1.6", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.14", "@radix-ui/react-dialog": "1.1.13", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.9", "@radix-ui/react-dropdown-menu": "2.1.14", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.6", "@radix-ui/react-form": "0.1.6", "@radix-ui/react-hover-card": "1.1.13", "@radix-ui/react-label": "2.1.6", "@radix-ui/react-menu": "2.1.14", "@radix-ui/react-menubar": "1.1.14", "@radix-ui/react-navigation-menu": "1.2.12", "@radix-ui/react-one-time-password-field": "0.1.6", "@radix-ui/react-password-toggle-field": "0.1.1", "@radix-ui/react-popover": "1.1.13", "@radix-ui/react-popper": "1.2.6", "@radix-ui/react-portal": "1.1.8", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-progress": "1.1.6", "@radix-ui/react-radio-group": "1.3.6", "@radix-ui/react-roving-focus": "1.1.9", "@radix-ui/react-scroll-area": "1.2.8", "@radix-ui/react-select": "2.2.4", "@radix-ui/react-separator": "1.1.6", "@radix-ui/react-slider": "1.3.4", "@radix-ui/react-slot": "1.2.2", "@radix-ui/react-switch": "1.2.4", "@radix-ui/react-tabs": "1.1.11", "@radix-ui/react-toast": "1.2.13", "@radix-ui/react-toggle": "1.1.8", "@radix-ui/react-toggle-group": "1.1.9", "@radix-ui/react-toolbar": "1.1.9", "@radix-ui/react-tooltip": "1.2.6", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-xG1aeAgvAiVglxHXMpHyk7RqLGnc8VnDUZvzpE8rZ8GAhuGeNm/+7YbIwCV+rKKRpsSgxdnvfUObQidK2EnTzw=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@3.0.0", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g=="], "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], @@ -741,26 +853,48 @@ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rollup": ["rollup@4.40.0", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.40.0", "@rollup/rollup-android-arm64": "4.40.0", "@rollup/rollup-darwin-arm64": "4.40.0", "@rollup/rollup-darwin-x64": "4.40.0", "@rollup/rollup-freebsd-arm64": "4.40.0", "@rollup/rollup-freebsd-x64": "4.40.0", "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", "@rollup/rollup-linux-arm-musleabihf": "4.40.0", "@rollup/rollup-linux-arm64-gnu": "4.40.0", "@rollup/rollup-linux-arm64-musl": "4.40.0", "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", "@rollup/rollup-linux-riscv64-gnu": "4.40.0", "@rollup/rollup-linux-riscv64-musl": "4.40.0", "@rollup/rollup-linux-s390x-gnu": "4.40.0", "@rollup/rollup-linux-x64-gnu": "4.40.0", "@rollup/rollup-linux-x64-musl": "4.40.0", "@rollup/rollup-win32-arm64-msvc": "4.40.0", "@rollup/rollup-win32-ia32-msvc": "4.40.0", "@rollup/rollup-win32-x64-msvc": "4.40.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w=="], + "rollup": ["rollup@4.40.2", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.40.2", "@rollup/rollup-android-arm64": "4.40.2", "@rollup/rollup-darwin-arm64": "4.40.2", "@rollup/rollup-darwin-x64": "4.40.2", "@rollup/rollup-freebsd-arm64": "4.40.2", "@rollup/rollup-freebsd-x64": "4.40.2", "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", "@rollup/rollup-linux-arm-musleabihf": "4.40.2", "@rollup/rollup-linux-arm64-gnu": "4.40.2", "@rollup/rollup-linux-arm64-musl": "4.40.2", "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", "@rollup/rollup-linux-riscv64-gnu": "4.40.2", "@rollup/rollup-linux-riscv64-musl": "4.40.2", "@rollup/rollup-linux-s390x-gnu": "4.40.2", "@rollup/rollup-linux-x64-gnu": "4.40.2", "@rollup/rollup-linux-x64-musl": "4.40.2", "@rollup/rollup-win32-arm64-msvc": "4.40.2", "@rollup/rollup-win32-ia32-msvc": "4.40.2", "@rollup/rollup-win32-x64-msvc": "4.40.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg=="], + + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "seroval": ["seroval@1.2.1", "", {}, "sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw=="], + "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], - "seroval-plugins": ["seroval-plugins@1.2.1", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw=="], + "seroval": ["seroval@1.3.0", "", {}, "sha512-4tYQDy3HVM0JjJ1CfDK3K8FhBKIDDri27oc2AyabuuHfQw6/yTDPp2Abt1h2cNtf1R0T+7AQYAzPhUgqXztaXw=="], + + "seroval-plugins": ["seroval-plugins@1.3.0", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-FFu/UE3uA8L1vj0CXXZo2Nlh10MtYoOs0G//ptwlQMjfPFSeIVYUNy0zewfV8iM0CrOebAfHEG6J3xA9c+lsaQ=="], + + "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "solid-js": ["solid-js@1.9.5", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", "seroval-plugins": "^1.1.0" } }, "sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw=="], + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "solid-js": ["solid-js@1.9.6", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "^1.1.0", "seroval-plugins": "^1.1.0" } }, "sha512-PoasAJvLk60hRtOTe9ulvALOdLjjqxuxcGZRolBQqxOnXrBXHGzqMT4ijNhGsDAYdOgEa8ZYaAE94PSldrFSkA=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -773,33 +907,39 @@ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="], + "tsx": ["tsx@4.19.4", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q=="], - "turbo": ["turbo@2.5.2", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.2", "turbo-darwin-arm64": "2.5.2", "turbo-linux-64": "2.5.2", "turbo-linux-arm64": "2.5.2", "turbo-windows-64": "2.5.2", "turbo-windows-arm64": "2.5.2" }, "bin": { "turbo": "bin/turbo" } }, "sha512-Qo5lfuStr6LQh3sPQl7kIi243bGU4aHGDQJUf6ylAdGwks30jJFloc9NYHP7Y373+gGU9OS0faA4Mb5Sy8X9Xw=="], + "turbo": ["turbo@2.5.3", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.3", "turbo-darwin-arm64": "2.5.3", "turbo-linux-64": "2.5.3", "turbo-linux-arm64": "2.5.3", "turbo-windows-64": "2.5.3", "turbo-windows-arm64": "2.5.3" }, "bin": { "turbo": "bin/turbo" } }, "sha512-iHuaNcq5GZZnr3XDZNuu2LSyCzAOPwDuo5Qt+q64DfsTP1i3T2bKfxJhni2ZQxsvAoxRbuUK5QetJki4qc5aYA=="], - "turbo-darwin-64": ["turbo-darwin-64@2.5.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-2aIl0Sx230nLk+Cg2qSVxvPOBWCZpwKNuAMKoROTvWKif6VMpkWWiR9XEPoz7sHeLmCOed4GYGMjL1bqAiIS/g=="], + "turbo-darwin-64": ["turbo-darwin-64@2.5.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-YSItEVBUIvAGPUDpAB9etEmSqZI3T6BHrkBkeSErvICXn3dfqXUfeLx35LfptLDEbrzFUdwYFNmt8QXOwe9yaw=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MrFYhK/jYu8N6QlqZtqSHi3e4QVxlzqU3ANHTKn3/tThuwTLbNHEvzBPWSj5W7nZcM58dCqi6gYrfRz6bJZyAA=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5PefrwHd42UiZX7YA9m1LPW6x9YJBDErXmsegCkVp+GjmWrADfEOxpFrGQNonH3ZMj77WZB2PVE5Aw3gA+IOhg=="], - "turbo-linux-64": ["turbo-linux-64@2.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-LxNqUE2HmAJQ/8deoLgMUDzKxd5bKxqH0UBogWa+DF+JcXhtze3UTMr6lEr0dEofdsEUYK1zg8FRjglmwlN5YA=="], + "turbo-linux-64": ["turbo-linux-64@2.5.3", "", { "os": "linux", "cpu": "x64" }, "sha512-M9xigFgawn5ofTmRzvjjLj3Lqc05O8VHKuOlWNUlnHPUltFquyEeSkpQNkE/vpPdOR14AzxqHbhhxtfS4qvb1w=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-0MI1Ao1q8zhd+UUbIEsrM+yLq1BsrcJQRGZkxIsHFlGp7WQQH1oR3laBgfnUCNdCotCMD6w4moc9pUbXdOR3bg=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.5.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-auJRbYZ8SGJVqvzTikpg1bsRAsiI9Tk0/SDkA5Xgg0GdiHDH/BOzv1ZjDE2mjmlrO/obr19Dw+39OlMhwLffrw=="], - "turbo-windows-64": ["turbo-windows-64@2.5.2", "", { "os": "win32", "cpu": "x64" }, "sha512-hOLcbgZzE5ttACHHyc1ajmWYq4zKT42IC3G6XqgiXxMbS+4eyVYTL+7UvCZBd3Kca1u4TLQdLQjeO76zyDJc2A=="], + "turbo-windows-64": ["turbo-windows-64@2.5.3", "", { "os": "win32", "cpu": "x64" }, "sha512-arLQYohuHtIEKkmQSCU9vtrKUg+/1TTstWB9VYRSsz+khvg81eX6LYHtXJfH/dK7Ho6ck+JaEh5G+QrE1jEmCQ=="], - "turbo-windows-arm64": ["turbo-windows-arm64@2.5.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-fMU41ABhSLa18H8V3Z7BMCGynQ8x+wj9WyBMvWm1jeyRKgkvUYJsO2vkIsy8m0vrwnIeVXKOIn6eSe1ddlBVqw=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.5.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3JPn66HAynJ0gtr6H+hjY4VHpu1RPKcEwGATvGUTmLmYSYBQieVlnGDRMMoYN066YfyPqnNGCfhYbXfH92Cm0g=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@4.40.1", "", {}, "sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA=="], + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], - "typescript-eslint": ["typescript-eslint@8.31.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.31.0", "@typescript-eslint/parser": "8.31.0", "@typescript-eslint/utils": "8.31.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-u+93F0sB0An8WEAPtwxVhFby573E8ckdjwUUQUj9QA4v8JAvgtoDdIyYR3XFwFHq2W1KJ1AurwJCO+w+Y1ixyQ=="], + "typescript-eslint": ["typescript-eslint@8.32.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.0", "@typescript-eslint/parser": "8.32.0", "@typescript-eslint/utils": "8.32.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], "unplugin": ["unplugin@2.3.2", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w=="], @@ -813,7 +953,9 @@ "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], - "vite": ["vite@6.3.3", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw=="], + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], @@ -821,11 +963,15 @@ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zod": ["zod@3.24.3", "", {}, "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg=="], + "zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="], "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], diff --git a/package.json b/package.json index 8e3e2de..bf6324c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/monorepo", - "packageManager": "bun@1.2.10", + "packageManager": "bun@1.2.12", "private": true, "workspaces": [ "./packages/*" @@ -17,7 +17,7 @@ "devDependencies": { "npm-check-updates": "^18.0.1", "npm-sort": "^0.0.4", - "turbo": "^2.5.2", + "turbo": "^2.5.3", "typescript": "^5.8.3" } } diff --git a/packages/example/package.json b/packages/example/package.json index 983cce2..f5621f1 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -11,41 +11,41 @@ "preview": "vite preview" }, "devDependencies": { - "@eslint/js": "^9.25.1", - "@tanstack/react-router": "^1.117.1", - "@tanstack/react-router-devtools": "^1.117.1", - "@tanstack/router-plugin": "^1.117.2", + "@eslint/js": "^9.26.0", + "@tanstack/react-router": "^1.120.2", + "@tanstack/react-router-devtools": "^1.120.2", + "@tanstack/router-plugin": "^1.120.2", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.2", + "@types/react": "^19.1.3", + "@types/react-dom": "^19.1.3", "@vitejs/plugin-react": "^4.4.1", - "eslint": "^9.25.1", + "eslint": "^9.26.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", - "globals": "^16.0.0", + "globals": "^16.1.0", "react": "^19.1.0", "react-dom": "^19.1.0", - "typescript-eslint": "^8.31.0", - "vite": "^6.3.3" + "typescript-eslint": "^8.32.0", + "vite": "^6.3.5" }, "dependencies": { - "@effect/platform": "^0.80.14", - "@effect/platform-browser": "^0.60.5", + "@effect/platform": "^0.80.21", + "@effect/platform-browser": "^0.60.12", "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", "@typed/async-data": "^0.13.1", "@typed/id": "^0.17.2", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.14.14", - "lucide-react": "^0.503.0", + "effect": "^3.14.21", + "lucide-react": "^0.508.0", "mobx": "^6.13.7", "reffuse": "workspace:*" }, "overrides": { - "effect": "^3.14.14", - "@effect/platform": "^0.80.14", - "@effect/platform-browser": "^0.60.5", + "effect": "^3.14.21", + "@effect/platform": "^0.80.21", + "@effect/platform-browser": "^0.60.12", "@typed/lazy-ref": "^0.3.3", "@typed/async-data": "^0.13.1" } -- 2.49.1 From 44fc6bbbc46e048ffdb2d60f3ea8bfb3426dcbdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 10 May 2025 05:26:15 +0200 Subject: [PATCH 283/326] Stream tests --- packages/example/src/routes/tests.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 9b859ea..0e609af 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -1,8 +1,8 @@ import { R } from "@/reffuse" -import { Button, Flex } from "@radix-ui/themes" +import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" -import { Console, Effect, Scope } from "effect" +import { Console, Effect, Option, Scope } from "effect" import { useEffect, useState } from "react" @@ -21,6 +21,9 @@ function RouteComponent() { Effect.tap(v => Effect.sync(() => setUuid(v))) ), []) + const uuidStream = R.useStreamFromReactiveValues([uuid]) + const uuidStreamLatestValue = R.useSubscribeStream(uuidStream) + const scope = R.useScope([uuid]) useEffect(() => Effect.addFinalizer(() => Console.log("Scope cleanup!")).pipe( @@ -32,6 +35,12 @@ function RouteComponent() { return ( + + {Option.match(uuidStreamLatestValue, { + onSome: ([v]) => v, + onNone: () => <>, + })} + ) } -- 2.49.1 From 08af31f0b9c688eda129b63d7f07a0f26db7c496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 10 May 2025 05:30:13 +0200 Subject: [PATCH 284/326] Fix --- packages/example/src/routes/tests.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 0e609af..51ce6a5 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -33,7 +33,8 @@ function RouteComponent() { ), [scope, runSync]) return ( - + + {uuid} {Option.match(uuidStreamLatestValue, { -- 2.49.1 From 59b7115d19f7f7f5b72da35f68ea0b1d749df94b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 10 May 2025 05:33:14 +0200 Subject: [PATCH 285/326] Fix --- packages/example/src/routes/tests.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 51ce6a5..5552ffb 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -22,7 +22,7 @@ function RouteComponent() { ), []) const uuidStream = R.useStreamFromReactiveValues([uuid]) - const uuidStreamLatestValue = R.useSubscribeStream(uuidStream) + const [uuidStreamLatestValue, pullUuidStream] = R.usePullStream(uuidStream) const scope = R.useScope([uuid]) @@ -42,6 +42,7 @@ function RouteComponent() { onNone: () => <>, })} + ) } -- 2.49.1 From e5a7fe8ad6c74679bd996dcd7eec303226c47437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 11 May 2025 03:17:35 +0200 Subject: [PATCH 286/326] useSubscribeStream --- packages/example/src/routes/tests.tsx | 4 ++-- packages/reffuse/src/ReffuseNamespace.ts | 29 ++++++++++++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 5552ffb..985cee9 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -22,7 +22,7 @@ function RouteComponent() { ), []) const uuidStream = R.useStreamFromReactiveValues([uuid]) - const [uuidStreamLatestValue, pullUuidStream] = R.usePullStream(uuidStream) + const uuidStreamLatestValue = R.useSubscribeStream(uuidStream, true) const scope = R.useScope([uuid]) @@ -42,7 +42,7 @@ function RouteComponent() { onNone: () => <>, })} - + {/* */} ) } diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 0250fdc..02a4a93 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -1,4 +1,4 @@ -import { Chunk, type Context, Effect, ExecutionStrategy, Exit, type Fiber, flow, type Layer, Match, Option, pipe, Pipeable, PubSub, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { type Cause, Chunk, type Context, Effect, ExecutionStrategy, Exit, type Fiber, flow, Function, type Layer, Match, Option, pipe, Pipeable, PubSub, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -501,6 +501,11 @@ export abstract class ReffuseNamespace { this: ReffuseNamespace, stream: Stream.Stream, ): Option.Option + useSubscribeStream( + this: ReffuseNamespace, + stream: Stream.Stream, + pullLatestValue: true, + ): Option.Some useSubscribeStream( this: ReffuseNamespace, stream: Stream.Stream, @@ -509,11 +514,25 @@ export abstract class ReffuseNamespace { useSubscribeStream( this: ReffuseNamespace, stream: Stream.Stream, - initialValue?: () => Effect.Effect, + pullLatestOrInitialValue?: true | (() => Effect.Effect), ): Option.Option { - const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( - () => initialValue - ? Effect.map(initialValue(), Option.some) + const [reactStateValue, setReactStateValue] = React.useState(this.useMemo< + Option.Option, + Cause.NoSuchElementException | Cause.Cause> | IE, + R + >( + () => pullLatestOrInitialValue + ? Function.isFunction(pullLatestOrInitialValue) + ? Effect.map(pullLatestOrInitialValue(), Option.some) + : Stream.toQueueOfElements(stream).pipe( + Effect.flatMap(Queue.takeAll), + Effect.flatMap(Chunk.last), + Effect.flatMap(Exit.matchEffect({ + onSuccess: v => Effect.succeed(Option.some(v)), + onFailure: Effect.fail, + })), + Effect.scoped, + ) : Effect.succeed(Option.none()), [], { doNotReExecuteOnRuntimeOrContextChange: true }, -- 2.49.1 From 85b41bda9f05c3c1d1f96aa976c80f344ebc9fbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 11 May 2025 06:48:58 +0200 Subject: [PATCH 287/326] Tests --- packages/example/src/routes/tests.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 985cee9..cb9b4c5 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -2,8 +2,8 @@ import { R } from "@/reffuse" import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" -import { Console, Effect, Option, Scope } from "effect" -import { useEffect, useState } from "react" +import { Console, Effect, Option, Random, Scope, Stream } from "effect" +import { useEffect, useMemo, useState } from "react" const makeUuid = Effect.provide(makeUuid4, GetRandomValues.CryptoRandom) @@ -22,7 +22,8 @@ function RouteComponent() { ), []) const uuidStream = R.useStreamFromReactiveValues([uuid]) - const uuidStreamLatestValue = R.useSubscribeStream(uuidStream, true) + const stream2 = useMemo(() => Stream.repeatEffect(Random.nextInt), []) + const uuidStreamLatestValue = R.useSubscribeStream(stream2, true) const scope = R.useScope([uuid]) @@ -38,7 +39,7 @@ function RouteComponent() { {Option.match(uuidStreamLatestValue, { - onSome: ([v]) => v, + onSome: v => v, onNone: () => <>, })} -- 2.49.1 From 5f4087aa404220d0c813c7e51823018d98cff482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 11 May 2025 07:04:14 +0200 Subject: [PATCH 288/326] Cleanup --- packages/example/src/routes/tests.tsx | 7 +++--- packages/reffuse/src/ReffuseNamespace.ts | 29 ++++-------------------- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index cb9b4c5..0ffe0c1 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -2,8 +2,8 @@ import { R } from "@/reffuse" import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" import { GetRandomValues, makeUuid4 } from "@typed/id" -import { Console, Effect, Option, Random, Scope, Stream } from "effect" -import { useEffect, useMemo, useState } from "react" +import { Console, Effect, Option, Scope } from "effect" +import { useEffect, useState } from "react" const makeUuid = Effect.provide(makeUuid4, GetRandomValues.CryptoRandom) @@ -22,8 +22,7 @@ function RouteComponent() { ), []) const uuidStream = R.useStreamFromReactiveValues([uuid]) - const stream2 = useMemo(() => Stream.repeatEffect(Random.nextInt), []) - const uuidStreamLatestValue = R.useSubscribeStream(stream2, true) + const uuidStreamLatestValue = R.useSubscribeStream(uuidStream) const scope = R.useScope([uuid]) diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 02a4a93..0250fdc 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -1,4 +1,4 @@ -import { type Cause, Chunk, type Context, Effect, ExecutionStrategy, Exit, type Fiber, flow, Function, type Layer, Match, Option, pipe, Pipeable, PubSub, Queue, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { Chunk, type Context, Effect, ExecutionStrategy, Exit, type Fiber, flow, type Layer, Match, Option, pipe, Pipeable, PubSub, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -501,11 +501,6 @@ export abstract class ReffuseNamespace { this: ReffuseNamespace, stream: Stream.Stream, ): Option.Option - useSubscribeStream( - this: ReffuseNamespace, - stream: Stream.Stream, - pullLatestValue: true, - ): Option.Some useSubscribeStream( this: ReffuseNamespace, stream: Stream.Stream, @@ -514,25 +509,11 @@ export abstract class ReffuseNamespace { useSubscribeStream( this: ReffuseNamespace, stream: Stream.Stream, - pullLatestOrInitialValue?: true | (() => Effect.Effect), + initialValue?: () => Effect.Effect, ): Option.Option { - const [reactStateValue, setReactStateValue] = React.useState(this.useMemo< - Option.Option, - Cause.NoSuchElementException | Cause.Cause> | IE, - R - >( - () => pullLatestOrInitialValue - ? Function.isFunction(pullLatestOrInitialValue) - ? Effect.map(pullLatestOrInitialValue(), Option.some) - : Stream.toQueueOfElements(stream).pipe( - Effect.flatMap(Queue.takeAll), - Effect.flatMap(Chunk.last), - Effect.flatMap(Exit.matchEffect({ - onSuccess: v => Effect.succeed(Option.some(v)), - onFailure: Effect.fail, - })), - Effect.scoped, - ) + const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( + () => initialValue + ? Effect.map(initialValue(), Option.some) : Effect.succeed(Option.none()), [], { doNotReExecuteOnRuntimeOrContextChange: true }, -- 2.49.1 From 9ccabbb627447c83d3a637d89901668b7e7f1cbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 11 May 2025 07:10:38 +0200 Subject: [PATCH 289/326] Tests --- packages/example/src/routes/tests.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index 0ffe0c1..ac58463 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -15,6 +15,7 @@ export const Route = createFileRoute("/tests")({ function RouteComponent() { const runSync = R.useRunSync() + const runPromise = R.useRunPromise() const [uuid, setUuid] = useState(R.useMemo(() => makeUuid, [])) const generateUuid = R.useCallbackSync(() => makeUuid.pipe( @@ -22,7 +23,7 @@ function RouteComponent() { ), []) const uuidStream = R.useStreamFromReactiveValues([uuid]) - const uuidStreamLatestValue = R.useSubscribeStream(uuidStream) + const [uuidStreamLatestValue, pullUuidStream] = R.usePullStream(uuidStream) const scope = R.useScope([uuid]) @@ -38,11 +39,11 @@ function RouteComponent() { {Option.match(uuidStreamLatestValue, { - onSome: v => v, + onSome: ([v]) => v, onNone: () => <>, })} - {/* */} + ) } -- 2.49.1 From 6f65574ebdd1e65d216e705e80c3d8ff767a22b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 11 May 2025 08:11:03 +0200 Subject: [PATCH 290/326] Cleanup --- packages/example/src/routes/streams/pull.tsx | 21 ++++++--- packages/example/src/routes/tests.tsx | 4 +- packages/reffuse/src/ReffuseNamespace.ts | 46 +------------------- 3 files changed, 18 insertions(+), 53 deletions(-) diff --git a/packages/example/src/routes/streams/pull.tsx b/packages/example/src/routes/streams/pull.tsx index 0524b53..c7c0722 100644 --- a/packages/example/src/routes/streams/pull.tsx +++ b/packages/example/src/routes/streams/pull.tsx @@ -1,8 +1,8 @@ import { R } from "@/reffuse" import { Button, Flex, Text } from "@radix-ui/themes" import { createFileRoute } from "@tanstack/react-router" -import { Option, Random, Stream } from "effect" -import { useMemo } from "react" +import { Chunk, Effect, Exit, Option, Queue, Random, Scope, Stream } from "effect" +import { useMemo, useState } from "react" export const Route = createFileRoute("/streams/pull")({ @@ -11,13 +11,24 @@ export const Route = createFileRoute("/streams/pull")({ function RouteComponent() { const stream = useMemo(() => Stream.repeatEffect(Random.nextInt), []) - const [value, pull] = R.usePullStream(stream) - const pullNext = R.useCallbackSync(() => pull, [pull]) + const streamScope = R.useScope([stream]) + + const queue = R.useMemo(() => Effect.provideService(Stream.toQueueOfElements(stream), Scope.Scope, streamScope), [streamScope]) + + const [value, setValue] = useState(Option.none()) + const pullLatest = R.useCallbackSync(() => Queue.takeAll(queue).pipe( + Effect.flatMap(Chunk.last), + Effect.flatMap(Exit.matchEffect({ + onSuccess: Effect.succeed, + onFailure: Effect.fail, + })), + Effect.tap(v => Effect.sync(() => setValue(Option.some(v)))), + ), [queue]) return ( {Option.isSome(value) && {value.value}} - + ) } diff --git a/packages/example/src/routes/tests.tsx b/packages/example/src/routes/tests.tsx index ac58463..51ce6a5 100644 --- a/packages/example/src/routes/tests.tsx +++ b/packages/example/src/routes/tests.tsx @@ -15,7 +15,6 @@ export const Route = createFileRoute("/tests")({ function RouteComponent() { const runSync = R.useRunSync() - const runPromise = R.useRunPromise() const [uuid, setUuid] = useState(R.useMemo(() => makeUuid, [])) const generateUuid = R.useCallbackSync(() => makeUuid.pipe( @@ -23,7 +22,7 @@ function RouteComponent() { ), []) const uuidStream = R.useStreamFromReactiveValues([uuid]) - const [uuidStreamLatestValue, pullUuidStream] = R.usePullStream(uuidStream) + const uuidStreamLatestValue = R.useSubscribeStream(uuidStream) const scope = R.useScope([uuid]) @@ -43,7 +42,6 @@ function RouteComponent() { onNone: () => <>, })} - ) } diff --git a/packages/reffuse/src/ReffuseNamespace.ts b/packages/reffuse/src/ReffuseNamespace.ts index 0250fdc..19ddee6 100644 --- a/packages/reffuse/src/ReffuseNamespace.ts +++ b/packages/reffuse/src/ReffuseNamespace.ts @@ -1,4 +1,4 @@ -import { Chunk, type Context, Effect, ExecutionStrategy, Exit, type Fiber, flow, type Layer, Match, Option, pipe, Pipeable, PubSub, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" +import { type Context, Effect, ExecutionStrategy, Exit, type Fiber, type Layer, Match, Option, pipe, Pipeable, PubSub, Ref, Runtime, Scope, Stream, SubscriptionRef } from "effect" import * as React from "react" import * as ReffuseContext from "./ReffuseContext.js" import * as ReffuseRuntime from "./ReffuseRuntime.js" @@ -527,50 +527,6 @@ export abstract class ReffuseNamespace { return reactStateValue } - usePullStream( - this: ReffuseNamespace, - stream: Stream.Stream, - ): [latestValue: Option.Option, pull: Effect.Effect, Option.Option>] - usePullStream( - this: ReffuseNamespace, - stream: Stream.Stream, - initialValue: () => Effect.Effect, - ): [latestValue: Option.Some, pull: Effect.Effect, Option.Option>] - usePullStream( - this: ReffuseNamespace, - stream: Stream.Stream, - initialValue?: () => Effect.Effect, - ): [latestValue: Option.Option, pull: Effect.Effect, Option.Option>] { - const scope = this.useScope([stream]) - - const [reactStateValue, setReactStateValue] = React.useState(this.useMemo( - () => initialValue - ? Effect.map(initialValue(), Option.some) - : Effect.succeed(Option.none()), - [], - { doNotReExecuteOnRuntimeOrContextChange: true }, - )) - - const pull = this.useMemo(() => Effect.context().pipe( - Effect.flatMap(context => Stream.toPull(Stream.changesWith(stream, (x, y) => x === y)).pipe( - Effect.map(effect => effect.pipe( - Effect.tap(flow( - Chunk.last, - v => Option.match(v, { - onSome: () => Effect.sync(() => setReactStateValue(v)), - onNone: () => Effect.void, - }), - )), - Effect.provide(context), - )), - - Effect.provideService(Scope.Scope, scope), - )) - ), [stream, scope]) - - return [reactStateValue, pull] - } - SubRef, R>( this: ReffuseNamespace, -- 2.49.1 From c832c3f79a964c255d0722138d4669c7e236e33a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 11 May 2025 19:13:30 +0200 Subject: [PATCH 291/326] Fix --- packages/example/src/routes/streams/pull.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/example/src/routes/streams/pull.tsx b/packages/example/src/routes/streams/pull.tsx index c7c0722..e9683f4 100644 --- a/packages/example/src/routes/streams/pull.tsx +++ b/packages/example/src/routes/streams/pull.tsx @@ -6,12 +6,12 @@ import { useMemo, useState } from "react" export const Route = createFileRoute("/streams/pull")({ - component: RouteComponent, + component: RouteComponent }) function RouteComponent() { const stream = useMemo(() => Stream.repeatEffect(Random.nextInt), []) - const streamScope = R.useScope([stream]) + const streamScope = R.useScope([stream], { finalizerExecutionMode: "fork" }) const queue = R.useMemo(() => Effect.provideService(Stream.toQueueOfElements(stream), Scope.Scope, streamScope), [streamScope]) -- 2.49.1 From a616e840797e9582bd9d72dcdccc297a6f2319e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 11 May 2025 19:19:02 +0200 Subject: [PATCH 292/326] Version bump --- packages/reffuse/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index 4f34fb9..d27cbe3 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -1,6 +1,6 @@ { "name": "reffuse", - "version": "0.1.9", + "version": "0.1.10", "type": "module", "files": [ "./README.md", -- 2.49.1 From 099a28ca0d2c7fa1ae203ac140f9145432bc3133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 11 May 2025 19:44:46 +0200 Subject: [PATCH 293/326] Fix --- packages/reffuse/package.json | 2 +- packages/reffuse/src/types/SubscriptionSubRef.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index d27cbe3..bdc53be 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -1,6 +1,6 @@ { "name": "reffuse", - "version": "0.1.10", + "version": "0.1.11", "type": "module", "files": [ "./README.md", diff --git a/packages/reffuse/src/types/SubscriptionSubRef.ts b/packages/reffuse/src/types/SubscriptionSubRef.ts index 4ea615d..b32f45d 100644 --- a/packages/reffuse/src/types/SubscriptionSubRef.ts +++ b/packages/reffuse/src/types/SubscriptionSubRef.ts @@ -52,7 +52,7 @@ class SubscriptionSubRefImpl extends Effectable.Class imp readonly setter: (parentValue: B, value: A) => B, ) { super() - this.get = Ref.get(this.parent).pipe(Effect.map(this.getter)) + this.get = Effect.map(Ref.get(this.parent), this.getter) } commit() { -- 2.49.1 From b395644798ee3897436303b635d68e6afea996d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 14 May 2025 06:19:39 +0200 Subject: [PATCH 294/326] Dependencies upgrade --- bun.lock | 76 +++++++++++++------------ package.json | 2 +- packages/example/package.json | 26 ++++----- packages/extension-lazyref/package.json | 2 +- packages/extension-query/package.json | 2 +- packages/reffuse/package.json | 2 +- 6 files changed, 58 insertions(+), 52 deletions(-) diff --git a/bun.lock b/bun.lock index 063145d..11e5902 100644 --- a/bun.lock +++ b/bun.lock @@ -14,27 +14,27 @@ "name": "@reffuse/example", "version": "0.0.0", "dependencies": { - "@effect/platform": "^0.80.21", - "@effect/platform-browser": "^0.60.12", + "@effect/platform": "^0.82.1", + "@effect/platform-browser": "^0.62.1", "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", "@typed/async-data": "^0.13.1", "@typed/id": "^0.17.2", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.14.21", - "lucide-react": "^0.508.0", + "effect": "^3.15.1", + "lucide-react": "^0.510.0", "mobx": "^6.13.7", "reffuse": "workspace:*", }, "devDependencies": { "@eslint/js": "^9.26.0", - "@tanstack/react-router": "^1.120.2", - "@tanstack/react-router-devtools": "^1.120.2", - "@tanstack/router-plugin": "^1.120.2", + "@tanstack/react-router": "^1.120.3", + "@tanstack/react-router-devtools": "^1.120.3", + "@tanstack/router-plugin": "^1.120.3", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.1.3", - "@types/react-dom": "^19.1.3", + "@types/react": "^19.1.4", + "@types/react-dom": "^19.1.5", "@vitejs/plugin-react": "^4.4.1", "eslint": "^9.26.0", "eslint-plugin-react-hooks": "^5.2.0", @@ -42,7 +42,7 @@ "globals": "^16.1.0", "react": "^19.1.0", "react-dom": "^19.1.0", - "typescript-eslint": "^8.32.0", + "typescript-eslint": "^8.32.1", "vite": "^6.3.5", }, }, @@ -55,7 +55,7 @@ "peerDependencies": { "@typed/lazy-ref": "^0.3.0", "@types/react": "^19.0.0", - "effect": "^3.13.0", + "effect": "^3.15.0", "react": "^19.0.0", "reffuse": "^0.1.8", }, @@ -71,17 +71,17 @@ "@effect/platform-browser": "^0.56.0", "@typed/async-data": "^0.13.0", "@types/react": "^19.0.0", - "effect": "^3.13.0", + "effect": "^3.15.0", "react": "^19.0.0", "reffuse": "^0.1.6", }, }, "packages/reffuse": { "name": "reffuse", - "version": "0.1.9", + "version": "0.1.11", "peerDependencies": { "@types/react": "^19.0.0", - "effect": "^3.13.0", + "effect": "^3.15.0", "react": "^19.0.0", }, }, @@ -129,9 +129,9 @@ "@babel/types": ["@babel/types@7.27.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q=="], - "@effect/platform": ["@effect/platform@0.80.21", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.14.21" } }, "sha512-c6pDar/1TYqeFc8Z6uxNC+065ElSJ4A0AuACZi0CT1riLAfGLCFIpejonkJ1tz6rsBTDyBm0JPdyb0aqyGAYAA=="], + "@effect/platform": ["@effect/platform@0.82.1", "", { "dependencies": { "find-my-way-ts": "^0.1.5", "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { "effect": "^3.15.1" } }, "sha512-fX5Lu//VkLXPegouxT1AdSyuRkxF55k70YaLV0vIzjgK97/u3Mow0ux8fYglm2dWDXWTLBkNprlhheGm/5/bvQ=="], - "@effect/platform-browser": ["@effect/platform-browser@0.60.12", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.80.21", "effect": "^3.14.21" } }, "sha512-4E+6SvGwSa3kIwuQNwk44vg7vZoZz7Q9d8VFvldz8zzv3+XZYMAhy+qaFQWmrqMoRP4n10xBE7MJJ2rIEtZYPw=="], + "@effect/platform-browser": ["@effect/platform-browser@0.62.1", "", { "dependencies": { "multipasta": "^0.2.5" }, "peerDependencies": { "@effect/platform": "^0.82.1", "effect": "^3.15.1" } }, "sha512-+aioMY5OsD9SQc7S88yv6tlWpkKhbA5Dv3lDs4CXQbRL5TWuHjzzDGpFNRhCBdv5ouAjoBAzu2Zi4+HIaWYqHQ=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], @@ -421,19 +421,19 @@ "@tanstack/history": ["@tanstack/history@1.115.0", "", {}, "sha512-K7JJNrRVvyjAVnbXOH2XLRhFXDkeP54Kt2P4FR1Kl2KDGlIbkua5VqZQD2rot3qaDrpufyUa63nuLai1kOLTsQ=="], - "@tanstack/react-router": ["@tanstack/react-router@1.120.2", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "1.119.0", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-CNduh/O3miW6A/WDMd2cfca8D8x+kVJTYwG5fMaBfcEF/bfjneDnEWXsmKLMdB2iLc6miaRQu66ryPSMdIBUAw=="], + "@tanstack/react-router": ["@tanstack/react-router@1.120.3", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/react-store": "^0.7.0", "@tanstack/router-core": "1.120.3", "jsesc": "^3.1.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-+5Y5ORtjW/LJhIxOxxBrvhZzfMOP9B+LaJ1j1P5tM5YqpLYWHuImfzGNRpKtBgiRoSaJedPjwY7lj88EwNWVbg=="], - "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.120.2", "", { "dependencies": { "@tanstack/router-devtools-core": "^1.119.0", "solid-js": "^1.9.5" }, "peerDependencies": { "@tanstack/react-router": "^1.120.2", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-89qY5pKdIN6r5G0pHP92mLvorzd7rUlHjvCkjNYOyYduxGQ8a703Y7Fp/RqXibwhjvZcet6BR2IrEhIqg9Yjhw=="], + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.120.3", "", { "dependencies": { "@tanstack/router-devtools-core": "^1.120.3", "solid-js": "^1.9.5" }, "peerDependencies": { "@tanstack/react-router": "^1.120.3", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-aeEodmbATZ81H1xJuiaWaadSW9iqG9YEvaBgmlS70bxepFNkeXONEXcw38IQMTsPNoEZqbtvqAjl2Pg08cZlxQ=="], "@tanstack/react-store": ["@tanstack/react-store@0.7.0", "", { "dependencies": { "@tanstack/store": "0.7.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng=="], - "@tanstack/router-core": ["@tanstack/router-core@1.119.0", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/store": "^0.7.0", "tiny-invariant": "^1.3.3" } }, "sha512-3dZYP5cCq3jJYgnRDzKR3w4sYzrXP5sw1st303ye87VV26r31I8UaIuUEs7kiJaxgWBvqHglWCiygBWQODZXVw=="], + "@tanstack/router-core": ["@tanstack/router-core@1.120.3", "", { "dependencies": { "@tanstack/history": "1.115.0", "@tanstack/store": "^0.7.0", "tiny-invariant": "^1.3.3" } }, "sha512-/16Pp7yxUUIGkc+oPVnlWqvlGtvLoQeKfJPpKc1vcPIBvHFO/o3yg/CEzP5raWDAjyq3b+BVkej3lSzkNxgBSg=="], - "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.119.0", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.119.0", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" }, "optionalPeers": ["csstype"] }, "sha512-CH2Hx4J2UOigFtKR0anQfNiWQfidV2S7AZafkeo/S885IxwoFK7xXWzYxNbUhCDJC2tsBJ+XKjgxeBv5wGi62Q=="], + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.120.3", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.120.3", "csstype": "^3.0.10", "solid-js": ">=1.9.5", "tiny-invariant": "^1.3.3" }, "optionalPeers": ["csstype"] }, "sha512-cUY1GFq8qNfIfivhozaG2NOt05Jran1yoZrBajVK0qLO0nIXJ673XeCPjzQkDctN5FU6xfmF6aXgO/xJd0igrA=="], - "@tanstack/router-generator": ["@tanstack/router-generator@1.120.2", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.115.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.2" }, "peerDependencies": { "@tanstack/react-router": "^1.120.2" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-rI+hQjUtsAZs5K2292zM6OE/fHAVRZxejAkrLlaQlunphqJYtHBizXk15SP9QsP3i+QvS1D8YnioMPvSlVPEOw=="], + "@tanstack/router-generator": ["@tanstack/router-generator@1.120.3", "", { "dependencies": { "@tanstack/virtual-file-routes": "^1.115.0", "prettier": "^3.5.0", "tsx": "^4.19.2", "zod": "^3.24.2" }, "peerDependencies": { "@tanstack/react-router": "^1.120.3" }, "optionalPeers": ["@tanstack/react-router"] }, "sha512-Lz0nIwGNM+vlLGGiSBTQvcD2gW5WhoIeZN8IlTBssUb33m21QLpoj9ozpXFDrlzk36rTn5NcijHEStpYqrvQbA=="], - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.120.2", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.119.0", "@tanstack/router-generator": "^1.120.2", "@tanstack/router-utils": "^1.115.0", "@tanstack/virtual-file-routes": "^1.115.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.120.2", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-LVwvd/QKFrxtsKfm1Oiv6+NzAB79hcuhlbu14NwmRfdexPYmfjvJJPK0E3IlLmh/mRlEHmfYajutwuqvBONM9w=="], + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.120.3", "", { "dependencies": { "@babel/core": "^7.26.8", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@tanstack/router-core": "^1.120.3", "@tanstack/router-generator": "^1.120.3", "@tanstack/router-utils": "^1.115.0", "@tanstack/virtual-file-routes": "^1.115.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.6", "babel-dead-code-elimination": "^1.0.10", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.120.3", "vite": ">=5.0.0 || >=6.0.0", "vite-plugin-solid": "^2.11.2", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-iTW402GLCxexMn42OSN8Md7A0vYm5q5+vBKDp3FcjnLgmD+31AI7H//RnGI6nxRWo/xMN8ZjESy/PVg1ouvDxA=="], "@tanstack/router-utils": ["@tanstack/router-utils@1.115.0", "", { "dependencies": { "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "ansis": "^3.11.0", "diff": "^7.0.0" } }, "sha512-Dng4y+uLR9b5zPGg7dHReHOTHQa6x+G6nCoZshsDtWrYsrdCcJEtLyhwZ5wG8OyYS6dVr/Cn+E5Bd2b6BhJ89w=="], @@ -461,25 +461,25 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/react": ["@types/react@19.1.3", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ=="], + "@types/react": ["@types/react@19.1.4", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g=="], - "@types/react-dom": ["@types/react-dom@19.1.3", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg=="], + "@types/react-dom": ["@types/react-dom@19.1.5", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.32.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/type-utils": "8.32.0", "@typescript-eslint/utils": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.32.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/type-utils": "8.32.1", "@typescript-eslint/utils": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.32.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/types": "8.32.0", "@typescript-eslint/typescript-estree": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.32.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0" } }, "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1" } }, "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.32.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.32.0", "@typescript-eslint/utils": "8.32.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.32.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/types": "8.32.0", "@typescript-eslint/typescript-estree": "8.32.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@4.4.1", "", { "dependencies": { "@babel/core": "^7.26.10", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w=="], @@ -571,7 +571,7 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "effect": ["effect@3.14.21", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-TKR7zfWcuZgEdWd+oIGA8LdREj/c+1Q0wz4pWqQtYT7VHnkW/QQEYCXgrDI5dT6lJgRTgyQAC1bAnpAf6MdjIA=="], + "effect": ["effect@3.15.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-n3bDF6K3R+FSVuH+dSVU3ya2pI4Wt/tnKzum3DC/3b5e0E9HfhrhbkonOkYU3AVJJOzCA6zZE2/y6EUgQNAY4g=="], "electron-to-chromium": ["electron-to-chromium@1.5.151", "", {}, "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA=="], @@ -733,7 +733,7 @@ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "lucide-react": ["lucide-react@0.508.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-gcP16PnexqtOFrTtv98kVsGzTfnbPekzZiQfByi2S89xfk7E/4uKE1USZqccIp58v42LqkO7MuwpCqshwSrJCg=="], + "lucide-react": ["lucide-react@0.510.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-p8SQRAMVh7NhsAIETokSqDrc5CHnDLbV29mMnzaXx+Vc/hnqQzwI2r0FMWCcoTXnbw2KEjy48xwpGdEL+ck06Q=="], "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], @@ -937,7 +937,7 @@ "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], - "typescript-eslint": ["typescript-eslint@8.32.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.0", "@typescript-eslint/parser": "8.32.0", "@typescript-eslint/utils": "8.32.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A=="], + "typescript-eslint": ["typescript-eslint@8.32.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.1", "@typescript-eslint/parser": "8.32.1", "@typescript-eslint/utils": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], @@ -981,6 +981,12 @@ "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + "@typed/async-data/effect": ["effect@3.14.21", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-TKR7zfWcuZgEdWd+oIGA8LdREj/c+1Q0wz4pWqQtYT7VHnkW/QQEYCXgrDI5dT6lJgRTgyQAC1bAnpAf6MdjIA=="], + + "@typed/lazy-ref/effect": ["effect@3.14.21", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-TKR7zfWcuZgEdWd+oIGA8LdREj/c+1Q0wz4pWqQtYT7VHnkW/QQEYCXgrDI5dT6lJgRTgyQAC1bAnpAf6MdjIA=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.4", "", {}, "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], "@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], diff --git a/package.json b/package.json index bf6324c..5c04e40 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@reffuse/monorepo", - "packageManager": "bun@1.2.12", + "packageManager": "bun@1.2.13", "private": true, "workspaces": [ "./packages/*" diff --git a/packages/example/package.json b/packages/example/package.json index f5621f1..def1525 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -12,12 +12,12 @@ }, "devDependencies": { "@eslint/js": "^9.26.0", - "@tanstack/react-router": "^1.120.2", - "@tanstack/react-router-devtools": "^1.120.2", - "@tanstack/router-plugin": "^1.120.2", + "@tanstack/react-router": "^1.120.3", + "@tanstack/react-router-devtools": "^1.120.3", + "@tanstack/router-plugin": "^1.120.3", "@thilawyn/thilaschema": "^0.1.4", - "@types/react": "^19.1.3", - "@types/react-dom": "^19.1.3", + "@types/react": "^19.1.4", + "@types/react-dom": "^19.1.5", "@vitejs/plugin-react": "^4.4.1", "eslint": "^9.26.0", "eslint-plugin-react-hooks": "^5.2.0", @@ -25,27 +25,27 @@ "globals": "^16.1.0", "react": "^19.1.0", "react-dom": "^19.1.0", - "typescript-eslint": "^8.32.0", + "typescript-eslint": "^8.32.1", "vite": "^6.3.5" }, "dependencies": { - "@effect/platform": "^0.80.21", - "@effect/platform-browser": "^0.60.12", + "@effect/platform": "^0.82.1", + "@effect/platform-browser": "^0.62.1", "@radix-ui/themes": "^3.2.1", "@reffuse/extension-lazyref": "workspace:*", "@reffuse/extension-query": "workspace:*", "@typed/async-data": "^0.13.1", "@typed/id": "^0.17.2", "@typed/lazy-ref": "^0.3.3", - "effect": "^3.14.21", - "lucide-react": "^0.508.0", + "effect": "^3.15.1", + "lucide-react": "^0.510.0", "mobx": "^6.13.7", "reffuse": "workspace:*" }, "overrides": { - "effect": "^3.14.21", - "@effect/platform": "^0.80.21", - "@effect/platform-browser": "^0.60.12", + "effect": "^3.15.1", + "@effect/platform": "^0.82.1", + "@effect/platform-browser": "^0.62.1", "@typed/lazy-ref": "^0.3.3", "@typed/async-data": "^0.13.1" } diff --git a/packages/extension-lazyref/package.json b/packages/extension-lazyref/package.json index 14e6ab6..f794354 100644 --- a/packages/extension-lazyref/package.json +++ b/packages/extension-lazyref/package.json @@ -35,7 +35,7 @@ "peerDependencies": { "@typed/lazy-ref": "^0.3.0", "@types/react": "^19.0.0", - "effect": "^3.13.0", + "effect": "^3.15.0", "react": "^19.0.0", "reffuse": "^0.1.8" } diff --git a/packages/extension-query/package.json b/packages/extension-query/package.json index dac050c..ec67d63 100644 --- a/packages/extension-query/package.json +++ b/packages/extension-query/package.json @@ -37,7 +37,7 @@ "@effect/platform-browser": "^0.56.0", "@typed/async-data": "^0.13.0", "@types/react": "^19.0.0", - "effect": "^3.13.0", + "effect": "^3.15.0", "react": "^19.0.0", "reffuse": "^0.1.6" } diff --git a/packages/reffuse/package.json b/packages/reffuse/package.json index bdc53be..b11914a 100644 --- a/packages/reffuse/package.json +++ b/packages/reffuse/package.json @@ -35,7 +35,7 @@ }, "peerDependencies": { "@types/react": "^19.0.0", - "effect": "^3.13.0", + "effect": "^3.15.0", "react": "^19.0.0" } } -- 2.49.1 From 557c4a1b97562a88f6f58720e352573b86233f8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 14 May 2025 06:29:37 +0200 Subject: [PATCH 295/326] Update --- bun.lock | 24 ++++++++++-------------- packages/example/src/query.ts | 6 +----- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/bun.lock b/bun.lock index 11e5902..7d09a3c 100644 --- a/bun.lock +++ b/bun.lock @@ -227,7 +227,7 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.11.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.3", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ=="], + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.11.2", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.3", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ=="], "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw=="], @@ -523,7 +523,7 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001717", "", {}, "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001718", "", {}, "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -555,7 +555,7 @@ "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], - "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], @@ -573,7 +573,7 @@ "effect": ["effect@3.15.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-n3bDF6K3R+FSVuH+dSVU3ya2pI4Wt/tnKzum3DC/3b5e0E9HfhrhbkonOkYU3AVJJOzCA6zZE2/y6EUgQNAY4g=="], - "electron-to-chromium": ["electron-to-chromium@1.5.151", "", {}, "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA=="], + "electron-to-chromium": ["electron-to-chromium@1.5.152", "", {}, "sha512-xBOfg/EBaIlVsHipHl2VdTPJRSvErNUaqW8ejTq5OlOlIYx1wOllCHsAvAIrr55jD1IYEfdR86miUEt8H5IeJg=="], "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], @@ -613,7 +613,7 @@ "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], - "eventsource": ["eventsource@3.0.6", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA=="], + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], "eventsource-parser": ["eventsource-parser@3.0.1", "", {}, "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA=="], @@ -845,7 +845,7 @@ "reffuse": ["reffuse@workspace:packages/reffuse"], - "remeda": ["remeda@2.21.3", "", { "dependencies": { "type-fest": "^4.39.1" } }, "sha512-XXrZdLA10oEOQhLLzEJEiFFSKi21REGAkHdImIb4rt/XXy8ORGXh5HCcpUOsElfPNDb+X6TA/+wkh+p2KffYmg=="], + "remeda": ["remeda@2.21.5", "", { "dependencies": { "type-fest": "^4.40.1" } }, "sha512-kXzS4ITQBoLNoec4CMj4GThW7/TG94l186/FEMKPHKN3PeY42xluSLIZMEda3nkqolQJrJ0oCet1rp3UGLx1Yg=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -869,9 +869,9 @@ "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], - "seroval": ["seroval@1.3.0", "", {}, "sha512-4tYQDy3HVM0JjJ1CfDK3K8FhBKIDDri27oc2AyabuuHfQw6/yTDPp2Abt1h2cNtf1R0T+7AQYAzPhUgqXztaXw=="], + "seroval": ["seroval@1.3.1", "", {}, "sha512-F+T9EQPdLzgdewgxnBh4mSc+vde+EOkU6dC9BDuu/bfGb+UyUlqM6t8znFCTPQSuai/ZcfFg0gu79h+bVW2O0w=="], - "seroval-plugins": ["seroval-plugins@1.3.0", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-FFu/UE3uA8L1vj0CXXZo2Nlh10MtYoOs0G//ptwlQMjfPFSeIVYUNy0zewfV8iM0CrOebAfHEG6J3xA9c+lsaQ=="], + "seroval-plugins": ["seroval-plugins@1.3.1", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-dOlUoiI3fgZbQIcj6By+l865pzeWdP3XCSLdI3xlKnjCk5983yLWPsXytFOUI0BUZKG9qwqbj78n9yVcVwUqaQ=="], "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], @@ -941,7 +941,7 @@ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - "unplugin": ["unplugin@2.3.2", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w=="], + "unplugin": ["unplugin@2.3.4", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-m4PjxTurwpWfpMomp8AptjD5yj8qEZN5uQjjGM3TAs9MWWD2tXSSNNj6jGR2FoVGod4293ytyV6SwBbertfyJg=="], "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], @@ -981,15 +981,11 @@ "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], - "@typed/async-data/effect": ["effect@3.14.21", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-TKR7zfWcuZgEdWd+oIGA8LdREj/c+1Q0wz4pWqQtYT7VHnkW/QQEYCXgrDI5dT6lJgRTgyQAC1bAnpAf6MdjIA=="], - - "@typed/lazy-ref/effect": ["effect@3.14.21", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-TKR7zfWcuZgEdWd+oIGA8LdREj/c+1Q0wz4pWqQtYT7VHnkW/QQEYCXgrDI5dT6lJgRTgyQAC1bAnpAf6MdjIA=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.4", "", {}, "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A=="], "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], diff --git a/packages/example/src/query.ts b/packages/example/src/query.ts index ecf7e53..853f6b0 100644 --- a/packages/example/src/query.ts +++ b/packages/example/src/query.ts @@ -9,11 +9,7 @@ export class AppQueryErrorHandler extends QueryErrorHandler.Service self.pipe( - Effect.catchTags({ - RequestError: failure, - ResponseError: failure, - }), - + Effect.catchTag("RequestError", "ResponseError", failure), Effect.catchAllDefect(defect), ), ) {} -- 2.49.1 From 9d0daaa87f0b7dabcb43f18241d94c551f7c673c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 18 May 2025 10:52:39 +0200 Subject: [PATCH 296/326] Todos example refactoring --- packages/example/src/routes/todos.tsx | 4 +- .../example/src/todos/services/TodosState.ts | 43 ++++++++++--------- packages/example/src/todos/views/VNewTodo.tsx | 41 +++++++----------- packages/example/src/todos/views/VTodos.tsx | 9 +--- 4 files changed, 41 insertions(+), 56 deletions(-) diff --git a/packages/example/src/routes/todos.tsx b/packages/example/src/routes/todos.tsx index 17aa88f..89591a8 100644 --- a/packages/example/src/routes/todos.tsx +++ b/packages/example/src/routes/todos.tsx @@ -26,9 +26,9 @@ function Todos() { return ( - + - + ) diff --git a/packages/example/src/todos/services/TodosState.ts b/packages/example/src/todos/services/TodosState.ts index d9b2bea..a3735c8 100644 --- a/packages/example/src/todos/services/TodosState.ts +++ b/packages/example/src/todos/services/TodosState.ts @@ -2,14 +2,14 @@ import { Todo } from "@/domain" import { KeyValueStore } from "@effect/platform" import { BrowserKeyValueStore } from "@effect/platform-browser" import { PlatformError } from "@effect/platform/Error" -import { Chunk, Context, Effect, identity, Layer, ParseResult, Ref, Schema, SubscriptionRef } from "effect" +import { Chunk, Context, Effect, identity, Layer, ParseResult, Ref, Schema, Stream, SubscriptionRef } from "effect" export class TodosState extends Context.Tag("TodosState")> - readonly readFromLocalStorage: Effect.Effect - readonly saveToLocalStorage: Effect.Effect + readonly load: Effect.Effect + readonly save: Effect.Effect readonly prepend: (todo: Todo.Todo) => Effect.Effect readonly replace: (index: number, todo: Todo.Todo) => Effect.Effect @@ -20,34 +20,31 @@ export class TodosState extends Context.Tag("TodosState") Layer.effect(TodosState, Effect.gen(function*() { - const todos = yield* SubscriptionRef.make(Chunk.empty()) - const readFromLocalStorage = KeyValueStore.KeyValueStore.pipe( Effect.flatMap(kv => kv.get(key)), Effect.flatMap(identity), - Effect.flatMap(Schema.parseJson().pipe( - Schema.compose(Schema.Chunk(Todo.TodoFromJson)), - Schema.decode, + Effect.flatMap(Schema.decode( + Schema.compose(Schema.parseJson(), Schema.Chunk(Todo.TodoFromJson)) )), - Effect.flatMap(v => Ref.set(todos, v)), - - Effect.catchTag("NoSuchElementException", () => Ref.set(todos, Chunk.empty())), - + Effect.catchTag("NoSuchElementException", () => Effect.succeed(Chunk.empty())), Effect.provide(BrowserKeyValueStore.layerLocalStorage), ) - const saveToLocalStorage = Effect.all([KeyValueStore.KeyValueStore, todos]).pipe( - Effect.flatMap(([kv, values]) => values.pipe( - Schema.parseJson().pipe( - Schema.compose(Schema.Chunk(Todo.TodoFromJson)), - Schema.encode, + const writeToLocalStorage = (values: Chunk.Chunk) => KeyValueStore.KeyValueStore.pipe( + Effect.flatMap(kv => values.pipe( + Schema.encode( + Schema.compose(Schema.parseJson(), Schema.Chunk(Todo.TodoFromJson)) ), Effect.flatMap(v => kv.set(key, v)), )), - Effect.provide(BrowserKeyValueStore.layerLocalStorage), ) + const todos = yield* SubscriptionRef.make(yield* readFromLocalStorage) + + const load = Effect.flatMap(readFromLocalStorage, v => Ref.set(todos, v)) + const save = Effect.flatMap(todos, writeToLocalStorage) + const prepend = (todo: Todo.Todo) => Ref.update(todos, Chunk.prepend(todo)) const replace = (index: number, todo: Todo.Todo) => Ref.update(todos, Chunk.replace(index, todo)) const remove = (index: number) => Ref.update(todos, Chunk.remove(index)) @@ -56,12 +53,16 @@ export const make = (key: string) => Layer.effect(TodosState, Effect.gen(functio // }) - yield* readFromLocalStorage + // Sync changes with local storage + yield* Effect.forkScoped(todos.changes.pipe( + Stream.debounce("500 millis"), + Stream.runForEach(writeToLocalStorage), + )) return { todos, - readFromLocalStorage, - saveToLocalStorage, + load, + save, prepend, replace, remove, diff --git a/packages/example/src/todos/views/VNewTodo.tsx b/packages/example/src/todos/views/VNewTodo.tsx index 4d183b5..c090df6 100644 --- a/packages/example/src/todos/views/VNewTodo.tsx +++ b/packages/example/src/todos/views/VNewTodo.tsx @@ -1,25 +1,27 @@ import { Todo } from "@/domain" import { Box, Button, Card, Flex, TextArea } from "@radix-ui/themes" -import { Effect, Option, SubscriptionRef } from "effect" +import { Effect, Option, Ref } from "effect" import { R } from "../reffuse" import { TodosState } from "../services" -const createEmptyTodo = Todo.generateUniqueID.pipe( - Effect.map(id => Todo.Todo.make({ - id, - content: "", - completedAt: Option.none(), - }, true)) -) +const createEmptyTodo = Effect.map(Todo.generateUniqueID, id => Todo.Todo.make({ + id, + content: "", + completedAt: Option.none(), +}, true)) export function VNewTodo() { - const runSync = R.useRunSync() + const todoRef = R.useRef(() => createEmptyTodo) + const [content, setContent] = R.useRefState(R.useSubRef(todoRef, ["content"])) - const todoRef = R.useMemo(() => createEmptyTodo.pipe(Effect.flatMap(SubscriptionRef.make)), []) - const [todo, setTodo] = R.useRefState(todoRef) + const add = R.useCallbackSync(() => Effect.all([TodosState.TodosState, todoRef]).pipe( + Effect.flatMap(([state, todo]) => state.prepend(todo)), + Effect.andThen(createEmptyTodo), + Effect.flatMap(v => Ref.set(todoRef, v)), + ), [todoRef]) return ( @@ -27,23 +29,12 @@ export function VNewTodo() {