From 8465c3e979ff75e058d5875b66d77dbfd98bd9e2 Mon Sep 17 00:00:00 2001 From: Liakhovskyi Vladyslav Date: Sun, 21 Jun 2026 23:00:17 +0000 Subject: [PATCH 1/3] fix the devcotnainer setup --- .devcontainer/devcontainer-lock.json | 24 ++++++++++++++++++++++++ .devcontainer/devcontainer.json | 4 +++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .devcontainer/devcontainer-lock.json diff --git a/.devcontainer/devcontainer-lock.json b/.devcontainer/devcontainer-lock.json new file mode 100644 index 00000000..fe37830f --- /dev/null +++ b/.devcontainer/devcontainer-lock.json @@ -0,0 +1,24 @@ +{ + "features": { + "ghcr.io/devcontainers-extra/features/go-task:1": { + "version": "1.0.6", + "resolved": "ghcr.io/devcontainers-extra/features/go-task@sha256:4d1db153919976cadd3209ca05d655a761a01707767716994dad677b4538dc1b", + "integrity": "sha256:4d1db153919976cadd3209ca05d655a761a01707767716994dad677b4538dc1b" + }, + "ghcr.io/devcontainers/features/docker-outside-of-docker:1": { + "version": "1.10.0", + "resolved": "ghcr.io/devcontainers/features/docker-outside-of-docker@sha256:c2c2cf829505ead8e4892c88c31b6594ae94a2bbb209e16e1fac456c1a3a624e", + "integrity": "sha256:c2c2cf829505ead8e4892c88c31b6594ae94a2bbb209e16e1fac456c1a3a624e" + }, + "ghcr.io/devcontainers/features/go:1": { + "version": "1.3.4", + "resolved": "ghcr.io/devcontainers/features/go@sha256:d85e921f91b41340055bb12b325d9d551170ed04b3b832e33530bf42f167c032", + "integrity": "sha256:d85e921f91b41340055bb12b325d9d551170ed04b3b832e33530bf42f167c032" + }, + "ghcr.io/rails/devcontainer/features/bun:1.0.2": { + "version": "1.0.2", + "resolved": "ghcr.io/rails/devcontainer/features/bun@sha256:08057c197a8cde49b08749681607bf0d69aed79e280225cf43ca5d1782028789", + "integrity": "sha256:08057c197a8cde49b08749681607bf0d69aed79e280225cf43ca5d1782028789" + } + } +} diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d9f564d1..3e4ac8f0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -5,7 +5,9 @@ "service": "app", "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", "features": { - "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {}, + "ghcr.io/devcontainers/features/docker-outside-of-docker:1": { + "moby" : false + }, "ghcr.io/rails/devcontainer/features/bun:1.0.2": {}, "ghcr.io/devcontainers-extra/features/go-task:1": {}, "ghcr.io/devcontainers/features/go:1": { From 7f908fa58866d6381e96bf838824c436e46664f5 Mon Sep 17 00:00:00 2001 From: Liakhovskyi Vladyslav Date: Sun, 21 Jun 2026 23:34:23 +0000 Subject: [PATCH 2/3] chore: upgrade all packages to the latest version. --- .devcontainer/devcontainer.json | 2 +- biome.json | 4 +- dashboard/bun.lock | 824 +-- dashboard/package.json | 74 +- dashboard/src/components/ui/calendar.tsx | 4 +- .../src/components/ui/datetime-picker.tsx | 4 +- dashboard/src/gql/graphql.ts | 566 +- dashboard/src/lib/dashboard-query.ts | 5 +- dashboard/tsconfig.json | 4 +- dashboard/vite.config.ts | 2 +- server/go.mod | 39 +- server/go.sum | 100 +- server/internal/auth/service.go | 3 + server/internal/graph/generated.go | 5093 ++++++++--------- server/internal/graph/schema.resolvers.go | 2 +- server/static/go.mod | 4 +- server/static/go.sum | 7 +- server/static/tsconfig.json | 1 - 18 files changed, 2804 insertions(+), 3934 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3e4ac8f0..6add5284 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -6,7 +6,7 @@ "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", "features": { "ghcr.io/devcontainers/features/docker-outside-of-docker:1": { - "moby" : false + "moby": false }, "ghcr.io/rails/devcontainer/features/bun:1.0.2": {}, "ghcr.io/devcontainers-extra/features/go-task:1": {}, diff --git a/biome.json b/biome.json index b1c4320a..6b6223de 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.4.6/schema.json", + "$schema": "https://biomejs.dev/schemas/2.5.0/schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -60,7 +60,7 @@ "linter": { "enabled": true, "rules": { - "recommended": true, + "preset": "recommended", "complexity": { "noArguments": "error", "noExcessiveCognitiveComplexity": { diff --git a/dashboard/bun.lock b/dashboard/bun.lock index a65e2a23..4451408b 100644 --- a/dashboard/bun.lock +++ b/dashboard/bun.lock @@ -5,58 +5,58 @@ "": { "name": "lovely-eye-dashboard", "dependencies": { - "@apollo/client": "^4.1.6", - "@radix-ui/react-avatar": "^1.1.11", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-popover": "^1.1.15", - "@radix-ui/react-progress": "^1.1.8", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-tabs": "^1.1.13", - "@tanstack/react-router": "^1.166.3", + "@apollo/client": "^4.2.3", + "@daypicker/react": "^10.0.1", + "@radix-ui/react-avatar": "^1.2.0", + "@radix-ui/react-checkbox": "^1.3.5", + "@radix-ui/react-dropdown-menu": "^2.1.18", + "@radix-ui/react-label": "^2.1.10", + "@radix-ui/react-popover": "^1.1.17", + "@radix-ui/react-progress": "^1.1.10", + "@radix-ui/react-select": "^2.3.1", + "@radix-ui/react-separator": "^1.1.10", + "@radix-ui/react-slot": "^1.3.0", + "@radix-ui/react-tabs": "^1.1.15", + "@tanstack/react-router": "^1.170.16", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "date-fns": "^4.1.0", - "graphql": "^16.13.1", - "lucide-react": "^1.0.0", - "react": "^19.2.4", - "react-day-picker": "^9.14.0", - "react-dom": "^19.2.4", - "react-is": "^19.2.4", + "date-fns": "^4.4.0", + "graphql": "^16.14.2", + "lucide-react": "^1.21.0", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-is": "^19.2.7", "recharts": "3.8.1", - "tailwind-merge": "^3.5.0", + "tailwind-merge": "^3.6.0", "tailwindcss-animate": "^1.0.7", - "zod": "^4.3.6", + "zod": "^4.4.3", }, "devDependencies": { - "@biomejs/biome": "^2.4.6", - "@graphql-codegen/cli": "^6.1.3", - "@graphql-codegen/client-preset": "^5.2.4", - "@tailwindcss/postcss": "^4.2.1", - "@tailwindcss/vite": "^4.2.1", - "@tanstack/router-generator": "^1.166.2", - "@tanstack/router-plugin": "^1.166.3", - "@types/node": "^25.3.5", - "@types/react": "^19.2.14", + "@biomejs/biome": "^2.5.0", + "@graphql-codegen/cli": "^7.1.3", + "@graphql-codegen/client-preset": "^6.0.1", + "@tailwindcss/postcss": "^4.3.1", + "@tailwindcss/vite": "^4.3.1", + "@tanstack/router-generator": "^1.167.17", + "@tanstack/router-plugin": "^1.168.18", + "@types/node": "^26.0.0", + "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.0", - "@vitejs/plugin-react-swc": "^4.2.3", - "autoprefixer": "^10.4.27", + "@vitejs/plugin-react": "^6.0.2", + "@vitejs/plugin-react-swc": "^4.3.1", + "autoprefixer": "^10.5.0", "lightningcss": "^1.32.0", - "postcss": "^8.5.8", - "tailwindcss": "^4.2.1", - "typescript": "~5.9.3", - "vite": "^8.0.0", + "postcss": "^8.5.15", + "tailwindcss": "^4.3.1", + "typescript": "~6.0.3", + "vite": "^8.0.16", }, }, }, "packages": { "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], - "@apollo/client": ["@apollo/client@4.1.6", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", "@wry/equality": "^0.5.6", "@wry/trie": "^0.5.0", "graphql-tag": "^2.12.6", "optimism": "^0.18.0", "tslib": "^2.3.0" }, "peerDependencies": { "graphql": "^16.0.0", "graphql-ws": "^5.5.5 || ^6.0.3", "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", "react-dom": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", "rxjs": "^7.3.0", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "optionalPeers": ["graphql-ws", "react", "react-dom", "subscriptions-transport-ws"] }, "sha512-ak8uzqmKeX3u9BziGf83RRyODAJKFkPG72hTNvEj4WjMWFmuKW2gGN1i3OfajKT6yuGjvo+n23ES2zqWDKFCZg=="], + "@apollo/client": ["@apollo/client@4.2.3", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", "@wry/equality": "^0.5.6", "@wry/trie": "^0.5.0", "graphql-tag": "^2.12.6", "optimism": "^0.18.0", "tslib": "^2.3.0" }, "peerDependencies": { "graphql": "^16.0.0 || ^17.0.0", "graphql-ws": "^5.5.5 || ^6.0.3", "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", "react-dom": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", "rxjs": "^7.3.0", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "optionalPeers": ["graphql-ws", "react", "react-dom", "subscriptions-transport-ws"] }, "sha512-+auRYBXow2v7cT+wKzvjyMyyEojq+G7Sf80vIR57rtEPcxRFuMXuU9IKjwxZ3muclUgdGKwZXNeuki+g0GabgQ=="], "@ardatan/relay-compiler": ["@ardatan/relay-compiler@13.0.0", "", { "dependencies": { "@babel/runtime": "^7.26.10", "immutable": "^5.1.5", "invariant": "^2.2.4" }, "peerDependencies": { "graphql": "*" } }, "sha512-ite4+xng5McO8MflWCi0un0YmnorTujsDnfPfhzYzAgoJ+jkI1pZj6jtmTl8Jptyi1H+Pa0zlatJIsxDD++ETA=="], @@ -90,43 +90,41 @@ "@babel/plugin-syntax-import-assertions": ["@babel/plugin-syntax-import-assertions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg=="], - "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], - - "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="], - "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], - "@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], + "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], - "@biomejs/biome": ["@biomejs/biome@2.4.6", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.4.6", "@biomejs/cli-darwin-x64": "2.4.6", "@biomejs/cli-linux-arm64": "2.4.6", "@biomejs/cli-linux-arm64-musl": "2.4.6", "@biomejs/cli-linux-x64": "2.4.6", "@biomejs/cli-linux-x64-musl": "2.4.6", "@biomejs/cli-win32-arm64": "2.4.6", "@biomejs/cli-win32-x64": "2.4.6" }, "bin": { "biome": "bin/biome" } }, "sha512-QnHe81PMslpy3mnpL8DnO2M4S4ZnYPkjlGCLWBZT/3R9M6b5daArWMMtEfP52/n174RKnwRIf3oT8+wc9ihSfQ=="], + "@biomejs/biome": ["@biomejs/biome@2.5.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.0", "@biomejs/cli-darwin-x64": "2.5.0", "@biomejs/cli-linux-arm64": "2.5.0", "@biomejs/cli-linux-arm64-musl": "2.5.0", "@biomejs/cli-linux-x64": "2.5.0", "@biomejs/cli-linux-x64-musl": "2.5.0", "@biomejs/cli-win32-arm64": "2.5.0", "@biomejs/cli-win32-x64": "2.5.0" }, "bin": { "biome": "bin/biome" } }, "sha512-4kURkd9hAPrdDM3C9n82ycYgx8hvQcW6MjKTEejruj8rK0N8P3OPpdy8BvI8kt3KWY4ycF5XtDOrktetEfhfuw=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.4.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-NW18GSyxr+8sJIqgoGwVp5Zqm4SALH4b4gftIA0n62PTuBs6G2tHlwNAOj0Vq0KKSs7Sf88VjjmHh0O36EnzrQ=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Mn3Fwi3SA5fgmfCPqmzpWF2DLZnms3BVAhM088nTnGrTZmHS3wwIjcoZPqpXeNgd3DrrLH6xp8vTLIBuJoZiXw=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.4.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-4uiE/9tuI7cnjtY9b07RgS7gGyYOAfIAGeVJWEfeCnAarOAS7qVmuRyX6d7JTKw28/mt+rUzMasYeZ+0R/U1Mw=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.5.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-rg3VPL5P8mYro6pqlXYXuJWph21slVp3SZtAqWSrkZs40d2gTzYmHF8E/X1iTID25btmNKltNDJ926sqVBp7DQ=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.4.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-kMLaI7OF5GN1Q8Doymjro1P8rVEoy7BKQALNz6fiR8IC1WKduoNyteBtJlHT7ASIL0Cx2jR6VUOBIbcB1B8pew=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.5.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-tl+LW8fdD96/xdeWtWwc82LIOc5CoY7N2AsogLTp5R4ECErYt+8Jl/N68ezN9vzSiqPTxw6vjcihoLPYKZHrlw=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.4.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-F/JdB7eN22txiTqHM5KhIVt0jVkzZwVYrdTR1O3Y4auBOQcXxHK4dxULf4z43QyZI5tsnQJrRBHZy7wwtL+B3A=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.5.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vQdM4oSGaf7ZNeGO9w5+Y8SBtyser9M6znxYbm7Ec8wInxJu1WiKxFYZW5Auj2d80bcVvefuGGRxoFOE0eee8g=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.4.6", "", { "os": "linux", "cpu": "x64" }, "sha512-oHXmUFEoH8Lql1xfc3QkFLiC1hGR7qedv5eKNlC185or+o4/4HiaU7vYODAH3peRCfsuLr1g6v2fK9dFFOYdyw=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.5.0", "", { "os": "linux", "cpu": "x64" }, "sha512-zpEGf4RQbFEh8Vt7OmavLyyOzRbtcE9osCqrS1kfvt8jDvxwhKXLSf7n0ebr/ov0RJ9ssP+lhs6C8a9WwFvrQA=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.4.6", "", { "os": "linux", "cpu": "x64" }, "sha512-C9s98IPDu7DYarjlZNuzJKTjVHN03RUnmHV5htvqsx6vEUXCDSJ59DNwjKVD5XYoSS4N+BYhq3RTBAL8X6svEg=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.5.0", "", { "os": "linux", "cpu": "x64" }, "sha512-+9hIcMngJ+yGUahXqZuZ8CoWKJE9SAZsFsM3QDvXpNsLbXZ9lqVzgBhOk/jTSYkOA0GLP9eu3teukqpLUojHMg=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.4.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-xzThn87Pf3YrOGTEODFGONmqXpTwUNxovQb72iaUOdcw8sBSY3+3WD8Hm9IhMYLnPi0n32s3L3NWU6+eSjfqFg=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.5.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-jB0wAvTLI4itx5VidqVUejPQFhRUxiZ9l9FvZ26D5fl6t3qme+ZB4PD3bTSeL1vZ8NI2Rx/zj6H9zcESuGHKGw=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.4.6", "", { "os": "win32", "cpu": "x64" }, "sha512-7++XhnsPlr1HDbor5amovPjOH6vsrFOCdp93iKXhFn6bcMUI6soodj3WWKfgEO6JosKU1W5n3uky3WW9RlRjTg=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.0", "", { "os": "win32", "cpu": "x64" }, "sha512-VT/lF+GId+67j8aDfLkxdxNoVApsPSTbyAtB3jJq0IWTrY77WXfbPfpngxq0bA6JCEv/7k8C9qWjDRKRznDlyw=="], "@date-fns/tz": ["@date-fns/tz@1.4.1", "", {}, "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA=="], - "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + "@daypicker/react": ["@daypicker/react@10.0.1", "", { "dependencies": { "react-day-picker": "10.0.1" }, "peerDependencies": { "@types/react": ">=16.8.0", "react": ">=16.8.0" }, "optionalPeers": ["@types/react"] }, "sha512-lH4YQz4iMBWP8hsI1bD9Eg0T7t503IkSUR/WDGGkV5mKZvwVv+ukCkJz7yN+uVFBv7vHTK+ww7a5EvlkeFwPYQ=="], + + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], - "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], "@envelop/core": ["@envelop/core@5.4.0", "", { "dependencies": { "@envelop/instrumentation": "^1.0.0", "@envelop/types": "^5.2.1", "@whatwg-node/promise-helpers": "^1.2.4", "tslib": "^2.5.0" } }, "sha512-/1fat63pySE8rw/dZZArEVytLD90JApY85deDJ0/34gm+yhQ3k70CloSUevxoOE4YCGveG3s9SJJfQeeB4NAtQ=="], @@ -134,58 +132,6 @@ "@envelop/types": ["@envelop/types@5.2.1", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.5.0" } }, "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.27.2", "", { "os": "android", "cpu": "arm" }, "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.2", "", { "os": "android", "cpu": "arm64" }, "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.27.2", "", { "os": "android", "cpu": "x64" }, "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.2", "", { "os": "linux", "cpu": "arm" }, "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA=="], - - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.2", "", { "os": "none", "cpu": "arm64" }, "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.2", "", { "os": "none", "cpu": "x64" }, "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA=="], - - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg=="], - - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.2", "", { "os": "none", "cpu": "arm64" }, "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.2", "", { "os": "win32", "cpu": "x64" }, "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ=="], - "@fastify/busboy": ["@fastify/busboy@3.2.0", "", {}, "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA=="], "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], @@ -196,27 +142,27 @@ "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], - "@graphql-codegen/add": ["@graphql-codegen/add@6.0.0", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^6.0.0", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-biFdaURX0KTwEJPQ1wkT6BRgNasqgQ5KbCI1a3zwtLtO7XTo7/vKITPylmiU27K5DSOWYnY/1jfSqUAEBuhZrQ=="], + "@graphql-codegen/add": ["@graphql-codegen/add@7.0.1", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^7.0.1", "tslib": "^2.8.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-kWw6RMu9ysBw1wcgcgf9mOnswc5M3ekOApDTiaJC/UZNTEYins01srZHYTP7z3P/WlGGC844BRtjwh3U2kNd/A=="], - "@graphql-codegen/cli": ["@graphql-codegen/cli@6.1.3", "", { "dependencies": { "@babel/generator": "^7.18.13", "@babel/template": "^7.18.10", "@babel/types": "^7.18.13", "@graphql-codegen/client-preset": "^5.2.4", "@graphql-codegen/core": "^5.0.1", "@graphql-codegen/plugin-helpers": "^6.1.1", "@graphql-tools/apollo-engine-loader": "^8.0.28", "@graphql-tools/code-file-loader": "^8.1.28", "@graphql-tools/git-loader": "^8.0.32", "@graphql-tools/github-loader": "^9.0.6", "@graphql-tools/graphql-file-loader": "^8.1.11", "@graphql-tools/json-file-loader": "^8.0.26", "@graphql-tools/load": "^8.1.8", "@graphql-tools/url-loader": "^9.0.6", "@graphql-tools/utils": "^11.0.0", "@inquirer/prompts": "^7.8.2", "@whatwg-node/fetch": "^0.10.0", "chalk": "^4.1.0", "cosmiconfig": "^9.0.0", "debounce": "^2.0.0", "detect-indent": "^6.0.0", "graphql-config": "^5.1.6", "is-glob": "^4.0.1", "jiti": "^2.3.0", "json-to-pretty-yaml": "^1.2.2", "listr2": "^9.0.0", "log-symbols": "^4.0.0", "micromatch": "^4.0.5", "shell-quote": "^1.7.3", "string-env-interpolation": "^1.0.1", "ts-log": "^2.2.3", "tslib": "^2.4.0", "yaml": "^2.3.1", "yargs": "^17.0.0" }, "peerDependencies": { "@parcel/watcher": "^2.1.0", "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" }, "optionalPeers": ["@parcel/watcher"], "bin": { "gql-gen": "cjs/bin.js", "graphql-codegen": "cjs/bin.js", "graphql-codegen-esm": "esm/bin.js", "graphql-code-generator": "cjs/bin.js" } }, "sha512-fkPJiOEjHndK5hWH1O1vq8+Y0c2zYYzS79Mz/wVpcv9koz5hnkB0UsdXVtK2UYorh2gLvQfNr7NByX1TUmPibg=="], + "@graphql-codegen/cli": ["@graphql-codegen/cli@7.1.3", "", { "dependencies": { "@babel/generator": "^7.18.13", "@babel/template": "^7.18.10", "@babel/types": "^7.18.13", "@graphql-codegen/client-preset": "^6.0.1", "@graphql-codegen/core": "^6.1.0", "@graphql-codegen/plugin-helpers": "^7.0.1", "@graphql-tools/apollo-engine-loader": "^8.0.28", "@graphql-tools/code-file-loader": "^8.1.28", "@graphql-tools/git-loader": "^8.0.32", "@graphql-tools/github-loader": "^9.0.6", "@graphql-tools/graphql-file-loader": "^8.1.11", "@graphql-tools/json-file-loader": "^8.0.26", "@graphql-tools/load": "^8.1.8", "@graphql-tools/merge": "^9.0.6", "@graphql-tools/url-loader": "^9.0.6", "@graphql-tools/utils": "^11.0.0", "@inquirer/prompts": "^8.3.2", "@whatwg-node/fetch": "^0.10.0", "chalk": "^5.6.0", "cosmiconfig": "^9.0.0", "debounce": "^3.0.0", "detect-indent": "^7.0.0", "graphql-config": "^5.1.6", "is-glob": "^4.0.1", "jiti": "^2.3.0", "json-to-pretty-yaml": "^1.2.2", "listr2": "^10.2.1", "log-symbols": "^7.0.0", "micromatch": "^4.0.5", "shell-quote": "^1.7.3", "string-env-interpolation": "^1.0.1", "ts-log": "^3.0.0", "tslib": "^2.4.0", "yaml": "^2.3.1", "yargs": "^18.0.0" }, "peerDependencies": { "@parcel/watcher": "^2.1.0", "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" }, "optionalPeers": ["@parcel/watcher"], "bin": { "gql-gen": "esm/bin.js", "graphql-codegen": "esm/bin.js", "graphql-code-generator": "esm/bin.js", "graphql-codegen-esm": "esm/bin.js", "graphql-codegen-cjs": "cjs/bin.js" } }, "sha512-mMYwpvpqJjjHoA/c6HBjdlbT8JqFC6W85RB80tpHACapufBnLlyNtYHYeOYAoUuU1n3cGQi1if1pKHnjLgS/eQ=="], - "@graphql-codegen/client-preset": ["@graphql-codegen/client-preset@5.2.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/template": "^7.20.7", "@graphql-codegen/add": "^6.0.0", "@graphql-codegen/gql-tag-operations": "5.1.4", "@graphql-codegen/plugin-helpers": "^6.1.1", "@graphql-codegen/typed-document-node": "^6.1.7", "@graphql-codegen/typescript": "^5.0.9", "@graphql-codegen/typescript-operations": "^5.0.9", "@graphql-codegen/visitor-plugin-common": "^6.2.4", "@graphql-tools/documents": "^1.0.0", "@graphql-tools/utils": "^11.0.0", "@graphql-typed-document-node/core": "3.2.0", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql-sock": "^1.0.0" }, "optionalPeers": ["graphql-sock"] }, "sha512-k4f9CoepkVznXRReCHBVnG/FeQVQgIOhgtkaJ6I9FcQRzUkrm9ASmQjOdNdMlZt0DHTU4nbVxIBGZW7gk1RavA=="], + "@graphql-codegen/client-preset": ["@graphql-codegen/client-preset@6.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/template": "^7.20.7", "@graphql-codegen/add": "^7.0.1", "@graphql-codegen/gql-tag-operations": "^6.0.1", "@graphql-codegen/plugin-helpers": "^7.0.1", "@graphql-codegen/typed-document-node": "^7.0.1", "@graphql-codegen/typescript": "^6.0.2", "@graphql-codegen/typescript-operations": "^6.0.3", "@graphql-codegen/visitor-plugin-common": "^7.0.3", "@graphql-tools/documents": "^1.0.0", "@graphql-tools/utils": "^11.0.0", "@graphql-typed-document-node/core": "3.2.0", "tslib": "^2.8.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql-sock": "^1.0.0" }, "optionalPeers": ["graphql-sock"] }, "sha512-6wh0ZHG9WzBD6bE4AVOO6VCCMXK2orxHuXxaNKj+sj1w0qZ3Y3WIjZnqZLg6JZrHCIs/e+gy3T15Dc2pH8IbHA=="], - "@graphql-codegen/core": ["@graphql-codegen/core@5.0.1", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", "@graphql-tools/schema": "^10.0.0", "@graphql-tools/utils": "^11.0.0", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-eQD7aXpKkKvaydMv5Bu0FnKCPnNMAhZ3vZW+K4Rl9IAC2w5PDv9lJhs3YTWM9W58zNOZpGQGT2F0ekS3QNIiKw=="], + "@graphql-codegen/core": ["@graphql-codegen/core@6.1.0", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^7.0.1", "@graphql-tools/schema": "^10.0.0", "@graphql-tools/utils": "^11.0.0", "tslib": "^2.8.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-jReAzuCYlrSBJHW2bfBpDl/vMRCw0yQEoTvGi9K+3OTsazDXEQGOpCVfj8p/xO2h7ynu5Yrvzo0sUylVv0CnwA=="], - "@graphql-codegen/gql-tag-operations": ["@graphql-codegen/gql-tag-operations@5.1.4", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", "@graphql-codegen/visitor-plugin-common": "^6.2.4", "@graphql-tools/utils": "^11.0.0", "auto-bind": "~4.0.0", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-tDj/0a1U7rDH3PQgLeA+PlgBNb593MIJ43oAOKMRgJPwIQ9T7p2oqBRLxwfFZFTDLwnwsGZ7xIKqIcGgyAIj5Q=="], + "@graphql-codegen/gql-tag-operations": ["@graphql-codegen/gql-tag-operations@6.0.1", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^7.0.1", "@graphql-codegen/visitor-plugin-common": "^7.0.3", "@graphql-tools/utils": "^11.0.0", "auto-bind": "^5.0.0", "tslib": "^2.8.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-eHYUIchZLG6G+kafeKnUByL2Nkmb8Uj2vg33UVLFj8XJ2coC4b1iRDWxCdTXbupZrN0FaM0QRRBLs3zBEAzcJg=="], - "@graphql-codegen/plugin-helpers": ["@graphql-codegen/plugin-helpers@6.1.1", "", { "dependencies": { "@graphql-tools/utils": "^11.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-ipWZHA4ZG8PUdZWx87rvL6LCoIZVhrovVl+448FuxnKIGdzyLmL3+FJc/x96jsQZqKKrUcId9oEgssyh6p15eg=="], + "@graphql-codegen/plugin-helpers": ["@graphql-codegen/plugin-helpers@7.0.1", "", { "dependencies": { "@graphql-tools/utils": "^11.0.0", "change-case-all": "^2.1.0", "common-tags": "1.8.2", "import-from": "4.0.0", "tslib": "^2.8.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-S2X0YT3XQbP2haqhIeku8GOXo2j8QuBu7BrLsOEHz4UeMu78y3rja1Q4ri3oJ0jq4dMgaQlazoVHI/A+FAKMGw=="], - "@graphql-codegen/schema-ast": ["@graphql-codegen/schema-ast@5.0.1", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", "@graphql-tools/utils": "^11.0.0", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-svLffXddnXxq1qFXQqqh+zYrxdiMnIKm+CXCUv0MYhLh0R4L5vpnaTzIUCk3icHNNXhKRm2uBD70+K8VY0xiCg=="], + "@graphql-codegen/schema-ast": ["@graphql-codegen/schema-ast@6.0.1", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^7.0.1", "@graphql-tools/utils": "^11.0.0", "tslib": "^2.8.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-P16b6XCWXfcrA4fkuAyqoy883USAULifv8YWgEOrNKDAnr2DR+Kr85jSomknIUTY39wiuvisv4/lrdXobwK6sA=="], - "@graphql-codegen/typed-document-node": ["@graphql-codegen/typed-document-node@6.1.7", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", "@graphql-codegen/visitor-plugin-common": "^6.2.4", "auto-bind": "~4.0.0", "change-case-all": "1.0.15", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-VLL9hB+YPigc/W2QYCkSNMZrkKv42nTchb9mJ0h5VY98YmW/zWb6NeYM80iHSpk8ZvHsuUT5geA53/s1phO2NQ=="], + "@graphql-codegen/typed-document-node": ["@graphql-codegen/typed-document-node@7.0.3", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^7.0.1", "@graphql-codegen/visitor-plugin-common": "^7.1.0", "auto-bind": "^5.0.0", "change-case-all": "^2.1.0", "tslib": "^2.8.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-l/4KenYJG5D8Aj6Aa2KPeS0fdMIIi04Qx28d4SLwMWuyFU9WXspU5mR9YMNDRZzaTgBtGR8aMIl9RzyiWf5uUw=="], - "@graphql-codegen/typescript": ["@graphql-codegen/typescript@5.0.9", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", "@graphql-codegen/schema-ast": "^5.0.1", "@graphql-codegen/visitor-plugin-common": "^6.2.4", "auto-bind": "~4.0.0", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-YlIZ4nqdFdzr5vxuNtQtZnnMYuZ5cLYB2HaGhGI2zvqHxCmkBjIRpu/5sfccawKy23wetV+aoWvoNqxGKIryig=="], + "@graphql-codegen/typescript": ["@graphql-codegen/typescript@6.0.2", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^7.0.1", "@graphql-codegen/schema-ast": "^6.0.1", "@graphql-codegen/visitor-plugin-common": "^7.0.3", "auto-bind": "^5.0.0", "tslib": "~2.8.0" }, "peerDependencies": { "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-zyLfKsFJ7TRkQ0PyaUVuiAek9TSbtVJwwBoOuaE9RAWr45+9Y5W1LYldpiSTcyfxKVSIniE7Gj0V87qzrpdyYw=="], - "@graphql-codegen/typescript-operations": ["@graphql-codegen/typescript-operations@5.0.9", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", "@graphql-codegen/typescript": "^5.0.9", "@graphql-codegen/visitor-plugin-common": "^6.2.4", "auto-bind": "~4.0.0", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql-sock": "^1.0.0" }, "optionalPeers": ["graphql-sock"] }, "sha512-jJFdJKMS5Cqisb5QMi7xXHPsJH9yHBMYOxBc8laFkFjHk/AOqJK90qCKbO9lwwTMPZUDe6N/HslmA0ax4J0zsg=="], + "@graphql-codegen/typescript-operations": ["@graphql-codegen/typescript-operations@6.0.4", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^7.0.1", "@graphql-codegen/schema-ast": "^6.0.1", "@graphql-codegen/visitor-plugin-common": "^7.1.0", "auto-bind": "^5.0.0", "tslib": "^2.8.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql-sock": "^1.0.0" }, "optionalPeers": ["graphql-sock"] }, "sha512-YUmnmZcJ6wMcC2VmTE7gw18zoG4S1VF1aJmaupDrBnwfKGA5BmdKrA6k2Wj6ZkUDOduHI60l/cmZBRtqel4VtQ=="], - "@graphql-codegen/visitor-plugin-common": ["@graphql-codegen/visitor-plugin-common@6.2.4", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", "@graphql-tools/optimize": "^2.0.0", "@graphql-tools/relay-operation-optimizer": "^7.1.1", "@graphql-tools/utils": "^11.0.0", "auto-bind": "~4.0.0", "change-case-all": "1.0.15", "dependency-graph": "^1.0.0", "graphql-tag": "^2.11.0", "parse-filepath": "^1.0.2", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-iwiVCc7Mv8/XAa3K35AdFQ9chJSDv/gYEnBeQFF/Sq/W8EyJoHypOGOTTLk7OSrWO4xea65ggv0e7fGt7rPJjQ=="], + "@graphql-codegen/visitor-plugin-common": ["@graphql-codegen/visitor-plugin-common@7.1.1", "", { "dependencies": { "@graphql-codegen/plugin-helpers": "^7.0.1", "@graphql-tools/optimize": "^2.0.0", "@graphql-tools/relay-operation-optimizer": "^7.1.1", "@graphql-tools/utils": "^11.0.0", "auto-bind": "^5.0.0", "change-case-all": "^2.1.0", "dependency-graph": "^1.0.0", "graphql-tag": "^2.11.0", "parse-filepath": "^1.0.2", "tslib": "^2.8.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-MGZBXmp1i+45aw0GRH+BBpOI8ic8Ay/OJ5zGeZH6SLhSB/uxhwTjjOxkxazR8dqzKTbk7hFPhIXcXhkFP2v2eA=="], "@graphql-hive/signal": ["@graphql-hive/signal@2.0.0", "", {}, "sha512-Pz8wB3K0iU6ae9S1fWfsmJX24CcGeTo6hE7T44ucmV/ALKRj+bxClmqrYcDT7v3f0d12Rh4FAXBb6gon+WkDpQ=="], @@ -270,37 +216,37 @@ "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], - "@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="], + "@inquirer/ansi": ["@inquirer/ansi@2.0.7", "", {}, "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q=="], - "@inquirer/checkbox": ["@inquirer/checkbox@4.3.2", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA=="], + "@inquirer/checkbox": ["@inquirer/checkbox@5.2.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/core": "^11.2.1", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw=="], - "@inquirer/confirm": ["@inquirer/confirm@5.1.21", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ=="], + "@inquirer/confirm": ["@inquirer/confirm@6.1.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ=="], - "@inquirer/core": ["@inquirer/core@10.3.2", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A=="], + "@inquirer/core": ["@inquirer/core@11.2.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA=="], - "@inquirer/editor": ["@inquirer/editor@4.2.23", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/external-editor": "^1.0.3", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ=="], + "@inquirer/editor": ["@inquirer/editor@5.2.2", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/external-editor": "^3.0.3", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg=="], - "@inquirer/expand": ["@inquirer/expand@4.0.23", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew=="], + "@inquirer/expand": ["@inquirer/expand@5.1.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g=="], - "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="], + "@inquirer/external-editor": ["@inquirer/external-editor@3.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA=="], - "@inquirer/figures": ["@inquirer/figures@1.0.15", "", {}, "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g=="], + "@inquirer/figures": ["@inquirer/figures@2.0.7", "", {}, "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw=="], - "@inquirer/input": ["@inquirer/input@4.3.1", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g=="], + "@inquirer/input": ["@inquirer/input@5.1.2", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg=="], - "@inquirer/number": ["@inquirer/number@3.0.23", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg=="], + "@inquirer/number": ["@inquirer/number@4.1.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA=="], - "@inquirer/password": ["@inquirer/password@4.0.23", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA=="], + "@inquirer/password": ["@inquirer/password@5.1.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg=="], - "@inquirer/prompts": ["@inquirer/prompts@7.10.1", "", { "dependencies": { "@inquirer/checkbox": "^4.3.2", "@inquirer/confirm": "^5.1.21", "@inquirer/editor": "^4.2.23", "@inquirer/expand": "^4.0.23", "@inquirer/input": "^4.3.1", "@inquirer/number": "^3.0.23", "@inquirer/password": "^4.0.23", "@inquirer/rawlist": "^4.1.11", "@inquirer/search": "^3.2.2", "@inquirer/select": "^4.4.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg=="], + "@inquirer/prompts": ["@inquirer/prompts@8.5.2", "", { "dependencies": { "@inquirer/checkbox": "^5.2.1", "@inquirer/confirm": "^6.1.1", "@inquirer/editor": "^5.2.2", "@inquirer/expand": "^5.1.1", "@inquirer/input": "^5.1.2", "@inquirer/number": "^4.1.1", "@inquirer/password": "^5.1.1", "@inquirer/rawlist": "^5.3.1", "@inquirer/search": "^4.2.1", "@inquirer/select": "^5.2.1" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g=="], - "@inquirer/rawlist": ["@inquirer/rawlist@4.1.11", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw=="], + "@inquirer/rawlist": ["@inquirer/rawlist@5.3.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og=="], - "@inquirer/search": ["@inquirer/search@3.2.2", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA=="], + "@inquirer/search": ["@inquirer/search@4.2.1", "", { "dependencies": { "@inquirer/core": "^11.2.1", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g=="], - "@inquirer/select": ["@inquirer/select@4.4.2", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w=="], + "@inquirer/select": ["@inquirer/select@5.2.1", "", { "dependencies": { "@inquirer/ansi": "^2.0.7", "@inquirer/core": "^11.2.1", "@inquirer/figures": "^2.0.7", "@inquirer/type": "^4.0.7" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw=="], - "@inquirer/type": ["@inquirer/type@3.0.10", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA=="], + "@inquirer/type": ["@inquirer/type@4.0.7", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -312,7 +258,7 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="], "@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=="], @@ -320,121 +266,119 @@ "@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=="], - "@oxc-project/runtime": ["@oxc-project/runtime@0.115.0", "", {}, "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ=="], - - "@oxc-project/types": ["@oxc-project/types@0.115.0", "", {}, "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw=="], + "@oxc-project/types": ["@oxc-project/types@0.133.0", "", {}, "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA=="], - "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], + "@radix-ui/number": ["@radix-ui/number@1.1.2", "", {}, "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig=="], - "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.4", "", {}, "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ=="], - "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.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-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.10", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-j2VTDz1vgCsmuG0k5lBfOcM8n5JPFqZBcMryasFjHYMhwxYL5SRUV5lMSUpRdNtw3D/Sv8pzJtrlAgkssYSsQQ=="], - "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.11", "", { "dependencies": { "@radix-ui/react-context": "1.1.3", "@radix-ui/react-primitive": "2.1.4", "@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-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q=="], + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.2.0", "", { "dependencies": { "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-is-hydrated": "0.1.1", "@radix-ui/react-use-layout-effect": "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-am/CwltXtmtdtP+5FbYblYDnMa/zuKcMJP1i3/SJMDXXfj2mG+BTqLH2wucqeyyiQMursUtg/5cK+Nh2pCaSOA=="], - "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@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-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw=="], + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-use-size": "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-pREzrmNnVwGvYaBoM64huTRK7B3lrTRuwj8A9nwhPiEtMb+yudiWh6zWAqEtP0Dzd5+iBa1Ki7V1pCxV8ExMdA=="], - "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.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-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.10", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-slot": "1.3.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-IVVz4EvBcKjrzKgof714qDnz/SzQAkLA2Emh5edlHbgcE6fNd3Un6CJLlaYcnm8N4JmAtzQgse4dOKxcD2yc9g=="], - "@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-compose-refs": ["@radix-ui/react-compose-refs@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA=="], - "@radix-ui/react-context": ["@radix-ui/react-context@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw=="], + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg=="], - "@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-direction": ["@radix-ui/react-direction@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA=="], - "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.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-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="], + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-escape-keydown": "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-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg=="], - "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@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.16", "@radix-ui/react-primitive": "2.1.3", "@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-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw=="], + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.18", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-menu": "2.1.18", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-controllable-state": "1.2.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-PZGV82gFk0WltDRI//SsG28ZIjlo9ANTmoNYg0jLNzXXiDsAy5PkOOYQaVD1pPxY6t7gxffb1QMD6qaUvsBZdw=="], - "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="], + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q=="], - "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.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-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.10", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-callback-ref": "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-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw=="], - "@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-id": ["@radix-ui/react-id@1.1.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA=="], - "@radix-ui/react-label": ["@radix-ui/react-label@2.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A=="], + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.10", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ib0zvq2ZsAqKm5tRnqGJn3vOxSgIts5ToxsXT0q1S/GfLD1Zj7UOEnkw8u2w6sRmn47djpQWuSU1DCL1R29/yw=="], - "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@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.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-slot": "1.2.3", "@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-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg=="], + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.18", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.10", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.13", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.10", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.1", "@radix-ui/react-portal": "1.1.12", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-roving-focus": "1.1.13", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-callback-ref": "1.1.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.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-lj8Rxjtn6zJq1oSbE/uDtAwCbB9BnxgHD+8MwJMuTh6u1dPamYhW9iuELr/Z8d0D/UysFblYYHeBPwi7T4k0YQ=="], - "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "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.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@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-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA=="], + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.17", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dismissable-layer": "1.1.13", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.10", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.1", "@radix-ui/react-portal": "1.1.12", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.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-/YSAOdJ7YJvdn7bn5sdSx2egW+SKY+u7O5RyAVs94Ymrg2fg5QTSFPMRkzvhGyFuE4/qsmPBdrwYoZMZh/4f+g=="], - "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.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-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="], + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.3.1", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.10", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-rect": "1.1.2", "@radix-ui/react-use-size": "1.1.2", "@radix-ui/rect": "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-bhnq/0DEPTi2lsOD3J5rTL65qUKHbKbhqHsmN9TMiclSXpipi651ooUKPPp6G5lF/WiHBdn1s0Wuqsn+myVAvw=="], - "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.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-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.12", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-layout-effect": "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-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw=="], - "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "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-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="], + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.6", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "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-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ=="], - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="], + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.6", "", { "dependencies": { "@radix-ui/react-slot": "1.3.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-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g=="], - "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.8", "", { "dependencies": { "@radix-ui/react-context": "1.1.3", "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA=="], + "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.10", "", { "dependencies": { "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-JYzEg60lk79PwKM27WZyKd7PW8O4OM5jOaFfRPfOyeXmMw7tLJh5kSj+CEjVTehszuwml/AdCzPGMXBTGf4BBw=="], - "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@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.3", "@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-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="], + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.10", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.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-9gkwneI0guf8JDmrFxPjJF6Ozzgioyw+/lonYNCwefS9ZHA05er0BVHiXr+LbWGHxUfczvMY6G1oiZZi1VzjRw=="], - "@radix-ui/react-select": ["@radix-ui/react-select@2.2.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@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.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@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.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-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ=="], + "@radix-ui/react-select": ["@radix-ui/react-select@2.3.1", "", { "dependencies": { "@radix-ui/number": "1.1.2", "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.10", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.13", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.10", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.1", "@radix-ui/react-portal": "1.1.12", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-visually-hidden": "1.2.6", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.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-w6eDvY78LE9ZUiNnXCA1QVK8RYN7k9galFv09kjVydJqBAgHd7Y9A6h0UJ/6DCZNGZMZrB2ohcSW1Bo9d8+wWA=="], - "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g=="], + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.10", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Y6K6jLQCVfCnTL2MEtGxDLffkhNfEfHsEg3Wa8JU+IWdn3EWbLXd3OuOfQRN7p/W/cUce1WyTk3QeuAoDBzN9g=="], - "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "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-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="], + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.3.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA=="], - "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@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.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@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-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="], + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.6", "@radix-ui/react-roving-focus": "1.1.13", "@radix-ui/react-use-controllable-state": "1.2.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-kxc9gI6/HfcU4nfMMVS3AmQK414kbU1IE6UCJmMmxjhO3cRPXOyYnmvyKD+ODt7q56nRq9l7Wovi6uaGwKgMlg=="], - "@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-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw=="], - "@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-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.3", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.3", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA=="], - "@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-effect-event": ["@radix-ui/react-use-effect-event@0.0.3", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA=="], - "@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-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.2", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw=="], - "@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-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A=="], - "@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-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA=="], - "@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-previous": ["@radix-ui/react-use-previous@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw=="], - "@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-rect": ["@radix-ui/react-use-rect@1.1.2", "", { "dependencies": { "@radix-ui/rect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw=="], - "@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-use-size": ["@radix-ui/react-use-size@1.1.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w=="], - "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.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-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="], + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.6", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.6" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-jCE0WljWifTI4niIMCll06kGpsJTAPiZVU9H4WR1N6qW7At9ystHbN7dDB+we2xH535roFHj7qKS+RGj0FMDWQ=="], - "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + "@radix-ui/rect": ["@radix-ui/rect@1.1.2", "", {}, "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA=="], "@reduxjs/toolkit": ["@reduxjs/toolkit@2.11.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ=="], "@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.6", "", {}, "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.9", "", { "os": "android", "cpu": "arm64" }, "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.3", "", { "os": "android", "cpu": "arm64" }, "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ=="], + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg=="], + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9", "", { "os": "linux", "cpu": "arm" }, "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.3", "", { "os": "linux", "cpu": "arm" }, "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q=="], - "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w=="], + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg=="], - "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA=="], + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.9", "", { "os": "linux", "cpu": "x64" }, "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.3", "", { "os": "linux", "cpu": "x64" }, "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.9", "", { "os": "linux", "cpu": "x64" }, "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.3", "", { "os": "linux", "cpu": "x64" }, "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow=="], - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.9", "", { "os": "none", "cpu": "arm64" }, "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.3", "", { "os": "none", "cpu": "arm64" }, "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg=="], - "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.9", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g=="], + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.3", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g=="], - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.9", "", { "os": "win32", "cpu": "x64" }, "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], @@ -466,59 +410,57 @@ "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="], - "@tabby_ai/hijri-converter": ["@tabby_ai/hijri-converter@1.0.5", "", {}, "sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ=="], - - "@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="], + "@tailwindcss/node": ["@tailwindcss/node@4.3.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.1" } }, "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A=="], - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.1", "@tailwindcss/oxide-darwin-arm64": "4.2.1", "@tailwindcss/oxide-darwin-x64": "4.2.1", "@tailwindcss/oxide-freebsd-x64": "4.2.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", "@tailwindcss/oxide-linux-x64-musl": "4.2.1", "@tailwindcss/oxide-wasm32-wasi": "4.2.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" } }, "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw=="], + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.1", "@tailwindcss/oxide-darwin-arm64": "4.3.1", "@tailwindcss/oxide-darwin-x64": "4.3.1", "@tailwindcss/oxide-freebsd-x64": "4.3.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", "@tailwindcss/oxide-linux-x64-musl": "4.3.1", "@tailwindcss/oxide-wasm32-wasi": "4.3.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" } }, "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA=="], - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg=="], + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.1", "", { "os": "android", "cpu": "arm64" }, "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ=="], - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw=="], + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA=="], - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw=="], + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg=="], - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA=="], + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g=="], - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw=="], + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1", "", { "os": "linux", "cpu": "arm" }, "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg=="], - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ=="], + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ=="], - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ=="], + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA=="], - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g=="], + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg=="], - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g=="], + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ=="], - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.1", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q=="], + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.1", "", { "dependencies": { "@emnapi/core": "^1.10.0", "@emnapi/runtime": "^1.10.0", "@emnapi/wasi-threads": "^1.2.1", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA=="], - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA=="], + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg=="], - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ=="], + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA=="], - "@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.1", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "postcss": "^8.5.6", "tailwindcss": "4.2.1" } }, "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw=="], + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.3.1", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.3.1", "@tailwindcss/oxide": "4.3.1", "postcss": "8.5.15", "tailwindcss": "4.3.1" } }, "sha512-dNJuNbdEJT/SWRuXTYP1WSamelsz3ztkUsdtWQPjrexysrTpaEPM40P/71knXiXLYEojqPOEGitVLLpPMS5T6A=="], - "@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="], + "@tailwindcss/vite": ["@tailwindcss/vite@4.3.1", "", { "dependencies": { "@tailwindcss/node": "4.3.1", "@tailwindcss/oxide": "4.3.1", "tailwindcss": "4.3.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ=="], - "@tanstack/history": ["@tanstack/history@1.161.4", "", {}, "sha512-Kp/WSt411ZWYvgXy6uiv5RmhHrz9cAml05AQPrtdAp7eUqvIDbMGPnML25OKbzR3RJ1q4wgENxDTvlGPa9+Mww=="], + "@tanstack/history": ["@tanstack/history@1.162.0", "", {}, "sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA=="], - "@tanstack/react-router": ["@tanstack/react-router@1.166.3", "", { "dependencies": { "@tanstack/history": "1.161.4", "@tanstack/react-store": "^0.9.1", "@tanstack/router-core": "1.166.2", "isbot": "^5.1.22", "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-5NOwAnEp+koHYaRkK5+biYiuOxnQe/7q8R7LLAJ5Ryk6hXoIimOv6gWimPxANwhCWg9spfRZCNswi8EQaidYBg=="], + "@tanstack/react-router": ["@tanstack/react-router@1.170.16", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.171.13", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-w6eq1IJklujs1tESazaK/FxH0+H2l8vm/QPuu1cD3oRW/ubgKneQpd7b64ti/8gUyEimzimJQZDmJr6YHfP5+g=="], - "@tanstack/react-store": ["@tanstack/react-store@0.9.2", "", { "dependencies": { "@tanstack/store": "0.9.2", "use-sync-external-store": "^1.6.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-Vt5usJE5sHG/cMechQfmwvwne6ktGCELe89Lmvoxe3LKRoFrhPa8OCKWs0NliG8HTJElEIj7PLtaBQIcux5pAQ=="], + "@tanstack/react-store": ["@tanstack/react-store@0.9.3", "", { "dependencies": { "@tanstack/store": "0.9.3", "use-sync-external-store": "^1.6.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-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg=="], - "@tanstack/router-core": ["@tanstack/router-core@1.166.2", "", { "dependencies": { "@tanstack/history": "1.161.4", "@tanstack/store": "^0.9.1", "cookie-es": "^2.0.0", "seroval": "^1.4.2", "seroval-plugins": "^1.4.2", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-zn3NhENOAX9ToQiX077UV2OH3aJKOvV2ZMNZZxZ3gDG3i3WqL8NfWfEgetEAfMN37/Mnt90PpotYgf7IyuoKqQ=="], + "@tanstack/router-core": ["@tanstack/router-core@1.171.13", "", { "dependencies": { "@tanstack/history": "1.162.0", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-+NOwEj1kO/6IGmpHRIZHasYxYWpyBQGNIZAST9aNrk9Q3YlU9SgqVnl1pbLa9qAKfeNdXQIRve0RQb/0kyDeDA=="], - "@tanstack/router-generator": ["@tanstack/router-generator@1.166.2", "", { "dependencies": { "@tanstack/router-core": "1.166.2", "@tanstack/router-utils": "1.161.4", "@tanstack/virtual-file-routes": "1.161.4", "prettier": "^3.5.0", "recast": "^0.23.11", "source-map": "^0.7.4", "tsx": "^4.19.2", "zod": "^3.24.2" } }, "sha512-wbvdyP1PKKQKk4aVlGeK9S5uDy8zodTr3tEZ2gRKNavJLusXbEWqtoo42JxHFFNB6dtguehFMt8PyZPAtkgWwQ=="], + "@tanstack/router-generator": ["@tanstack/router-generator@1.167.17", "", { "dependencies": { "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-utils": "1.162.2", "@tanstack/virtual-file-routes": "1.162.0", "jiti": "^2.7.0", "magic-string": "^0.30.21", "prettier": "^3.5.0", "zod": "^4.4.3" } }, "sha512-xtB9tB2Ws0tWR6Pi7nc3Qk9IYgoh1mQCKWjHqIl9tf6BNUpKoqniJoPAQ4+LGrK8FeZYU0o0p/qlZEyj9FAulA=="], - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.166.3", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.166.2", "@tanstack/router-generator": "1.166.2", "@tanstack/router-utils": "1.161.4", "@tanstack/virtual-file-routes": "1.161.4", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.166.3", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0", "vite-plugin-solid": "^2.11.10", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-yhnJRohpdKB24Fh7fW5mwgffpOcERZlXdk3i8PjXn+OYgAiG/cpuXXOJpZZ6An68vDW+Z5zBuTynXsDi2ZE4JQ=="], + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.168.18", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-generator": "1.167.17", "@tanstack/router-utils": "1.162.2", "chokidar": "^5.0.0", "unplugin": "^3.0.0", "zod": "^4.4.3" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", "@tanstack/react-router": "^1.170.15", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-MofS28/axfnfnhOD2RSgJEaU882aX5RsAzhGz5Vc4XhAmvCjy919u9JrNs4QsTWFbTD1P7IJ8WFlFVsrg0pStg=="], - "@tanstack/router-utils": ["@tanstack/router-utils@1.161.4", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-r8TpjyIZoqrXXaf2DDyjd44gjGBoyE+/oEaaH68yLI9ySPO1gUWmQENZ1MZnmBnpUGN24NOZxdjDLc8npK0SAw=="], + "@tanstack/router-utils": ["@tanstack/router-utils@1.162.2", "", { "dependencies": { "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ=="], - "@tanstack/store": ["@tanstack/store@0.9.2", "", {}, "sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA=="], + "@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="], - "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.161.4", "", {}, "sha512-42WoRePf8v690qG8yGRe/YOh+oHni9vUaUUfoqlS91U2scd3a5rkLtVsc6b7z60w3RogH0I00vdrC5AaeiZ18w=="], + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.162.0", "", {}, "sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], @@ -538,9 +480,9 @@ "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], - "@types/node": ["@types/node@25.3.5", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA=="], + "@types/node": ["@types/node@26.0.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA=="], - "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], + "@types/react": ["@types/react@19.2.17", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw=="], "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], @@ -548,9 +490,9 @@ "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], - "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="], + "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.2", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.0" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg=="], - "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@4.2.3", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.2", "@swc/core": "^1.15.11" }, "peerDependencies": { "vite": "^4 || ^5 || ^6 || ^7" } }, "sha512-QIluDil2prhY1gdA3GGwxZzTAmLdi8cQ2CcuMW4PB/Wu4e/1pzqrwhYWVd09LInCRlDUidQjd0B70QWbjWtLxA=="], + "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@4.3.1", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.0", "@swc/core": "^1.15.11" }, "peerDependencies": { "vite": "^4 || ^5 || ^6 || ^7 || ^8" } }, "sha512-PaeokKjAGraNN+s5SIApgsktnJprIyt3zgEIu7awnEdfn29QiB2crTcCzyi2XGpX9rUnTc0cKU07Wm0N0g7H2w=="], "@whatwg-node/disposablestack": ["@whatwg-node/disposablestack@0.0.6", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.6.3" } }, "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw=="], @@ -568,87 +510,67 @@ "@wry/trie": ["@wry/trie@0.5.0", "", { "dependencies": { "tslib": "^2.3.0" } }, "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA=="], - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], - "ansi-escapes": ["ansi-escapes@7.2.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw=="], "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="], - "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.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], - "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], + "auto-bind": ["auto-bind@5.0.1", "", {}, "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg=="], - "auto-bind": ["auto-bind@4.0.0", "", {}, "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ=="], - - "autoprefixer": ["autoprefixer@10.4.27", "", { "dependencies": { "browserslist": "^4.28.1", "caniuse-lite": "^1.0.30001774", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA=="], + "autoprefixer": ["autoprefixer@10.5.0", "", { "dependencies": { "browserslist": "^4.28.2", "caniuse-lite": "^1.0.30001787", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong=="], "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.9.13", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ=="], - - "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.38", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw=="], "brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "camel-case": ["camel-case@4.1.2", "", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="], - - "caniuse-lite": ["caniuse-lite@1.0.30001777", "", {}, "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], - "capital-case": ["capital-case@1.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A=="], + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], - "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], - "change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], - - "change-case-all": ["change-case-all@1.0.15", "", { "dependencies": { "change-case": "^4.1.2", "is-lower-case": "^2.0.2", "is-upper-case": "^2.0.2", "lower-case": "^2.0.2", "lower-case-first": "^2.0.2", "sponge-case": "^1.0.1", "swap-case": "^2.0.2", "title-case": "^3.0.3", "upper-case": "^2.0.2", "upper-case-first": "^2.0.2" } }, "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ=="], + "change-case-all": ["change-case-all@2.1.0", "", { "dependencies": { "change-case": "^5.2.0", "sponge-case": "^2.0.2", "swap-case": "^3.0.2", "title-case": "^3.0.3" } }, "sha512-v6b0WWWkZUMHVuYk82l+WROgkUm4qEN2w5hKRNWtEOYwWqUGoi8C6xH0l1RLF1EoWqDFK6MFclmN3od6ws3/uw=="], "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], - "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=="], + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], - "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="], + "cli-truncate": ["cli-truncate@5.2.0", "", { "dependencies": { "slice-ansi": "^8.0.0", "string-width": "^8.2.0" } }, "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw=="], "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="], - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], "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=="], - - "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], - "common-tags": ["common-tags@1.8.2", "", {}, "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA=="], - "constant-case": ["constant-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case": "^2.0.2" } }, "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ=="], - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "cookie-es": ["cookie-es@2.0.0", "", {}, "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg=="], + "cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], "cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="], @@ -682,11 +604,9 @@ "dataloader": ["dataloader@2.2.3", "", {}, "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA=="], - "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], + "date-fns": ["date-fns@4.4.0", "", {}, "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w=="], - "date-fns-jalali": ["date-fns-jalali@4.1.0-0", "", {}, "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg=="], - - "debounce": ["debounce@2.2.0", "", {}, "sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw=="], + "debounce": ["debounce@3.0.0", "", {}, "sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], @@ -694,7 +614,7 @@ "dependency-graph": ["dependency-graph@1.0.0", "", {}, "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg=="], - "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], + "detect-indent": ["detect-indent@7.0.2", "", {}, "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A=="], "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], @@ -704,13 +624,11 @@ "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], - "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], - - "electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="], + "electron-to-chromium": ["electron-to-chromium@1.5.376", "", {}, "sha512-cUVA7/RvbFTEuw/i3obUwDTRIXojaxkResf+ibByPFxjc6XK3VNtcQXV0NSbAlJ0FMjcJGgftVVB4Qo184EXvA=="], - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - "enhanced-resolve": ["enhanced-resolve@5.20.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ=="], + "enhanced-resolve": ["enhanced-resolve@5.21.6", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ=="], "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], @@ -720,16 +638,18 @@ "es-toolkit": ["es-toolkit@1.45.1", "", {}, "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw=="], - "esbuild": ["esbuild@0.27.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.2", "@esbuild/android-arm": "0.27.2", "@esbuild/android-arm64": "0.27.2", "@esbuild/android-x64": "0.27.2", "@esbuild/darwin-arm64": "0.27.2", "@esbuild/darwin-x64": "0.27.2", "@esbuild/freebsd-arm64": "0.27.2", "@esbuild/freebsd-x64": "0.27.2", "@esbuild/linux-arm": "0.27.2", "@esbuild/linux-arm64": "0.27.2", "@esbuild/linux-ia32": "0.27.2", "@esbuild/linux-loong64": "0.27.2", "@esbuild/linux-mips64el": "0.27.2", "@esbuild/linux-ppc64": "0.27.2", "@esbuild/linux-riscv64": "0.27.2", "@esbuild/linux-s390x": "0.27.2", "@esbuild/linux-x64": "0.27.2", "@esbuild/netbsd-arm64": "0.27.2", "@esbuild/netbsd-x64": "0.27.2", "@esbuild/openbsd-arm64": "0.27.2", "@esbuild/openbsd-x64": "0.27.2", "@esbuild/openharmony-arm64": "0.27.2", "@esbuild/sunos-x64": "0.27.2", "@esbuild/win32-arm64": "0.27.2", "@esbuild/win32-ia32": "0.27.2", "@esbuild/win32-x64": "0.27.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw=="], - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], "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-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], + + "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], + + "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], @@ -752,15 +672,13 @@ "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], - "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], - "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "graphql": ["graphql@16.13.1", "", {}, "sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ=="], + "graphql": ["graphql@16.14.2", "", {}, "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA=="], "graphql-config": ["graphql-config@5.1.6", "", { "dependencies": { "@graphql-tools/graphql-file-loader": "^8.0.0", "@graphql-tools/json-file-loader": "^8.0.0", "@graphql-tools/load": "^8.1.0", "@graphql-tools/merge": "^9.0.0", "@graphql-tools/url-loader": "^9.0.0", "@graphql-tools/utils": "^11.0.0", "cosmiconfig": "^8.1.0", "jiti": "^2.0.0", "minimatch": "^10.0.0", "string-env-interpolation": "^1.0.1", "tslib": "^2.4.0" }, "peerDependencies": { "cosmiconfig-toml-loader": "^1.0.0", "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" }, "optionalPeers": ["cosmiconfig-toml-loader"] }, "sha512-fCkYnm4Kdq3un0YIM4BCZHVR5xl0UeLP6syxxO7KAstdY7QVyVvTHP0kRPDYEP1v08uwtJVgis5sj3IOTLOniQ=="], @@ -768,10 +686,6 @@ "graphql-ws": ["graphql-ws@6.0.6", "", { "peerDependencies": { "@fastify/websocket": "^10 || ^11", "crossws": "~0.3", "graphql": "^15.10.1 || ^16", "uWebSockets.js": "^20", "ws": "^8" }, "optionalPeers": ["@fastify/websocket", "crossws", "uWebSockets.js", "ws"] }, "sha512-zgfER9s+ftkGKUZgc0xbx8T7/HMO4AV5/YuYiFc+AtgcO5T0v8AxYYNQ+ltzuzDZgNkYJaFspm5MMYLjQzrkmw=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - - "header-case": ["header-case@2.0.4", "", { "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" } }, "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q=="], - "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -792,25 +706,19 @@ "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], - "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-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - "is-lower-case": ["is-lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ=="], - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-relative": ["is-relative@1.0.0", "", { "dependencies": { "is-unc-path": "^1.0.0" } }, "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA=="], "is-unc-path": ["is-unc-path@1.0.0", "", { "dependencies": { "unc-path-regex": "^0.1.2" } }, "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ=="], - "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], - - "is-upper-case": ["is-upper-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ=="], + "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], @@ -820,7 +728,7 @@ "isows": ["isows@1.0.7", "", { "peerDependencies": { "ws": "*" } }, "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg=="], - "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], @@ -860,25 +768,19 @@ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="], - - "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + "listr2": ["listr2@10.2.1", "", { "dependencies": { "cli-truncate": "^5.2.0", "eventemitter3": "^5.0.4", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^10.0.0" } }, "sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q=="], "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="], - "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], + "log-symbols": ["log-symbols@7.0.1", "", { "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" } }, "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg=="], "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], - "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], - - "lower-case-first": ["lower-case-first@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg=="], - "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "lucide-react": ["lucide-react@1.8.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-WuvlsjngSk7TnTBJ1hsCy3ql9V9VOdcPkd3PKcSmM34vJD8KG6molxz7m7zbYFgICwsanQWmJ13JlYs4Zp7Arw=="], + "lucide-react": ["lucide-react@1.21.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-reEZMXq8Qdd5jg5XYkQ5TR1fB/GiQ7ih4vcrthYDtgjSDwh0i6/YLiGjsWsIwgN49gpAnd4J2elSNzncMEEUUQ=="], "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], @@ -896,19 +798,17 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="], + "mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], + "nanoid": ["nanoid@3.3.15", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA=="], "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], - "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + "node-releases": ["node-releases@2.0.48", "", {}, "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA=="], - "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + "normalize-path": ["normalize-path@2.1.1", "", { "dependencies": { "remove-trailing-separator": "^1.0.1" } }, "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w=="], "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], @@ -916,18 +816,12 @@ "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], "parse-filepath": ["parse-filepath@1.0.2", "", { "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", "path-root": "^0.1.1" } }, "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q=="], "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], - - "path-case": ["path-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg=="], - "path-root": ["path-root@0.1.1", "", { "dependencies": { "path-root-regex": "^0.1.0" } }, "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg=="], "path-root-regex": ["path-root-regex@0.1.2", "", {}, "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ=="], @@ -938,9 +832,9 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], + "postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="], "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], @@ -948,13 +842,13 @@ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], + "react": ["react@19.2.7", "", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="], - "react-day-picker": ["react-day-picker@9.14.0", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "@tabby_ai/hijri-converter": "1.0.5", "date-fns": "^4.1.0", "date-fns-jalali": "4.1.0-0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-tBaoDWjPwe0M5pGrum4H0SR6Lyk+BO9oHnp9JbKpGKW2mlraNPgP9BMfsg5pWpwrssARmeqk7YBl2oXutZTaHA=="], + "react-day-picker": ["react-day-picker@10.0.1", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "date-fns": "^4.1.0" }, "peerDependencies": { "@types/react": ">=16.8.0", "react": ">=16.8.0" }, "optionalPeers": ["@types/react"] }, "sha512-eNh6BlwcYInWaJtRv18mXQ06Ys/H6rdTZAnTaSdOYJuTpwP1JMCHNd1FDRadA+gbeinq+psdULN5Xnowy9mV8w=="], - "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], + "react-dom": ["react-dom@19.2.7", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.7" } }, "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="], - "react-is": ["react-is@19.2.4", "", {}, "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA=="], + "react-is": ["react-is@19.2.7", "", {}, "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A=="], "react-redux": ["react-redux@9.2.0", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": "^18.2.25 || ^19", "react": "^18.0 || ^19", "redux": "^5.0.0" }, "optionalPeers": ["@types/react", "redux"] }, "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g=="], @@ -964,9 +858,7 @@ "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=="], - - "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], + "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], "recharts": ["recharts@3.8.1", "", { "dependencies": { "@reduxjs/toolkit": "^1.9.0 || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg=="], @@ -980,21 +872,17 @@ "remove-trailing-spaces": ["remove-trailing-spaces@1.0.9", "", {}, "sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], - "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="], "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], - "rolldown": ["rolldown@1.0.0-rc.9", "", { "dependencies": { "@oxc-project/types": "=0.115.0", "@rolldown/pluginutils": "1.0.0-rc.9" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.9", "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", "@rolldown/binding-darwin-x64": "1.0.0-rc.9", "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q=="], + "rolldown": ["rolldown@1.0.3", "", { "dependencies": { "@oxc-project/types": "=0.133.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.3", "@rolldown/binding-darwin-arm64": "1.0.3", "@rolldown/binding-darwin-x64": "1.0.3", "@rolldown/binding-freebsd-x64": "1.0.3", "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", "@rolldown/binding-linux-arm64-gnu": "1.0.3", "@rolldown/binding-linux-arm64-musl": "1.0.3", "@rolldown/binding-linux-ppc64-gnu": "1.0.3", "@rolldown/binding-linux-s390x-gnu": "1.0.3", "@rolldown/binding-linux-x64-gnu": "1.0.3", "@rolldown/binding-linux-x64-musl": "1.0.3", "@rolldown/binding-openharmony-arm64": "1.0.3", "@rolldown/binding-wasm32-wasi": "1.0.3", "@rolldown/binding-win32-arm64-msvc": "1.0.3", "@rolldown/binding-win32-x64-msvc": "1.0.3" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], @@ -1006,11 +894,9 @@ "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "sentence-case": ["sentence-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg=="], + "seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], - "seroval": ["seroval@1.4.2", "", {}, "sha512-N3HEHRCZYn3cQbsC4B5ldj9j+tHdf4JZoYPlcI4rRYu0Xy4qN8MQf1Z08EibzB0WpgRG5BGK08FTrmM66eSzKQ=="], - - "seroval-plugins": ["seroval-plugins@1.4.2", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-X7p4MEDTi+60o2sXZ4bnDBhgsUYDSkQEvzYZuJyFqWg9jcoPsHts5nrg5O956py2wyt28lUrBxk0M0/wU8URpA=="], + "seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], @@ -1018,70 +904,56 @@ "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], - - "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], - - "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + "slice-ansi": ["slice-ansi@8.0.0", "", { "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" } }, "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - "sponge-case": ["sponge-case@1.0.1", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA=="], + "sponge-case": ["sponge-case@2.0.3", "", {}, "sha512-i4h9ZGRfxV6Xw3mpZSFOfbXjf0cQcYmssGWutgNIfFZ2VM+YIWfD71N/kjjwK6X/AAHzBr+rciEcn/L34S8TGw=="], "string-env-interpolation": ["string-env-interpolation@1.0.1", "", {}, "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg=="], - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - - "swap-case": ["swap-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw=="], + "swap-case": ["swap-case@3.0.3", "", {}, "sha512-6p4op8wE9CQv7uDFzulI6YXUw4lD9n4oQierdbFThEKVWVQcbQcUjdP27W8XE7V4QnWmnq9jueSHceyyQnqQVA=="], "sync-fetch": ["sync-fetch@0.6.0", "", { "dependencies": { "node-fetch": "^3.3.2", "timeout-signal": "^2.0.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-IELLEvzHuCfc1uTsshPK58ViSdNqXxlml1U+fmwJIKLYKOr/rAtBrorE2RYm5IHaMpDNlmC0fr1LAvdXvyheEQ=="], - "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="], + "tailwind-merge": ["tailwind-merge@3.6.0", "", {}, "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="], - "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="], + "tailwindcss": ["tailwindcss@4.3.1", "", {}, "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q=="], "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], - "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], + "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], "timeout-signal": ["timeout-signal@2.0.0", "", {}, "sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA=="], "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=="], - - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], "title-case": ["title-case@3.0.3", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "ts-log": ["ts-log@2.2.7", "", {}, "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg=="], + "ts-log": ["ts-log@3.0.2", "", {}, "sha512-esq6hx2lM66sQV1YcFkIYTqrWWabmqBqobKHyn1CswdI5FgfQhkmiKiRWVGBNlIbdjBxEIkNvMIwLKKPgRYZLQ=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], - - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], "unc-path-regex": ["unc-path-regex@0.1.2", "", {}, "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg=="], - "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], "unixify": ["unixify@1.0.0", "", { "dependencies": { "normalize-path": "^2.1.1" } }, "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg=="], - "unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], + "unplugin": ["unplugin@3.0.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg=="], "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], - "upper-case": ["upper-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg=="], - - "upper-case-first": ["upper-case-first@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg=="], - "urlpattern-polyfill": ["urlpattern-polyfill@10.1.0", "", {}, "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw=="], "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=="], @@ -1092,7 +964,7 @@ "victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="], - "vite": ["vite@8.0.0", "", { "dependencies": { "@oxc-project/runtime": "0.115.0", "lightningcss": "^1.32.0", "picomatch": "^4.0.3", "postcss": "^8.5.8", "rolldown": "1.0.0-rc.9", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.0.0-alpha.31", "esbuild": "^0.27.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q=="], + "vite": ["vite@8.0.16", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", "rolldown": "1.0.3", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw=="], "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], @@ -1100,7 +972,7 @@ "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], - "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + "wrap-ansi": ["wrap-ansi@10.0.0", "", { "dependencies": { "ansi-styles": "^6.2.3", "string-width": "^8.2.0", "strip-ansi": "^7.1.2" } }, "sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ=="], "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], @@ -1110,189 +982,81 @@ "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], - "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="], - - "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], - "@babel/core/@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], + "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], - "@babel/helper-module-imports/@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], - - "@babel/helper-module-transforms/@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], + "@babel/helper-compilation-targets/browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], "@babel/plugin-syntax-import-assertions/@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], - "@babel/traverse/@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/traverse/@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="], - - "@babel/traverse/@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], - - "@babel/traverse/@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/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], - - "@graphql-codegen/add/@graphql-codegen/plugin-helpers": ["@graphql-codegen/plugin-helpers@6.1.0", "", { "dependencies": { "@graphql-tools/utils": "^10.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", "tslib": "~2.6.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-JJypehWTcty9kxKiqH7TQOetkGdOYjY78RHlI+23qB59cV2wxjFFVf8l7kmuXS4cpGVUNfIjFhVr7A1W7JMtdA=="], - - "@graphql-codegen/add/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], - - "@graphql-codegen/client-preset/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], - - "@graphql-codegen/core/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], - - "@graphql-codegen/gql-tag-operations/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], - - "@graphql-codegen/plugin-helpers/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], - - "@graphql-codegen/schema-ast/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], - - "@graphql-codegen/typed-document-node/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], - - "@graphql-codegen/typescript/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], - - "@graphql-codegen/typescript-operations/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], - - "@graphql-codegen/visitor-plugin-common/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], - "@graphql-tools/graphql-tag-pluck/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "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-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "@graphql-tools/graphql-tag-pluck/@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], - "@graphql-tools/graphql-tag-pluck/@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], - - "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], - - "@radix-ui/react-arrow/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-checkbox/@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-checkbox/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-collection/@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-collection/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-dismissable-layer/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-dropdown-menu/@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-dropdown-menu/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-focus-scope/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-menu/@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-menu/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-menu/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-popover/@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=="], + "@graphql-tools/graphql-tag-pluck/@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], - "@radix-ui/react-popover/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-popover/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-popper/@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-popper/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-portal/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-roving-focus/@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-roving-focus/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-select/@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-select/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-select/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-tabs/@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-tabs/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - - "@radix-ui/react-visually-hidden/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.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-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "@graphql-tools/graphql-tag-pluck/@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], "@reduxjs/toolkit/immer": ["immer@11.1.4", "", {}, "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw=="], - "@tailwindcss/node/lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], - - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="], - "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@tanstack/router-generator/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "@tanstack/router-plugin/@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=="], - - "@tanstack/router-plugin/@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], - - "@tanstack/router-plugin/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@types/ws/@types/node": ["@types/node@22.19.3", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], - "@vitejs/plugin-react-swc/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.2", "", {}, "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw=="], - - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "babel-dead-code-elimination/@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "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-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], "babel-dead-code-elimination/@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], - "babel-dead-code-elimination/@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], - - "browserslist/caniuse-lite": ["caniuse-lite@1.0.30001763", "", {}, "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ=="], + "babel-dead-code-elimination/@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], - "cli-truncate/string-width": ["string-width@8.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg=="], + "babel-dead-code-elimination/@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], - "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "cli-truncate/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], - "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "cliui/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], "graphql-config/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], - "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "graphql-config/jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], - "parse-json/@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=="], + "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "listr2/eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], - "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "log-update/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], - "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.9", "", {}, "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw=="], + "log-update/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + "parse-json/@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=="], - "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "wrap-ansi/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], - "unixify/normalize-path": ["normalize-path@2.1.1", "", { "dependencies": { "remove-trailing-separator": "^1.0.1" } }, "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w=="], + "@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.9.13", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001763", "", {}, "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ=="], - "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="], - "@graphql-codegen/add/@graphql-codegen/plugin-helpers/@graphql-tools/utils": ["@graphql-tools/utils@10.11.0", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@whatwg-node/promise-helpers": "^1.0.0", "cross-inspect": "1.0.1", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-iBFR9GXIs0gCD+yc3hoNswViL1O5josI33dUqiNStFI/MHLCEPduasceAcazRH77YONKNiviHBV8f7OgcT4o2Q=="], + "@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], "@graphql-tools/graphql-tag-pluck/@babel/core/@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=="], @@ -1306,53 +1070,11 @@ "@graphql-tools/graphql-tag-pluck/@babel/core/@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=="], - "@inquirer/core/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "@radix-ui/react-arrow/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-checkbox/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-dismissable-layer/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-dropdown-menu/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-focus-scope/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-popper/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-portal/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-roving-focus/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-tabs/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-visually-hidden/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "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-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@tailwindcss/node/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="], - - "@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.31.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg=="], + "@graphql-tools/graphql-tag-pluck/@babel/traverse/@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=="], - "@tailwindcss/node/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.31.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA=="], + "@graphql-tools/graphql-tag-pluck/@babel/traverse/@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="], - "@tailwindcss/node/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.31.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A=="], - - "@tailwindcss/node/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.31.1", "", { "os": "linux", "cpu": "arm" }, "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g=="], - - "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg=="], - - "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg=="], - - "@tailwindcss/node/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA=="], - - "@tailwindcss/node/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA=="], - - "@tailwindcss/node/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.31.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w=="], - - "@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="], - - "@tanstack/router-plugin/@babel/template/@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=="], - - "@tanstack/router-plugin/@babel/template/@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], + "@graphql-tools/graphql-tag-pluck/@babel/traverse/@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=="], "@types/ws/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], @@ -1368,22 +1090,42 @@ "babel-dead-code-elimination/@babel/core/@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=="], - "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "babel-dead-code-elimination/@babel/traverse/@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=="], - "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "babel-dead-code-elimination/@babel/traverse/@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="], - "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + "babel-dead-code-elimination/@babel/traverse/@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=="], - "@graphql-codegen/add/@graphql-codegen/plugin-helpers/@graphql-tools/utils/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "cli-truncate/string-width/get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], + + "wrap-ansi/string-width/get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], "@graphql-tools/graphql-tag-pluck/@babel/core/@babel/helper-compilation-targets/@babel/compat-data": ["@babel/compat-data@7.28.5", "", {}, "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="], - "@graphql-tools/graphql-tag-pluck/@babel/core/@babel/helper-module-transforms/@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=="], + "@graphql-tools/graphql-tag-pluck/@babel/core/@babel/helper-compilation-targets/browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], - "@inquirer/core/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "@graphql-tools/graphql-tag-pluck/@babel/core/@babel/helper-module-transforms/@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-dead-code-elimination/@babel/core/@babel/helper-compilation-targets/@babel/compat-data": ["@babel/compat-data@7.28.5", "", {}, "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="], + "babel-dead-code-elimination/@babel/core/@babel/helper-compilation-targets/browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + "babel-dead-code-elimination/@babel/core/@babel/helper-module-transforms/@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=="], + + "@graphql-tools/graphql-tag-pluck/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.9.13", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ=="], + + "@graphql-tools/graphql-tag-pluck/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001763", "", {}, "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ=="], + + "@graphql-tools/graphql-tag-pluck/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="], + + "@graphql-tools/graphql-tag-pluck/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + + "babel-dead-code-elimination/@babel/core/@babel/helper-compilation-targets/browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.9.13", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ=="], + + "babel-dead-code-elimination/@babel/core/@babel/helper-compilation-targets/browserslist/caniuse-lite": ["caniuse-lite@1.0.30001763", "", {}, "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ=="], + + "babel-dead-code-elimination/@babel/core/@babel/helper-compilation-targets/browserslist/electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="], + + "babel-dead-code-elimination/@babel/core/@babel/helper-compilation-targets/browserslist/node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], } } diff --git a/dashboard/package.json b/dashboard/package.json index 588c22e8..21d34b2c 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -16,50 +16,50 @@ "codegen": "graphql-codegen --config codegen.ts" }, "dependencies": { - "@apollo/client": "^4.1.6", - "@radix-ui/react-avatar": "^1.1.11", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-popover": "^1.1.15", - "@radix-ui/react-progress": "^1.1.8", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-tabs": "^1.1.13", - "@tanstack/react-router": "^1.166.3", + "@apollo/client": "^4.2.3", + "@daypicker/react": "^10.0.1", + "@radix-ui/react-avatar": "^1.2.0", + "@radix-ui/react-checkbox": "^1.3.5", + "@radix-ui/react-dropdown-menu": "^2.1.18", + "@radix-ui/react-label": "^2.1.10", + "@radix-ui/react-popover": "^1.1.17", + "@radix-ui/react-progress": "^1.1.10", + "@radix-ui/react-select": "^2.3.1", + "@radix-ui/react-separator": "^1.1.10", + "@radix-ui/react-slot": "^1.3.0", + "@radix-ui/react-tabs": "^1.1.15", + "@tanstack/react-router": "^1.170.16", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "date-fns": "^4.1.0", - "graphql": "^16.13.1", - "lucide-react": "^1.0.0", - "react": "^19.2.4", - "react-day-picker": "^9.14.0", - "react-dom": "^19.2.4", - "react-is": "^19.2.4", + "date-fns": "^4.4.0", + "graphql": "^16.14.2", + "lucide-react": "^1.21.0", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-is": "^19.2.7", "recharts": "3.8.1", - "tailwind-merge": "^3.5.0", + "tailwind-merge": "^3.6.0", "tailwindcss-animate": "^1.0.7", - "zod": "^4.3.6" + "zod": "^4.4.3" }, "devDependencies": { - "@biomejs/biome": "^2.4.6", - "@graphql-codegen/cli": "^6.1.3", - "@graphql-codegen/client-preset": "^5.2.4", - "@tailwindcss/postcss": "^4.2.1", - "@tailwindcss/vite": "^4.2.1", - "@tanstack/router-generator": "^1.166.2", - "@tanstack/router-plugin": "^1.166.3", - "@types/node": "^25.3.5", - "@types/react": "^19.2.14", + "@biomejs/biome": "^2.5.0", + "@graphql-codegen/cli": "^7.1.3", + "@graphql-codegen/client-preset": "^6.0.1", + "@tailwindcss/postcss": "^4.3.1", + "@tailwindcss/vite": "^4.3.1", + "@tanstack/router-generator": "^1.167.17", + "@tanstack/router-plugin": "^1.168.18", + "@types/node": "^26.0.0", + "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^6.0.0", - "@vitejs/plugin-react-swc": "^4.2.3", - "autoprefixer": "^10.4.27", + "@vitejs/plugin-react": "^6.0.2", + "@vitejs/plugin-react-swc": "^4.3.1", + "autoprefixer": "^10.5.0", "lightningcss": "^1.32.0", - "postcss": "^8.5.8", - "tailwindcss": "^4.2.1", - "typescript": "~5.9.3", - "vite": "^8.0.0" + "postcss": "^8.5.15", + "tailwindcss": "^4.3.1", + "typescript": "~6.0.3", + "vite": "^8.0.16" } } diff --git a/dashboard/src/components/ui/calendar.tsx b/dashboard/src/components/ui/calendar.tsx index 39068758..9144cfda 100644 --- a/dashboard/src/components/ui/calendar.tsx +++ b/dashboard/src/components/ui/calendar.tsx @@ -4,7 +4,7 @@ import { ChevronLeftIcon, ChevronRightIcon, } from "lucide-react" -import { DayButton, DayPicker, getDefaultClassNames } from "react-day-picker" +import { DayButton, DayPicker, getDefaultClassNames } from "@daypicker/react" import { cn } from "@/lib/utils" import { Button, buttonVariants } from "@/components/ui/button" @@ -82,7 +82,7 @@ const Calendar = ({ : "[&>svg]:text-muted-foreground flex h-8 items-center gap-1 rounded-md pl-2 pr-1 text-sm [&>svg]:size-3.5", defaultClassNames.caption_label ), - table: "w-full border-collapse", + month_grid: cn("w-full border-collapse", defaultClassNames.month_grid), weekdays: cn("flex", defaultClassNames.weekdays), weekday: cn( "text-muted-foreground flex-1 select-none rounded-md text-[0.8rem] font-normal", diff --git a/dashboard/src/components/ui/datetime-picker.tsx b/dashboard/src/components/ui/datetime-picker.tsx index 961eb23c..26a7a9c7 100644 --- a/dashboard/src/components/ui/datetime-picker.tsx +++ b/dashboard/src/components/ui/datetime-picker.tsx @@ -21,7 +21,7 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import type { MonthCaptionProps } from "react-day-picker"; +import type { MonthCaptionProps } from "@daypicker/react"; // ---------- utils start ---------- /** @@ -753,7 +753,7 @@ const DateTimePicker = React.forwardRef< buttonVariants({ variant: "outline" }), "absolute right-5 top-5 h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100", ), - table: "w-full border-collapse space-y-1", + month_grid: "w-full border-collapse space-y-1", weekdays: cn("flex", showWeekNumber && "justify-end"), weekday: "text-muted-foreground w-9 rounded-md text-[0.8rem] font-normal", diff --git a/dashboard/src/gql/graphql.ts b/dashboard/src/gql/graphql.ts index bd23e9e4..c57511dd 100644 --- a/dashboard/src/gql/graphql.ts +++ b/dashboard/src/gql/graphql.ts @@ -1,521 +1,97 @@ /* eslint-disable */ -import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; -export type Maybe = T | null; -export type InputMaybe = T | null | undefined; -export type Exact = { [K in keyof T]: T[K] }; -export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; -export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; -export type MakeEmpty = { [_ in K]?: never }; +/** Internal type. DO NOT USE DIRECTLY. */ +type Exact = { [K in keyof T]: T[K] }; +/** Internal type. DO NOT USE DIRECTLY. */ export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; -/** All built-in and custom scalars, mapped to their actual values */ -export type Scalars = { - ID: { input: string; output: string; } - String: { input: string; output: string; } - Boolean: { input: boolean; output: boolean; } - Int: { input: number; output: number; } - Float: { input: number; output: number; } - Time: { input: string; output: string; } -}; - -export type ActivePageStats = { - __typename: 'ActivePageStats'; - path: Scalars['String']['output']; - /** Number of visitors currently viewing this page */ - visitors: Scalars['Int']['output']; -}; - -export type AuthPayload = { - __typename: 'AuthPayload'; - user: User; -}; - -export type BrowserStats = { - __typename: 'BrowserStats'; - browser: Scalars['String']['output']; - visitors: Scalars['Int']['output']; -}; - -export type Country = { - __typename: 'Country'; - code: Scalars['String']['output']; - name: Scalars['String']['output']; -}; - -export type CountryStats = { - __typename: 'CountryStats'; - country: Country; - visitors: Scalars['Int']['output']; -}; - +import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; export type CreateSiteInput = { - domains: Array; - name: Scalars['String']['input']; -}; - -export type DailyStats = { - __typename: 'DailyStats'; - date: Scalars['Time']['output']; - pageViews: Scalars['Int']['output']; - sessions: Scalars['Int']['output']; - visitors: Scalars['Int']['output']; -}; - -export type DashboardStats = { - __typename: 'DashboardStats'; - /** Average session duration in seconds */ - avgDuration: Scalars['Float']['output']; - bounceRate: Scalars['Float']['output']; - browsers: Array; - countries: PagedCountryStats; - dailyStats: Array; - devices: PagedDeviceStats; - operatingSystems: PagedOperatingSystemStats; - pageViews: Scalars['Int']['output']; - sessions: Scalars['Int']['output']; - topPages: PagedPageStats; - topReferrers: PagedReferrerStats; - visitors: Scalars['Int']['output']; -}; - - -export type DashboardStatsBrowsersArgs = { - paging: PagingInput; -}; - - -export type DashboardStatsCountriesArgs = { - paging: PagingInput; -}; - - -export type DashboardStatsDailyStatsArgs = { - bucket?: InputMaybe; - limit: InputMaybe; - offset: InputMaybe; -}; - - -export type DashboardStatsDevicesArgs = { - paging: PagingInput; -}; - - -export type DashboardStatsOperatingSystemsArgs = { - paging: PagingInput; -}; - - -export type DashboardStatsTopPagesArgs = { - paging: PagingInput; -}; - - -export type DashboardStatsTopReferrersArgs = { - paging: PagingInput; + domains: Array; + name: string; }; export type DateRangeInput = { - from: InputMaybe; - to: InputMaybe; -}; - -export type DeviceStats = { - __typename: 'DeviceStats'; - device: Scalars['String']['output']; - visitors: Scalars['Int']['output']; -}; - -export type Event = { - __typename: 'Event'; - createdAt: Scalars['Time']['output']; - definition: Maybe; - id: Scalars['ID']['output']; - name: Scalars['String']['output']; - path: Scalars['String']['output']; - /** Key-value properties associated with the event */ - properties: Array; -}; - -export type EventCount = { - __typename: 'EventCount'; - count: Scalars['Int']['output']; - event: Event; -}; - -export type EventDefinition = { - __typename: 'EventDefinition'; - createdAt: Scalars['Time']['output']; - fields: Array; - id: Scalars['ID']['output']; - name: Scalars['String']['output']; - updatedAt: Scalars['Time']['output']; -}; - -export type EventDefinitionField = { - __typename: 'EventDefinitionField'; - id: Scalars['ID']['output']; - key: Scalars['String']['output']; - maxLength: Scalars['Int']['output']; - required: Scalars['Boolean']['output']; - type: EventFieldType; + from: string | null | undefined; + to: string | null | undefined; }; export type EventDefinitionFieldInput = { - key: Scalars['String']['input']; - maxLength: InputMaybe; - required: Scalars['Boolean']['input']; + key: string; + maxLength: number | null | undefined; + required: boolean; type: EventFieldType; }; export type EventDefinitionInput = { fields: Array; - name: Scalars['String']['input']; + name: string; }; -export const EventFieldType = { - Boolean: 'BOOLEAN', - Int: 'INT', - String: 'STRING' -} as const; - -export type EventFieldType = typeof EventFieldType[keyof typeof EventFieldType]; -export type EventProperty = { - __typename: 'EventProperty'; - key: Scalars['String']['output']; - value: Scalars['String']['output']; -}; - -export const EventType = { - PageView: 'PAGE_VIEW', - Predefined: 'PREDEFINED' -} as const; +export type EventFieldType = + | 'BOOLEAN' + | 'INT' + | 'STRING'; -export type EventType = typeof EventType[keyof typeof EventType]; -export type EventsResult = { - __typename: 'EventsResult'; - events: Array; - total: Scalars['Int']['output']; -}; +export type EventType = + | 'PAGE_VIEW' + | 'PREDEFINED'; export type FilterInput = { /** Filter by browser type */ - browser: InputMaybe>; + browser: Array | null | undefined; /** Filter by ISO country code */ - country: InputMaybe>; + country: Array | null | undefined; /** Filter by device type (desktop, mobile, tablet, smart-tv, console, watch) */ - device: InputMaybe>; + device: Array | null | undefined; /** Filter by event definition ID */ - eventDefinitionId: InputMaybe>; + eventDefinitionId: Array | null | undefined; /** Filter by event name */ - eventName: InputMaybe>; + eventName: Array | null | undefined; /** Filter by event path */ - eventPath: InputMaybe>; + eventPath: Array | null | undefined; /** Filter by event type (page view or predefined) */ - eventType: InputMaybe>; + eventType: Array | null | undefined; /** Filter by operating system */ - os: InputMaybe>; + os: Array | null | undefined; /** Filter by page path */ - page: InputMaybe>; + page: Array | null | undefined; /** Filter by specific referrer */ - referrer: InputMaybe>; -}; - -export type GeoIpStatus = { - __typename: 'GeoIPStatus'; - dbPath: Scalars['String']['output']; - lastError: Maybe; - source: Maybe; - state: Scalars['String']['output']; - updatedAt: Maybe; + referrer: Array | null | undefined; }; export type LoginInput = { - password: Scalars['String']['input']; - username: Scalars['String']['input']; -}; - -export type Mutation = { - __typename: 'Mutation'; - createSite: Site; - deleteEventDefinition: Scalars['Boolean']['output']; - /** Deletes site and all analytics data */ - deleteSite: Scalars['Boolean']['output']; - login: AuthPayload; - /** Clears auth cookies */ - logout: Scalars['Boolean']['output']; - refreshGeoIPDatabase: GeoIpStatus; - refreshToken: TokenPayload; - /** Invalidates old tracking scripts */ - regenerateSiteKey: Site; - /** First user becomes admin */ - register: AuthPayload; - updateSite: Site; - upsertEventDefinition: EventDefinition; -}; - - -export type MutationCreateSiteArgs = { - input: CreateSiteInput; -}; - - -export type MutationDeleteEventDefinitionArgs = { - name: Scalars['String']['input']; - siteId: Scalars['ID']['input']; -}; - - -export type MutationDeleteSiteArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationLoginArgs = { - input: LoginInput; -}; - - -export type MutationRefreshTokenArgs = { - refreshToken: Scalars['String']['input']; -}; - - -export type MutationRegenerateSiteKeyArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRegisterArgs = { - input: RegisterInput; -}; - - -export type MutationUpdateSiteArgs = { - id: Scalars['ID']['input']; - input: UpdateSiteInput; -}; - - -export type MutationUpsertEventDefinitionArgs = { - input: EventDefinitionInput; - siteId: Scalars['ID']['input']; -}; - -export type OperatingSystemStats = { - __typename: 'OperatingSystemStats'; - os: Scalars['String']['output']; - visitors: Scalars['Int']['output']; -}; - -export type PageStats = { - __typename: 'PageStats'; - path: Scalars['String']['output']; - views: Scalars['Int']['output']; - visitors: Scalars['Int']['output']; -}; - -export type PagedCountryStats = { - __typename: 'PagedCountryStats'; - items: Array; - total: Scalars['Int']['output']; - totalVisitors: Scalars['Int']['output']; -}; - -export type PagedDeviceStats = { - __typename: 'PagedDeviceStats'; - items: Array; - total: Scalars['Int']['output']; - totalVisitors: Scalars['Int']['output']; -}; - -export type PagedOperatingSystemStats = { - __typename: 'PagedOperatingSystemStats'; - items: Array; - total: Scalars['Int']['output']; - totalVisitors: Scalars['Int']['output']; -}; - -export type PagedPageStats = { - __typename: 'PagedPageStats'; - items: Array; - total: Scalars['Int']['output']; -}; - -export type PagedReferrerStats = { - __typename: 'PagedReferrerStats'; - items: Array; - total: Scalars['Int']['output']; + password: string; + username: string; }; export type PagingInput = { - limit: Scalars['Int']['input']; - offset: Scalars['Int']['input']; -}; - -export type Query = { - __typename: 'Query'; - dashboard: DashboardStats; - /** Get event counts aggregated by event with the most recent occurrence */ - eventCounts: Array; - /** Get event definitions for a site */ - eventDefinitions: Array; - /** Get events for a site with pagination */ - events: EventsResult; - geoIPCountries: Array; - geoIPStatus: GeoIpStatus; - me: Maybe; - realtime: RealtimeStats; - registrationStatus: RegistrationStatus; - site: Maybe; - sites: Array; -}; - - -export type QueryDashboardArgs = { - dateRange: InputMaybe; - filter: InputMaybe; - siteId: Scalars['ID']['input']; -}; - - -export type QueryEventCountsArgs = { - dateRange: InputMaybe; - filter: InputMaybe; - paging: PagingInput; - siteId: Scalars['ID']['input']; -}; - - -export type QueryEventDefinitionsArgs = { - paging: PagingInput; - siteId: Scalars['ID']['input']; -}; - - -export type QueryEventsArgs = { - dateRange: InputMaybe; - filter: InputMaybe; - limit: InputMaybe; - offset: InputMaybe; - siteId: Scalars['ID']['input']; -}; - - -export type QueryGeoIpCountriesArgs = { - codes: InputMaybe>; - paging: PagingInput; - search: InputMaybe; -}; - - -export type QueryRealtimeArgs = { - siteId: Scalars['ID']['input']; -}; - - -export type QuerySiteArgs = { - id: Scalars['ID']['input']; -}; - - -export type QuerySitesArgs = { - paging: PagingInput; -}; - -export type RealtimeStats = { - __typename: 'RealtimeStats'; - /** Active pages with visitor count */ - activePages: Array; - /** Visitors active in last 5 minutes */ - visitors: Scalars['Int']['output']; -}; - - -export type RealtimeStatsActivePagesArgs = { - paging: PagingInput; -}; - -export type ReferrerStats = { - __typename: 'ReferrerStats'; - referrer: Scalars['String']['output']; - visitors: Scalars['Int']['output']; + limit: number; + offset: number; }; export type RegisterInput = { - password: Scalars['String']['input']; - username: Scalars['String']['input']; -}; - -export type RegistrationStatus = { - __typename: 'RegistrationStatus'; - /** Resolved registration policy after the first user exists */ - allowRegistration: Scalars['Boolean']['output']; - hasUsers: Scalars['Boolean']['output']; -}; - -export type Session = { - __typename: 'Session'; - id: Scalars['ID']['output']; + password: string; + username: string; }; -export type Site = { - __typename: 'Site'; - /** ISO country codes blocked from tracking */ - blockedCountries: Array; - /** IP addresses blocked from tracking */ - blockedIPs: Array; - createdAt: Scalars['Time']['output']; - /** All tracked domains (includes primary) */ - domains: Array; - id: Scalars['ID']['output']; - name: Scalars['String']['output']; - /** Used in tracking script */ - publicKey: Scalars['String']['output']; - /** Enable country tracking (requires GeoIP database) */ - trackCountry: Scalars['Boolean']['output']; -}; - -export const TimeBucket = { - Daily: 'DAILY', - Hourly: 'HOURLY' -} as const; - -export type TimeBucket = typeof TimeBucket[keyof typeof TimeBucket]; -export type TokenPayload = { - __typename: 'TokenPayload'; - accessToken: Scalars['String']['output']; - refreshToken: Scalars['String']['output']; -}; +export type TimeBucket = + | 'DAILY' + | 'HOURLY'; export type UpdateSiteInput = { /** Full list of blocked country codes */ - blockedCountries: InputMaybe>; + blockedCountries: Array | null | undefined; /** Full list of blocked IPs */ - blockedIPs: InputMaybe>; + blockedIPs: Array | null | undefined; /** Full list of tracked domains (includes primary) */ - domains: InputMaybe>; - name: Scalars['String']['input']; - trackCountry: InputMaybe; -}; - -export type User = { - __typename: 'User'; - createdAt: Scalars['Time']['output']; - id: Scalars['ID']['output']; - role: Scalars['String']['output']; - sites: Maybe>; - username: Scalars['String']['output']; -}; - - -export type UserSitesArgs = { - paging: PagingInput; + domains: Array | null | undefined; + name: string; + trackCountry: boolean | null | undefined; }; export type CountryFieldsFragment = { __typename: 'Country', code: string, name: string } & { ' $fragmentName'?: 'CountryFieldsFragment' }; export type CountriesByCodeQueryVariables = Exact<{ - codes: InputMaybe | Scalars['String']['input']>; + codes?: Array | string | null | undefined; paging: PagingInput; }>; @@ -536,14 +112,14 @@ export type RefreshGeoIpDatabaseMutation = { __typename: 'Mutation', refreshGeoI export type CountryTrackingGeoIpStatusFieldsFragment = { __typename: 'GeoIPStatus', state: string, dbPath: string, source: string | null, lastError: string | null, updatedAt: string | null } & { ' $fragmentName'?: 'CountryTrackingGeoIpStatusFieldsFragment' }; export type DeleteSiteMutationVariables = Exact<{ - id: Scalars['ID']['input']; + id: string | number; }>; export type DeleteSiteMutation = { __typename: 'Mutation', deleteSite: boolean }; export type EventDefinitionsQueryVariables = Exact<{ - siteId: Scalars['ID']['input']; + siteId: string | number; paging: PagingInput; }>; @@ -554,7 +130,7 @@ export type EventDefinitionsQuery = { __typename: 'Query', eventDefinitions: Arr )> }; export type UpsertEventDefinitionMutationVariables = Exact<{ - siteId: Scalars['ID']['input']; + siteId: string | number; input: EventDefinitionInput; }>; @@ -565,8 +141,8 @@ export type UpsertEventDefinitionMutation = { __typename: 'Mutation', upsertEven ) }; export type DeleteEventDefinitionMutationVariables = Exact<{ - siteId: Scalars['ID']['input']; - name: Scalars['String']['input']; + siteId: string | number; + name: string; }>; @@ -580,7 +156,7 @@ export type EventDefinitionFieldsFragment = { __typename: 'EventDefinition', id: )> } & { ' $fragmentName'?: 'EventDefinitionFieldsFragment' }; export type RegenerateSiteKeyMutationVariables = Exact<{ - id: Scalars['ID']['input']; + id: string | number; }>; @@ -592,7 +168,7 @@ export type RegenerateSiteKeyMutation = { __typename: 'Mutation', regenerateSite export type TrackingCodeSiteSummaryFieldsFragment = { __typename: 'Site', id: string, domains: Array, name: string, publicKey: string, createdAt: string } & { ' $fragmentName'?: 'TrackingCodeSiteSummaryFieldsFragment' }; export type GeoIpCountriesQueryVariables = Exact<{ - search: InputMaybe; + search?: string | null | undefined; paging: PagingInput; }>; @@ -647,9 +223,9 @@ export type AuthUserDetailsFieldsFragment = { __typename: 'User', id: string, us )> | null } & { ' $fragmentName'?: 'AuthUserDetailsFieldsFragment' }; export type DashboardQueryVariables = Exact<{ - siteId: Scalars['ID']['input']; - dateRange: InputMaybe; - filter: InputMaybe; + siteId: string | number; + dateRange?: DateRangeInput | null | undefined; + filter?: FilterInput | null | undefined; topPagesPaging: PagingInput; referrersPaging: PagingInput; browsersPaging: PagingInput; @@ -665,7 +241,7 @@ export type DashboardQuery = { __typename: 'Query', dashboard: ( ) }; export type RealtimeQueryVariables = Exact<{ - siteId: Scalars['ID']['input']; + siteId: string | number; activePagesPaging: PagingInput; }>; @@ -676,11 +252,11 @@ export type RealtimeQuery = { __typename: 'Query', realtime: ( ) }; export type EventsQueryVariables = Exact<{ - siteId: Scalars['ID']['input']; - dateRange: InputMaybe; - filter: InputMaybe; - limit: InputMaybe; - offset: InputMaybe; + siteId: string | number; + dateRange?: DateRangeInput | null | undefined; + filter?: FilterInput | null | undefined; + limit?: number | null | undefined; + offset?: number | null | undefined; }>; @@ -690,9 +266,9 @@ export type EventsQuery = { __typename: 'Query', events: { __typename: 'EventsRe )> } }; export type EventCountsQueryVariables = Exact<{ - siteId: Scalars['ID']['input']; - dateRange: InputMaybe; - filter: InputMaybe; + siteId: string | number; + dateRange?: DateRangeInput | null | undefined; + filter?: FilterInput | null | undefined; paging: PagingInput; }>; @@ -703,12 +279,12 @@ export type EventCountsQuery = { __typename: 'Query', eventCounts: Array<( )> }; export type ChartDataQueryVariables = Exact<{ - siteId: Scalars['ID']['input']; - dateRange: InputMaybe; - filter: InputMaybe; - bucket: InputMaybe; - limit: InputMaybe; - offset: InputMaybe; + siteId: string | number; + dateRange?: DateRangeInput | null | undefined; + filter?: FilterInput | null | undefined; + bucket?: TimeBucket | null | undefined; + limit?: number | null | undefined; + offset?: number | null | undefined; }>; @@ -792,7 +368,7 @@ export type GeoIpStatusQuery = { __typename: 'Query', geoIPStatus: ( ) }; export type SiteQueryVariables = Exact<{ - id: Scalars['ID']['input']; + id: string | number; }>; @@ -802,7 +378,7 @@ export type SiteQuery = { __typename: 'Query', site: ( ) | null }; export type UpdateSiteMutationVariables = Exact<{ - id: Scalars['ID']['input']; + id: string | number; input: UpdateSiteInput; }>; diff --git a/dashboard/src/lib/dashboard-query.ts b/dashboard/src/lib/dashboard-query.ts index c95bbdcd..adccec67 100644 --- a/dashboard/src/lib/dashboard-query.ts +++ b/dashboard/src/lib/dashboard-query.ts @@ -2,10 +2,10 @@ import type { DashboardQueryVariables, EventCountsQueryVariables, EventsQueryVariables, + EventType, FilterInput, RealtimeQueryVariables, } from '@/gql/graphql'; -import { EventType } from '@/gql/graphql'; const EMPTY_COUNT = 0; const PAGE_INDEX_OFFSET = 1; @@ -34,6 +34,7 @@ export const PAGE_SIZES = { export const DASHBOARD_POLL_INTERVAL_MS = 60000; export const REALTIME_POLL_INTERVAL_MS = 5000; +const PREDEFINED_EVENT_TYPE = 'PREDEFINED' satisfies EventType; const normalizeFilter = (filter: FilterInput | null): FilterInput | null => filter === null || Object.keys(filter).length === EMPTY_COUNT ? null : filter; @@ -89,7 +90,7 @@ export const buildEventCountsVariables = ( page: filter?.page ?? null, country: filter?.country ?? null, os: filter?.os ?? null, - eventType: [EventType.Predefined], + eventType: [PREDEFINED_EVENT_TYPE], eventDefinitionId: filter?.eventDefinitionId ?? null, eventName: filter?.eventName ?? null, eventPath: filter?.eventPath ?? null, diff --git a/dashboard/tsconfig.json b/dashboard/tsconfig.json index 05888ebd..b10e2215 100644 --- a/dashboard/tsconfig.json +++ b/dashboard/tsconfig.json @@ -30,7 +30,6 @@ "allowUnreachableCode": false, "noImplicitThis": true, "useUnknownInCatchVariables": true, - "alwaysStrict": true, "strictBindCallApply": true, "strictFunctionTypes": true, "strictNullChecks": true, @@ -38,9 +37,8 @@ "verbatimModuleSyntax": true, /* Paths */ - "baseUrl": ".", "paths": { - "@/*": ["src/*"] + "@/*": ["./src/*"] } }, "include": ["src", "codegen.ts", "vite.config.ts", "tailwind.config.ts", "postcss.config.js"] diff --git a/dashboard/vite.config.ts b/dashboard/vite.config.ts index 7292b3fa..99bb3574 100644 --- a/dashboard/vite.config.ts +++ b/dashboard/vite.config.ts @@ -33,7 +33,7 @@ export default defineConfig({ // Optimize for static serving minify: true, cssMinify: 'lightningcss', - rollupOptions: { + rolldownOptions: { treeshake: true, }, }, diff --git a/server/go.mod b/server/go.mod index 1ae9febf..8316868c 100644 --- a/server/go.mod +++ b/server/go.mod @@ -3,24 +3,24 @@ module github.com/lovely-eye/server go 1.26.0 require ( - ariga.io/atlas v1.2.0 + ariga.io/atlas v1.2.2 ariga.io/atlas-provider-bun v0.0.3 - github.com/99designs/gqlgen v0.17.90 + github.com/99designs/gqlgen v0.17.92 github.com/Khan/genqlient v0.8.1 github.com/golang-jwt/jwt/v5 v5.3.1 github.com/mileusna/useragent v1.3.5 - github.com/oschwald/geoip2-golang/v2 v2.1.0 - github.com/oschwald/maxminddb-golang/v2 v2.2.0 + github.com/oschwald/geoip2-golang/v2 v2.2.0 + github.com/oschwald/maxminddb-golang/v2 v2.4.0 github.com/stretchr/testify v1.11.1 github.com/uptrace/bun v1.2.18 github.com/uptrace/bun/dialect/pgdialect v1.2.18 github.com/uptrace/bun/dialect/sqlitedialect v1.2.18 github.com/uptrace/bun/driver/pgdriver v1.2.18 github.com/uptrace/bun/extra/bundebug v1.2.18 - github.com/urfave/cli/v3 v3.8.0 - github.com/vektah/gqlparser/v2 v2.5.33 - golang.org/x/crypto v0.50.0 - modernc.org/sqlite v1.50.0 + github.com/urfave/cli/v3 v3.10.0 + github.com/vektah/gqlparser/v2 v2.5.35 + golang.org/x/crypto v0.53.0 + modernc.org/sqlite v1.53.0 ) require ( @@ -29,9 +29,10 @@ require ( github.com/alexflint/go-scalar v1.2.0 // indirect github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/coder/websocket v1.8.15 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/fatih/color v1.18.0 // indirect + github.com/fatih/color v1.19.0 // indirect github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/uuid v1.6.0 // indirect @@ -39,8 +40,8 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/kr/pretty v0.3.0 // indirect - github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.21 // indirect + github.com/mattn/go-colorable v0.1.15 // indirect + github.com/mattn/go-isatty v0.0.22 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect @@ -52,17 +53,17 @@ require ( github.com/uptrace/bun/dialect/oracledialect v1.2.18 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - go.opentelemetry.io/otel v1.42.0 // indirect - go.opentelemetry.io/otel/trace v1.42.0 // indirect - golang.org/x/mod v0.34.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.43.0 // indirect - golang.org/x/text v0.36.0 // indirect - golang.org/x/tools v0.43.0 // indirect + go.opentelemetry.io/otel v1.44.0 // indirect + go.opentelemetry.io/otel/trace v1.44.0 // indirect + golang.org/x/mod v0.37.0 // indirect + golang.org/x/sync v0.21.0 // indirect + golang.org/x/sys v0.46.0 // indirect + golang.org/x/text v0.38.0 // indirect + golang.org/x/tools v0.46.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect mellium.im/sasl v0.3.2 // indirect - modernc.org/libc v1.72.0 // indirect + modernc.org/libc v1.73.4 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect ) diff --git a/server/go.sum b/server/go.sum index 2d76a358..d5c0afaa 100644 --- a/server/go.sum +++ b/server/go.sum @@ -1,9 +1,9 @@ -ariga.io/atlas v1.2.0 h1:PJZzG1zTA8SzMR1giJ7XnQe4VjfDWEbJjHnIaK45BFg= -ariga.io/atlas v1.2.0/go.mod h1:vg7qWSatkNqs04Y4Lheg7vR4bGX0wy51Wz4FIMFVr3U= +ariga.io/atlas v1.2.2 h1:+cryCHGIVcbQxuK4rB7nK5pDkMC4g4XxqltYIioFWIQ= +ariga.io/atlas v1.2.2/go.mod h1:bEAo6Igo8PNJUyGOnni9jv+D83HyNEY3tNXV1ATtqI8= ariga.io/atlas-provider-bun v0.0.3 h1:Qv/ZnSL2XGthvlPJqVjoBZj/qF9B0qtmO0jRhwhQLFs= ariga.io/atlas-provider-bun v0.0.3/go.mod h1:y0+OG2FrM9dmN48jZzJib1Ro5suVYERyEjV89x/geiI= -github.com/99designs/gqlgen v0.17.90 h1:wSv6blm/PoplU6QoNw83EcQpNtC0HX3/+44vITJOzpk= -github.com/99designs/gqlgen v0.17.90/go.mod h1:GqYrEwYsqCG8VaOsq2kJUCUKwAE1T+u2i+Nj7NtXiVI= +github.com/99designs/gqlgen v0.17.92 h1:Ovj/hoMVqFaVLj7O2jlQNc8Z7FWpsd44LmA70e6qruM= +github.com/99designs/gqlgen v0.17.92/go.mod h1:D51dk25OyUPz7jBw3P7B3+k4vsLxZo9f0yOrT4t/vLE= github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs= github.com/Khan/genqlient v0.8.1/go.mod h1:R2G6DzjBvCbhjsEajfRjbWdVglSH/73kSivC9TLWVjU= github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= @@ -12,8 +12,6 @@ github.com/alexflint/go-arg v1.5.1 h1:nBuWUCpuRy0snAG+uIJ6N0UvYxpxA0/ghA/AaHxlT8 github.com/alexflint/go-arg v1.5.1/go.mod h1:A7vTJzvjoaSTypg4biM5uYNTkJ27SkNTArtYXnlqVO8= github.com/alexflint/go-scalar v1.2.0 h1:WR7JPKkeNpnYIOfHRa7ivM21aWAdHD0gEWHCx+WQBRw= github.com/alexflint/go-scalar v1.2.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= @@ -22,6 +20,8 @@ github.com/bradleyjkemp/cupaloy/v2 v2.6.0 h1:knToPYa2xtfg42U3I6punFEjaGFKWQRXJwj github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/coder/websocket v1.8.15 h1:6B2JPeOGlpff2Uz6vOEH1Vzpi0iUz20A+lPVhPHtNUA= +github.com/coder/websocket v1.8.15/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -29,8 +29,8 @@ github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7c github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= -github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= @@ -56,18 +56,18 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= -github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.21 h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs= -github.com/mattn/go-isatty v0.0.21/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= +github.com/mattn/go-colorable v0.1.15 h1:+u9SLTRGnXv73cEsnsmoZBom+dMU88B2M0aDcWy0/jY= +github.com/mattn/go-colorable v0.1.15/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mileusna/useragent v1.3.5 h1:SJM5NzBmh/hO+4LGeATKpaEX9+b4vcGg2qXGLiNGDws= github.com/mileusna/useragent v1.3.5/go.mod h1:3d8TOmwL/5I8pJjyVDteHtgDGcefrFUX4ccGOMKNYYc= github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -github.com/oschwald/geoip2-golang/v2 v2.1.0 h1:DjnLhNJu9WHwTrmoiQFvgmyJoczhdnm7LB23UBI2Amo= -github.com/oschwald/geoip2-golang/v2 v2.1.0/go.mod h1:qdVmcPgrTJ4q2eP9tHq/yldMTdp2VMr33uVdFbHBiBc= -github.com/oschwald/maxminddb-golang/v2 v2.2.0 h1:/2khmIiNvFxgfwGxitper3XBJBs5qTCPQ/H1iR9MgBw= -github.com/oschwald/maxminddb-golang/v2 v2.2.0/go.mod h1:n/ctYVTFYQypkn5uO1CZnTmj8jdQKIVh/LX7gSaIl0w= +github.com/oschwald/geoip2-golang/v2 v2.2.0 h1:gdkhpnHQMiH9ymOI+zSB0QKFGH+n4TntNt7vz+TxGPY= +github.com/oschwald/geoip2-golang/v2 v2.2.0/go.mod h1:xW4tCeQiNU1gqMD1x7zEH2CDNM3d796Ls50yxYDaX0U= +github.com/oschwald/maxminddb-golang/v2 v2.4.0 h1:3ftnrR1/XwiQ788bWIRhsE1DK3GOgJ6tm6S2qTktLm8= +github.com/oschwald/maxminddb-golang/v2 v2.4.0/go.mod h1:7jcFtmhWVDEV+UopVv9NjcPm200uMyEHN14LIVV4hW8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= @@ -76,8 +76,6 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/sosodev/duration v1.4.0 h1:35ed0KiVFriGHHzZZJaZLgmTEEICIyt8Sx0RQfj9IjE= github.com/sosodev/duration v1.4.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -101,30 +99,32 @@ github.com/uptrace/bun/driver/pgdriver v1.2.18 h1:Zojuc83ulApocXomBLEcx1DqCZweRE github.com/uptrace/bun/driver/pgdriver v1.2.18/go.mod h1:ZRJcARw93nxbQ5WawTrc5EO+F+GygkcYgDLEnT17CcE= github.com/uptrace/bun/extra/bundebug v1.2.18 h1:5cgkqdvhpSHIEONazSytm4RWYFneNtcznaWLt6r8m4M= github.com/uptrace/bun/extra/bundebug v1.2.18/go.mod h1:M+U9YJVJcmk0RrszCb2Q1oskJiJ0LuC44FxDhZLP1ws= -github.com/urfave/cli/v3 v3.8.0 h1:XqKPrm0q4P0q5JpoclYoCAv0/MIvH/jZ2umzuf8pNTI= -github.com/urfave/cli/v3 v3.8.0/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso= -github.com/vektah/gqlparser/v2 v2.5.33 h1:lRp8aIeNUNbimf/axZd7ETg24q06hBtPaas+TcvI/7E= -github.com/vektah/gqlparser/v2 v2.5.33/go.mod h1:c1I28gSOVNzlfc4WuDlqU7voQnsqI6OG2amkBAFmgts= +github.com/urfave/cli/v3 v3.10.0 h1:0aU8yOObVDMkM13Cj4G+zb4P0PdeJMec65f81Ak1ioM= +github.com/urfave/cli/v3 v3.10.0/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso= +github.com/vektah/gqlparser/v2 v2.5.35 h1:LEr/wXnTKkOqNn+4tNClYclksXN2781VoBFzzFW51Dk= +github.com/vektah/gqlparser/v2 v2.5.35/go.mod h1:cAJ9qwVgPaUkWv6Gn8vn0mqOE0Ui5Pn56wNy5396XWo= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= -go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= -go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= -go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= -golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= -golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= -golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= -golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= -golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= -golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ= +golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0= +golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +golang.org/x/tools v0.46.0 h1:7jTurBkPZu4moS/Uy4OQT1M+QBlsj3wejyZwsT8Z7rk= +golang.org/x/tools v0.46.0/go.mod h1:FrD85F8l+NWL+9XWBSyVSHO6Ne4jutsfIFba7AWQ5Ys= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -136,30 +136,30 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= mellium.im/sasl v0.3.2 h1:PT6Xp7ccn9XaXAnJ03FcEjmAn7kK1x7aoXV6F+Vmrl0= mellium.im/sasl v0.3.2/go.mod h1:NKXDi1zkr+BlMHLQjY3ofYuU4KSPFxknb8mfEu6SveY= -modernc.org/cc/v4 v4.27.3 h1:uNCgn37E5U09mTv1XgskEVUJ8ADKpmFMPxzGJ0TSo+U= -modernc.org/cc/v4 v4.27.3/go.mod h1:3YjcbCqhoTTHPycJDRl2WZKKFj0nwcOIPBfEZK0Hdk8= -modernc.org/ccgo/v4 v4.32.4 h1:L5OB8rpEX4ZsXEQwGozRfJyJSFHbbNVOoQ59DU9/KuU= -modernc.org/ccgo/v4 v4.32.4/go.mod h1:lY7f+fiTDHfcv6YlRgSkxYfhs+UvOEEzj49jAn2TOx0= +modernc.org/cc/v4 v4.28.4 h1:Hd/4Es+MBj+/7hSdZaisNyu6bv3V0Dp2MdllyfqaH+c= +modernc.org/cc/v4 v4.28.4/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI= +modernc.org/ccgo/v4 v4.34.4 h1:OVnSOWQjVKOYkFxoHYB+qQmSHK5gqMqARM+K9DpR/Ws= +modernc.org/ccgo/v4 v4.34.4/go.mod h1:qdKqE8FNIYyysougB1RX9MxCzp5oJOcQXSobANJ4TuE= modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo= -modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= +modernc.org/gc/v3 v3.1.3 h1:6QAplYyVO+KdPW3pGnqmJDUxtkec8ooEWvks/hhU3lc= +modernc.org/gc/v3 v3.1.3/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= -modernc.org/libc v1.72.0 h1:IEu559v9a0XWjw0DPoVKtXpO2qt5NVLAnFaBbjq+n8c= -modernc.org/libc v1.72.0/go.mod h1:tTU8DL8A+XLVkEY3x5E/tO7s2Q/q42EtnNWda/L5QhQ= +modernc.org/libc v1.73.4 h1:+ra4Ui8ngyt8HDcO1FTDPWlkAh6yOdaO2yAoh8MddQA= +modernc.org/libc v1.73.4/go.mod h1:DXZ3eO8qMCNn2SnmTNCiC71nJ9Rcq3PsnpU6Vc4rWK8= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= -modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= -modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/opt v0.2.0 h1:tGyef5ApycA7FSEOMraay9SaTk5zmbx7Tu+cJs4QKZg= +modernc.org/opt v0.2.0/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.50.0 h1:eMowQSWLK0MeiQTdmz3lqoF5dqclujdlIKeJA11+7oM= -modernc.org/sqlite v1.50.0/go.mod h1:m0w8xhwYUVY3H6pSDwc3gkJ/irZT/0YEXwBlhaxQEew= +modernc.org/sqlite v1.53.0 h1:20WG8N9q4ji/dEqGk4uiI0c6OPjSeLTNYGFCc3+7c1M= +modernc.org/sqlite v1.53.0/go.mod h1:xoEpOIpGrgT48H5iiyt/YXPCZPEzlfmfFwtk8Lklw8s= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/server/internal/auth/service.go b/server/internal/auth/service.go index f3ae2158..28d8fa6f 100644 --- a/server/internal/auth/service.go +++ b/server/internal/auth/service.go @@ -215,6 +215,7 @@ func (s *jwtService) SetAuthCookies(w http.ResponseWriter, tokens *Tokens) { sameSite = http.SameSiteStrictMode } + // #nosec G124 -- Secure is configurable for local HTTP/test; production defaults it to true. http.SetCookie(w, &http.Cookie{ Name: accessTokenCookie, Value: tokens.AccessToken, @@ -226,6 +227,7 @@ func (s *jwtService) SetAuthCookies(w http.ResponseWriter, tokens *Tokens) { SameSite: sameSite, }) + // #nosec G124 -- Secure is configurable for local HTTP/test; production defaults it to true. http.SetCookie(w, &http.Cookie{ Name: refreshTokenCookie, Value: tokens.RefreshToken, @@ -245,6 +247,7 @@ func (s *jwtService) ClearAuthCookies(w http.ResponseWriter) { } for _, name := range []string{accessTokenCookie, refreshTokenCookie} { + // #nosec G124 -- Secure is configurable for local HTTP/test; production defaults it to true. http.SetCookie(w, &http.Cookie{ Name: name, Value: "", diff --git a/server/internal/graph/generated.go b/server/internal/graph/generated.go index 61e199d7..30b3bc07 100644 --- a/server/internal/graph/generated.go +++ b/server/internal/graph/generated.go @@ -7,6 +7,7 @@ import ( "context" "errors" "fmt" + "math" "strconv" "sync/atomic" "time" @@ -18,7 +19,7 @@ import ( "github.com/vektah/gqlparser/v2/ast" ) -// region ************************** generated!.gotpl ************************** +// region ***************************** api!.gotpl ***************************** // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { @@ -249,6 +250,10 @@ type ComplexityRoot struct { } } +// endregion ***************************** api!.gotpl ***************************** + +// region ************************** generated!.gotpl ************************** + type CountryResolver interface { Name(ctx context.Context, obj *model.Country) (string, error) } @@ -291,6 +296,10 @@ type RealtimeStatsResolver interface { ActivePages(ctx context.Context, obj *model.RealtimeStats, paging model.PagingInput) ([]*model.ActivePageStats, error) } +// endregion ************************** generated!.gotpl ************************** + +// region ************************** internal!.gotpl *************************** + type executableSchema graphql.ExecutableSchemaState[ResolverRoot, DirectiveRoot, ComplexityRoot] func (e *executableSchema) Schema() *ast.Schema { @@ -1243,8 +1252,8 @@ func newExecutionContext( opCtx *graphql.OperationContext, execSchema *executableSchema, deferredResults chan graphql.DeferredResult, -) executionContext { - return executionContext{ +) *executionContext { + return &executionContext{ ExecutionContextState: graphql.NewExecutionContextState[ResolverRoot, DirectiveRoot, ComplexityRoot]( opCtx, (*graphql.ExecutableSchemaState[ResolverRoot, DirectiveRoot, ComplexityRoot])(execSchema), @@ -1649,14 +1658,487 @@ type Mutation { } var parsedSchema = gqlparser.MustLoadSchema(sources...) -// endregion ************************** generated!.gotpl ************************** +// childFields_* functions provide shared child field context lookups. +// Each function is generated once per unique object type, deduplicating the +// switch statements that were previously inlined in every fieldContext_* function. + +func (ec *executionContext) childFields_ActivePageStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "path": + return ec.fieldContext_ActivePageStats_path(ctx, field) + case "visitors": + return ec.fieldContext_ActivePageStats_visitors(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type ActivePageStats", field.Name) +} + +func (ec *executionContext) childFields_AuthPayload(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "user": + return ec.fieldContext_AuthPayload_user(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AuthPayload", field.Name) +} + +func (ec *executionContext) childFields_BrowserStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "browser": + return ec.fieldContext_BrowserStats_browser(ctx, field) + case "visitors": + return ec.fieldContext_BrowserStats_visitors(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type BrowserStats", field.Name) +} + +func (ec *executionContext) childFields_Country(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "code": + return ec.fieldContext_Country_code(ctx, field) + case "name": + return ec.fieldContext_Country_name(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Country", field.Name) +} + +func (ec *executionContext) childFields_CountryStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "country": + return ec.fieldContext_CountryStats_country(ctx, field) + case "visitors": + return ec.fieldContext_CountryStats_visitors(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type CountryStats", field.Name) +} + +func (ec *executionContext) childFields_DailyStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "date": + return ec.fieldContext_DailyStats_date(ctx, field) + case "visitors": + return ec.fieldContext_DailyStats_visitors(ctx, field) + case "pageViews": + return ec.fieldContext_DailyStats_pageViews(ctx, field) + case "sessions": + return ec.fieldContext_DailyStats_sessions(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type DailyStats", field.Name) +} + +func (ec *executionContext) childFields_DashboardStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "visitors": + return ec.fieldContext_DashboardStats_visitors(ctx, field) + case "pageViews": + return ec.fieldContext_DashboardStats_pageViews(ctx, field) + case "sessions": + return ec.fieldContext_DashboardStats_sessions(ctx, field) + case "bounceRate": + return ec.fieldContext_DashboardStats_bounceRate(ctx, field) + case "avgDuration": + return ec.fieldContext_DashboardStats_avgDuration(ctx, field) + case "topPages": + return ec.fieldContext_DashboardStats_topPages(ctx, field) + case "topReferrers": + return ec.fieldContext_DashboardStats_topReferrers(ctx, field) + case "browsers": + return ec.fieldContext_DashboardStats_browsers(ctx, field) + case "devices": + return ec.fieldContext_DashboardStats_devices(ctx, field) + case "operatingSystems": + return ec.fieldContext_DashboardStats_operatingSystems(ctx, field) + case "countries": + return ec.fieldContext_DashboardStats_countries(ctx, field) + case "dailyStats": + return ec.fieldContext_DashboardStats_dailyStats(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type DashboardStats", field.Name) +} + +func (ec *executionContext) childFields_DeviceStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "device": + return ec.fieldContext_DeviceStats_device(ctx, field) + case "visitors": + return ec.fieldContext_DeviceStats_visitors(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type DeviceStats", field.Name) +} + +func (ec *executionContext) childFields_Event(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Event_id(ctx, field) + case "name": + return ec.fieldContext_Event_name(ctx, field) + case "path": + return ec.fieldContext_Event_path(ctx, field) + case "definition": + return ec.fieldContext_Event_definition(ctx, field) + case "properties": + return ec.fieldContext_Event_properties(ctx, field) + case "createdAt": + return ec.fieldContext_Event_createdAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Event", field.Name) +} + +func (ec *executionContext) childFields_EventCount(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "event": + return ec.fieldContext_EventCount_event(ctx, field) + case "count": + return ec.fieldContext_EventCount_count(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type EventCount", field.Name) +} + +func (ec *executionContext) childFields_EventDefinition(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_EventDefinition_id(ctx, field) + case "name": + return ec.fieldContext_EventDefinition_name(ctx, field) + case "fields": + return ec.fieldContext_EventDefinition_fields(ctx, field) + case "createdAt": + return ec.fieldContext_EventDefinition_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_EventDefinition_updatedAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type EventDefinition", field.Name) +} + +func (ec *executionContext) childFields_EventDefinitionField(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_EventDefinitionField_id(ctx, field) + case "key": + return ec.fieldContext_EventDefinitionField_key(ctx, field) + case "type": + return ec.fieldContext_EventDefinitionField_type(ctx, field) + case "required": + return ec.fieldContext_EventDefinitionField_required(ctx, field) + case "maxLength": + return ec.fieldContext_EventDefinitionField_maxLength(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type EventDefinitionField", field.Name) +} + +func (ec *executionContext) childFields_EventProperty(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "key": + return ec.fieldContext_EventProperty_key(ctx, field) + case "value": + return ec.fieldContext_EventProperty_value(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type EventProperty", field.Name) +} + +func (ec *executionContext) childFields_EventsResult(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "events": + return ec.fieldContext_EventsResult_events(ctx, field) + case "total": + return ec.fieldContext_EventsResult_total(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type EventsResult", field.Name) +} + +func (ec *executionContext) childFields_GeoIPStatus(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "state": + return ec.fieldContext_GeoIPStatus_state(ctx, field) + case "dbPath": + return ec.fieldContext_GeoIPStatus_dbPath(ctx, field) + case "source": + return ec.fieldContext_GeoIPStatus_source(ctx, field) + case "lastError": + return ec.fieldContext_GeoIPStatus_lastError(ctx, field) + case "updatedAt": + return ec.fieldContext_GeoIPStatus_updatedAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type GeoIPStatus", field.Name) +} + +func (ec *executionContext) childFields_OperatingSystemStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "os": + return ec.fieldContext_OperatingSystemStats_os(ctx, field) + case "visitors": + return ec.fieldContext_OperatingSystemStats_visitors(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type OperatingSystemStats", field.Name) +} + +func (ec *executionContext) childFields_PageStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "path": + return ec.fieldContext_PageStats_path(ctx, field) + case "views": + return ec.fieldContext_PageStats_views(ctx, field) + case "visitors": + return ec.fieldContext_PageStats_visitors(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PageStats", field.Name) +} + +func (ec *executionContext) childFields_PagedCountryStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "items": + return ec.fieldContext_PagedCountryStats_items(ctx, field) + case "total": + return ec.fieldContext_PagedCountryStats_total(ctx, field) + case "totalVisitors": + return ec.fieldContext_PagedCountryStats_totalVisitors(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PagedCountryStats", field.Name) +} + +func (ec *executionContext) childFields_PagedDeviceStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "items": + return ec.fieldContext_PagedDeviceStats_items(ctx, field) + case "total": + return ec.fieldContext_PagedDeviceStats_total(ctx, field) + case "totalVisitors": + return ec.fieldContext_PagedDeviceStats_totalVisitors(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PagedDeviceStats", field.Name) +} + +func (ec *executionContext) childFields_PagedOperatingSystemStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "items": + return ec.fieldContext_PagedOperatingSystemStats_items(ctx, field) + case "total": + return ec.fieldContext_PagedOperatingSystemStats_total(ctx, field) + case "totalVisitors": + return ec.fieldContext_PagedOperatingSystemStats_totalVisitors(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PagedOperatingSystemStats", field.Name) +} + +func (ec *executionContext) childFields_PagedPageStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "items": + return ec.fieldContext_PagedPageStats_items(ctx, field) + case "total": + return ec.fieldContext_PagedPageStats_total(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PagedPageStats", field.Name) +} + +func (ec *executionContext) childFields_PagedReferrerStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "items": + return ec.fieldContext_PagedReferrerStats_items(ctx, field) + case "total": + return ec.fieldContext_PagedReferrerStats_total(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PagedReferrerStats", field.Name) +} + +func (ec *executionContext) childFields_RealtimeStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "visitors": + return ec.fieldContext_RealtimeStats_visitors(ctx, field) + case "activePages": + return ec.fieldContext_RealtimeStats_activePages(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type RealtimeStats", field.Name) +} + +func (ec *executionContext) childFields_ReferrerStats(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "referrer": + return ec.fieldContext_ReferrerStats_referrer(ctx, field) + case "visitors": + return ec.fieldContext_ReferrerStats_visitors(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type ReferrerStats", field.Name) +} + +func (ec *executionContext) childFields_RegistrationStatus(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "hasUsers": + return ec.fieldContext_RegistrationStatus_hasUsers(ctx, field) + case "allowRegistration": + return ec.fieldContext_RegistrationStatus_allowRegistration(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type RegistrationStatus", field.Name) +} + +func (ec *executionContext) childFields_Site(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Site_id(ctx, field) + case "domains": + return ec.fieldContext_Site_domains(ctx, field) + case "name": + return ec.fieldContext_Site_name(ctx, field) + case "publicKey": + return ec.fieldContext_Site_publicKey(ctx, field) + case "trackCountry": + return ec.fieldContext_Site_trackCountry(ctx, field) + case "blockedIPs": + return ec.fieldContext_Site_blockedIPs(ctx, field) + case "blockedCountries": + return ec.fieldContext_Site_blockedCountries(ctx, field) + case "createdAt": + return ec.fieldContext_Site_createdAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Site", field.Name) +} + +func (ec *executionContext) childFields_TokenPayload(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "accessToken": + return ec.fieldContext_TokenPayload_accessToken(ctx, field) + case "refreshToken": + return ec.fieldContext_TokenPayload_refreshToken(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TokenPayload", field.Name) +} + +func (ec *executionContext) childFields_User(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_User_id(ctx, field) + case "username": + return ec.fieldContext_User_username(ctx, field) + case "role": + return ec.fieldContext_User_role(ctx, field) + case "createdAt": + return ec.fieldContext_User_createdAt(ctx, field) + case "sites": + return ec.fieldContext_User_sites(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type User", field.Name) +} + +func (ec *executionContext) childFields___Directive(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___Directive_name(ctx, field) + case "description": + return ec.fieldContext___Directive_description(ctx, field) + case "isRepeatable": + return ec.fieldContext___Directive_isRepeatable(ctx, field) + case "locations": + return ec.fieldContext___Directive_locations(ctx, field) + case "args": + return ec.fieldContext___Directive_args(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Directive", field.Name) +} + +func (ec *executionContext) childFields___EnumValue(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___EnumValue_name(ctx, field) + case "description": + return ec.fieldContext___EnumValue_description(ctx, field) + case "isDeprecated": + return ec.fieldContext___EnumValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___EnumValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __EnumValue", field.Name) +} + +func (ec *executionContext) childFields___Field(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___Field_name(ctx, field) + case "description": + return ec.fieldContext___Field_description(ctx, field) + case "args": + return ec.fieldContext___Field_args(ctx, field) + case "type": + return ec.fieldContext___Field_type(ctx, field) + case "isDeprecated": + return ec.fieldContext___Field_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___Field_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Field", field.Name) +} + +func (ec *executionContext) childFields___InputValue(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + case "isDeprecated": + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___InputValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) +} + +func (ec *executionContext) childFields___Schema(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "description": + return ec.fieldContext___Schema_description(ctx, field) + case "types": + return ec.fieldContext___Schema_types(ctx, field) + case "queryType": + return ec.fieldContext___Schema_queryType(ctx, field) + case "mutationType": + return ec.fieldContext___Schema_mutationType(ctx, field) + case "subscriptionType": + return ec.fieldContext___Schema_subscriptionType(ctx, field) + case "directives": + return ec.fieldContext___Schema_directives(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Schema", field.Name) +} + +func (ec *executionContext) childFields___Type(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) +} + +// endregion ************************** internal!.gotpl *************************** // region ***************************** args.gotpl ***************************** func (ec *executionContext) field_DashboardStats_browsers_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -1667,7 +2149,10 @@ func (ec *executionContext) field_DashboardStats_browsers_args(ctx context.Conte func (ec *executionContext) field_DashboardStats_countries_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -1678,17 +2163,26 @@ func (ec *executionContext) field_DashboardStats_countries_args(ctx context.Cont func (ec *executionContext) field_DashboardStats_dailyStats_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "bucket", ec.unmarshalOTimeBucket2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐTimeBucket) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "bucket", + func(ctx context.Context, v any) (*model.TimeBucket, error) { + return ec.unmarshalOTimeBucket2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐTimeBucket(ctx, v) + }) if err != nil { return nil, err } args["bucket"] = arg0 - arg1, err := graphql.ProcessArgField(ctx, rawArgs, "limit", ec.unmarshalOInt2ᚖint) + arg1, err := graphql.ProcessArgField(ctx, rawArgs, "limit", + func(ctx context.Context, v any) (*int, error) { + return ec.unmarshalOInt2ᚖint(ctx, v) + }) if err != nil { return nil, err } args["limit"] = arg1 - arg2, err := graphql.ProcessArgField(ctx, rawArgs, "offset", ec.unmarshalOInt2ᚖint) + arg2, err := graphql.ProcessArgField(ctx, rawArgs, "offset", + func(ctx context.Context, v any) (*int, error) { + return ec.unmarshalOInt2ᚖint(ctx, v) + }) if err != nil { return nil, err } @@ -1699,7 +2193,10 @@ func (ec *executionContext) field_DashboardStats_dailyStats_args(ctx context.Con func (ec *executionContext) field_DashboardStats_devices_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -1710,7 +2207,10 @@ func (ec *executionContext) field_DashboardStats_devices_args(ctx context.Contex func (ec *executionContext) field_DashboardStats_operatingSystems_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -1721,7 +2221,10 @@ func (ec *executionContext) field_DashboardStats_operatingSystems_args(ctx conte func (ec *executionContext) field_DashboardStats_topPages_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -1732,7 +2235,10 @@ func (ec *executionContext) field_DashboardStats_topPages_args(ctx context.Conte func (ec *executionContext) field_DashboardStats_topReferrers_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -1743,7 +2249,10 @@ func (ec *executionContext) field_DashboardStats_topReferrers_args(ctx context.C func (ec *executionContext) field_Mutation_createSite_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "input", ec.unmarshalNCreateSiteInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐCreateSiteInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "input", + func(ctx context.Context, v any) (model.CreateSiteInput, error) { + return ec.unmarshalNCreateSiteInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐCreateSiteInput(ctx, v) + }) if err != nil { return nil, err } @@ -1754,12 +2263,18 @@ func (ec *executionContext) field_Mutation_createSite_args(ctx context.Context, func (ec *executionContext) field_Mutation_deleteEventDefinition_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } args["siteId"] = arg0 - arg1, err := graphql.ProcessArgField(ctx, rawArgs, "name", ec.unmarshalNString2string) + arg1, err := graphql.ProcessArgField(ctx, rawArgs, "name", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNString2string(ctx, v) + }) if err != nil { return nil, err } @@ -1770,7 +2285,10 @@ func (ec *executionContext) field_Mutation_deleteEventDefinition_args(ctx contex func (ec *executionContext) field_Mutation_deleteSite_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "id", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "id", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } @@ -1781,7 +2299,10 @@ func (ec *executionContext) field_Mutation_deleteSite_args(ctx context.Context, func (ec *executionContext) field_Mutation_login_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "input", ec.unmarshalNLoginInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐLoginInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "input", + func(ctx context.Context, v any) (model.LoginInput, error) { + return ec.unmarshalNLoginInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐLoginInput(ctx, v) + }) if err != nil { return nil, err } @@ -1792,7 +2313,10 @@ func (ec *executionContext) field_Mutation_login_args(ctx context.Context, rawAr func (ec *executionContext) field_Mutation_refreshToken_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "refreshToken", ec.unmarshalNString2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "refreshToken", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNString2string(ctx, v) + }) if err != nil { return nil, err } @@ -1803,7 +2327,10 @@ func (ec *executionContext) field_Mutation_refreshToken_args(ctx context.Context func (ec *executionContext) field_Mutation_regenerateSiteKey_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "id", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "id", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } @@ -1814,7 +2341,10 @@ func (ec *executionContext) field_Mutation_regenerateSiteKey_args(ctx context.Co func (ec *executionContext) field_Mutation_register_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "input", ec.unmarshalNRegisterInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐRegisterInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "input", + func(ctx context.Context, v any) (model.RegisterInput, error) { + return ec.unmarshalNRegisterInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐRegisterInput(ctx, v) + }) if err != nil { return nil, err } @@ -1825,12 +2355,18 @@ func (ec *executionContext) field_Mutation_register_args(ctx context.Context, ra func (ec *executionContext) field_Mutation_updateSite_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "id", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "id", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } args["id"] = arg0 - arg1, err := graphql.ProcessArgField(ctx, rawArgs, "input", ec.unmarshalNUpdateSiteInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐUpdateSiteInput) + arg1, err := graphql.ProcessArgField(ctx, rawArgs, "input", + func(ctx context.Context, v any) (model.UpdateSiteInput, error) { + return ec.unmarshalNUpdateSiteInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐUpdateSiteInput(ctx, v) + }) if err != nil { return nil, err } @@ -1841,12 +2377,18 @@ func (ec *executionContext) field_Mutation_updateSite_args(ctx context.Context, func (ec *executionContext) field_Mutation_upsertEventDefinition_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } args["siteId"] = arg0 - arg1, err := graphql.ProcessArgField(ctx, rawArgs, "input", ec.unmarshalNEventDefinitionInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventDefinitionInput) + arg1, err := graphql.ProcessArgField(ctx, rawArgs, "input", + func(ctx context.Context, v any) (model.EventDefinitionInput, error) { + return ec.unmarshalNEventDefinitionInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventDefinitionInput(ctx, v) + }) if err != nil { return nil, err } @@ -1857,7 +2399,10 @@ func (ec *executionContext) field_Mutation_upsertEventDefinition_args(ctx contex func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "name", ec.unmarshalNString2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "name", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNString2string(ctx, v) + }) if err != nil { return nil, err } @@ -1868,17 +2413,26 @@ func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs func (ec *executionContext) field_Query_dashboard_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } args["siteId"] = arg0 - arg1, err := graphql.ProcessArgField(ctx, rawArgs, "dateRange", ec.unmarshalODateRangeInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDateRangeInput) + arg1, err := graphql.ProcessArgField(ctx, rawArgs, "dateRange", + func(ctx context.Context, v any) (*model.DateRangeInput, error) { + return ec.unmarshalODateRangeInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDateRangeInput(ctx, v) + }) if err != nil { return nil, err } args["dateRange"] = arg1 - arg2, err := graphql.ProcessArgField(ctx, rawArgs, "filter", ec.unmarshalOFilterInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐFilterInput) + arg2, err := graphql.ProcessArgField(ctx, rawArgs, "filter", + func(ctx context.Context, v any) (*model.FilterInput, error) { + return ec.unmarshalOFilterInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐFilterInput(ctx, v) + }) if err != nil { return nil, err } @@ -1889,22 +2443,34 @@ func (ec *executionContext) field_Query_dashboard_args(ctx context.Context, rawA func (ec *executionContext) field_Query_eventCounts_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } args["siteId"] = arg0 - arg1, err := graphql.ProcessArgField(ctx, rawArgs, "dateRange", ec.unmarshalODateRangeInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDateRangeInput) + arg1, err := graphql.ProcessArgField(ctx, rawArgs, "dateRange", + func(ctx context.Context, v any) (*model.DateRangeInput, error) { + return ec.unmarshalODateRangeInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDateRangeInput(ctx, v) + }) if err != nil { return nil, err } args["dateRange"] = arg1 - arg2, err := graphql.ProcessArgField(ctx, rawArgs, "filter", ec.unmarshalOFilterInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐFilterInput) + arg2, err := graphql.ProcessArgField(ctx, rawArgs, "filter", + func(ctx context.Context, v any) (*model.FilterInput, error) { + return ec.unmarshalOFilterInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐFilterInput(ctx, v) + }) if err != nil { return nil, err } args["filter"] = arg2 - arg3, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg3, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -1915,12 +2481,18 @@ func (ec *executionContext) field_Query_eventCounts_args(ctx context.Context, ra func (ec *executionContext) field_Query_eventDefinitions_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } args["siteId"] = arg0 - arg1, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg1, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -1931,27 +2503,42 @@ func (ec *executionContext) field_Query_eventDefinitions_args(ctx context.Contex func (ec *executionContext) field_Query_events_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } args["siteId"] = arg0 - arg1, err := graphql.ProcessArgField(ctx, rawArgs, "dateRange", ec.unmarshalODateRangeInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDateRangeInput) + arg1, err := graphql.ProcessArgField(ctx, rawArgs, "dateRange", + func(ctx context.Context, v any) (*model.DateRangeInput, error) { + return ec.unmarshalODateRangeInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDateRangeInput(ctx, v) + }) if err != nil { return nil, err } args["dateRange"] = arg1 - arg2, err := graphql.ProcessArgField(ctx, rawArgs, "filter", ec.unmarshalOFilterInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐFilterInput) + arg2, err := graphql.ProcessArgField(ctx, rawArgs, "filter", + func(ctx context.Context, v any) (*model.FilterInput, error) { + return ec.unmarshalOFilterInput2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐFilterInput(ctx, v) + }) if err != nil { return nil, err } args["filter"] = arg2 - arg3, err := graphql.ProcessArgField(ctx, rawArgs, "limit", ec.unmarshalOInt2ᚖint) + arg3, err := graphql.ProcessArgField(ctx, rawArgs, "limit", + func(ctx context.Context, v any) (*int, error) { + return ec.unmarshalOInt2ᚖint(ctx, v) + }) if err != nil { return nil, err } args["limit"] = arg3 - arg4, err := graphql.ProcessArgField(ctx, rawArgs, "offset", ec.unmarshalOInt2ᚖint) + arg4, err := graphql.ProcessArgField(ctx, rawArgs, "offset", + func(ctx context.Context, v any) (*int, error) { + return ec.unmarshalOInt2ᚖint(ctx, v) + }) if err != nil { return nil, err } @@ -1962,17 +2549,26 @@ func (ec *executionContext) field_Query_events_args(ctx context.Context, rawArgs func (ec *executionContext) field_Query_geoIPCountries_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "search", ec.unmarshalOString2ᚖstring) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "search", + func(ctx context.Context, v any) (*string, error) { + return ec.unmarshalOString2ᚖstring(ctx, v) + }) if err != nil { return nil, err } args["search"] = arg0 - arg1, err := graphql.ProcessArgField(ctx, rawArgs, "codes", ec.unmarshalOString2ᚕstringᚄ) + arg1, err := graphql.ProcessArgField(ctx, rawArgs, "codes", + func(ctx context.Context, v any) ([]string, error) { + return ec.unmarshalOString2ᚕstringᚄ(ctx, v) + }) if err != nil { return nil, err } args["codes"] = arg1 - arg2, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg2, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -1983,7 +2579,10 @@ func (ec *executionContext) field_Query_geoIPCountries_args(ctx context.Context, func (ec *executionContext) field_Query_realtime_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "siteId", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } @@ -1994,7 +2593,10 @@ func (ec *executionContext) field_Query_realtime_args(ctx context.Context, rawAr func (ec *executionContext) field_Query_site_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "id", ec.unmarshalNID2string) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "id", + func(ctx context.Context, v any) (string, error) { + return ec.unmarshalNID2string(ctx, v) + }) if err != nil { return nil, err } @@ -2005,7 +2607,10 @@ func (ec *executionContext) field_Query_site_args(ctx context.Context, rawArgs m func (ec *executionContext) field_Query_sites_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -2016,7 +2621,10 @@ func (ec *executionContext) field_Query_sites_args(ctx context.Context, rawArgs func (ec *executionContext) field_RealtimeStats_activePages_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -2027,7 +2635,10 @@ func (ec *executionContext) field_RealtimeStats_activePages_args(ctx context.Con func (ec *executionContext) field_User_sites_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "paging", + func(ctx context.Context, v any) (model.PagingInput, error) { + return ec.unmarshalNPagingInput2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagingInput(ctx, v) + }) if err != nil { return nil, err } @@ -2038,7 +2649,10 @@ func (ec *executionContext) field_User_sites_args(ctx context.Context, rawArgs m func (ec *executionContext) field___Directive_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "includeDeprecated", ec.unmarshalOBoolean2ᚖbool) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "includeDeprecated", + func(ctx context.Context, v any) (*bool, error) { + return ec.unmarshalOBoolean2ᚖbool(ctx, v) + }) if err != nil { return nil, err } @@ -2049,7 +2663,10 @@ func (ec *executionContext) field___Directive_args_args(ctx context.Context, raw func (ec *executionContext) field___Field_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "includeDeprecated", ec.unmarshalOBoolean2ᚖbool) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "includeDeprecated", + func(ctx context.Context, v any) (*bool, error) { + return ec.unmarshalOBoolean2ᚖbool(ctx, v) + }) if err != nil { return nil, err } @@ -2060,7 +2677,10 @@ func (ec *executionContext) field___Field_args_args(ctx context.Context, rawArgs func (ec *executionContext) field___Type_enumValues_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "includeDeprecated", ec.unmarshalOBoolean2bool) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "includeDeprecated", + func(ctx context.Context, v any) (bool, error) { + return ec.unmarshalOBoolean2bool(ctx, v) + }) if err != nil { return nil, err } @@ -2071,7 +2691,10 @@ func (ec *executionContext) field___Type_enumValues_args(ctx context.Context, ra func (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} - arg0, err := graphql.ProcessArgField(ctx, rawArgs, "includeDeprecated", ec.unmarshalOBoolean2bool) + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "includeDeprecated", + func(ctx context.Context, v any) (bool, error) { + return ec.unmarshalOBoolean2bool(ctx, v) + }) if err != nil { return nil, err } @@ -2081,10 +2704,6 @@ func (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArg // endregion ***************************** args.gotpl ***************************** -// region ************************** directives.gotpl ************************** - -// endregion ************************** directives.gotpl ************************** - // region **************************** field.gotpl ***************************** func (ec *executionContext) _ActivePageStats_path(ctx context.Context, field graphql.CollectedField, obj *model.ActivePageStats) (ret graphql.Marshaler) { @@ -2092,28 +2711,22 @@ func (ec *executionContext) _ActivePageStats_path(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext_ActivePageStats_path, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_ActivePageStats_path(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Path, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_ActivePageStats_path(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "ActivePageStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("ActivePageStats", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _ActivePageStats_visitors(ctx context.Context, field graphql.CollectedField, obj *model.ActivePageStats) (ret graphql.Marshaler) { @@ -2121,28 +2734,22 @@ func (ec *executionContext) _ActivePageStats_visitors(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_ActivePageStats_visitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_ActivePageStats_visitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Visitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_ActivePageStats_visitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "ActivePageStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("ActivePageStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _AuthPayload_user(ctx context.Context, field graphql.CollectedField, obj *model.AuthPayload) (ret graphql.Marshaler) { @@ -2150,17 +2757,20 @@ func (ec *executionContext) _AuthPayload_user(ctx context.Context, field graphql ctx, ec.OperationContext, field, - ec.fieldContext_AuthPayload_user, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_AuthPayload_user(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.User, nil }, nil, - ec.marshalNUser2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐUser, + func(ctx context.Context, selections ast.SelectionSet, v *model.User) graphql.Marshaler { + return ec.marshalNUser2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐUser(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_AuthPayload_user(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "AuthPayload", @@ -2168,19 +2778,7 @@ func (ec *executionContext) fieldContext_AuthPayload_user(_ context.Context, fie IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_User_id(ctx, field) - case "username": - return ec.fieldContext_User_username(ctx, field) - case "role": - return ec.fieldContext_User_role(ctx, field) - case "createdAt": - return ec.fieldContext_User_createdAt(ctx, field) - case "sites": - return ec.fieldContext_User_sites(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + return ec.childFields_User(ctx, field) }, } return fc, nil @@ -2191,28 +2789,22 @@ func (ec *executionContext) _BrowserStats_browser(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext_BrowserStats_browser, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_BrowserStats_browser(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Browser, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_BrowserStats_browser(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "BrowserStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("BrowserStats", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _BrowserStats_visitors(ctx context.Context, field graphql.CollectedField, obj *model.BrowserStats) (ret graphql.Marshaler) { @@ -2220,28 +2812,22 @@ func (ec *executionContext) _BrowserStats_visitors(ctx context.Context, field gr ctx, ec.OperationContext, field, - ec.fieldContext_BrowserStats_visitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_BrowserStats_visitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Visitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_BrowserStats_visitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "BrowserStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("BrowserStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _Country_code(ctx context.Context, field graphql.CollectedField, obj *model.Country) (ret graphql.Marshaler) { @@ -2249,28 +2835,22 @@ func (ec *executionContext) _Country_code(ctx context.Context, field graphql.Col ctx, ec.OperationContext, field, - ec.fieldContext_Country_code, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Country_code(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Code, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Country_code(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Country", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Country", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _Country_name(ctx context.Context, field graphql.CollectedField, obj *model.Country) (ret graphql.Marshaler) { @@ -2278,28 +2858,22 @@ func (ec *executionContext) _Country_name(ctx context.Context, field graphql.Col ctx, ec.OperationContext, field, - ec.fieldContext_Country_name, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Country_name(ctx, field) + }, func(ctx context.Context) (any, error) { return ec.Resolvers.Country().Name(ctx, obj) }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Country_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Country", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Country", field, true, true, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _CountryStats_country(ctx context.Context, field graphql.CollectedField, obj *model.CountryStats) (ret graphql.Marshaler) { @@ -2307,17 +2881,20 @@ func (ec *executionContext) _CountryStats_country(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext_CountryStats_country, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_CountryStats_country(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Country, nil }, nil, - ec.marshalNCountry2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐCountry, + func(ctx context.Context, selections ast.SelectionSet, v *model.Country) graphql.Marshaler { + return ec.marshalNCountry2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐCountry(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_CountryStats_country(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "CountryStats", @@ -2325,13 +2902,7 @@ func (ec *executionContext) fieldContext_CountryStats_country(_ context.Context, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "code": - return ec.fieldContext_Country_code(ctx, field) - case "name": - return ec.fieldContext_Country_name(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Country", field.Name) + return ec.childFields_Country(ctx, field) }, } return fc, nil @@ -2342,28 +2913,22 @@ func (ec *executionContext) _CountryStats_visitors(ctx context.Context, field gr ctx, ec.OperationContext, field, - ec.fieldContext_CountryStats_visitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_CountryStats_visitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Visitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_CountryStats_visitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "CountryStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("CountryStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _DailyStats_date(ctx context.Context, field graphql.CollectedField, obj *model.DailyStats) (ret graphql.Marshaler) { @@ -2371,28 +2936,22 @@ func (ec *executionContext) _DailyStats_date(ctx context.Context, field graphql. ctx, ec.OperationContext, field, - ec.fieldContext_DailyStats_date, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DailyStats_date(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Date, nil }, nil, - ec.marshalNTime2timeᚐTime, + func(ctx context.Context, selections ast.SelectionSet, v time.Time) graphql.Marshaler { + return ec.marshalNTime2timeᚐTime(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DailyStats_date(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DailyStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Time does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DailyStats", field, false, false, errors.New("field of type Time does not have child fields")) } func (ec *executionContext) _DailyStats_visitors(ctx context.Context, field graphql.CollectedField, obj *model.DailyStats) (ret graphql.Marshaler) { @@ -2400,28 +2959,22 @@ func (ec *executionContext) _DailyStats_visitors(ctx context.Context, field grap ctx, ec.OperationContext, field, - ec.fieldContext_DailyStats_visitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DailyStats_visitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Visitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DailyStats_visitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DailyStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DailyStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _DailyStats_pageViews(ctx context.Context, field graphql.CollectedField, obj *model.DailyStats) (ret graphql.Marshaler) { @@ -2429,28 +2982,22 @@ func (ec *executionContext) _DailyStats_pageViews(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext_DailyStats_pageViews, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DailyStats_pageViews(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.PageViews, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DailyStats_pageViews(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DailyStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DailyStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _DailyStats_sessions(ctx context.Context, field graphql.CollectedField, obj *model.DailyStats) (ret graphql.Marshaler) { @@ -2458,28 +3005,22 @@ func (ec *executionContext) _DailyStats_sessions(ctx context.Context, field grap ctx, ec.OperationContext, field, - ec.fieldContext_DailyStats_sessions, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DailyStats_sessions(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Sessions, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DailyStats_sessions(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DailyStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DailyStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _DashboardStats_visitors(ctx context.Context, field graphql.CollectedField, obj *model.DashboardStats) (ret graphql.Marshaler) { @@ -2487,28 +3028,22 @@ func (ec *executionContext) _DashboardStats_visitors(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_visitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_visitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Visitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_visitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DashboardStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DashboardStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _DashboardStats_pageViews(ctx context.Context, field graphql.CollectedField, obj *model.DashboardStats) (ret graphql.Marshaler) { @@ -2516,28 +3051,22 @@ func (ec *executionContext) _DashboardStats_pageViews(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_pageViews, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_pageViews(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.PageViews, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_pageViews(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DashboardStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DashboardStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _DashboardStats_sessions(ctx context.Context, field graphql.CollectedField, obj *model.DashboardStats) (ret graphql.Marshaler) { @@ -2545,28 +3074,22 @@ func (ec *executionContext) _DashboardStats_sessions(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_sessions, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_sessions(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Sessions, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_sessions(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DashboardStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DashboardStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _DashboardStats_bounceRate(ctx context.Context, field graphql.CollectedField, obj *model.DashboardStats) (ret graphql.Marshaler) { @@ -2574,28 +3097,22 @@ func (ec *executionContext) _DashboardStats_bounceRate(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_bounceRate, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_bounceRate(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.BounceRate, nil }, nil, - ec.marshalNFloat2float64, + func(ctx context.Context, selections ast.SelectionSet, v float64) graphql.Marshaler { + return ec.marshalNFloat2float64(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_bounceRate(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DashboardStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Float does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DashboardStats", field, false, false, errors.New("field of type Float does not have child fields")) } func (ec *executionContext) _DashboardStats_avgDuration(ctx context.Context, field graphql.CollectedField, obj *model.DashboardStats) (ret graphql.Marshaler) { @@ -2603,28 +3120,22 @@ func (ec *executionContext) _DashboardStats_avgDuration(ctx context.Context, fie ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_avgDuration, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_avgDuration(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.AvgDuration, nil }, nil, - ec.marshalNFloat2float64, + func(ctx context.Context, selections ast.SelectionSet, v float64) graphql.Marshaler { + return ec.marshalNFloat2float64(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_avgDuration(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DashboardStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Float does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DashboardStats", field, false, false, errors.New("field of type Float does not have child fields")) } func (ec *executionContext) _DashboardStats_topPages(ctx context.Context, field graphql.CollectedField, obj *model.DashboardStats) (ret graphql.Marshaler) { @@ -2632,18 +3143,21 @@ func (ec *executionContext) _DashboardStats_topPages(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_topPages, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_topPages(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.DashboardStats().TopPages(ctx, obj, fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNPagedPageStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagedPageStats, + func(ctx context.Context, selections ast.SelectionSet, v *model.PagedPageStats) graphql.Marshaler { + return ec.marshalNPagedPageStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagedPageStats(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_topPages(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "DashboardStats", @@ -2651,13 +3165,7 @@ func (ec *executionContext) fieldContext_DashboardStats_topPages(ctx context.Con IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "items": - return ec.fieldContext_PagedPageStats_items(ctx, field) - case "total": - return ec.fieldContext_PagedPageStats_total(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type PagedPageStats", field.Name) + return ec.childFields_PagedPageStats(ctx, field) }, } defer func() { @@ -2679,18 +3187,21 @@ func (ec *executionContext) _DashboardStats_topReferrers(ctx context.Context, fi ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_topReferrers, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_topReferrers(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.DashboardStats().TopReferrers(ctx, obj, fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNPagedReferrerStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagedReferrerStats, + func(ctx context.Context, selections ast.SelectionSet, v *model.PagedReferrerStats) graphql.Marshaler { + return ec.marshalNPagedReferrerStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagedReferrerStats(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_topReferrers(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "DashboardStats", @@ -2698,13 +3209,7 @@ func (ec *executionContext) fieldContext_DashboardStats_topReferrers(ctx context IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "items": - return ec.fieldContext_PagedReferrerStats_items(ctx, field) - case "total": - return ec.fieldContext_PagedReferrerStats_total(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type PagedReferrerStats", field.Name) + return ec.childFields_PagedReferrerStats(ctx, field) }, } defer func() { @@ -2726,18 +3231,21 @@ func (ec *executionContext) _DashboardStats_browsers(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_browsers, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_browsers(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.DashboardStats().Browsers(ctx, obj, fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNBrowserStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐBrowserStatsᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.BrowserStats) graphql.Marshaler { + return ec.marshalNBrowserStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐBrowserStatsᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_browsers(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "DashboardStats", @@ -2745,13 +3253,7 @@ func (ec *executionContext) fieldContext_DashboardStats_browsers(ctx context.Con IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "browser": - return ec.fieldContext_BrowserStats_browser(ctx, field) - case "visitors": - return ec.fieldContext_BrowserStats_visitors(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type BrowserStats", field.Name) + return ec.childFields_BrowserStats(ctx, field) }, } defer func() { @@ -2773,18 +3275,21 @@ func (ec *executionContext) _DashboardStats_devices(ctx context.Context, field g ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_devices, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_devices(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.DashboardStats().Devices(ctx, obj, fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNPagedDeviceStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagedDeviceStats, + func(ctx context.Context, selections ast.SelectionSet, v *model.PagedDeviceStats) graphql.Marshaler { + return ec.marshalNPagedDeviceStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagedDeviceStats(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_devices(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "DashboardStats", @@ -2792,15 +3297,7 @@ func (ec *executionContext) fieldContext_DashboardStats_devices(ctx context.Cont IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "items": - return ec.fieldContext_PagedDeviceStats_items(ctx, field) - case "total": - return ec.fieldContext_PagedDeviceStats_total(ctx, field) - case "totalVisitors": - return ec.fieldContext_PagedDeviceStats_totalVisitors(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type PagedDeviceStats", field.Name) + return ec.childFields_PagedDeviceStats(ctx, field) }, } defer func() { @@ -2822,18 +3319,21 @@ func (ec *executionContext) _DashboardStats_operatingSystems(ctx context.Context ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_operatingSystems, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_operatingSystems(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.DashboardStats().OperatingSystems(ctx, obj, fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNPagedOperatingSystemStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagedOperatingSystemStats, + func(ctx context.Context, selections ast.SelectionSet, v *model.PagedOperatingSystemStats) graphql.Marshaler { + return ec.marshalNPagedOperatingSystemStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagedOperatingSystemStats(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_operatingSystems(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "DashboardStats", @@ -2841,15 +3341,7 @@ func (ec *executionContext) fieldContext_DashboardStats_operatingSystems(ctx con IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "items": - return ec.fieldContext_PagedOperatingSystemStats_items(ctx, field) - case "total": - return ec.fieldContext_PagedOperatingSystemStats_total(ctx, field) - case "totalVisitors": - return ec.fieldContext_PagedOperatingSystemStats_totalVisitors(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type PagedOperatingSystemStats", field.Name) + return ec.childFields_PagedOperatingSystemStats(ctx, field) }, } defer func() { @@ -2871,18 +3363,21 @@ func (ec *executionContext) _DashboardStats_countries(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_countries, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_countries(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.DashboardStats().Countries(ctx, obj, fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNPagedCountryStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagedCountryStats, + func(ctx context.Context, selections ast.SelectionSet, v *model.PagedCountryStats) graphql.Marshaler { + return ec.marshalNPagedCountryStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPagedCountryStats(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_countries(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "DashboardStats", @@ -2890,15 +3385,7 @@ func (ec *executionContext) fieldContext_DashboardStats_countries(ctx context.Co IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "items": - return ec.fieldContext_PagedCountryStats_items(ctx, field) - case "total": - return ec.fieldContext_PagedCountryStats_total(ctx, field) - case "totalVisitors": - return ec.fieldContext_PagedCountryStats_totalVisitors(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type PagedCountryStats", field.Name) + return ec.childFields_PagedCountryStats(ctx, field) }, } defer func() { @@ -2920,18 +3407,21 @@ func (ec *executionContext) _DashboardStats_dailyStats(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext_DashboardStats_dailyStats, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DashboardStats_dailyStats(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.DashboardStats().DailyStats(ctx, obj, fc.Args["bucket"].(*model.TimeBucket), fc.Args["limit"].(*int), fc.Args["offset"].(*int)) }, nil, - ec.marshalNDailyStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDailyStatsᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.DailyStats) graphql.Marshaler { + return ec.marshalNDailyStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDailyStatsᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DashboardStats_dailyStats(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "DashboardStats", @@ -2939,17 +3429,7 @@ func (ec *executionContext) fieldContext_DashboardStats_dailyStats(ctx context.C IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "date": - return ec.fieldContext_DailyStats_date(ctx, field) - case "visitors": - return ec.fieldContext_DailyStats_visitors(ctx, field) - case "pageViews": - return ec.fieldContext_DailyStats_pageViews(ctx, field) - case "sessions": - return ec.fieldContext_DailyStats_sessions(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type DailyStats", field.Name) + return ec.childFields_DailyStats(ctx, field) }, } defer func() { @@ -2971,28 +3451,22 @@ func (ec *executionContext) _DeviceStats_device(ctx context.Context, field graph ctx, ec.OperationContext, field, - ec.fieldContext_DeviceStats_device, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DeviceStats_device(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Device, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DeviceStats_device(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DeviceStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DeviceStats", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _DeviceStats_visitors(ctx context.Context, field graphql.CollectedField, obj *model.DeviceStats) (ret graphql.Marshaler) { @@ -3000,28 +3474,22 @@ func (ec *executionContext) _DeviceStats_visitors(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext_DeviceStats_visitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_DeviceStats_visitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Visitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_DeviceStats_visitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "DeviceStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("DeviceStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _Event_id(ctx context.Context, field graphql.CollectedField, obj *model.Event) (ret graphql.Marshaler) { @@ -3029,28 +3497,22 @@ func (ec *executionContext) _Event_id(ctx context.Context, field graphql.Collect ctx, ec.OperationContext, field, - ec.fieldContext_Event_id, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Event_id(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.ID, nil }, nil, - ec.marshalNID2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNID2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Event_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Event", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Event", field, false, false, errors.New("field of type ID does not have child fields")) } func (ec *executionContext) _Event_name(ctx context.Context, field graphql.CollectedField, obj *model.Event) (ret graphql.Marshaler) { @@ -3058,28 +3520,22 @@ func (ec *executionContext) _Event_name(ctx context.Context, field graphql.Colle ctx, ec.OperationContext, field, - ec.fieldContext_Event_name, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Event_name(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Name, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Event_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Event", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Event", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _Event_path(ctx context.Context, field graphql.CollectedField, obj *model.Event) (ret graphql.Marshaler) { @@ -3087,28 +3543,22 @@ func (ec *executionContext) _Event_path(ctx context.Context, field graphql.Colle ctx, ec.OperationContext, field, - ec.fieldContext_Event_path, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Event_path(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Path, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Event_path(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Event", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Event", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _Event_definition(ctx context.Context, field graphql.CollectedField, obj *model.Event) (ret graphql.Marshaler) { @@ -3116,17 +3566,20 @@ func (ec *executionContext) _Event_definition(ctx context.Context, field graphql ctx, ec.OperationContext, field, - ec.fieldContext_Event_definition, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Event_definition(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Definition, nil }, nil, - ec.marshalOEventDefinition2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventDefinition, + func(ctx context.Context, selections ast.SelectionSet, v *model.EventDefinition) graphql.Marshaler { + return ec.marshalOEventDefinition2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventDefinition(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext_Event_definition(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Event", @@ -3134,19 +3587,7 @@ func (ec *executionContext) fieldContext_Event_definition(_ context.Context, fie IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_EventDefinition_id(ctx, field) - case "name": - return ec.fieldContext_EventDefinition_name(ctx, field) - case "fields": - return ec.fieldContext_EventDefinition_fields(ctx, field) - case "createdAt": - return ec.fieldContext_EventDefinition_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_EventDefinition_updatedAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type EventDefinition", field.Name) + return ec.childFields_EventDefinition(ctx, field) }, } return fc, nil @@ -3157,17 +3598,20 @@ func (ec *executionContext) _Event_properties(ctx context.Context, field graphql ctx, ec.OperationContext, field, - ec.fieldContext_Event_properties, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Event_properties(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Properties, nil }, nil, - ec.marshalNEventProperty2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventPropertyᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.EventProperty) graphql.Marshaler { + return ec.marshalNEventProperty2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventPropertyᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Event_properties(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Event", @@ -3175,13 +3619,7 @@ func (ec *executionContext) fieldContext_Event_properties(_ context.Context, fie IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "key": - return ec.fieldContext_EventProperty_key(ctx, field) - case "value": - return ec.fieldContext_EventProperty_value(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type EventProperty", field.Name) + return ec.childFields_EventProperty(ctx, field) }, } return fc, nil @@ -3192,28 +3630,22 @@ func (ec *executionContext) _Event_createdAt(ctx context.Context, field graphql. ctx, ec.OperationContext, field, - ec.fieldContext_Event_createdAt, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Event_createdAt(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.CreatedAt, nil }, nil, - ec.marshalNTime2timeᚐTime, + func(ctx context.Context, selections ast.SelectionSet, v time.Time) graphql.Marshaler { + return ec.marshalNTime2timeᚐTime(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Event_createdAt(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Event", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Time does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Event", field, false, false, errors.New("field of type Time does not have child fields")) } func (ec *executionContext) _EventCount_event(ctx context.Context, field graphql.CollectedField, obj *model.EventCount) (ret graphql.Marshaler) { @@ -3221,17 +3653,20 @@ func (ec *executionContext) _EventCount_event(ctx context.Context, field graphql ctx, ec.OperationContext, field, - ec.fieldContext_EventCount_event, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventCount_event(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Event, nil }, nil, - ec.marshalNEvent2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEvent, + func(ctx context.Context, selections ast.SelectionSet, v *model.Event) graphql.Marshaler { + return ec.marshalNEvent2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEvent(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventCount_event(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "EventCount", @@ -3239,21 +3674,7 @@ func (ec *executionContext) fieldContext_EventCount_event(_ context.Context, fie IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Event_id(ctx, field) - case "name": - return ec.fieldContext_Event_name(ctx, field) - case "path": - return ec.fieldContext_Event_path(ctx, field) - case "definition": - return ec.fieldContext_Event_definition(ctx, field) - case "properties": - return ec.fieldContext_Event_properties(ctx, field) - case "createdAt": - return ec.fieldContext_Event_createdAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Event", field.Name) + return ec.childFields_Event(ctx, field) }, } return fc, nil @@ -3264,28 +3685,22 @@ func (ec *executionContext) _EventCount_count(ctx context.Context, field graphql ctx, ec.OperationContext, field, - ec.fieldContext_EventCount_count, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventCount_count(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Count, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventCount_count(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventCount", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventCount", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _EventDefinition_id(ctx context.Context, field graphql.CollectedField, obj *model.EventDefinition) (ret graphql.Marshaler) { @@ -3293,28 +3708,22 @@ func (ec *executionContext) _EventDefinition_id(ctx context.Context, field graph ctx, ec.OperationContext, field, - ec.fieldContext_EventDefinition_id, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventDefinition_id(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.ID, nil }, nil, - ec.marshalNID2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNID2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventDefinition_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventDefinition", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventDefinition", field, false, false, errors.New("field of type ID does not have child fields")) } func (ec *executionContext) _EventDefinition_name(ctx context.Context, field graphql.CollectedField, obj *model.EventDefinition) (ret graphql.Marshaler) { @@ -3322,28 +3731,22 @@ func (ec *executionContext) _EventDefinition_name(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext_EventDefinition_name, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventDefinition_name(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Name, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventDefinition_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventDefinition", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventDefinition", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _EventDefinition_fields(ctx context.Context, field graphql.CollectedField, obj *model.EventDefinition) (ret graphql.Marshaler) { @@ -3351,17 +3754,20 @@ func (ec *executionContext) _EventDefinition_fields(ctx context.Context, field g ctx, ec.OperationContext, field, - ec.fieldContext_EventDefinition_fields, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventDefinition_fields(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Fields, nil }, nil, - ec.marshalNEventDefinitionField2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventDefinitionFieldᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.EventDefinitionField) graphql.Marshaler { + return ec.marshalNEventDefinitionField2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventDefinitionFieldᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventDefinition_fields(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "EventDefinition", @@ -3369,19 +3775,7 @@ func (ec *executionContext) fieldContext_EventDefinition_fields(_ context.Contex IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_EventDefinitionField_id(ctx, field) - case "key": - return ec.fieldContext_EventDefinitionField_key(ctx, field) - case "type": - return ec.fieldContext_EventDefinitionField_type(ctx, field) - case "required": - return ec.fieldContext_EventDefinitionField_required(ctx, field) - case "maxLength": - return ec.fieldContext_EventDefinitionField_maxLength(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type EventDefinitionField", field.Name) + return ec.childFields_EventDefinitionField(ctx, field) }, } return fc, nil @@ -3392,28 +3786,22 @@ func (ec *executionContext) _EventDefinition_createdAt(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext_EventDefinition_createdAt, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventDefinition_createdAt(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.CreatedAt, nil }, nil, - ec.marshalNTime2timeᚐTime, + func(ctx context.Context, selections ast.SelectionSet, v time.Time) graphql.Marshaler { + return ec.marshalNTime2timeᚐTime(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventDefinition_createdAt(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventDefinition", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Time does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventDefinition", field, false, false, errors.New("field of type Time does not have child fields")) } func (ec *executionContext) _EventDefinition_updatedAt(ctx context.Context, field graphql.CollectedField, obj *model.EventDefinition) (ret graphql.Marshaler) { @@ -3421,28 +3809,22 @@ func (ec *executionContext) _EventDefinition_updatedAt(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext_EventDefinition_updatedAt, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventDefinition_updatedAt(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.UpdatedAt, nil }, nil, - ec.marshalNTime2timeᚐTime, + func(ctx context.Context, selections ast.SelectionSet, v time.Time) graphql.Marshaler { + return ec.marshalNTime2timeᚐTime(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventDefinition_updatedAt(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventDefinition", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Time does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventDefinition", field, false, false, errors.New("field of type Time does not have child fields")) } func (ec *executionContext) _EventDefinitionField_id(ctx context.Context, field graphql.CollectedField, obj *model.EventDefinitionField) (ret graphql.Marshaler) { @@ -3450,28 +3832,22 @@ func (ec *executionContext) _EventDefinitionField_id(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_EventDefinitionField_id, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventDefinitionField_id(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.ID, nil }, nil, - ec.marshalNID2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNID2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventDefinitionField_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventDefinitionField", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventDefinitionField", field, false, false, errors.New("field of type ID does not have child fields")) } func (ec *executionContext) _EventDefinitionField_key(ctx context.Context, field graphql.CollectedField, obj *model.EventDefinitionField) (ret graphql.Marshaler) { @@ -3479,28 +3855,22 @@ func (ec *executionContext) _EventDefinitionField_key(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_EventDefinitionField_key, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventDefinitionField_key(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Key, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventDefinitionField_key(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventDefinitionField", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventDefinitionField", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _EventDefinitionField_type(ctx context.Context, field graphql.CollectedField, obj *model.EventDefinitionField) (ret graphql.Marshaler) { @@ -3508,28 +3878,22 @@ func (ec *executionContext) _EventDefinitionField_type(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext_EventDefinitionField_type, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventDefinitionField_type(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Type, nil }, nil, - ec.marshalNEventFieldType2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventFieldType, + func(ctx context.Context, selections ast.SelectionSet, v model.EventFieldType) graphql.Marshaler { + return ec.marshalNEventFieldType2githubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventFieldType(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventDefinitionField_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventDefinitionField", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type EventFieldType does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventDefinitionField", field, false, false, errors.New("field of type EventFieldType does not have child fields")) } func (ec *executionContext) _EventDefinitionField_required(ctx context.Context, field graphql.CollectedField, obj *model.EventDefinitionField) (ret graphql.Marshaler) { @@ -3537,28 +3901,22 @@ func (ec *executionContext) _EventDefinitionField_required(ctx context.Context, ctx, ec.OperationContext, field, - ec.fieldContext_EventDefinitionField_required, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventDefinitionField_required(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Required, nil }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventDefinitionField_required(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventDefinitionField", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventDefinitionField", field, false, false, errors.New("field of type Boolean does not have child fields")) } func (ec *executionContext) _EventDefinitionField_maxLength(ctx context.Context, field graphql.CollectedField, obj *model.EventDefinitionField) (ret graphql.Marshaler) { @@ -3566,28 +3924,22 @@ func (ec *executionContext) _EventDefinitionField_maxLength(ctx context.Context, ctx, ec.OperationContext, field, - ec.fieldContext_EventDefinitionField_maxLength, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventDefinitionField_maxLength(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.MaxLength, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventDefinitionField_maxLength(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventDefinitionField", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventDefinitionField", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _EventProperty_key(ctx context.Context, field graphql.CollectedField, obj *model.EventProperty) (ret graphql.Marshaler) { @@ -3595,28 +3947,22 @@ func (ec *executionContext) _EventProperty_key(ctx context.Context, field graphq ctx, ec.OperationContext, field, - ec.fieldContext_EventProperty_key, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventProperty_key(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Key, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventProperty_key(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventProperty", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventProperty", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _EventProperty_value(ctx context.Context, field graphql.CollectedField, obj *model.EventProperty) (ret graphql.Marshaler) { @@ -3624,28 +3970,22 @@ func (ec *executionContext) _EventProperty_value(ctx context.Context, field grap ctx, ec.OperationContext, field, - ec.fieldContext_EventProperty_value, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventProperty_value(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Value, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventProperty_value(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventProperty", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventProperty", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _EventsResult_events(ctx context.Context, field graphql.CollectedField, obj *model.EventsResult) (ret graphql.Marshaler) { @@ -3653,17 +3993,20 @@ func (ec *executionContext) _EventsResult_events(ctx context.Context, field grap ctx, ec.OperationContext, field, - ec.fieldContext_EventsResult_events, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventsResult_events(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Events, nil }, nil, - ec.marshalNEvent2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.Event) graphql.Marshaler { + return ec.marshalNEvent2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventsResult_events(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "EventsResult", @@ -3671,21 +4014,7 @@ func (ec *executionContext) fieldContext_EventsResult_events(_ context.Context, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Event_id(ctx, field) - case "name": - return ec.fieldContext_Event_name(ctx, field) - case "path": - return ec.fieldContext_Event_path(ctx, field) - case "definition": - return ec.fieldContext_Event_definition(ctx, field) - case "properties": - return ec.fieldContext_Event_properties(ctx, field) - case "createdAt": - return ec.fieldContext_Event_createdAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Event", field.Name) + return ec.childFields_Event(ctx, field) }, } return fc, nil @@ -3696,28 +4025,22 @@ func (ec *executionContext) _EventsResult_total(ctx context.Context, field graph ctx, ec.OperationContext, field, - ec.fieldContext_EventsResult_total, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_EventsResult_total(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Total, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_EventsResult_total(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "EventsResult", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("EventsResult", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _GeoIPStatus_state(ctx context.Context, field graphql.CollectedField, obj *model.GeoIPStatus) (ret graphql.Marshaler) { @@ -3725,28 +4048,22 @@ func (ec *executionContext) _GeoIPStatus_state(ctx context.Context, field graphq ctx, ec.OperationContext, field, - ec.fieldContext_GeoIPStatus_state, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_GeoIPStatus_state(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.State, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_GeoIPStatus_state(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "GeoIPStatus", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("GeoIPStatus", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _GeoIPStatus_dbPath(ctx context.Context, field graphql.CollectedField, obj *model.GeoIPStatus) (ret graphql.Marshaler) { @@ -3754,28 +4071,22 @@ func (ec *executionContext) _GeoIPStatus_dbPath(ctx context.Context, field graph ctx, ec.OperationContext, field, - ec.fieldContext_GeoIPStatus_dbPath, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_GeoIPStatus_dbPath(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.DbPath, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_GeoIPStatus_dbPath(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "GeoIPStatus", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("GeoIPStatus", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _GeoIPStatus_source(ctx context.Context, field graphql.CollectedField, obj *model.GeoIPStatus) (ret graphql.Marshaler) { @@ -3783,28 +4094,22 @@ func (ec *executionContext) _GeoIPStatus_source(ctx context.Context, field graph ctx, ec.OperationContext, field, - ec.fieldContext_GeoIPStatus_source, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_GeoIPStatus_source(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Source, nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext_GeoIPStatus_source(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "GeoIPStatus", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("GeoIPStatus", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _GeoIPStatus_lastError(ctx context.Context, field graphql.CollectedField, obj *model.GeoIPStatus) (ret graphql.Marshaler) { @@ -3812,28 +4117,22 @@ func (ec *executionContext) _GeoIPStatus_lastError(ctx context.Context, field gr ctx, ec.OperationContext, field, - ec.fieldContext_GeoIPStatus_lastError, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_GeoIPStatus_lastError(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.LastError, nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext_GeoIPStatus_lastError(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "GeoIPStatus", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("GeoIPStatus", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _GeoIPStatus_updatedAt(ctx context.Context, field graphql.CollectedField, obj *model.GeoIPStatus) (ret graphql.Marshaler) { @@ -3841,28 +4140,22 @@ func (ec *executionContext) _GeoIPStatus_updatedAt(ctx context.Context, field gr ctx, ec.OperationContext, field, - ec.fieldContext_GeoIPStatus_updatedAt, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_GeoIPStatus_updatedAt(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.UpdatedAt, nil }, nil, - ec.marshalOTime2ᚖtimeᚐTime, + func(ctx context.Context, selections ast.SelectionSet, v *time.Time) graphql.Marshaler { + return ec.marshalOTime2ᚖtimeᚐTime(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext_GeoIPStatus_updatedAt(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "GeoIPStatus", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Time does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("GeoIPStatus", field, false, false, errors.New("field of type Time does not have child fields")) } func (ec *executionContext) _Mutation_register(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { @@ -3870,18 +4163,21 @@ func (ec *executionContext) _Mutation_register(ctx context.Context, field graphq ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_register, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_register(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Mutation().Register(ctx, fc.Args["input"].(model.RegisterInput)) }, nil, - ec.marshalNAuthPayload2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐAuthPayload, + func(ctx context.Context, selections ast.SelectionSet, v *model.AuthPayload) graphql.Marshaler { + return ec.marshalNAuthPayload2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐAuthPayload(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_register(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", @@ -3889,11 +4185,7 @@ func (ec *executionContext) fieldContext_Mutation_register(ctx context.Context, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "user": - return ec.fieldContext_AuthPayload_user(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthPayload", field.Name) + return ec.childFields_AuthPayload(ctx, field) }, } defer func() { @@ -3915,18 +4207,21 @@ func (ec *executionContext) _Mutation_login(ctx context.Context, field graphql.C ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_login, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_login(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Mutation().Login(ctx, fc.Args["input"].(model.LoginInput)) }, nil, - ec.marshalNAuthPayload2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐAuthPayload, + func(ctx context.Context, selections ast.SelectionSet, v *model.AuthPayload) graphql.Marshaler { + return ec.marshalNAuthPayload2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐAuthPayload(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_login(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", @@ -3934,11 +4229,7 @@ func (ec *executionContext) fieldContext_Mutation_login(ctx context.Context, fie IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "user": - return ec.fieldContext_AuthPayload_user(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type AuthPayload", field.Name) + return ec.childFields_AuthPayload(ctx, field) }, } defer func() { @@ -3960,28 +4251,22 @@ func (ec *executionContext) _Mutation_logout(ctx context.Context, field graphql. ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_logout, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_logout(ctx, field) + }, func(ctx context.Context) (any, error) { return ec.Resolvers.Mutation().Logout(ctx) }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_logout(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Mutation", field, true, true, errors.New("field of type Boolean does not have child fields")) } func (ec *executionContext) _Mutation_refreshToken(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { @@ -3989,18 +4274,21 @@ func (ec *executionContext) _Mutation_refreshToken(ctx context.Context, field gr ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_refreshToken, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_refreshToken(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Mutation().RefreshToken(ctx, fc.Args["refreshToken"].(string)) }, nil, - ec.marshalNTokenPayload2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐTokenPayload, + func(ctx context.Context, selections ast.SelectionSet, v *model.TokenPayload) graphql.Marshaler { + return ec.marshalNTokenPayload2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐTokenPayload(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_refreshToken(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", @@ -4008,13 +4296,7 @@ func (ec *executionContext) fieldContext_Mutation_refreshToken(ctx context.Conte IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "accessToken": - return ec.fieldContext_TokenPayload_accessToken(ctx, field) - case "refreshToken": - return ec.fieldContext_TokenPayload_refreshToken(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type TokenPayload", field.Name) + return ec.childFields_TokenPayload(ctx, field) }, } defer func() { @@ -4036,18 +4318,21 @@ func (ec *executionContext) _Mutation_createSite(ctx context.Context, field grap ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_createSite, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_createSite(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Mutation().CreateSite(ctx, fc.Args["input"].(model.CreateSiteInput)) }, nil, - ec.marshalNSite2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSite, + func(ctx context.Context, selections ast.SelectionSet, v *model.Site) graphql.Marshaler { + return ec.marshalNSite2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSite(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_createSite(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", @@ -4055,25 +4340,7 @@ func (ec *executionContext) fieldContext_Mutation_createSite(ctx context.Context IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Site_id(ctx, field) - case "domains": - return ec.fieldContext_Site_domains(ctx, field) - case "name": - return ec.fieldContext_Site_name(ctx, field) - case "publicKey": - return ec.fieldContext_Site_publicKey(ctx, field) - case "trackCountry": - return ec.fieldContext_Site_trackCountry(ctx, field) - case "blockedIPs": - return ec.fieldContext_Site_blockedIPs(ctx, field) - case "blockedCountries": - return ec.fieldContext_Site_blockedCountries(ctx, field) - case "createdAt": - return ec.fieldContext_Site_createdAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Site", field.Name) + return ec.childFields_Site(ctx, field) }, } defer func() { @@ -4095,18 +4362,21 @@ func (ec *executionContext) _Mutation_updateSite(ctx context.Context, field grap ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_updateSite, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_updateSite(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Mutation().UpdateSite(ctx, fc.Args["id"].(string), fc.Args["input"].(model.UpdateSiteInput)) }, nil, - ec.marshalNSite2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSite, + func(ctx context.Context, selections ast.SelectionSet, v *model.Site) graphql.Marshaler { + return ec.marshalNSite2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSite(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_updateSite(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", @@ -4114,25 +4384,7 @@ func (ec *executionContext) fieldContext_Mutation_updateSite(ctx context.Context IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Site_id(ctx, field) - case "domains": - return ec.fieldContext_Site_domains(ctx, field) - case "name": - return ec.fieldContext_Site_name(ctx, field) - case "publicKey": - return ec.fieldContext_Site_publicKey(ctx, field) - case "trackCountry": - return ec.fieldContext_Site_trackCountry(ctx, field) - case "blockedIPs": - return ec.fieldContext_Site_blockedIPs(ctx, field) - case "blockedCountries": - return ec.fieldContext_Site_blockedCountries(ctx, field) - case "createdAt": - return ec.fieldContext_Site_createdAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Site", field.Name) + return ec.childFields_Site(ctx, field) }, } defer func() { @@ -4154,18 +4406,21 @@ func (ec *executionContext) _Mutation_deleteSite(ctx context.Context, field grap ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_deleteSite, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_deleteSite(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Mutation().DeleteSite(ctx, fc.Args["id"].(string)) }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_deleteSite(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", @@ -4195,18 +4450,21 @@ func (ec *executionContext) _Mutation_regenerateSiteKey(ctx context.Context, fie ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_regenerateSiteKey, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_regenerateSiteKey(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Mutation().RegenerateSiteKey(ctx, fc.Args["id"].(string)) }, nil, - ec.marshalNSite2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSite, + func(ctx context.Context, selections ast.SelectionSet, v *model.Site) graphql.Marshaler { + return ec.marshalNSite2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSite(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_regenerateSiteKey(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", @@ -4214,25 +4472,7 @@ func (ec *executionContext) fieldContext_Mutation_regenerateSiteKey(ctx context. IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Site_id(ctx, field) - case "domains": - return ec.fieldContext_Site_domains(ctx, field) - case "name": - return ec.fieldContext_Site_name(ctx, field) - case "publicKey": - return ec.fieldContext_Site_publicKey(ctx, field) - case "trackCountry": - return ec.fieldContext_Site_trackCountry(ctx, field) - case "blockedIPs": - return ec.fieldContext_Site_blockedIPs(ctx, field) - case "blockedCountries": - return ec.fieldContext_Site_blockedCountries(ctx, field) - case "createdAt": - return ec.fieldContext_Site_createdAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Site", field.Name) + return ec.childFields_Site(ctx, field) }, } defer func() { @@ -4254,17 +4494,20 @@ func (ec *executionContext) _Mutation_refreshGeoIPDatabase(ctx context.Context, ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_refreshGeoIPDatabase, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_refreshGeoIPDatabase(ctx, field) + }, func(ctx context.Context) (any, error) { return ec.Resolvers.Mutation().RefreshGeoIPDatabase(ctx) }, nil, - ec.marshalNGeoIPStatus2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐGeoIPStatus, + func(ctx context.Context, selections ast.SelectionSet, v *model.GeoIPStatus) graphql.Marshaler { + return ec.marshalNGeoIPStatus2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐGeoIPStatus(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_refreshGeoIPDatabase(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", @@ -4272,19 +4515,7 @@ func (ec *executionContext) fieldContext_Mutation_refreshGeoIPDatabase(_ context IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "state": - return ec.fieldContext_GeoIPStatus_state(ctx, field) - case "dbPath": - return ec.fieldContext_GeoIPStatus_dbPath(ctx, field) - case "source": - return ec.fieldContext_GeoIPStatus_source(ctx, field) - case "lastError": - return ec.fieldContext_GeoIPStatus_lastError(ctx, field) - case "updatedAt": - return ec.fieldContext_GeoIPStatus_updatedAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type GeoIPStatus", field.Name) + return ec.childFields_GeoIPStatus(ctx, field) }, } return fc, nil @@ -4295,18 +4526,21 @@ func (ec *executionContext) _Mutation_upsertEventDefinition(ctx context.Context, ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_upsertEventDefinition, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_upsertEventDefinition(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Mutation().UpsertEventDefinition(ctx, fc.Args["siteId"].(string), fc.Args["input"].(model.EventDefinitionInput)) }, nil, - ec.marshalNEventDefinition2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventDefinition, + func(ctx context.Context, selections ast.SelectionSet, v *model.EventDefinition) graphql.Marshaler { + return ec.marshalNEventDefinition2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventDefinition(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_upsertEventDefinition(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", @@ -4314,19 +4548,7 @@ func (ec *executionContext) fieldContext_Mutation_upsertEventDefinition(ctx cont IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_EventDefinition_id(ctx, field) - case "name": - return ec.fieldContext_EventDefinition_name(ctx, field) - case "fields": - return ec.fieldContext_EventDefinition_fields(ctx, field) - case "createdAt": - return ec.fieldContext_EventDefinition_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_EventDefinition_updatedAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type EventDefinition", field.Name) + return ec.childFields_EventDefinition(ctx, field) }, } defer func() { @@ -4348,18 +4570,21 @@ func (ec *executionContext) _Mutation_deleteEventDefinition(ctx context.Context, ctx, ec.OperationContext, field, - ec.fieldContext_Mutation_deleteEventDefinition, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Mutation_deleteEventDefinition(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Mutation().DeleteEventDefinition(ctx, fc.Args["siteId"].(string), fc.Args["name"].(string)) }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Mutation_deleteEventDefinition(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", @@ -4389,28 +4614,22 @@ func (ec *executionContext) _OperatingSystemStats_os(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_OperatingSystemStats_os, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_OperatingSystemStats_os(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.OS, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_OperatingSystemStats_os(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "OperatingSystemStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("OperatingSystemStats", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _OperatingSystemStats_visitors(ctx context.Context, field graphql.CollectedField, obj *model.OperatingSystemStats) (ret graphql.Marshaler) { @@ -4418,28 +4637,22 @@ func (ec *executionContext) _OperatingSystemStats_visitors(ctx context.Context, ctx, ec.OperationContext, field, - ec.fieldContext_OperatingSystemStats_visitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_OperatingSystemStats_visitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Visitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_OperatingSystemStats_visitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "OperatingSystemStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("OperatingSystemStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _PageStats_path(ctx context.Context, field graphql.CollectedField, obj *model.PageStats) (ret graphql.Marshaler) { @@ -4447,28 +4660,22 @@ func (ec *executionContext) _PageStats_path(ctx context.Context, field graphql.C ctx, ec.OperationContext, field, - ec.fieldContext_PageStats_path, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PageStats_path(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Path, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PageStats_path(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PageStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PageStats", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _PageStats_views(ctx context.Context, field graphql.CollectedField, obj *model.PageStats) (ret graphql.Marshaler) { @@ -4476,28 +4683,22 @@ func (ec *executionContext) _PageStats_views(ctx context.Context, field graphql. ctx, ec.OperationContext, field, - ec.fieldContext_PageStats_views, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PageStats_views(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Views, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PageStats_views(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PageStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PageStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _PageStats_visitors(ctx context.Context, field graphql.CollectedField, obj *model.PageStats) (ret graphql.Marshaler) { @@ -4505,28 +4706,22 @@ func (ec *executionContext) _PageStats_visitors(ctx context.Context, field graph ctx, ec.OperationContext, field, - ec.fieldContext_PageStats_visitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PageStats_visitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Visitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PageStats_visitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PageStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PageStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _PagedCountryStats_items(ctx context.Context, field graphql.CollectedField, obj *model.PagedCountryStats) (ret graphql.Marshaler) { @@ -4534,17 +4729,20 @@ func (ec *executionContext) _PagedCountryStats_items(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_PagedCountryStats_items, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedCountryStats_items(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Items, nil }, nil, - ec.marshalNCountryStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐCountryStatsᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.CountryStats) graphql.Marshaler { + return ec.marshalNCountryStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐCountryStatsᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedCountryStats_items(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "PagedCountryStats", @@ -4552,13 +4750,7 @@ func (ec *executionContext) fieldContext_PagedCountryStats_items(_ context.Conte IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "country": - return ec.fieldContext_CountryStats_country(ctx, field) - case "visitors": - return ec.fieldContext_CountryStats_visitors(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type CountryStats", field.Name) + return ec.childFields_CountryStats(ctx, field) }, } return fc, nil @@ -4569,28 +4761,22 @@ func (ec *executionContext) _PagedCountryStats_total(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_PagedCountryStats_total, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedCountryStats_total(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Total, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedCountryStats_total(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PagedCountryStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PagedCountryStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _PagedCountryStats_totalVisitors(ctx context.Context, field graphql.CollectedField, obj *model.PagedCountryStats) (ret graphql.Marshaler) { @@ -4598,28 +4784,22 @@ func (ec *executionContext) _PagedCountryStats_totalVisitors(ctx context.Context ctx, ec.OperationContext, field, - ec.fieldContext_PagedCountryStats_totalVisitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedCountryStats_totalVisitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.TotalVisitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedCountryStats_totalVisitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PagedCountryStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PagedCountryStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _PagedDeviceStats_items(ctx context.Context, field graphql.CollectedField, obj *model.PagedDeviceStats) (ret graphql.Marshaler) { @@ -4627,17 +4807,20 @@ func (ec *executionContext) _PagedDeviceStats_items(ctx context.Context, field g ctx, ec.OperationContext, field, - ec.fieldContext_PagedDeviceStats_items, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedDeviceStats_items(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Items, nil }, nil, - ec.marshalNDeviceStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDeviceStatsᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.DeviceStats) graphql.Marshaler { + return ec.marshalNDeviceStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDeviceStatsᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedDeviceStats_items(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "PagedDeviceStats", @@ -4645,13 +4828,7 @@ func (ec *executionContext) fieldContext_PagedDeviceStats_items(_ context.Contex IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "device": - return ec.fieldContext_DeviceStats_device(ctx, field) - case "visitors": - return ec.fieldContext_DeviceStats_visitors(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type DeviceStats", field.Name) + return ec.childFields_DeviceStats(ctx, field) }, } return fc, nil @@ -4662,28 +4839,22 @@ func (ec *executionContext) _PagedDeviceStats_total(ctx context.Context, field g ctx, ec.OperationContext, field, - ec.fieldContext_PagedDeviceStats_total, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedDeviceStats_total(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Total, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedDeviceStats_total(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PagedDeviceStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PagedDeviceStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _PagedDeviceStats_totalVisitors(ctx context.Context, field graphql.CollectedField, obj *model.PagedDeviceStats) (ret graphql.Marshaler) { @@ -4691,28 +4862,22 @@ func (ec *executionContext) _PagedDeviceStats_totalVisitors(ctx context.Context, ctx, ec.OperationContext, field, - ec.fieldContext_PagedDeviceStats_totalVisitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedDeviceStats_totalVisitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.TotalVisitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedDeviceStats_totalVisitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PagedDeviceStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PagedDeviceStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _PagedOperatingSystemStats_items(ctx context.Context, field graphql.CollectedField, obj *model.PagedOperatingSystemStats) (ret graphql.Marshaler) { @@ -4720,17 +4885,20 @@ func (ec *executionContext) _PagedOperatingSystemStats_items(ctx context.Context ctx, ec.OperationContext, field, - ec.fieldContext_PagedOperatingSystemStats_items, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedOperatingSystemStats_items(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Items, nil }, nil, - ec.marshalNOperatingSystemStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐOperatingSystemStatsᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.OperatingSystemStats) graphql.Marshaler { + return ec.marshalNOperatingSystemStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐOperatingSystemStatsᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedOperatingSystemStats_items(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "PagedOperatingSystemStats", @@ -4738,13 +4906,7 @@ func (ec *executionContext) fieldContext_PagedOperatingSystemStats_items(_ conte IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "os": - return ec.fieldContext_OperatingSystemStats_os(ctx, field) - case "visitors": - return ec.fieldContext_OperatingSystemStats_visitors(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type OperatingSystemStats", field.Name) + return ec.childFields_OperatingSystemStats(ctx, field) }, } return fc, nil @@ -4755,28 +4917,22 @@ func (ec *executionContext) _PagedOperatingSystemStats_total(ctx context.Context ctx, ec.OperationContext, field, - ec.fieldContext_PagedOperatingSystemStats_total, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedOperatingSystemStats_total(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Total, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedOperatingSystemStats_total(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PagedOperatingSystemStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PagedOperatingSystemStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _PagedOperatingSystemStats_totalVisitors(ctx context.Context, field graphql.CollectedField, obj *model.PagedOperatingSystemStats) (ret graphql.Marshaler) { @@ -4784,28 +4940,22 @@ func (ec *executionContext) _PagedOperatingSystemStats_totalVisitors(ctx context ctx, ec.OperationContext, field, - ec.fieldContext_PagedOperatingSystemStats_totalVisitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedOperatingSystemStats_totalVisitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.TotalVisitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedOperatingSystemStats_totalVisitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PagedOperatingSystemStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PagedOperatingSystemStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _PagedPageStats_items(ctx context.Context, field graphql.CollectedField, obj *model.PagedPageStats) (ret graphql.Marshaler) { @@ -4813,17 +4963,20 @@ func (ec *executionContext) _PagedPageStats_items(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext_PagedPageStats_items, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedPageStats_items(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Items, nil }, nil, - ec.marshalNPageStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPageStatsᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.PageStats) graphql.Marshaler { + return ec.marshalNPageStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐPageStatsᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedPageStats_items(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "PagedPageStats", @@ -4831,15 +4984,7 @@ func (ec *executionContext) fieldContext_PagedPageStats_items(_ context.Context, IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "path": - return ec.fieldContext_PageStats_path(ctx, field) - case "views": - return ec.fieldContext_PageStats_views(ctx, field) - case "visitors": - return ec.fieldContext_PageStats_visitors(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type PageStats", field.Name) + return ec.childFields_PageStats(ctx, field) }, } return fc, nil @@ -4850,28 +4995,22 @@ func (ec *executionContext) _PagedPageStats_total(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext_PagedPageStats_total, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedPageStats_total(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Total, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedPageStats_total(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PagedPageStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PagedPageStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _PagedReferrerStats_items(ctx context.Context, field graphql.CollectedField, obj *model.PagedReferrerStats) (ret graphql.Marshaler) { @@ -4879,17 +5018,20 @@ func (ec *executionContext) _PagedReferrerStats_items(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_PagedReferrerStats_items, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedReferrerStats_items(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Items, nil }, nil, - ec.marshalNReferrerStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐReferrerStatsᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.ReferrerStats) graphql.Marshaler { + return ec.marshalNReferrerStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐReferrerStatsᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedReferrerStats_items(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "PagedReferrerStats", @@ -4897,13 +5039,7 @@ func (ec *executionContext) fieldContext_PagedReferrerStats_items(_ context.Cont IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "referrer": - return ec.fieldContext_ReferrerStats_referrer(ctx, field) - case "visitors": - return ec.fieldContext_ReferrerStats_visitors(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type ReferrerStats", field.Name) + return ec.childFields_ReferrerStats(ctx, field) }, } return fc, nil @@ -4914,28 +5050,22 @@ func (ec *executionContext) _PagedReferrerStats_total(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_PagedReferrerStats_total, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_PagedReferrerStats_total(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Total, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_PagedReferrerStats_total(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "PagedReferrerStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("PagedReferrerStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _Query_me(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { @@ -4943,17 +5073,20 @@ func (ec *executionContext) _Query_me(ctx context.Context, field graphql.Collect ctx, ec.OperationContext, field, - ec.fieldContext_Query_me, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_me(ctx, field) + }, func(ctx context.Context) (any, error) { return ec.Resolvers.Query().Me(ctx) }, nil, - ec.marshalOUser2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐUser, + func(ctx context.Context, selections ast.SelectionSet, v *model.User) graphql.Marshaler { + return ec.marshalOUser2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐUser(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext_Query_me(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -4961,19 +5094,7 @@ func (ec *executionContext) fieldContext_Query_me(_ context.Context, field graph IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_User_id(ctx, field) - case "username": - return ec.fieldContext_User_username(ctx, field) - case "role": - return ec.fieldContext_User_role(ctx, field) - case "createdAt": - return ec.fieldContext_User_createdAt(ctx, field) - case "sites": - return ec.fieldContext_User_sites(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + return ec.childFields_User(ctx, field) }, } return fc, nil @@ -4984,17 +5105,20 @@ func (ec *executionContext) _Query_registrationStatus(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_Query_registrationStatus, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_registrationStatus(ctx, field) + }, func(ctx context.Context) (any, error) { return ec.Resolvers.Query().RegistrationStatus(ctx) }, nil, - ec.marshalNRegistrationStatus2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐRegistrationStatus, + func(ctx context.Context, selections ast.SelectionSet, v *model.RegistrationStatus) graphql.Marshaler { + return ec.marshalNRegistrationStatus2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐRegistrationStatus(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Query_registrationStatus(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5002,13 +5126,7 @@ func (ec *executionContext) fieldContext_Query_registrationStatus(_ context.Cont IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "hasUsers": - return ec.fieldContext_RegistrationStatus_hasUsers(ctx, field) - case "allowRegistration": - return ec.fieldContext_RegistrationStatus_allowRegistration(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type RegistrationStatus", field.Name) + return ec.childFields_RegistrationStatus(ctx, field) }, } return fc, nil @@ -5019,18 +5137,21 @@ func (ec *executionContext) _Query_sites(ctx context.Context, field graphql.Coll ctx, ec.OperationContext, field, - ec.fieldContext_Query_sites, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_sites(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Query().Sites(ctx, fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNSite2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSiteᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.Site) graphql.Marshaler { + return ec.marshalNSite2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSiteᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Query_sites(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5038,25 +5159,7 @@ func (ec *executionContext) fieldContext_Query_sites(ctx context.Context, field IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Site_id(ctx, field) - case "domains": - return ec.fieldContext_Site_domains(ctx, field) - case "name": - return ec.fieldContext_Site_name(ctx, field) - case "publicKey": - return ec.fieldContext_Site_publicKey(ctx, field) - case "trackCountry": - return ec.fieldContext_Site_trackCountry(ctx, field) - case "blockedIPs": - return ec.fieldContext_Site_blockedIPs(ctx, field) - case "blockedCountries": - return ec.fieldContext_Site_blockedCountries(ctx, field) - case "createdAt": - return ec.fieldContext_Site_createdAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Site", field.Name) + return ec.childFields_Site(ctx, field) }, } defer func() { @@ -5078,18 +5181,21 @@ func (ec *executionContext) _Query_site(ctx context.Context, field graphql.Colle ctx, ec.OperationContext, field, - ec.fieldContext_Query_site, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_site(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Query().Site(ctx, fc.Args["id"].(string)) }, nil, - ec.marshalOSite2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSite, + func(ctx context.Context, selections ast.SelectionSet, v *model.Site) graphql.Marshaler { + return ec.marshalOSite2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSite(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext_Query_site(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5097,25 +5203,7 @@ func (ec *executionContext) fieldContext_Query_site(ctx context.Context, field g IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Site_id(ctx, field) - case "domains": - return ec.fieldContext_Site_domains(ctx, field) - case "name": - return ec.fieldContext_Site_name(ctx, field) - case "publicKey": - return ec.fieldContext_Site_publicKey(ctx, field) - case "trackCountry": - return ec.fieldContext_Site_trackCountry(ctx, field) - case "blockedIPs": - return ec.fieldContext_Site_blockedIPs(ctx, field) - case "blockedCountries": - return ec.fieldContext_Site_blockedCountries(ctx, field) - case "createdAt": - return ec.fieldContext_Site_createdAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Site", field.Name) + return ec.childFields_Site(ctx, field) }, } defer func() { @@ -5137,18 +5225,21 @@ func (ec *executionContext) _Query_dashboard(ctx context.Context, field graphql. ctx, ec.OperationContext, field, - ec.fieldContext_Query_dashboard, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_dashboard(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Query().Dashboard(ctx, fc.Args["siteId"].(string), fc.Args["dateRange"].(*model.DateRangeInput), fc.Args["filter"].(*model.FilterInput)) }, nil, - ec.marshalNDashboardStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDashboardStats, + func(ctx context.Context, selections ast.SelectionSet, v *model.DashboardStats) graphql.Marshaler { + return ec.marshalNDashboardStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐDashboardStats(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Query_dashboard(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5156,33 +5247,7 @@ func (ec *executionContext) fieldContext_Query_dashboard(ctx context.Context, fi IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "visitors": - return ec.fieldContext_DashboardStats_visitors(ctx, field) - case "pageViews": - return ec.fieldContext_DashboardStats_pageViews(ctx, field) - case "sessions": - return ec.fieldContext_DashboardStats_sessions(ctx, field) - case "bounceRate": - return ec.fieldContext_DashboardStats_bounceRate(ctx, field) - case "avgDuration": - return ec.fieldContext_DashboardStats_avgDuration(ctx, field) - case "topPages": - return ec.fieldContext_DashboardStats_topPages(ctx, field) - case "topReferrers": - return ec.fieldContext_DashboardStats_topReferrers(ctx, field) - case "browsers": - return ec.fieldContext_DashboardStats_browsers(ctx, field) - case "devices": - return ec.fieldContext_DashboardStats_devices(ctx, field) - case "operatingSystems": - return ec.fieldContext_DashboardStats_operatingSystems(ctx, field) - case "countries": - return ec.fieldContext_DashboardStats_countries(ctx, field) - case "dailyStats": - return ec.fieldContext_DashboardStats_dailyStats(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type DashboardStats", field.Name) + return ec.childFields_DashboardStats(ctx, field) }, } defer func() { @@ -5204,18 +5269,21 @@ func (ec *executionContext) _Query_realtime(ctx context.Context, field graphql.C ctx, ec.OperationContext, field, - ec.fieldContext_Query_realtime, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_realtime(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Query().Realtime(ctx, fc.Args["siteId"].(string)) }, nil, - ec.marshalNRealtimeStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐRealtimeStats, + func(ctx context.Context, selections ast.SelectionSet, v *model.RealtimeStats) graphql.Marshaler { + return ec.marshalNRealtimeStats2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐRealtimeStats(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Query_realtime(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5223,13 +5291,7 @@ func (ec *executionContext) fieldContext_Query_realtime(ctx context.Context, fie IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "visitors": - return ec.fieldContext_RealtimeStats_visitors(ctx, field) - case "activePages": - return ec.fieldContext_RealtimeStats_activePages(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type RealtimeStats", field.Name) + return ec.childFields_RealtimeStats(ctx, field) }, } defer func() { @@ -5251,17 +5313,20 @@ func (ec *executionContext) _Query_geoIPStatus(ctx context.Context, field graphq ctx, ec.OperationContext, field, - ec.fieldContext_Query_geoIPStatus, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_geoIPStatus(ctx, field) + }, func(ctx context.Context) (any, error) { return ec.Resolvers.Query().GeoIPStatus(ctx) }, nil, - ec.marshalNGeoIPStatus2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐGeoIPStatus, + func(ctx context.Context, selections ast.SelectionSet, v *model.GeoIPStatus) graphql.Marshaler { + return ec.marshalNGeoIPStatus2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐGeoIPStatus(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Query_geoIPStatus(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5269,19 +5334,7 @@ func (ec *executionContext) fieldContext_Query_geoIPStatus(_ context.Context, fi IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "state": - return ec.fieldContext_GeoIPStatus_state(ctx, field) - case "dbPath": - return ec.fieldContext_GeoIPStatus_dbPath(ctx, field) - case "source": - return ec.fieldContext_GeoIPStatus_source(ctx, field) - case "lastError": - return ec.fieldContext_GeoIPStatus_lastError(ctx, field) - case "updatedAt": - return ec.fieldContext_GeoIPStatus_updatedAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type GeoIPStatus", field.Name) + return ec.childFields_GeoIPStatus(ctx, field) }, } return fc, nil @@ -5292,18 +5345,21 @@ func (ec *executionContext) _Query_geoIPCountries(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext_Query_geoIPCountries, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_geoIPCountries(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Query().GeoIPCountries(ctx, fc.Args["search"].(*string), fc.Args["codes"].([]string), fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNCountry2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐCountryᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.Country) graphql.Marshaler { + return ec.marshalNCountry2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐCountryᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Query_geoIPCountries(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5311,13 +5367,7 @@ func (ec *executionContext) fieldContext_Query_geoIPCountries(ctx context.Contex IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "code": - return ec.fieldContext_Country_code(ctx, field) - case "name": - return ec.fieldContext_Country_name(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Country", field.Name) + return ec.childFields_Country(ctx, field) }, } defer func() { @@ -5339,18 +5389,21 @@ func (ec *executionContext) _Query_events(ctx context.Context, field graphql.Col ctx, ec.OperationContext, field, - ec.fieldContext_Query_events, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_events(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Query().Events(ctx, fc.Args["siteId"].(string), fc.Args["dateRange"].(*model.DateRangeInput), fc.Args["filter"].(*model.FilterInput), fc.Args["limit"].(*int), fc.Args["offset"].(*int)) }, nil, - ec.marshalNEventsResult2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventsResult, + func(ctx context.Context, selections ast.SelectionSet, v *model.EventsResult) graphql.Marshaler { + return ec.marshalNEventsResult2ᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventsResult(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Query_events(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5358,13 +5411,7 @@ func (ec *executionContext) fieldContext_Query_events(ctx context.Context, field IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "events": - return ec.fieldContext_EventsResult_events(ctx, field) - case "total": - return ec.fieldContext_EventsResult_total(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type EventsResult", field.Name) + return ec.childFields_EventsResult(ctx, field) }, } defer func() { @@ -5386,18 +5433,21 @@ func (ec *executionContext) _Query_eventCounts(ctx context.Context, field graphq ctx, ec.OperationContext, field, - ec.fieldContext_Query_eventCounts, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_eventCounts(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Query().EventCounts(ctx, fc.Args["siteId"].(string), fc.Args["dateRange"].(*model.DateRangeInput), fc.Args["filter"].(*model.FilterInput), fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNEventCount2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventCountᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.EventCount) graphql.Marshaler { + return ec.marshalNEventCount2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventCountᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Query_eventCounts(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5405,13 +5455,7 @@ func (ec *executionContext) fieldContext_Query_eventCounts(ctx context.Context, IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "event": - return ec.fieldContext_EventCount_event(ctx, field) - case "count": - return ec.fieldContext_EventCount_count(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type EventCount", field.Name) + return ec.childFields_EventCount(ctx, field) }, } defer func() { @@ -5433,18 +5477,21 @@ func (ec *executionContext) _Query_eventDefinitions(ctx context.Context, field g ctx, ec.OperationContext, field, - ec.fieldContext_Query_eventDefinitions, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query_eventDefinitions(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.Query().EventDefinitions(ctx, fc.Args["siteId"].(string), fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNEventDefinition2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventDefinitionᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.EventDefinition) graphql.Marshaler { + return ec.marshalNEventDefinition2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐEventDefinitionᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Query_eventDefinitions(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5452,19 +5499,7 @@ func (ec *executionContext) fieldContext_Query_eventDefinitions(ctx context.Cont IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_EventDefinition_id(ctx, field) - case "name": - return ec.fieldContext_EventDefinition_name(ctx, field) - case "fields": - return ec.fieldContext_EventDefinition_fields(ctx, field) - case "createdAt": - return ec.fieldContext_EventDefinition_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_EventDefinition_updatedAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type EventDefinition", field.Name) + return ec.childFields_EventDefinition(ctx, field) }, } defer func() { @@ -5486,18 +5521,21 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col ctx, ec.OperationContext, field, - ec.fieldContext_Query___type, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query___type(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.IntrospectType(fc.Args["name"].(string)) }, nil, - ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType, + func(ctx context.Context, selections ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext_Query___type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5505,31 +5543,7 @@ func (ec *executionContext) fieldContext_Query___type(ctx context.Context, field IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return ec.childFields___Type(ctx, field) }, } defer func() { @@ -5551,17 +5565,20 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C ctx, ec.OperationContext, field, - ec.fieldContext_Query___schema, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Query___schema(ctx, field) + }, func(ctx context.Context) (any, error) { return ec.IntrospectSchema() }, nil, - ec.marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema, + func(ctx context.Context, selections ast.SelectionSet, v *introspection.Schema) graphql.Marshaler { + return ec.marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext_Query___schema(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", @@ -5569,21 +5586,7 @@ func (ec *executionContext) fieldContext_Query___schema(_ context.Context, field IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "description": - return ec.fieldContext___Schema_description(ctx, field) - case "types": - return ec.fieldContext___Schema_types(ctx, field) - case "queryType": - return ec.fieldContext___Schema_queryType(ctx, field) - case "mutationType": - return ec.fieldContext___Schema_mutationType(ctx, field) - case "subscriptionType": - return ec.fieldContext___Schema_subscriptionType(ctx, field) - case "directives": - return ec.fieldContext___Schema_directives(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Schema", field.Name) + return ec.childFields___Schema(ctx, field) }, } return fc, nil @@ -5594,28 +5597,22 @@ func (ec *executionContext) _RealtimeStats_visitors(ctx context.Context, field g ctx, ec.OperationContext, field, - ec.fieldContext_RealtimeStats_visitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_RealtimeStats_visitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Visitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_RealtimeStats_visitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "RealtimeStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("RealtimeStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _RealtimeStats_activePages(ctx context.Context, field graphql.CollectedField, obj *model.RealtimeStats) (ret graphql.Marshaler) { @@ -5623,18 +5620,21 @@ func (ec *executionContext) _RealtimeStats_activePages(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext_RealtimeStats_activePages, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_RealtimeStats_activePages(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return ec.Resolvers.RealtimeStats().ActivePages(ctx, obj, fc.Args["paging"].(model.PagingInput)) }, nil, - ec.marshalNActivePageStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐActivePageStatsᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.ActivePageStats) graphql.Marshaler { + return ec.marshalNActivePageStats2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐActivePageStatsᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_RealtimeStats_activePages(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "RealtimeStats", @@ -5642,13 +5642,7 @@ func (ec *executionContext) fieldContext_RealtimeStats_activePages(ctx context.C IsMethod: true, IsResolver: true, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "path": - return ec.fieldContext_ActivePageStats_path(ctx, field) - case "visitors": - return ec.fieldContext_ActivePageStats_visitors(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type ActivePageStats", field.Name) + return ec.childFields_ActivePageStats(ctx, field) }, } defer func() { @@ -5670,28 +5664,22 @@ func (ec *executionContext) _ReferrerStats_referrer(ctx context.Context, field g ctx, ec.OperationContext, field, - ec.fieldContext_ReferrerStats_referrer, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_ReferrerStats_referrer(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Referrer, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_ReferrerStats_referrer(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "ReferrerStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("ReferrerStats", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _ReferrerStats_visitors(ctx context.Context, field graphql.CollectedField, obj *model.ReferrerStats) (ret graphql.Marshaler) { @@ -5699,28 +5687,22 @@ func (ec *executionContext) _ReferrerStats_visitors(ctx context.Context, field g ctx, ec.OperationContext, field, - ec.fieldContext_ReferrerStats_visitors, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_ReferrerStats_visitors(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Visitors, nil }, nil, - ec.marshalNInt2int, + func(ctx context.Context, selections ast.SelectionSet, v int) graphql.Marshaler { + return ec.marshalNInt2int(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_ReferrerStats_visitors(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "ReferrerStats", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Int does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("ReferrerStats", field, false, false, errors.New("field of type Int does not have child fields")) } func (ec *executionContext) _RegistrationStatus_hasUsers(ctx context.Context, field graphql.CollectedField, obj *model.RegistrationStatus) (ret graphql.Marshaler) { @@ -5728,28 +5710,22 @@ func (ec *executionContext) _RegistrationStatus_hasUsers(ctx context.Context, fi ctx, ec.OperationContext, field, - ec.fieldContext_RegistrationStatus_hasUsers, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_RegistrationStatus_hasUsers(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.HasUsers, nil }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_RegistrationStatus_hasUsers(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "RegistrationStatus", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("RegistrationStatus", field, false, false, errors.New("field of type Boolean does not have child fields")) } func (ec *executionContext) _RegistrationStatus_allowRegistration(ctx context.Context, field graphql.CollectedField, obj *model.RegistrationStatus) (ret graphql.Marshaler) { @@ -5757,28 +5733,22 @@ func (ec *executionContext) _RegistrationStatus_allowRegistration(ctx context.Co ctx, ec.OperationContext, field, - ec.fieldContext_RegistrationStatus_allowRegistration, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_RegistrationStatus_allowRegistration(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.AllowRegistration, nil }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_RegistrationStatus_allowRegistration(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "RegistrationStatus", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("RegistrationStatus", field, false, false, errors.New("field of type Boolean does not have child fields")) } func (ec *executionContext) _Session_id(ctx context.Context, field graphql.CollectedField, obj *model.Session) (ret graphql.Marshaler) { @@ -5786,28 +5756,22 @@ func (ec *executionContext) _Session_id(ctx context.Context, field graphql.Colle ctx, ec.OperationContext, field, - ec.fieldContext_Session_id, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Session_id(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.ID, nil }, nil, - ec.marshalNID2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNID2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Session_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Session", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Session", field, false, false, errors.New("field of type ID does not have child fields")) } func (ec *executionContext) _Site_id(ctx context.Context, field graphql.CollectedField, obj *model.Site) (ret graphql.Marshaler) { @@ -5815,28 +5779,22 @@ func (ec *executionContext) _Site_id(ctx context.Context, field graphql.Collecte ctx, ec.OperationContext, field, - ec.fieldContext_Site_id, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Site_id(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.ID, nil }, nil, - ec.marshalNID2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNID2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Site_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Site", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Site", field, false, false, errors.New("field of type ID does not have child fields")) } func (ec *executionContext) _Site_domains(ctx context.Context, field graphql.CollectedField, obj *model.Site) (ret graphql.Marshaler) { @@ -5844,28 +5802,22 @@ func (ec *executionContext) _Site_domains(ctx context.Context, field graphql.Col ctx, ec.OperationContext, field, - ec.fieldContext_Site_domains, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Site_domains(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Domains, nil }, nil, - ec.marshalNString2ᚕstringᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []string) graphql.Marshaler { + return ec.marshalNString2ᚕstringᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Site_domains(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Site", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Site", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _Site_name(ctx context.Context, field graphql.CollectedField, obj *model.Site) (ret graphql.Marshaler) { @@ -5873,28 +5825,22 @@ func (ec *executionContext) _Site_name(ctx context.Context, field graphql.Collec ctx, ec.OperationContext, field, - ec.fieldContext_Site_name, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Site_name(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Name, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Site_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Site", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Site", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _Site_publicKey(ctx context.Context, field graphql.CollectedField, obj *model.Site) (ret graphql.Marshaler) { @@ -5902,28 +5848,22 @@ func (ec *executionContext) _Site_publicKey(ctx context.Context, field graphql.C ctx, ec.OperationContext, field, - ec.fieldContext_Site_publicKey, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Site_publicKey(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.PublicKey, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Site_publicKey(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Site", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Site", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _Site_trackCountry(ctx context.Context, field graphql.CollectedField, obj *model.Site) (ret graphql.Marshaler) { @@ -5931,28 +5871,22 @@ func (ec *executionContext) _Site_trackCountry(ctx context.Context, field graphq ctx, ec.OperationContext, field, - ec.fieldContext_Site_trackCountry, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Site_trackCountry(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.TrackCountry, nil }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Site_trackCountry(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Site", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Site", field, false, false, errors.New("field of type Boolean does not have child fields")) } func (ec *executionContext) _Site_blockedIPs(ctx context.Context, field graphql.CollectedField, obj *model.Site) (ret graphql.Marshaler) { @@ -5960,28 +5894,22 @@ func (ec *executionContext) _Site_blockedIPs(ctx context.Context, field graphql. ctx, ec.OperationContext, field, - ec.fieldContext_Site_blockedIPs, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Site_blockedIPs(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.BlockedIPs, nil }, nil, - ec.marshalNString2ᚕstringᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []string) graphql.Marshaler { + return ec.marshalNString2ᚕstringᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Site_blockedIPs(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Site", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Site", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _Site_blockedCountries(ctx context.Context, field graphql.CollectedField, obj *model.Site) (ret graphql.Marshaler) { @@ -5989,28 +5917,22 @@ func (ec *executionContext) _Site_blockedCountries(ctx context.Context, field gr ctx, ec.OperationContext, field, - ec.fieldContext_Site_blockedCountries, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Site_blockedCountries(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.BlockedCountries, nil }, nil, - ec.marshalNString2ᚕstringᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []string) graphql.Marshaler { + return ec.marshalNString2ᚕstringᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Site_blockedCountries(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Site", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Site", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _Site_createdAt(ctx context.Context, field graphql.CollectedField, obj *model.Site) (ret graphql.Marshaler) { @@ -6018,28 +5940,22 @@ func (ec *executionContext) _Site_createdAt(ctx context.Context, field graphql.C ctx, ec.OperationContext, field, - ec.fieldContext_Site_createdAt, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_Site_createdAt(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.CreatedAt, nil }, nil, - ec.marshalNTime2timeᚐTime, + func(ctx context.Context, selections ast.SelectionSet, v time.Time) graphql.Marshaler { + return ec.marshalNTime2timeᚐTime(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_Site_createdAt(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Site", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Time does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("Site", field, false, false, errors.New("field of type Time does not have child fields")) } func (ec *executionContext) _TokenPayload_accessToken(ctx context.Context, field graphql.CollectedField, obj *model.TokenPayload) (ret graphql.Marshaler) { @@ -6047,28 +5963,22 @@ func (ec *executionContext) _TokenPayload_accessToken(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext_TokenPayload_accessToken, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_TokenPayload_accessToken(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.AccessToken, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_TokenPayload_accessToken(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "TokenPayload", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("TokenPayload", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _TokenPayload_refreshToken(ctx context.Context, field graphql.CollectedField, obj *model.TokenPayload) (ret graphql.Marshaler) { @@ -6076,28 +5986,22 @@ func (ec *executionContext) _TokenPayload_refreshToken(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext_TokenPayload_refreshToken, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_TokenPayload_refreshToken(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.RefreshToken, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_TokenPayload_refreshToken(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "TokenPayload", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("TokenPayload", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _User_id(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { @@ -6105,28 +6009,22 @@ func (ec *executionContext) _User_id(ctx context.Context, field graphql.Collecte ctx, ec.OperationContext, field, - ec.fieldContext_User_id, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_User_id(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.ID, nil }, nil, - ec.marshalNID2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNID2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_User_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "User", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type ID does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("User", field, false, false, errors.New("field of type ID does not have child fields")) } func (ec *executionContext) _User_username(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { @@ -6134,28 +6032,22 @@ func (ec *executionContext) _User_username(ctx context.Context, field graphql.Co ctx, ec.OperationContext, field, - ec.fieldContext_User_username, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_User_username(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Username, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_User_username(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "User", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("User", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _User_role(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { @@ -6163,28 +6055,22 @@ func (ec *executionContext) _User_role(ctx context.Context, field graphql.Collec ctx, ec.OperationContext, field, - ec.fieldContext_User_role, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_User_role(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Role, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_User_role(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "User", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("User", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) _User_createdAt(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { @@ -6192,28 +6078,22 @@ func (ec *executionContext) _User_createdAt(ctx context.Context, field graphql.C ctx, ec.OperationContext, field, - ec.fieldContext_User_createdAt, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_User_createdAt(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.CreatedAt, nil }, nil, - ec.marshalNTime2timeᚐTime, + func(ctx context.Context, selections ast.SelectionSet, v time.Time) graphql.Marshaler { + return ec.marshalNTime2timeᚐTime(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext_User_createdAt(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "User", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Time does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("User", field, false, false, errors.New("field of type Time does not have child fields")) } func (ec *executionContext) _User_sites(ctx context.Context, field graphql.CollectedField, obj *model.User) (ret graphql.Marshaler) { @@ -6221,17 +6101,20 @@ func (ec *executionContext) _User_sites(ctx context.Context, field graphql.Colle ctx, ec.OperationContext, field, - ec.fieldContext_User_sites, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext_User_sites(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Sites, nil }, nil, - ec.marshalOSite2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSiteᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []*model.Site) graphql.Marshaler { + return ec.marshalOSite2ᚕᚖgithubᚗcomᚋlovelyᚑeyeᚋserverᚋinternalᚋgraphᚋmodelᚐSiteᚄ(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext_User_sites(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "User", @@ -6239,25 +6122,7 @@ func (ec *executionContext) fieldContext_User_sites(ctx context.Context, field g IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Site_id(ctx, field) - case "domains": - return ec.fieldContext_Site_domains(ctx, field) - case "name": - return ec.fieldContext_Site_name(ctx, field) - case "publicKey": - return ec.fieldContext_Site_publicKey(ctx, field) - case "trackCountry": - return ec.fieldContext_Site_trackCountry(ctx, field) - case "blockedIPs": - return ec.fieldContext_Site_blockedIPs(ctx, field) - case "blockedCountries": - return ec.fieldContext_Site_blockedCountries(ctx, field) - case "createdAt": - return ec.fieldContext_Site_createdAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Site", field.Name) + return ec.childFields_Site(ctx, field) }, } defer func() { @@ -6279,28 +6144,22 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql ctx, ec.OperationContext, field, - ec.fieldContext___Directive_name, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Directive_name(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Name, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Directive_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Directive", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Directive", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___Directive_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { @@ -6308,28 +6167,22 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext___Directive_description, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Directive_description(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Description(), nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Directive_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Directive", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Directive", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___Directive_isRepeatable(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { @@ -6337,28 +6190,22 @@ func (ec *executionContext) ___Directive_isRepeatable(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext___Directive_isRepeatable, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Directive_isRepeatable(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.IsRepeatable, nil }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Directive_isRepeatable(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Directive", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Directive", field, false, false, errors.New("field of type Boolean does not have child fields")) } func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { @@ -6366,28 +6213,22 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr ctx, ec.OperationContext, field, - ec.fieldContext___Directive_locations, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Directive_locations(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Locations, nil }, nil, - ec.marshalN__DirectiveLocation2ᚕstringᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []string) graphql.Marshaler { + return ec.marshalN__DirectiveLocation2ᚕstringᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Directive_locations(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Directive", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type __DirectiveLocation does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Directive", field, false, false, errors.New("field of type __DirectiveLocation does not have child fields")) } func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { @@ -6395,17 +6236,20 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql ctx, ec.OperationContext, field, - ec.fieldContext___Directive_args, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Directive_args(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Args, nil }, nil, - ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { + return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Directive_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Directive", @@ -6413,21 +6257,7 @@ func (ec *executionContext) fieldContext___Directive_args(ctx context.Context, f IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___InputValue_name(ctx, field) - case "description": - return ec.fieldContext___InputValue_description(ctx, field) - case "type": - return ec.fieldContext___InputValue_type(ctx, field) - case "defaultValue": - return ec.fieldContext___InputValue_defaultValue(ctx, field) - case "isDeprecated": - return ec.fieldContext___InputValue_isDeprecated(ctx, field) - case "deprecationReason": - return ec.fieldContext___InputValue_deprecationReason(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + return ec.childFields___InputValue(ctx, field) }, } defer func() { @@ -6449,28 +6279,22 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql ctx, ec.OperationContext, field, - ec.fieldContext___EnumValue_name, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___EnumValue_name(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Name, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___EnumValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__EnumValue", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___EnumValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { @@ -6478,28 +6302,22 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext___EnumValue_description, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___EnumValue_description(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Description(), nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___EnumValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__EnumValue", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { @@ -6507,28 +6325,22 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext___EnumValue_isDeprecated, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___EnumValue_isDeprecated(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.IsDeprecated(), nil }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___EnumValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__EnumValue", field, true, false, errors.New("field of type Boolean does not have child fields")) } func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { @@ -6536,28 +6348,22 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, ctx, ec.OperationContext, field, - ec.fieldContext___EnumValue_deprecationReason, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___EnumValue_deprecationReason(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.DeprecationReason(), nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___EnumValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__EnumValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__EnumValue", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { @@ -6565,28 +6371,22 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col ctx, ec.OperationContext, field, - ec.fieldContext___Field_name, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Field_name(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Name, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Field_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Field", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Field", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___Field_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { @@ -6594,28 +6394,22 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap ctx, ec.OperationContext, field, - ec.fieldContext___Field_description, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Field_description(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Description(), nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Field_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Field", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Field", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { @@ -6623,17 +6417,20 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col ctx, ec.OperationContext, field, - ec.fieldContext___Field_args, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Field_args(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Args, nil }, nil, - ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { + return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Field_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Field", @@ -6641,21 +6438,7 @@ func (ec *executionContext) fieldContext___Field_args(ctx context.Context, field IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___InputValue_name(ctx, field) - case "description": - return ec.fieldContext___InputValue_description(ctx, field) - case "type": - return ec.fieldContext___InputValue_type(ctx, field) - case "defaultValue": - return ec.fieldContext___InputValue_defaultValue(ctx, field) - case "isDeprecated": - return ec.fieldContext___InputValue_isDeprecated(ctx, field) - case "deprecationReason": - return ec.fieldContext___InputValue_deprecationReason(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + return ec.childFields___InputValue(ctx, field) }, } defer func() { @@ -6677,17 +6460,20 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col ctx, ec.OperationContext, field, - ec.fieldContext___Field_type, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Field_type(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Type, nil }, nil, - ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType, + func(ctx context.Context, selections ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Field_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Field", @@ -6695,31 +6481,7 @@ func (ec *executionContext) fieldContext___Field_type(_ context.Context, field g IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return ec.childFields___Type(ctx, field) }, } return fc, nil @@ -6730,28 +6492,22 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext___Field_isDeprecated, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Field_isDeprecated(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.IsDeprecated(), nil }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Field_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Field", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Field", field, true, false, errors.New("field of type Boolean does not have child fields")) } func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { @@ -6759,28 +6515,22 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext___Field_deprecationReason, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Field_deprecationReason(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.DeprecationReason(), nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Field_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Field", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Field", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { @@ -6788,28 +6538,22 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq ctx, ec.OperationContext, field, - ec.fieldContext___InputValue_name, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___InputValue_name(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Name, nil }, nil, - ec.marshalNString2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalNString2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___InputValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__InputValue", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___InputValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { @@ -6817,28 +6561,22 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field ctx, ec.OperationContext, field, - ec.fieldContext___InputValue_description, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___InputValue_description(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Description(), nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___InputValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__InputValue", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { @@ -6846,17 +6584,20 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq ctx, ec.OperationContext, field, - ec.fieldContext___InputValue_type, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___InputValue_type(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Type, nil }, nil, - ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType, + func(ctx context.Context, selections ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___InputValue_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__InputValue", @@ -6864,31 +6605,7 @@ func (ec *executionContext) fieldContext___InputValue_type(_ context.Context, fi IsMethod: false, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return ec.childFields___Type(ctx, field) }, } return fc, nil @@ -6899,28 +6616,22 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext___InputValue_defaultValue, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___InputValue_defaultValue(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.DefaultValue, nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___InputValue_defaultValue(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__InputValue", field, false, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___InputValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { @@ -6928,28 +6639,22 @@ func (ec *executionContext) ___InputValue_isDeprecated(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext___InputValue_isDeprecated, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.IsDeprecated(), nil }, nil, - ec.marshalNBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalNBoolean2bool(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___InputValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__InputValue", field, true, false, errors.New("field of type Boolean does not have child fields")) } func (ec *executionContext) ___InputValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { @@ -6957,28 +6662,22 @@ func (ec *executionContext) ___InputValue_deprecationReason(ctx context.Context, ctx, ec.OperationContext, field, - ec.fieldContext___InputValue_deprecationReason, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___InputValue_deprecationReason(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.DeprecationReason(), nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___InputValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__InputValue", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__InputValue", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___Schema_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { @@ -6986,28 +6685,22 @@ func (ec *executionContext) ___Schema_description(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext___Schema_description, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Schema_description(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Description(), nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Schema_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Schema", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Schema", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { @@ -7015,17 +6708,20 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C ctx, ec.OperationContext, field, - ec.fieldContext___Schema_types, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Schema_types(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Types(), nil }, nil, - ec.marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []introspection.Type) graphql.Marshaler { + return ec.marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Schema_types(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Schema", @@ -7033,31 +6729,7 @@ func (ec *executionContext) fieldContext___Schema_types(_ context.Context, field IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return ec.childFields___Type(ctx, field) }, } return fc, nil @@ -7068,17 +6740,20 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph ctx, ec.OperationContext, field, - ec.fieldContext___Schema_queryType, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Schema_queryType(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.QueryType(), nil }, nil, - ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType, + func(ctx context.Context, selections ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Schema_queryType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Schema", @@ -7086,31 +6761,7 @@ func (ec *executionContext) fieldContext___Schema_queryType(_ context.Context, f IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return ec.childFields___Type(ctx, field) }, } return fc, nil @@ -7121,17 +6772,20 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr ctx, ec.OperationContext, field, - ec.fieldContext___Schema_mutationType, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Schema_mutationType(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.MutationType(), nil }, nil, - ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType, + func(ctx context.Context, selections ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Schema_mutationType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Schema", @@ -7139,31 +6793,7 @@ func (ec *executionContext) fieldContext___Schema_mutationType(_ context.Context IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return ec.childFields___Type(ctx, field) }, } return fc, nil @@ -7174,17 +6804,20 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel ctx, ec.OperationContext, field, - ec.fieldContext___Schema_subscriptionType, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Schema_subscriptionType(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.SubscriptionType(), nil }, nil, - ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType, + func(ctx context.Context, selections ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Schema_subscriptionType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Schema", @@ -7192,31 +6825,7 @@ func (ec *executionContext) fieldContext___Schema_subscriptionType(_ context.Con IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return ec.childFields___Type(ctx, field) }, } return fc, nil @@ -7227,17 +6836,20 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap ctx, ec.OperationContext, field, - ec.fieldContext___Schema_directives, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Schema_directives(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Directives(), nil }, nil, - ec.marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []introspection.Directive) graphql.Marshaler { + return ec.marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Schema_directives(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Schema", @@ -7245,19 +6857,7 @@ func (ec *executionContext) fieldContext___Schema_directives(_ context.Context, IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___Directive_name(ctx, field) - case "description": - return ec.fieldContext___Directive_description(ctx, field) - case "isRepeatable": - return ec.fieldContext___Directive_isRepeatable(ctx, field) - case "locations": - return ec.fieldContext___Directive_locations(ctx, field) - case "args": - return ec.fieldContext___Directive_args(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Directive", field.Name) + return ec.childFields___Directive(ctx, field) }, } return fc, nil @@ -7268,28 +6868,22 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll ctx, ec.OperationContext, field, - ec.fieldContext___Type_kind, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_kind(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Kind(), nil }, nil, - ec.marshalN__TypeKind2string, + func(ctx context.Context, selections ast.SelectionSet, v string) graphql.Marshaler { + return ec.marshalN__TypeKind2string(ctx, selections, v) + }, true, true, ) } - func (ec *executionContext) fieldContext___Type_kind(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type __TypeKind does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Type", field, true, false, errors.New("field of type __TypeKind does not have child fields")) } func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { @@ -7297,28 +6891,22 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll ctx, ec.OperationContext, field, - ec.fieldContext___Type_name, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_name(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Name(), nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Type_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Type", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { @@ -7326,28 +6914,22 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph ctx, ec.OperationContext, field, - ec.fieldContext___Type_description, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_description(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Description(), nil }, nil, - ec.marshalOString2ᚖstring, + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Type_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Type", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___Type_specifiedByURL(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { @@ -7355,28 +6937,22 @@ func (ec *executionContext) ___Type_specifiedByURL(ctx context.Context, field gr ctx, ec.OperationContext, field, - ec.fieldContext___Type_specifiedByURL, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_specifiedByURL(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.SpecifiedByURL(), nil }, nil, - ec.marshalOString2ᚖstring, - true, - false, - ) -} - -func (ec *executionContext) fieldContext___Type_specifiedByURL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type String does not have child fields") - }, - } - return fc, nil + func(ctx context.Context, selections ast.SelectionSet, v *string) graphql.Marshaler { + return ec.marshalOString2ᚖstring(ctx, selections, v) + }, + true, + false, + ) +} +func (ec *executionContext) fieldContext___Type_specifiedByURL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + return graphql.NewScalarFieldContext("__Type", field, true, false, errors.New("field of type String does not have child fields")) } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { @@ -7384,18 +6960,21 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co ctx, ec.OperationContext, field, - ec.fieldContext___Type_fields, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_fields(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return obj.Fields(fc.Args["includeDeprecated"].(bool)), nil }, nil, - ec.marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []introspection.Field) graphql.Marshaler { + return ec.marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Type_fields(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Type", @@ -7403,21 +6982,7 @@ func (ec *executionContext) fieldContext___Type_fields(ctx context.Context, fiel IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___Field_name(ctx, field) - case "description": - return ec.fieldContext___Field_description(ctx, field) - case "args": - return ec.fieldContext___Field_args(ctx, field) - case "type": - return ec.fieldContext___Field_type(ctx, field) - case "isDeprecated": - return ec.fieldContext___Field_isDeprecated(ctx, field) - case "deprecationReason": - return ec.fieldContext___Field_deprecationReason(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Field", field.Name) + return ec.childFields___Field(ctx, field) }, } defer func() { @@ -7439,17 +7004,20 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq ctx, ec.OperationContext, field, - ec.fieldContext___Type_interfaces, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_interfaces(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.Interfaces(), nil }, nil, - ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []introspection.Type) graphql.Marshaler { + return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Type_interfaces(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Type", @@ -7457,31 +7025,7 @@ func (ec *executionContext) fieldContext___Type_interfaces(_ context.Context, fi IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return ec.childFields___Type(ctx, field) }, } return fc, nil @@ -7492,17 +7036,20 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra ctx, ec.OperationContext, field, - ec.fieldContext___Type_possibleTypes, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_possibleTypes(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.PossibleTypes(), nil }, nil, - ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []introspection.Type) graphql.Marshaler { + return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Type_possibleTypes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Type", @@ -7510,31 +7057,7 @@ func (ec *executionContext) fieldContext___Type_possibleTypes(_ context.Context, IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return ec.childFields___Type(ctx, field) }, } return fc, nil @@ -7545,18 +7068,21 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq ctx, ec.OperationContext, field, - ec.fieldContext___Type_enumValues, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_enumValues(ctx, field) + }, func(ctx context.Context) (any, error) { fc := graphql.GetFieldContext(ctx) return obj.EnumValues(fc.Args["includeDeprecated"].(bool)), nil }, nil, - ec.marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []introspection.EnumValue) graphql.Marshaler { + return ec.marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Type", @@ -7564,17 +7090,7 @@ func (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___EnumValue_name(ctx, field) - case "description": - return ec.fieldContext___EnumValue_description(ctx, field) - case "isDeprecated": - return ec.fieldContext___EnumValue_isDeprecated(ctx, field) - case "deprecationReason": - return ec.fieldContext___EnumValue_deprecationReason(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __EnumValue", field.Name) + return ec.childFields___EnumValue(ctx, field) }, } defer func() { @@ -7596,17 +7112,20 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph ctx, ec.OperationContext, field, - ec.fieldContext___Type_inputFields, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_inputFields(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.InputFields(), nil }, nil, - ec.marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ, + func(ctx context.Context, selections ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { + return ec.marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Type_inputFields(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Type", @@ -7614,21 +7133,7 @@ func (ec *executionContext) fieldContext___Type_inputFields(_ context.Context, f IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "name": - return ec.fieldContext___InputValue_name(ctx, field) - case "description": - return ec.fieldContext___InputValue_description(ctx, field) - case "type": - return ec.fieldContext___InputValue_type(ctx, field) - case "defaultValue": - return ec.fieldContext___InputValue_defaultValue(ctx, field) - case "isDeprecated": - return ec.fieldContext___InputValue_isDeprecated(ctx, field) - case "deprecationReason": - return ec.fieldContext___InputValue_deprecationReason(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + return ec.childFields___InputValue(ctx, field) }, } return fc, nil @@ -7639,17 +7144,20 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co ctx, ec.OperationContext, field, - ec.fieldContext___Type_ofType, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_ofType(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.OfType(), nil }, nil, - ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType, + func(ctx context.Context, selections ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Type_ofType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "__Type", @@ -7657,31 +7165,7 @@ func (ec *executionContext) fieldContext___Type_ofType(_ context.Context, field IsMethod: true, IsResolver: false, Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "kind": - return ec.fieldContext___Type_kind(ctx, field) - case "name": - return ec.fieldContext___Type_name(ctx, field) - case "description": - return ec.fieldContext___Type_description(ctx, field) - case "specifiedByURL": - return ec.fieldContext___Type_specifiedByURL(ctx, field) - case "fields": - return ec.fieldContext___Type_fields(ctx, field) - case "interfaces": - return ec.fieldContext___Type_interfaces(ctx, field) - case "possibleTypes": - return ec.fieldContext___Type_possibleTypes(ctx, field) - case "enumValues": - return ec.fieldContext___Type_enumValues(ctx, field) - case "inputFields": - return ec.fieldContext___Type_inputFields(ctx, field) - case "ofType": - return ec.fieldContext___Type_ofType(ctx, field) - case "isOneOf": - return ec.fieldContext___Type_isOneOf(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + return ec.childFields___Type(ctx, field) }, } return fc, nil @@ -7692,28 +7176,22 @@ func (ec *executionContext) ___Type_isOneOf(ctx context.Context, field graphql.C ctx, ec.OperationContext, field, - ec.fieldContext___Type_isOneOf, + func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return ec.fieldContext___Type_isOneOf(ctx, field) + }, func(ctx context.Context) (any, error) { return obj.IsOneOf(), nil }, nil, - ec.marshalOBoolean2bool, + func(ctx context.Context, selections ast.SelectionSet, v bool) graphql.Marshaler { + return ec.marshalOBoolean2bool(ctx, selections, v) + }, true, false, ) } - func (ec *executionContext) fieldContext___Type_isOneOf(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "__Type", - Field: field, - IsMethod: true, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - return fc, nil + return graphql.NewScalarFieldContext("__Type", field, true, false, errors.New("field of type Boolean does not have child fields")) } // endregion **************************** field.gotpl ***************************** @@ -8158,7 +7636,8 @@ func (ec *executionContext) _ActivePageStats(ctx context.Context, sel ast.Select fields := graphql.CollectFields(ec.OperationContext, sel, activePageStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8182,16 +7661,14 @@ func (ec *executionContext) _ActivePageStats(ctx context.Context, sel ast.Select return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8202,7 +7679,8 @@ func (ec *executionContext) _AuthPayload(ctx context.Context, sel ast.SelectionS fields := graphql.CollectFields(ec.OperationContext, sel, authPayloadImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8221,16 +7699,14 @@ func (ec *executionContext) _AuthPayload(ctx context.Context, sel ast.SelectionS return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8241,7 +7717,8 @@ func (ec *executionContext) _BrowserStats(ctx context.Context, sel ast.Selection fields := graphql.CollectFields(ec.OperationContext, sel, browserStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8265,16 +7742,14 @@ func (ec *executionContext) _BrowserStats(ctx context.Context, sel ast.Selection return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8285,7 +7760,8 @@ func (ec *executionContext) _Country(ctx context.Context, sel ast.SelectionSet, fields := graphql.CollectFields(ec.OperationContext, sel, countryImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8311,20 +7787,22 @@ func (ec *executionContext) _Country(ctx context.Context, sel ast.SelectionSet, return res } - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) + if field.IsDeferred() { + deferredFieldSet.AddField(field) + fieldIndex := len(deferredFieldSet.Values) - 1 + deferredFieldSet.Concurrently(fieldIndex, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, deferredFieldSet) }) + for _, deferrable := range field.Deferrables { + view, ok := deferLabelToView[deferrable.Label] + if !ok { + view = deferredFieldSet.NewView() + deferLabelToView[deferrable.Label] = view + } + view.AddIndices(fieldIndex) + } + // don't run the out.Concurrently() call below out.Values[i] = graphql.Null continue @@ -8340,16 +7818,14 @@ func (ec *executionContext) _Country(ctx context.Context, sel ast.SelectionSet, return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8360,7 +7836,8 @@ func (ec *executionContext) _CountryStats(ctx context.Context, sel ast.Selection fields := graphql.CollectFields(ec.OperationContext, sel, countryStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8384,16 +7861,14 @@ func (ec *executionContext) _CountryStats(ctx context.Context, sel ast.Selection return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8404,7 +7879,8 @@ func (ec *executionContext) _DailyStats(ctx context.Context, sel ast.SelectionSe fields := graphql.CollectFields(ec.OperationContext, sel, dailyStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8438,16 +7914,14 @@ func (ec *executionContext) _DailyStats(ctx context.Context, sel ast.SelectionSe return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8458,7 +7932,8 @@ func (ec *executionContext) _DashboardStats(ctx context.Context, sel ast.Selecti fields := graphql.CollectFields(ec.OperationContext, sel, dashboardStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8504,20 +7979,22 @@ func (ec *executionContext) _DashboardStats(ctx context.Context, sel ast.Selecti return res } - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) + if field.IsDeferred() { + deferredFieldSet.AddField(field) + fieldIndex := len(deferredFieldSet.Values) - 1 + deferredFieldSet.Concurrently(fieldIndex, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, deferredFieldSet) }) + for _, deferrable := range field.Deferrables { + view, ok := deferLabelToView[deferrable.Label] + if !ok { + view = deferredFieldSet.NewView() + deferLabelToView[deferrable.Label] = view + } + view.AddIndices(fieldIndex) + } + // don't run the out.Concurrently() call below out.Values[i] = graphql.Null continue @@ -8540,20 +8017,22 @@ func (ec *executionContext) _DashboardStats(ctx context.Context, sel ast.Selecti return res } - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) + if field.IsDeferred() { + deferredFieldSet.AddField(field) + fieldIndex := len(deferredFieldSet.Values) - 1 + deferredFieldSet.Concurrently(fieldIndex, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, deferredFieldSet) }) + for _, deferrable := range field.Deferrables { + view, ok := deferLabelToView[deferrable.Label] + if !ok { + view = deferredFieldSet.NewView() + deferLabelToView[deferrable.Label] = view + } + view.AddIndices(fieldIndex) + } + // don't run the out.Concurrently() call below out.Values[i] = graphql.Null continue @@ -8576,20 +8055,22 @@ func (ec *executionContext) _DashboardStats(ctx context.Context, sel ast.Selecti return res } - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) + if field.IsDeferred() { + deferredFieldSet.AddField(field) + fieldIndex := len(deferredFieldSet.Values) - 1 + deferredFieldSet.Concurrently(fieldIndex, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, deferredFieldSet) }) + for _, deferrable := range field.Deferrables { + view, ok := deferLabelToView[deferrable.Label] + if !ok { + view = deferredFieldSet.NewView() + deferLabelToView[deferrable.Label] = view + } + view.AddIndices(fieldIndex) + } + // don't run the out.Concurrently() call below out.Values[i] = graphql.Null continue @@ -8612,20 +8093,22 @@ func (ec *executionContext) _DashboardStats(ctx context.Context, sel ast.Selecti return res } - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) + if field.IsDeferred() { + deferredFieldSet.AddField(field) + fieldIndex := len(deferredFieldSet.Values) - 1 + deferredFieldSet.Concurrently(fieldIndex, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, deferredFieldSet) }) + for _, deferrable := range field.Deferrables { + view, ok := deferLabelToView[deferrable.Label] + if !ok { + view = deferredFieldSet.NewView() + deferLabelToView[deferrable.Label] = view + } + view.AddIndices(fieldIndex) + } + // don't run the out.Concurrently() call below out.Values[i] = graphql.Null continue @@ -8648,20 +8131,22 @@ func (ec *executionContext) _DashboardStats(ctx context.Context, sel ast.Selecti return res } - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) + if field.IsDeferred() { + deferredFieldSet.AddField(field) + fieldIndex := len(deferredFieldSet.Values) - 1 + deferredFieldSet.Concurrently(fieldIndex, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, deferredFieldSet) }) + for _, deferrable := range field.Deferrables { + view, ok := deferLabelToView[deferrable.Label] + if !ok { + view = deferredFieldSet.NewView() + deferLabelToView[deferrable.Label] = view + } + view.AddIndices(fieldIndex) + } + // don't run the out.Concurrently() call below out.Values[i] = graphql.Null continue @@ -8684,20 +8169,22 @@ func (ec *executionContext) _DashboardStats(ctx context.Context, sel ast.Selecti return res } - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) + if field.IsDeferred() { + deferredFieldSet.AddField(field) + fieldIndex := len(deferredFieldSet.Values) - 1 + deferredFieldSet.Concurrently(fieldIndex, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, deferredFieldSet) }) + for _, deferrable := range field.Deferrables { + view, ok := deferLabelToView[deferrable.Label] + if !ok { + view = deferredFieldSet.NewView() + deferLabelToView[deferrable.Label] = view + } + view.AddIndices(fieldIndex) + } + // don't run the out.Concurrently() call below out.Values[i] = graphql.Null continue @@ -8720,20 +8207,22 @@ func (ec *executionContext) _DashboardStats(ctx context.Context, sel ast.Selecti return res } - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) + if field.IsDeferred() { + deferredFieldSet.AddField(field) + fieldIndex := len(deferredFieldSet.Values) - 1 + deferredFieldSet.Concurrently(fieldIndex, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, deferredFieldSet) }) + for _, deferrable := range field.Deferrables { + view, ok := deferLabelToView[deferrable.Label] + if !ok { + view = deferredFieldSet.NewView() + deferLabelToView[deferrable.Label] = view + } + view.AddIndices(fieldIndex) + } + // don't run the out.Concurrently() call below out.Values[i] = graphql.Null continue @@ -8749,16 +8238,14 @@ func (ec *executionContext) _DashboardStats(ctx context.Context, sel ast.Selecti return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8769,7 +8256,8 @@ func (ec *executionContext) _DeviceStats(ctx context.Context, sel ast.SelectionS fields := graphql.CollectFields(ec.OperationContext, sel, deviceStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8793,16 +8281,14 @@ func (ec *executionContext) _DeviceStats(ctx context.Context, sel ast.SelectionS return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8813,7 +8299,8 @@ func (ec *executionContext) _Event(ctx context.Context, sel ast.SelectionSet, ob fields := graphql.CollectFields(ec.OperationContext, sel, eventImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8835,6 +8322,9 @@ func (ec *executionContext) _Event(ctx context.Context, sel ast.SelectionSet, ob } case "definition": out.Values[i] = ec._Event_definition(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "properties": out.Values[i] = ec._Event_properties(ctx, field, obj) if out.Values[i] == graphql.Null { @@ -8854,16 +8344,14 @@ func (ec *executionContext) _Event(ctx context.Context, sel ast.SelectionSet, ob return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8874,7 +8362,8 @@ func (ec *executionContext) _EventCount(ctx context.Context, sel ast.SelectionSe fields := graphql.CollectFields(ec.OperationContext, sel, eventCountImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8898,16 +8387,14 @@ func (ec *executionContext) _EventCount(ctx context.Context, sel ast.SelectionSe return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8918,7 +8405,8 @@ func (ec *executionContext) _EventDefinition(ctx context.Context, sel ast.Select fields := graphql.CollectFields(ec.OperationContext, sel, eventDefinitionImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -8957,16 +8445,14 @@ func (ec *executionContext) _EventDefinition(ctx context.Context, sel ast.Select return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -8977,7 +8463,8 @@ func (ec *executionContext) _EventDefinitionField(ctx context.Context, sel ast.S fields := graphql.CollectFields(ec.OperationContext, sel, eventDefinitionFieldImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9016,16 +8503,14 @@ func (ec *executionContext) _EventDefinitionField(ctx context.Context, sel ast.S return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9036,7 +8521,8 @@ func (ec *executionContext) _EventProperty(ctx context.Context, sel ast.Selectio fields := graphql.CollectFields(ec.OperationContext, sel, eventPropertyImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9060,16 +8546,14 @@ func (ec *executionContext) _EventProperty(ctx context.Context, sel ast.Selectio return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9080,7 +8564,8 @@ func (ec *executionContext) _EventsResult(ctx context.Context, sel ast.Selection fields := graphql.CollectFields(ec.OperationContext, sel, eventsResultImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9104,16 +8589,14 @@ func (ec *executionContext) _EventsResult(ctx context.Context, sel ast.Selection return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9124,7 +8607,8 @@ func (ec *executionContext) _GeoIPStatus(ctx context.Context, sel ast.SelectionS fields := graphql.CollectFields(ec.OperationContext, sel, geoIPStatusImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9141,10 +8625,19 @@ func (ec *executionContext) _GeoIPStatus(ctx context.Context, sel ast.SelectionS } case "source": out.Values[i] = ec._GeoIPStatus_source(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "lastError": out.Values[i] = ec._GeoIPStatus_lastError(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "updatedAt": out.Values[i] = ec._GeoIPStatus_updatedAt(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -9154,16 +8647,14 @@ func (ec *executionContext) _GeoIPStatus(ctx context.Context, sel ast.SelectionS return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9177,7 +8668,8 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) }) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{ Object: field.Name, @@ -9273,16 +8765,14 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9293,7 +8783,8 @@ func (ec *executionContext) _OperatingSystemStats(ctx context.Context, sel ast.S fields := graphql.CollectFields(ec.OperationContext, sel, operatingSystemStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9317,16 +8808,14 @@ func (ec *executionContext) _OperatingSystemStats(ctx context.Context, sel ast.S return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9337,7 +8826,8 @@ func (ec *executionContext) _PageStats(ctx context.Context, sel ast.SelectionSet fields := graphql.CollectFields(ec.OperationContext, sel, pageStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9366,16 +8856,14 @@ func (ec *executionContext) _PageStats(ctx context.Context, sel ast.SelectionSet return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9386,7 +8874,8 @@ func (ec *executionContext) _PagedCountryStats(ctx context.Context, sel ast.Sele fields := graphql.CollectFields(ec.OperationContext, sel, pagedCountryStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9415,16 +8904,14 @@ func (ec *executionContext) _PagedCountryStats(ctx context.Context, sel ast.Sele return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9435,7 +8922,8 @@ func (ec *executionContext) _PagedDeviceStats(ctx context.Context, sel ast.Selec fields := graphql.CollectFields(ec.OperationContext, sel, pagedDeviceStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9464,16 +8952,14 @@ func (ec *executionContext) _PagedDeviceStats(ctx context.Context, sel ast.Selec return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9484,7 +8970,8 @@ func (ec *executionContext) _PagedOperatingSystemStats(ctx context.Context, sel fields := graphql.CollectFields(ec.OperationContext, sel, pagedOperatingSystemStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9513,16 +9000,14 @@ func (ec *executionContext) _PagedOperatingSystemStats(ctx context.Context, sel return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9533,7 +9018,8 @@ func (ec *executionContext) _PagedPageStats(ctx context.Context, sel ast.Selecti fields := graphql.CollectFields(ec.OperationContext, sel, pagedPageStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9557,16 +9043,14 @@ func (ec *executionContext) _PagedPageStats(ctx context.Context, sel ast.Selecti return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9577,7 +9061,8 @@ func (ec *executionContext) _PagedReferrerStats(ctx context.Context, sel ast.Sel fields := graphql.CollectFields(ec.OperationContext, sel, pagedReferrerStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9601,16 +9086,14 @@ func (ec *executionContext) _PagedReferrerStats(ctx context.Context, sel ast.Sel return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9624,7 +9107,8 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr }) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{ Object: field.Name, @@ -9637,13 +9121,16 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr case "me": field := field - innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_me(ctx, field) + if res == graphql.RequiredNull { + atomic.AddUint32(&fs.Invalids, 1) + } return res } @@ -9700,13 +9187,16 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr case "site": field := field - innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { defer func() { if r := recover(); r != nil { ec.Error(ctx, ec.Recover(ctx, r)) } }() res = ec._Query_site(ctx, field) + if res == graphql.RequiredNull { + atomic.AddUint32(&fs.Invalids, 1) + } return res } @@ -9874,10 +9364,16 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Query___type(ctx, field) }) + if out.Values[i] == graphql.RequiredNull { + atomic.AddUint32(&out.Invalids, 1) + } case "__schema": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Query___schema(ctx, field) }) + if out.Values[i] == graphql.RequiredNull { + atomic.AddUint32(&out.Invalids, 1) + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -9887,16 +9383,14 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9907,7 +9401,8 @@ func (ec *executionContext) _RealtimeStats(ctx context.Context, sel ast.Selectio fields := graphql.CollectFields(ec.OperationContext, sel, realtimeStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -9933,20 +9428,22 @@ func (ec *executionContext) _RealtimeStats(ctx context.Context, sel ast.Selectio return res } - if field.Deferrable != nil { - dfs, ok := deferred[field.Deferrable.Label] - di := 0 - if ok { - dfs.AddField(field) - di = len(dfs.Values) - 1 - } else { - dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) - deferred[field.Deferrable.Label] = dfs - } - dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { - return innerFunc(ctx, dfs) + if field.IsDeferred() { + deferredFieldSet.AddField(field) + fieldIndex := len(deferredFieldSet.Values) - 1 + deferredFieldSet.Concurrently(fieldIndex, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, deferredFieldSet) }) + for _, deferrable := range field.Deferrables { + view, ok := deferLabelToView[deferrable.Label] + if !ok { + view = deferredFieldSet.NewView() + deferLabelToView[deferrable.Label] = view + } + view.AddIndices(fieldIndex) + } + // don't run the out.Concurrently() call below out.Values[i] = graphql.Null continue @@ -9962,16 +9459,14 @@ func (ec *executionContext) _RealtimeStats(ctx context.Context, sel ast.Selectio return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -9982,7 +9477,8 @@ func (ec *executionContext) _ReferrerStats(ctx context.Context, sel ast.Selectio fields := graphql.CollectFields(ec.OperationContext, sel, referrerStatsImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10006,16 +9502,14 @@ func (ec *executionContext) _ReferrerStats(ctx context.Context, sel ast.Selectio return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10026,7 +9520,8 @@ func (ec *executionContext) _RegistrationStatus(ctx context.Context, sel ast.Sel fields := graphql.CollectFields(ec.OperationContext, sel, registrationStatusImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10050,16 +9545,14 @@ func (ec *executionContext) _RegistrationStatus(ctx context.Context, sel ast.Sel return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10070,7 +9563,8 @@ func (ec *executionContext) _Session(ctx context.Context, sel ast.SelectionSet, fields := graphql.CollectFields(ec.OperationContext, sel, sessionImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10089,16 +9583,14 @@ func (ec *executionContext) _Session(ctx context.Context, sel ast.SelectionSet, return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10109,7 +9601,8 @@ func (ec *executionContext) _Site(ctx context.Context, sel ast.SelectionSet, obj fields := graphql.CollectFields(ec.OperationContext, sel, siteImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10163,16 +9656,14 @@ func (ec *executionContext) _Site(ctx context.Context, sel ast.SelectionSet, obj return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10183,7 +9674,8 @@ func (ec *executionContext) _TokenPayload(ctx context.Context, sel ast.Selection fields := graphql.CollectFields(ec.OperationContext, sel, tokenPayloadImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10207,16 +9699,14 @@ func (ec *executionContext) _TokenPayload(ctx context.Context, sel ast.Selection return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10227,7 +9717,8 @@ func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj fields := graphql.CollectFields(ec.OperationContext, sel, userImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10254,6 +9745,9 @@ func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj } case "sites": out.Values[i] = ec._User_sites(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -10263,16 +9757,14 @@ func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10283,7 +9775,8 @@ func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionS fields := graphql.CollectFields(ec.OperationContext, sel, __DirectiveImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10295,6 +9788,9 @@ func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionS } case "description": out.Values[i] = ec.___Directive_description(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "isRepeatable": out.Values[i] = ec.___Directive_isRepeatable(ctx, field, obj) if out.Values[i] == graphql.Null { @@ -10319,16 +9815,14 @@ func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionS return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10339,7 +9833,8 @@ func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionS fields := graphql.CollectFields(ec.OperationContext, sel, __EnumValueImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10351,6 +9846,9 @@ func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionS } case "description": out.Values[i] = ec.___EnumValue_description(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "isDeprecated": out.Values[i] = ec.___EnumValue_isDeprecated(ctx, field, obj) if out.Values[i] == graphql.Null { @@ -10358,6 +9856,9 @@ func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionS } case "deprecationReason": out.Values[i] = ec.___EnumValue_deprecationReason(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -10367,16 +9868,14 @@ func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionS return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10387,7 +9886,8 @@ func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, fields := graphql.CollectFields(ec.OperationContext, sel, __FieldImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10399,6 +9899,9 @@ func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, } case "description": out.Values[i] = ec.___Field_description(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "args": out.Values[i] = ec.___Field_args(ctx, field, obj) if out.Values[i] == graphql.Null { @@ -10416,6 +9919,9 @@ func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, } case "deprecationReason": out.Values[i] = ec.___Field_deprecationReason(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -10425,16 +9931,14 @@ func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10445,7 +9949,8 @@ func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.Selection fields := graphql.CollectFields(ec.OperationContext, sel, __InputValueImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10457,6 +9962,9 @@ func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.Selection } case "description": out.Values[i] = ec.___InputValue_description(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "type": out.Values[i] = ec.___InputValue_type(ctx, field, obj) if out.Values[i] == graphql.Null { @@ -10464,6 +9972,9 @@ func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.Selection } case "defaultValue": out.Values[i] = ec.___InputValue_defaultValue(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "isDeprecated": out.Values[i] = ec.___InputValue_isDeprecated(ctx, field, obj) if out.Values[i] == graphql.Null { @@ -10471,6 +9982,9 @@ func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.Selection } case "deprecationReason": out.Values[i] = ec.___InputValue_deprecationReason(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -10480,16 +9994,14 @@ func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.Selection return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10500,13 +10012,17 @@ func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, fields := graphql.CollectFields(ec.OperationContext, sel, __SchemaImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("__Schema") case "description": out.Values[i] = ec.___Schema_description(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "types": out.Values[i] = ec.___Schema_types(ctx, field, obj) if out.Values[i] == graphql.Null { @@ -10519,8 +10035,14 @@ func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, } case "mutationType": out.Values[i] = ec.___Schema_mutationType(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "subscriptionType": out.Values[i] = ec.___Schema_subscriptionType(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "directives": out.Values[i] = ec.___Schema_directives(ctx, field, obj) if out.Values[i] == graphql.Null { @@ -10535,16 +10057,14 @@ func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } @@ -10555,7 +10075,8 @@ func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, o fields := graphql.CollectFields(ec.OperationContext, sel, __TypeImplementors) out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) + deferredFieldSet := graphql.NewFieldSet(nil) + deferLabelToView := make(map[string]*graphql.FieldSetView) for i, field := range fields { switch field.Name { case "__typename": @@ -10567,24 +10088,54 @@ func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, o } case "name": out.Values[i] = ec.___Type_name(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "description": out.Values[i] = ec.___Type_description(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "specifiedByURL": out.Values[i] = ec.___Type_specifiedByURL(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "fields": out.Values[i] = ec.___Type_fields(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "interfaces": out.Values[i] = ec.___Type_interfaces(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "possibleTypes": out.Values[i] = ec.___Type_possibleTypes(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "enumValues": out.Values[i] = ec.___Type_enumValues(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "inputFields": out.Values[i] = ec.___Type_inputFields(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "ofType": out.Values[i] = ec.___Type_ofType(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } case "isOneOf": out.Values[i] = ec.___Type_isOneOf(ctx, field, obj) + if out.Values[i] == graphql.RequiredNull { + out.Invalids++ + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -10594,16 +10145,14 @@ func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, o return graphql.Null } - atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + atomic.AddInt32(&ec.Deferred, int32(min(len(deferLabelToView), math.MaxInt32))) - for label, dfs := range deferred { - ec.ProcessDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Defers: deferLabelToView, + Path: graphql.GetPath(ctx), + FieldSet: deferredFieldSet, + Context: ctx, + }) return out } diff --git a/server/internal/graph/schema.resolvers.go b/server/internal/graph/schema.resolvers.go index 1f9c66f3..44eb07eb 100644 --- a/server/internal/graph/schema.resolvers.go +++ b/server/internal/graph/schema.resolvers.go @@ -3,7 +3,7 @@ package graph // This file will be automatically regenerated based on the schema, any resolver // implementations // will be copied through when generating and any unknown code will be moved to the end. -// Code generated by github.com/99designs/gqlgen version v0.17.88 +// Code generated by github.com/99designs/gqlgen version v0.17.92 import ( "context" diff --git a/server/static/go.mod b/server/static/go.mod index 7aae7cfb..59238187 100644 --- a/server/static/go.mod +++ b/server/static/go.mod @@ -2,6 +2,6 @@ module github.com/lovely-eye/static go 1.26 -require github.com/evanw/esbuild v0.28.0 +require github.com/evanw/esbuild v0.28.1 -require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect +require golang.org/x/sys v0.46.0 // indirect diff --git a/server/static/go.sum b/server/static/go.sum index aacf254b..4d8acf74 100644 --- a/server/static/go.sum +++ b/server/static/go.sum @@ -1,4 +1,5 @@ -github.com/evanw/esbuild v0.28.0 h1:V96ghtc5p5JnNUQIUsc5H3kr+AcFcMqOJll2ZmJW6Lo= -github.com/evanw/esbuild v0.28.0/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= +github.com/evanw/esbuild v0.28.1 h1:ds+yuRyUaZGx++GR56CrCeuXh8PVhVM4xq8v7PNELFc= +github.com/evanw/esbuild v0.28.1/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= diff --git a/server/static/tsconfig.json b/server/static/tsconfig.json index 10c44260..8144d279 100644 --- a/server/static/tsconfig.json +++ b/server/static/tsconfig.json @@ -7,7 +7,6 @@ "strict": true, "noImplicitAny": true, "noImplicitThis": true, - "alwaysStrict": true, "exactOptionalPropertyTypes": true, "noUncheckedIndexedAccess": true, "useUnknownInCatchVariables": true, From cf3f32db778f910954f540563dfa2414b2d1d279 Mon Sep 17 00:00:00 2001 From: Liakhovskyi Vladyslav Date: Sun, 12 Jul 2026 18:14:09 +0000 Subject: [PATCH 3/3] feat(analytics)!: harden server-owned collection Require query site_key and minimal tracker payloads with server-computed session timing. Add collect/query limits, trusted proxy IP resolution, rate limiting, accuracy indexes, and dashboard aggregation fixes. BREAKING CHANGE: collect requests now require site_key in the query string and legacy duration/screen_width payload behavior is removed. AI-Impact: co-developed AI: cx --- ANALYTICS.md | 145 ++++++--- README.md | 69 +++- .../src/components/event-definitions-card.tsx | 5 +- server/e2e/dashboard_filter_test.go | 31 +- server/e2e/e2e_test.go | 52 ++- server/internal/README.md | 10 +- server/internal/config/config.go | 55 +++- server/internal/config/config_test.go | 52 +++ server/internal/graph/handler.go | 6 +- server/internal/graph/helpers.go | 48 ++- server/internal/graph/resolver.go | 22 ++ server/internal/graph/schema.resolvers.go | 37 ++- server/internal/handlers/analytics_handler.go | 120 +++++-- .../handlers/analytics_handler_test.go | 266 ++++++++++++++++ server/internal/handlers/rate_limiter.go | 74 +++++ .../repository/analytics_repository.go | 166 +++++++--- .../repository/analytics_repository_test.go | 295 +++++++++++++++++- server/internal/server/server.go | 41 ++- .../services/analytics_client_rotation.go | 21 ++ .../services/analytics_identity_test.go | 250 ++++++++++++++- server/internal/services/analytics_service.go | 231 +++++++++----- server/migrations/README.md | 11 + ...120000_analytics_accuracy_indexes.down.sql | 6 + ...03120000_analytics_accuracy_indexes.up.sql | 6 + server/migrations/postgres/atlas.sum | 22 +- ...120000_analytics_accuracy_indexes.down.sql | 6 + ...03120000_analytics_accuracy_indexes.up.sql | 6 + server/migrations/sqlite/atlas.sum | 22 +- server/pkg/README.md | 7 + server/pkg/clientip/clientip.go | 140 ++++++++- server/pkg/clientip/clientip_test.go | 45 +++ server/pkg/clientip/doc.go | 10 +- server/static/dist/tracker-size.svg | 8 +- server/static/dist/tracker.js | 2 +- server/static/tracker.js | 146 +-------- server/static/tracker.ts | 92 +++--- 36 files changed, 2014 insertions(+), 511 deletions(-) create mode 100644 server/internal/handlers/analytics_handler_test.go create mode 100644 server/internal/handlers/rate_limiter.go create mode 100644 server/migrations/postgres/20260703120000_analytics_accuracy_indexes.down.sql create mode 100644 server/migrations/postgres/20260703120000_analytics_accuracy_indexes.up.sql create mode 100644 server/migrations/sqlite/20260703120000_analytics_accuracy_indexes.down.sql create mode 100644 server/migrations/sqlite/20260703120000_analytics_accuracy_indexes.up.sql create mode 100644 server/pkg/clientip/clientip_test.go diff --git a/ANALYTICS.md b/ANALYTICS.md index 2c74b618..b0cd8239 100644 --- a/ANALYTICS.md +++ b/ANALYTICS.md @@ -2,6 +2,51 @@ Implementation notes for Lovely Eye analytics. +## Public Collect Contract + +`POST /api/collect?site_key=` is the only collect shape. `site_key` in the JSON body is not part of the contract. + +The tracker sends JSON with `Content-Type: text/plain;charset=UTF-8` so `navigator.sendBeacon` can queue small analytics payloads without a custom request setup. + +Page view: + +```json +{ "path": "/pricing" } +``` + +Exit ping: + +```json +{ "path": "/pricing", "exit": true } +``` + +Initial attribution, when present, is sent only on the first page view: + +```json +{ "path": "/pricing", "referrer": "https://google.com", "utm_source": "google" } +``` + +Custom event: + +```json +{ "name": "checkout_failed", "path": "/checkout", "properties": "{\"code\":\"PAYMENT_DECLINED\"}" } +``` + +The client does not send `duration`, `screen_width`, `last_alive`, session IDs, client IDs, or page-state decisions. All client data is treated as untrusted hints. + +## Tracker Lifecycle + +- Normal page views send only the current path, plus first-touch attribution if present. +- SPA navigation hooks send a new page view when the path changes. +- Exit pings use `visibilitychange` when the document becomes hidden. +- `pagehide` is kept only as a fallback. +- `beforeunload` is intentionally not used. + +This follows browser guidance for small analytics payloads: +- [MDN `sendBeacon`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon): intended for small analytics/diagnostic POSTs and avoids slowing navigation. +- [MDN `visibilitychange`](https://developer.mozilla.org/en-US/docs/Web/API/Document/visibilitychange_event): the hidden transition is the last reliably observable lifecycle point for many pages. +- [W3C Beacon](https://www.w3.org/TR/beacon/): defines asynchronous beacon delivery for analytics-style data. + ## Visitor Identification Server-generated visitor ID computed from minimized request signals: @@ -16,6 +61,56 @@ Server-generated visitor ID computed from minimized request signals: - Country is not part of the visitor ID - The server secret helps reduce the impact of database-only leaks by making visitor IDs harder to recompute outside the app +## IP Address Handling + +Client IP is resolved by `server/pkg/clientip`: +- `RemoteAddr` is authoritative unless it belongs to a configured trusted proxy CIDR. +- `X-Forwarded-For` and `X-Real-IP` are ignored from untrusted remotes. +- For trusted proxy chains, Lovely Eye scans `X-Forwarded-For` from right to left and selects the last non-trusted hop as the client. +- If every forwarded hop is trusted, the leftmost valid forwarded IP is used. +- IPs are truncated before hashing: IPv4 `/24`, IPv6 `/64`. +- IPs are used only for visitor identity, block checks, rate limiting, and optional country lookup. They are not stored. + +The default `TRUSTED_PROXY_CIDRS` covers loopback, RFC1918 private IPv4 ranges, and IPv6 unique-local addresses for common Docker, Nginx, Traefik, and Kubernetes private-network deployments. Public CDN or edge proxy ranges must be configured explicitly. The hop-selection behavior matches the intent of Nginx `real_ip_recursive`: [Nginx realip module](https://nginx.org/en/docs/http/ngx_http_realip_module.html). + +## Session Mechanics + +Sessions are computed server-side: +- 30-minute inactivity timeout. +- Server receive time is used for event time, session entry time, exit time, and duration. +- A normal page view creates or extends the active session. +- A same-path exit ping updates `exit_time`, `exit_path`, and computed duration only. +- Same-path exit pings may close a single-page session for up to `ANALYTICS_MAX_SINGLE_PAGE_DURATION`, defaulting to `4h`; repeated exit pings cannot push that single-page duration past the cap. +- A different-path exit ping counts that path as a page view only while the session is still inside the normal 30-minute active window, then updates session exit fields. +- An exit ping without an active session is a no-op. +- A 10-second dedupe window suppresses repeated same-path page views before counters change. +- Bounce rate uses sessions with one page view. +- Average session duration uses positive server-computed durations, including single-page sessions closed by exit pings. + +## Query Accuracy + +- Top pages and active pages count distinct analytics clients, not sessions. +- Page-view time series are bucketed by event time, not session start time. +- Visitor and session time series are bucketed by session entry time. +- Dashboard overview errors are propagated instead of returning partial zero values. + +## Limits And Hardening + +Limits exist because analytics endpoints are public by design: +- `ANALYTICS_MAX_BODY_BYTES` defaults to `16384`; tracker payloads should be far smaller. +- `ANALYTICS_MAX_PROPERTIES_BYTES` defaults to `8192`; custom event properties are allowlisted and capped. +- `ANALYTICS_MAX_SINGLE_PAGE_DURATION` defaults to `4h`; this bounds long-lived open tabs while still allowing real long reads. +- `ANALYTICS_RATE_LIMIT_ENABLED` defaults to `true`. +- `ANALYTICS_RATE_LIMIT_PER_MINUTE` defaults to `120`; collect traffic is limited by client IP before site lookup and by site key plus client IP after validation. +- `ANALYTICS_RATE_LIMIT_BURST` defaults to `240`; it uses the same keying as the refill limit. +- `GRAPHQL_MAX_BODY_BYTES` defaults to `1048576`. +- `DASHBOARD_MAX_DAILY_RANGE_DAYS` defaults to `730`. +- `DASHBOARD_MAX_HOURLY_RANGE_DAYS` defaults to `31`. +- `DASHBOARD_MAX_FILTER_VALUES` defaults to `100`. +- `DASHBOARD_MAX_FILTER_STRING_LENGTH` defaults to `2048`. + +These controls follow OWASP API guidance to constrain resource consumption and validate request sizes at the boundary: [OWASP REST Security Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html). + ## Bot Filtering Filters non-human traffic: @@ -25,49 +120,23 @@ Filters non-human traffic: - Scrapers: curl, wget, python-requests - Headless browsers: Puppeteer, Playwright -## Page View Deduplication - -Prevents duplicate counting: -- 10-second deduplication window per visitor per page -- Filters double-clicks, script reloads, same-path SPA updates within 10s -- Duplicate hits are ignored before page-view counters or session exit metrics change -- Ensures accurate page view metrics - ## Query Parameters -- By default, query parameters are not included in tracked page paths -- Use `data-include-query="true"` on the tracker script to include full query strings - -## IP Address Handling - -Extracts real client IP from proxied requests: -- Parses X-Forwarded-For header (first IP) -- Falls back to X-Real-IP header -- Strips port from RemoteAddr -- Truncates IP before hashing: IPv4 `/24`, IPv6 `/64` -- IPs used only for visitor identity and optional geolocation, never stored - -## Session Management - -Tracks browsing sessions: -- 30-minute inactivity timeout -- Records entry page, exit page, duration -- Calculates bounce rate -- Captures device, browser, OS, screen size -- Optional country detection via GeoIP +- By default, query parameters are not included in tracked page paths. +- Use `data-include-query="true"` on the tracker script to include full query strings. ## Privacy -- No client-side cookies or persistent identifiers -- Visitor IDs use UTC-day-skipped rotation -- Visitor IDs are derived server-side from minimized signals -- Site-scoped keying prevents reuse across sites -- Keyed visitor IDs reduce the value of database-only leaks -- IP addresses never stored in database -- Country-level geolocation only (no city data) +- No client-side cookies or persistent identifiers. +- Visitor IDs use UTC-day-skipped rotation. +- Visitor IDs are derived server-side from minimized signals. +- Site-scoped keying prevents reuse across sites. +- Keyed visitor IDs reduce the value of database-only leaks. +- IP addresses are never stored in the database. +- Country-level geolocation only, no city data. ## Event Allowlist -- Custom events are recorded only if the event name is allowlisted for the site -- Event properties are filtered to the allowed keys and types -- Required fields must be present for the event to be stored +- Custom events are recorded only if the event name is allowlisted for the site. +- Event properties are filtered to the allowed keys and types. +- Required fields must be present for the event to be stored. diff --git a/README.md b/README.md index 9ea9bfa8..8a72eb5b 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Self-hosted web analytics with a Go backend and a React dashboard. Lovely Eye tr - Cookieless analytics with an identifier computed from minimized request data and keyed with a server-side secret - SQLite by default, PostgreSQL when needed - Bot filtering and page-view deduplication +- Server-side session timing; client timing fields are ignored - Allowlisted custom events - Optional country tracking - Dashboard served as static assets by the Go server @@ -116,12 +117,16 @@ SQLite is the default database. If `JWT_SECRET` is unset, Lovely Eye generates o ## Privacy And Tracking - Lovely Eye does not use analytics cookies or local storage by default. +- The tracker sends a minimal payload. A page view sends `path`; an exit ping sends `path` plus `exit: true`. +- Timing is computed from server receive time. The client does not send `duration`, `screen_width`, or session state. +- Single-page exit duration is bounded by `ANALYTICS_MAX_SINGLE_PAGE_DURATION`, which defaults to `4h`; repeated exit pings cannot extend it past that cap. - The analytics visitor identifier is computed from site ID, truncated IP prefix, browser family, and device class, and keyed with a server-side secret. - The analytics visitor identifier is unique per site. - The server computes hashes for `today` and `yesterday`. - A visitor who returns at least once per UTC day keeps the same analytics client row. - A new analytics client row is created only after the visitor skips a full UTC day between visits. - Sessions are separate from the analytics visitor identifier and expire after 30 minutes of inactivity. +- Exit pings update the active session when they match the current path. If an exit ping names a different path while the session is still inside the 30-minute active window, the server counts that path as a page view before closing the session path; stale different-path exits are ignored. - Country tracking is optional and is not part of the analytics visitor identifier. - The dedicated `ANALYTICS_IDENTITY_SECRET` helps reduce the impact of database-only leaks because stored analytics rows do not contain enough information to recompute the identifier on their own. @@ -133,6 +138,35 @@ SQLite is the default database. If `JWT_SECRET` is unset, Lovely Eye generates o 4. Copy the generated tracking code. 5. Add it to the site you want to track. +## Tracker API + +The collect endpoint requires the public key in the query string: + +```http +POST /api/collect?site_key= +Content-Type: text/plain;charset=UTF-8 +``` + +Page view: + +```json +{ "path": "/pricing" } +``` + +Exit ping: + +```json +{ "path": "/pricing", "exit": true } +``` + +Initial attribution, when present, is sent only on the first page view: + +```json +{ "path": "/pricing", "referrer": "https://google.com", "utm_source": "google" } +``` + +The tracker uses `visibilitychange` with `sendBeacon`, with `pagehide` as a fallback. This follows the current MDN and W3C Beacon guidance for small analytics payloads that should not block navigation: [MDN sendBeacon](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon), [MDN visibilitychange](https://developer.mozilla.org/en-US/docs/Web/API/Document/visibilitychange_event), and [W3C Beacon](https://www.w3.org/TR/beacon/). + ## Common Configuration | Variable | Default | Meaning | @@ -146,14 +180,29 @@ SQLite is the default database. If `JWT_SECRET` is unset, Lovely Eye generates o | `INITIAL_ADMIN_USERNAME` | empty | Initial admin username. Requires `INITIAL_ADMIN_PASSWORD`. | | `INITIAL_ADMIN_PASSWORD` | empty | Initial admin password. Requires `INITIAL_ADMIN_USERNAME`. | | `GEOIP_MAXMIND_LICENSE_KEY` | empty | Optional MaxMind license key for country tracking | +| `ANALYTICS_MAX_BODY_BYTES` | `16384` | Maximum collect request body size. Small because tracker payloads are tiny. | +| `ANALYTICS_MAX_PROPERTIES_BYTES` | `8192` | Maximum custom-event `properties` JSON string size. | +| `ANALYTICS_MAX_SINGLE_PAGE_DURATION` | `4h` | Maximum same-path single-page duration accepted from an exit ping. | +| `ANALYTICS_RATE_LIMIT_ENABLED` | `true` | Enables per-process collect rate limiting. | +| `ANALYTICS_RATE_LIMIT_PER_MINUTE` | `120` | Refill rate for client IP admission and validated site key plus client IP admission. | +| `ANALYTICS_RATE_LIMIT_BURST` | `240` | Short burst allowance for the same collect admission keys. | +| `TRUSTED_PROXY_CIDRS` | private, loopback, and unique-local ranges | CIDRs allowed to supply `X-Forwarded-For` / `X-Real-IP`. Public CDN ranges must be configured explicitly. | +| `GRAPHQL_MAX_BODY_BYTES` | `1048576` | Maximum GraphQL request body size. | +| `DASHBOARD_MAX_DAILY_RANGE_DAYS` | `730` | Maximum daily dashboard date range. | +| `DASHBOARD_MAX_HOURLY_RANGE_DAYS` | `31` | Maximum hourly dashboard date range. | +| `DASHBOARD_MAX_FILTER_VALUES` | `100` | Maximum values per dashboard filter list. | +| `DASHBOARD_MAX_FILTER_STRING_LENGTH` | `2048` | Maximum byte length for each dashboard filter string. | ## Custom Events ```html ``` @@ -199,6 +248,20 @@ services: - INITIAL_ADMIN_USERNAME= - INITIAL_ADMIN_PASSWORD= - ANALYTICS_IDENTITY_SECRET=replace-with-a-second-32-plus-character-secret + - ANALYTICS_MAX_BODY_BYTES=16384 + - ANALYTICS_MAX_PROPERTIES_BYTES=8192 + - ANALYTICS_MAX_SINGLE_PAGE_DURATION=4h + - ANALYTICS_RATE_LIMIT_ENABLED=true + - ANALYTICS_RATE_LIMIT_PER_MINUTE=120 + - ANALYTICS_RATE_LIMIT_BURST=240 + # Trust loopback and private network proxies by default. + # Add CDN/public reverse-proxy ranges explicitly. + - TRUSTED_PROXY_CIDRS=127.0.0.1/32,::1/128,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,fc00::/7 + - GRAPHQL_MAX_BODY_BYTES=1048576 + - DASHBOARD_MAX_DAILY_RANGE_DAYS=730 + - DASHBOARD_MAX_HOURLY_RANGE_DAYS=31 + - DASHBOARD_MAX_FILTER_VALUES=100 + - DASHBOARD_MAX_FILTER_STRING_LENGTH=2048 - GEOIP_DB_PATH=/data/GeoLite2-Country.mmdb - GEOIP_DOWNLOAD_URL=https://download.db-ip.com/free/dbip-country-lite.mmdb.gz - GEOIP_MAXMIND_LICENSE_KEY= diff --git a/dashboard/src/components/event-definitions-card.tsx b/dashboard/src/components/event-definitions-card.tsx index 3b1b6b99..560836d9 100644 --- a/dashboard/src/components/event-definitions-card.tsx +++ b/dashboard/src/components/event-definitions-card.tsx @@ -115,7 +115,10 @@ export const EventDefinitionsCard = ({ const properties = fieldEntries.length > EMPTY_COUNT ? `{\n ${fieldEntries.join(',\n ')}\n}` : '{}'; - return `window.lovelyEye?.track('${eventName}', ${properties});`; + return `window.lovelyEye?.track({ + name: '${eventName}', + properties: ${properties}, +});`; }, [draftFields, draftName]); const handleAddField = (): void => { diff --git a/server/e2e/dashboard_filter_test.go b/server/e2e/dashboard_filter_test.go index e5dd428f..6ba0c8df 100644 --- a/server/e2e/dashboard_filter_test.go +++ b/server/e2e/dashboard_filter_test.go @@ -46,35 +46,32 @@ func TestDashboardFiltering(t *testing.T) { siteID := siteResp.CreateSite.Id testData := []struct { - path string - referrer string - userAgent string - screenWidth int - ip string + path string + referrer string + userAgent string + ip string }{ - {"/home", "https://google.com/search", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0", 1920, "203.0.113.10"}, - {"/home", "https://google.com/search", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0", 1920, "198.51.100.20"}, + {"/home", "https://google.com/search", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0", "203.0.113.10"}, + {"/home", "https://google.com/search", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0", "198.51.100.20"}, - {"/about", "https://facebook.com", "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) Safari/604.1", 375, "192.0.2.30"}, - {"/about", "https://facebook.com", "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) Safari/604.1", 375, "198.18.0.40"}, + {"/about", "https://facebook.com", "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) Safari/604.1", "192.0.2.30"}, + {"/about", "https://facebook.com", "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) Safari/604.1", "198.18.0.40"}, - {"/products", "", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605.1.15", 1440, "198.18.1.50"}, - {"/products", "", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605.1.15", 1440, "198.19.0.60"}, + {"/products", "", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605.1.15", "198.18.1.50"}, + {"/products", "", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605.1.15", "198.19.0.60"}, - {"/home", "https://twitter.com", "Mozilla/5.0 (Android 13; Mobile) Chrome/119.0", 412, "198.19.1.70"}, + {"/home", "https://twitter.com", "Mozilla/5.0 (Android 13; Mobile) Chrome/119.0", "198.19.1.70"}, } for _, data := range testData { payload := map[string]interface{}{ - "site_key": siteKey, - "path": data.path, - "referrer": data.referrer, - "screen_width": data.screenWidth, + "path": data.path, + "referrer": data.referrer, } body, _ := json.Marshal(payload) - req, _ := http.NewRequest("POST", ts.httpServer.URL+"/api/collect", bytes.NewReader(body)) + req, _ := http.NewRequest("POST", collectURL(ts.httpServer.URL, siteKey), bytes.NewReader(body)) req.Header.Set("Content-Type", "application/json") req.Header.Set("Origin", "https://filter-test.com") req.Header.Set("User-Agent", data.userAgent) diff --git a/server/e2e/e2e_test.go b/server/e2e/e2e_test.go index 050e48a2..6f60717e 100644 --- a/server/e2e/e2e_test.go +++ b/server/e2e/e2e_test.go @@ -11,6 +11,7 @@ import ( "net/http" "net/http/cookiejar" "net/http/httptest" + "net/url" "strings" "testing" "time" @@ -44,7 +45,8 @@ func testConfig() config.Config { CookieDomain: "", }, Analytics: config.AnalyticsConfig{ - IdentitySecret: strings.Repeat("a", 32), + IdentitySecret: strings.Repeat("a", 32), + TrustedProxyCIDRs: []string{"127.0.0.1/32"}, }, // Mock tracker.js for testing (avoid file I/O) TrackerJS: []byte(`console.log("mock tracker")`), @@ -107,6 +109,10 @@ func postJSONWithOrigin(client *http.Client, url string, body []byte, origin str return resp, nil } +func collectURL(baseURL, siteKey string) string { + return baseURL + "/api/collect?site_key=" + url.QueryEscape(siteKey) +} + func (ts *testServer) graphqlClient() graphql.Client { return graphql.NewClient(ts.httpServer.URL+"/graphql", ts.httpServer.Client()) } @@ -222,16 +228,14 @@ func TestStatsCollection(t *testing.T) { t.Run("collect page view", func(t *testing.T) { payload := map[string]any{ - "site_key": siteKey, - "path": "/home", - "referrer": "https://google.com", - "screen_width": 1920, + "path": "/home", + "referrer": "https://google.com", } body, _ := json.Marshal(payload) resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://example.com", ) @@ -247,7 +251,6 @@ func TestStatsCollection(t *testing.T) { t.Run("collect custom event", func(t *testing.T) { payload := map[string]any{ - "site_key": siteKey, "name": "button_click", "path": "/home", "properties": `{"button": "signup"}`, @@ -256,7 +259,7 @@ func TestStatsCollection(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://example.com", ) @@ -431,7 +434,6 @@ func TestEventPropertiesValidation(t *testing.T) { t.Run("valid string:string properties accepted", func(t *testing.T) { payload := map[string]interface{}{ - "site_key": siteKey, "name": "purchase", "path": "/checkout", "properties": `{"product_id": "123", "price": "29.99", "currency": "USD"}`, @@ -440,7 +442,7 @@ func TestEventPropertiesValidation(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-test.com", ) @@ -456,7 +458,6 @@ func TestEventPropertiesValidation(t *testing.T) { t.Run("empty properties accepted", func(t *testing.T) { payload := map[string]interface{}{ - "site_key": siteKey, "name": "page_scroll", "path": "/home", "properties": "", @@ -465,7 +466,7 @@ func TestEventPropertiesValidation(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-test.com", ) @@ -481,7 +482,6 @@ func TestEventPropertiesValidation(t *testing.T) { t.Run("invalid JSON properties rejected", func(t *testing.T) { payload := map[string]interface{}{ - "site_key": siteKey, "name": "click", "path": "/page", "properties": `{invalid json}`, @@ -490,7 +490,7 @@ func TestEventPropertiesValidation(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-test.com", ) @@ -506,7 +506,6 @@ func TestEventPropertiesValidation(t *testing.T) { t.Run("malformed JSON properties rejected", func(t *testing.T) { payload := map[string]interface{}{ - "site_key": siteKey, "name": "click", "path": "/page", "properties": `{"key": "value"`, @@ -515,7 +514,7 @@ func TestEventPropertiesValidation(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-test.com", ) @@ -531,7 +530,6 @@ func TestEventPropertiesValidation(t *testing.T) { t.Run("JSON array rejected (must be object)", func(t *testing.T) { payload := map[string]interface{}{ - "site_key": siteKey, "name": "click", "path": "/page", "properties": `["item1", "item2"]`, @@ -540,7 +538,7 @@ func TestEventPropertiesValidation(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-test.com", ) @@ -556,7 +554,6 @@ func TestEventPropertiesValidation(t *testing.T) { t.Run("JSON string rejected (must be object)", func(t *testing.T) { payload := map[string]interface{}{ - "site_key": siteKey, "name": "click", "path": "/page", "properties": `"just a string"`, @@ -565,7 +562,7 @@ func TestEventPropertiesValidation(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-test.com", ) @@ -581,7 +578,6 @@ func TestEventPropertiesValidation(t *testing.T) { t.Run("JSON number rejected (must be object)", func(t *testing.T) { payload := map[string]interface{}{ - "site_key": siteKey, "name": "click", "path": "/page", "properties": `123`, @@ -590,7 +586,7 @@ func TestEventPropertiesValidation(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-test.com", ) @@ -606,7 +602,6 @@ func TestEventPropertiesValidation(t *testing.T) { t.Run("non-string values rejected (must be string:string)", func(t *testing.T) { payload := map[string]interface{}{ - "site_key": siteKey, "name": "click", "path": "/page", "properties": `{"key": 123}`, @@ -615,7 +610,7 @@ func TestEventPropertiesValidation(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-test.com", ) @@ -631,7 +626,6 @@ func TestEventPropertiesValidation(t *testing.T) { t.Run("nested objects rejected (must be string:string)", func(t *testing.T) { payload := map[string]interface{}{ - "site_key": siteKey, "name": "click", "path": "/page", "properties": `{"key": {"nested": "value"}}`, @@ -640,7 +634,7 @@ func TestEventPropertiesValidation(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-test.com", ) @@ -718,7 +712,6 @@ func TestEventPropertiesStored(t *testing.T) { properties := `{"button": "signup", "variant": "blue", "position": "1"}` payload := map[string]interface{}{ - "site_key": siteKey, "name": "button_click", "path": "/landing", "properties": properties, @@ -727,7 +720,7 @@ func TestEventPropertiesStored(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-storage-test.com", ) @@ -778,7 +771,6 @@ func TestEventPropertiesStored(t *testing.T) { for _, ev := range events { payload := map[string]interface{}{ - "site_key": siteKey, "name": ev.name, "path": ev.path, "properties": ev.properties, @@ -787,7 +779,7 @@ func TestEventPropertiesStored(t *testing.T) { resp, err := postJSONWithOrigin( ts.httpServer.Client(), - ts.httpServer.URL+"/api/collect", + collectURL(ts.httpServer.URL, siteKey), body, "https://events-storage-test.com", ) diff --git a/server/internal/README.md b/server/internal/README.md index 484874d2..2dec825d 100644 --- a/server/internal/README.md +++ b/server/internal/README.md @@ -6,12 +6,12 @@ Rules: Modules: - `./auth` - Authentication module with JWT-based auth using HTTP-only cookies. Handles user registration, login, token refresh, and CSRF mitigations via SameSite cookies. -- `./config` - Application configuration loader. Reads environment variables for server, database, auth, and analytics identity settings. +- `./config` - Application configuration loader. Reads environment variables for server, database, auth, analytics identity, collect limits, single-page duration caps, trusted proxies, GraphQL body limits, and dashboard query caps. - `./database` - Database connection layer using [Bun ORM](https://github.com/uptrace/bun). Supports both SQLite and PostgreSQL. -- `./graph` - GraphQL API layer ([gqlgen](https://github.com/99designs/gqlgen)). Contains resolvers, generated code, and schema handlers for the dashboard. -- `./handlers` - HTTP handlers for REST endpoints. Currently handles analytics data collection (page views, events). +- `./graph` - GraphQL API layer ([gqlgen](https://github.com/99designs/gqlgen)). Contains resolvers, generated code, schema handlers, and dashboard date/filter limit enforcement. +- `./handlers` - HTTP handlers for REST endpoints. Handles analytics collection, including query `site_key` validation, body/property caps, collect rate limiting, domain validation, and trusted client-IP resolution. - `./middleware` - HTTP middleware (CORS, logging). Applied to HTTP routes for cross-cutting concerns. - `./models` - Domain models with [Bun](https://github.com/uptrace/bun) annotations. Defines User, Site, Client, Session, Event, and event definition entities. -- `./repository` - Data access layer. Provides CRUD operations for all models using [Bun ORM](https://github.com/uptrace/bun). +- `./repository` - Data access layer. Provides CRUD operations and analytics aggregate queries using [Bun ORM](https://github.com/uptrace/bun). Pageview aggregates bucket by event time where accuracy requires it. - `./server` - Application bootstrap and HTTP server setup. Wires all dependencies and configures routes. -- `./services` - Business logic layer. Contains SiteService and AnalyticsService with domain operations, including pseudonymous visitor identity with UTC-day-skipped rotation and 30-minute session handling. +- `./services` - Business logic layer. Contains SiteService and AnalyticsService with domain operations, including pseudonymous visitor identity with UTC-day-skipped rotation, server-side pageview/exit classification, 30-minute session handling, and capped single-page exit duration. diff --git a/server/internal/config/config.go b/server/internal/config/config.go index 714c4fe5..546197bd 100644 --- a/server/internal/config/config.go +++ b/server/internal/config/config.go @@ -17,6 +17,8 @@ const ( ) const defaultDBDSN string = "file:data/lovely_eye.db?cache=shared&mode=rwc" +const defaultTrustedProxyCIDRs string = "127.0.0.1/32,::1/128,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,fc00::/7" + const ( DBDriverPG DBDriver = "postgres" DBDriverSQLite DBDriver = "sqlite" @@ -29,6 +31,8 @@ type Config struct { Database DatabaseConfig Auth AuthConfig Analytics AnalyticsConfig + GraphQL GraphQLConfig + Dashboard DashboardConfig GeoIP GeoIPConfig LogLevel slog.Level // Log level: DEBUG(-4), INFO(0), WARN(4), ERROR(8) - default: WARN TrackerJS []byte // Optional: for testing, to avoid loading from file @@ -61,7 +65,25 @@ type AuthConfig struct { } type AnalyticsConfig struct { - IdentitySecret string + IdentitySecret string + MaxBodyBytes int64 + MaxPropertiesBytes int + MaxSinglePageDuration time.Duration + RateLimitEnabled bool + RateLimitPerMinute int + RateLimitBurst int + TrustedProxyCIDRs []string +} + +type GraphQLConfig struct { + MaxBodyBytes int64 +} + +type DashboardConfig struct { + MaxDailyRangeDays int + MaxHourlyRangeDays int + MaxFilterValues int + MaxFilterStringLength int } type GeoIPConfig struct { @@ -113,7 +135,23 @@ func Load() Config { InitialAdminPassword: initialAdminPassword, }, Analytics: AnalyticsConfig{ - IdentitySecret: getAnalyticsIdentitySecret(authSecret), + IdentitySecret: getAnalyticsIdentitySecret(authSecret), + MaxBodyBytes: int64(getEnvInt("ANALYTICS_MAX_BODY_BYTES", 16*1024)), + MaxPropertiesBytes: getEnvInt("ANALYTICS_MAX_PROPERTIES_BYTES", 8*1024), + MaxSinglePageDuration: getEnvDuration("ANALYTICS_MAX_SINGLE_PAGE_DURATION", 4*time.Hour), + RateLimitEnabled: getEnvBool("ANALYTICS_RATE_LIMIT_ENABLED", true), + RateLimitPerMinute: getEnvInt("ANALYTICS_RATE_LIMIT_PER_MINUTE", 120), + RateLimitBurst: getEnvInt("ANALYTICS_RATE_LIMIT_BURST", 240), + TrustedProxyCIDRs: getEnvCSV("TRUSTED_PROXY_CIDRS", defaultTrustedProxyCIDRs), + }, + GraphQL: GraphQLConfig{ + MaxBodyBytes: int64(getEnvInt("GRAPHQL_MAX_BODY_BYTES", 1024*1024)), + }, + Dashboard: DashboardConfig{ + MaxDailyRangeDays: getEnvInt("DASHBOARD_MAX_DAILY_RANGE_DAYS", 730), + MaxHourlyRangeDays: getEnvInt("DASHBOARD_MAX_HOURLY_RANGE_DAYS", 31), + MaxFilterValues: getEnvInt("DASHBOARD_MAX_FILTER_VALUES", 100), + MaxFilterStringLength: getEnvInt("DASHBOARD_MAX_FILTER_STRING_LENGTH", 2048), }, GeoIP: GeoIPConfig{ DBPath: getEnv("GEOIP_DB_PATH", defaultIPDBLocalPath), @@ -158,6 +196,19 @@ func getEnv(key, defaultValue string) string { return defaultValue } +func getEnvCSV(key, defaultValue string) []string { + raw := getEnv(key, defaultValue) + parts := strings.Split(raw, ",") + values := make([]string, 0, len(parts)) + for _, part := range parts { + value := strings.TrimSpace(part) + if value != "" { + values = append(values, value) + } + } + return values +} + func getEnvInt(key string, defaultValue int) int { if value := os.Getenv(key); value != "" { if intVal, err := strconv.Atoi(value); err == nil { diff --git a/server/internal/config/config_test.go b/server/internal/config/config_test.go index c7dfa8df..ef3d8b0b 100644 --- a/server/internal/config/config_test.go +++ b/server/internal/config/config_test.go @@ -3,6 +3,7 @@ package config import ( "strings" "testing" + "time" "github.com/stretchr/testify/require" ) @@ -91,6 +92,57 @@ func TestLoad_FallsBackToJWTSecretForAnalyticsIdentity(t *testing.T) { require.Equal(t, strings.Repeat("j", 32), cfg.Analytics.IdentitySecret) } +func TestLoad_UsesAnalyticsHardeningDefaults(t *testing.T) { + t.Setenv("JWT_SECRET", strings.Repeat("j", 32)) + + cfg := Load() + + require.Equal(t, int64(16*1024), cfg.Analytics.MaxBodyBytes) + require.Equal(t, 8*1024, cfg.Analytics.MaxPropertiesBytes) + require.Equal(t, 4*time.Hour, cfg.Analytics.MaxSinglePageDuration) + require.True(t, cfg.Analytics.RateLimitEnabled) + require.Equal(t, 120, cfg.Analytics.RateLimitPerMinute) + require.Equal(t, 240, cfg.Analytics.RateLimitBurst) + require.Contains(t, cfg.Analytics.TrustedProxyCIDRs, "127.0.0.1/32") + require.Contains(t, cfg.Analytics.TrustedProxyCIDRs, "10.0.0.0/8") + require.Equal(t, int64(1024*1024), cfg.GraphQL.MaxBodyBytes) + require.Equal(t, 730, cfg.Dashboard.MaxDailyRangeDays) + require.Equal(t, 31, cfg.Dashboard.MaxHourlyRangeDays) + require.Equal(t, 100, cfg.Dashboard.MaxFilterValues) + require.Equal(t, 2048, cfg.Dashboard.MaxFilterStringLength) +} + +func TestLoad_UsesAnalyticsHardeningOverrides(t *testing.T) { + t.Setenv("JWT_SECRET", strings.Repeat("j", 32)) + t.Setenv("ANALYTICS_MAX_BODY_BYTES", "4096") + t.Setenv("ANALYTICS_MAX_PROPERTIES_BYTES", "1024") + t.Setenv("ANALYTICS_MAX_SINGLE_PAGE_DURATION", "2h") + t.Setenv("ANALYTICS_RATE_LIMIT_ENABLED", "false") + t.Setenv("ANALYTICS_RATE_LIMIT_PER_MINUTE", "12") + t.Setenv("ANALYTICS_RATE_LIMIT_BURST", "24") + t.Setenv("TRUSTED_PROXY_CIDRS", "203.0.113.0/24, 2001:db8::/32") + t.Setenv("GRAPHQL_MAX_BODY_BYTES", "8192") + t.Setenv("DASHBOARD_MAX_DAILY_RANGE_DAYS", "90") + t.Setenv("DASHBOARD_MAX_HOURLY_RANGE_DAYS", "7") + t.Setenv("DASHBOARD_MAX_FILTER_VALUES", "25") + t.Setenv("DASHBOARD_MAX_FILTER_STRING_LENGTH", "128") + + cfg := Load() + + require.Equal(t, int64(4096), cfg.Analytics.MaxBodyBytes) + require.Equal(t, 1024, cfg.Analytics.MaxPropertiesBytes) + require.Equal(t, 2*time.Hour, cfg.Analytics.MaxSinglePageDuration) + require.False(t, cfg.Analytics.RateLimitEnabled) + require.Equal(t, 12, cfg.Analytics.RateLimitPerMinute) + require.Equal(t, 24, cfg.Analytics.RateLimitBurst) + require.Equal(t, []string{"203.0.113.0/24", "2001:db8::/32"}, cfg.Analytics.TrustedProxyCIDRs) + require.Equal(t, int64(8192), cfg.GraphQL.MaxBodyBytes) + require.Equal(t, 90, cfg.Dashboard.MaxDailyRangeDays) + require.Equal(t, 7, cfg.Dashboard.MaxHourlyRangeDays) + require.Equal(t, 25, cfg.Dashboard.MaxFilterValues) + require.Equal(t, 128, cfg.Dashboard.MaxFilterStringLength) +} + func ptr[T any](value T) *T { return &value } diff --git a/server/internal/graph/handler.go b/server/internal/graph/handler.go index 43cd4171..c18c2479 100644 --- a/server/internal/graph/handler.go +++ b/server/internal/graph/handler.go @@ -13,12 +13,16 @@ const ( responseWriterKey contextKey = "response_writer" ) -func Handler(resolver *Resolver) http.HandlerFunc { +func Handler(resolver *Resolver, maxBodyBytes int64) http.HandlerFunc { + if maxBodyBytes <= 0 { + maxBodyBytes = 1024 * 1024 + } srv := handler.NewDefaultServer(NewExecutableSchema(Config{ Resolvers: resolver, })) return func(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, maxBodyBytes) ctx := context.WithValue(r.Context(), responseWriterKey, w) srv.ServeHTTP(w, r.WithContext(ctx)) diff --git a/server/internal/graph/helpers.go b/server/internal/graph/helpers.go index 1a294654..a596d0e8 100644 --- a/server/internal/graph/helpers.go +++ b/server/internal/graph/helpers.go @@ -1,6 +1,7 @@ package graph import ( + "fmt" "strconv" "strings" "time" @@ -11,13 +12,13 @@ import ( "github.com/lovely-eye/server/internal/services" ) -func parseDateRangeInput(input *model.DateRangeInput) (time.Time, time.Time) { +func parseDateRangeInput(input *model.DateRangeInput, maxRangeDays int) (time.Time, time.Time, error) { now := time.Now() defaultFrom := now.AddDate(0, 0, -30) defaultTo := now if input == nil { - return defaultFrom, defaultTo + return defaultFrom, defaultTo, nil } from := defaultFrom @@ -30,12 +31,32 @@ func parseDateRangeInput(input *model.DateRangeInput) (time.Time, time.Time) { to = *input.To } - return from, to + if err := validateDateRange(from, to, maxRangeDays); err != nil { + return time.Time{}, time.Time{}, err + } + return from, to, nil +} + +func validateDateRange(from, to time.Time, maxRangeDays int) error { + if from.After(to) { + return fmt.Errorf("date range from must be before to") + } + if maxRangeDays > 0 && to.Sub(from) > time.Duration(maxRangeDays)*24*time.Hour { + return fmt.Errorf("date range exceeds %d days", maxRangeDays) + } + return nil } -func parseFilterInput(input *model.FilterInput) services.DashboardFilter { +func parseFilterInput(input *model.FilterInput, limits DashboardLimits) (services.DashboardFilter, error) { if input == nil { - return services.DashboardFilter{} + return services.DashboardFilter{}, nil + } + + if err := validateStringFilters(limits, input.Referrer, input.Browser, input.Device, input.Os, input.Page, input.Country, input.EventName, input.EventPath, input.EventDefinitionID); err != nil { + return services.DashboardFilter{}, err + } + if limits.MaxFilterValues > 0 && len(input.EventType) > limits.MaxFilterValues { + return services.DashboardFilter{}, fmt.Errorf("filter eventType exceeds %d values", limits.MaxFilterValues) } referrers := make([]string, 0, len(input.Referrer)) @@ -57,7 +78,24 @@ func parseFilterInput(input *model.FilterInput) services.DashboardFilter { EventName: input.EventName, EventPath: input.EventPath, EventDefinitionIDs: parseEventDefinitionIDs(input.EventDefinitionID), + }, nil +} + +func validateStringFilters(limits DashboardLimits, groups ...[]string) error { + for _, values := range groups { + if limits.MaxFilterValues > 0 && len(values) > limits.MaxFilterValues { + return fmt.Errorf("filter exceeds %d values", limits.MaxFilterValues) + } + if limits.MaxFilterStringLength <= 0 { + continue + } + for _, value := range values { + if len(value) > limits.MaxFilterStringLength { + return fmt.Errorf("filter value exceeds %d bytes", limits.MaxFilterStringLength) + } + } } + return nil } func isFilterEmpty(filter services.DashboardFilter) bool { diff --git a/server/internal/graph/resolver.go b/server/internal/graph/resolver.go index c8197fa3..f8085a99 100644 --- a/server/internal/graph/resolver.go +++ b/server/internal/graph/resolver.go @@ -11,6 +11,14 @@ type Resolver struct { AnalyticsService *services.AnalyticsService CountryService *services.CountryService EventDefService *services.EventDefinitionService + DashboardLimits DashboardLimits +} + +type DashboardLimits struct { + MaxDailyRangeDays int + MaxHourlyRangeDays int + MaxFilterValues int + MaxFilterStringLength int } func NewResolver( @@ -19,12 +27,26 @@ func NewResolver( analyticsService *services.AnalyticsService, countryService *services.CountryService, eventDefService *services.EventDefinitionService, + dashboardLimits DashboardLimits, ) *Resolver { + if dashboardLimits.MaxDailyRangeDays <= 0 { + dashboardLimits.MaxDailyRangeDays = 730 + } + if dashboardLimits.MaxHourlyRangeDays <= 0 { + dashboardLimits.MaxHourlyRangeDays = 31 + } + if dashboardLimits.MaxFilterValues <= 0 { + dashboardLimits.MaxFilterValues = 100 + } + if dashboardLimits.MaxFilterStringLength <= 0 { + dashboardLimits.MaxFilterStringLength = 2048 + } return &Resolver{ AuthService: authService, SiteService: siteService, AnalyticsService: analyticsService, CountryService: countryService, EventDefService: eventDefService, + DashboardLimits: dashboardLimits, } } diff --git a/server/internal/graph/schema.resolvers.go b/server/internal/graph/schema.resolvers.go index 44eb07eb..0ac8c9a1 100644 --- a/server/internal/graph/schema.resolvers.go +++ b/server/internal/graph/schema.resolvers.go @@ -229,6 +229,13 @@ func (r *dashboardStatsResolver) DailyStats(ctx context.Context, obj *model.Dash if limit != nil { pointLimit = clampLimit(*limit, maxTimeSeriesPoints) } + maxRangeDays := r.DashboardLimits.MaxDailyRangeDays + if selectedBucket == services.TimeBucketHourly { + maxRangeDays = r.DashboardLimits.MaxHourlyRangeDays + } + if err := validateDateRange(obj.From, obj.To, maxRangeDays); err != nil { + return nil, err + } offsetValue := 0 if offset != nil { @@ -597,8 +604,14 @@ func (r *queryResolver) Dashboard(ctx context.Context, siteID string, dateRange return nil, fmt.Errorf("failed to get site: %w", err) } - from, to := parseDateRangeInput(dateRange) - filterOpts := parseFilterInput(filter) + from, to, err := parseDateRangeInput(dateRange, r.DashboardLimits.MaxDailyRangeDays) + if err != nil { + return nil, err + } + filterOpts, err := parseFilterInput(filter, r.DashboardLimits) + if err != nil { + return nil, err + } stats, err := r.AnalyticsService.GetDashboardOverviewWithFilter(ctx, services.AnalyticsQuery{ SiteID: id, @@ -709,7 +722,10 @@ func (r *queryResolver) Events(ctx context.Context, siteID string, dateRange *mo return nil, fmt.Errorf("failed to get site: %w", err) } - from, to := parseDateRangeInput(dateRange) + from, to, err := parseDateRangeInput(dateRange, r.DashboardLimits.MaxDailyRangeDays) + if err != nil { + return nil, err + } lim := defaultEventsPage off := 0 @@ -724,7 +740,10 @@ func (r *queryResolver) Events(ctx context.Context, siteID string, dateRange *mo off = 0 } - filterOpts := parseFilterInput(filter) + filterOpts, err := parseFilterInput(filter, r.DashboardLimits) + if err != nil { + return nil, err + } var events []*models.Event var total int @@ -764,11 +783,17 @@ func (r *queryResolver) EventCounts(ctx context.Context, siteID string, dateRang return nil, fmt.Errorf("failed to get site: %w", err) } - from, to := parseDateRangeInput(dateRange) + from, to, err := parseDateRangeInput(dateRange, r.DashboardLimits.MaxDailyRangeDays) + if err != nil { + return nil, err + } limit, offset := normalizePaging(paging) - filterOpts := parseFilterInput(filter) + filterOpts, err := parseFilterInput(filter, r.DashboardLimits) + if err != nil { + return nil, err + } eventCounts, err := r.AnalyticsService.GetEventCounts(ctx, services.AnalyticsQuery{ SiteID: id, diff --git a/server/internal/handlers/analytics_handler.go b/server/internal/handlers/analytics_handler.go index a0ba7178..d89587d6 100644 --- a/server/internal/handlers/analytics_handler.go +++ b/server/internal/handlers/analytics_handler.go @@ -2,8 +2,11 @@ package handlers import ( "encoding/json" + "errors" "net/http" + "strings" + "github.com/lovely-eye/server/internal/models" "github.com/lovely-eye/server/internal/services" "github.com/lovely-eye/server/pkg/clientip" ) @@ -11,23 +14,47 @@ import ( type AnalyticsHandler struct { analyticsService *services.AnalyticsService siteService *services.SiteService + config AnalyticsHandlerConfig + ipResolver *clientip.Resolver + rateLimiter *CollectRateLimiter } -func NewAnalyticsHandler(analyticsService *services.AnalyticsService, siteService *services.SiteService) *AnalyticsHandler { +type AnalyticsHandlerConfig struct { + MaxBodyBytes int64 + MaxPropertiesBytes int +} + +func NewAnalyticsHandler( + analyticsService *services.AnalyticsService, + siteService *services.SiteService, + config AnalyticsHandlerConfig, + ipResolver *clientip.Resolver, + rateLimiter *CollectRateLimiter, +) *AnalyticsHandler { + if config.MaxBodyBytes <= 0 { + config.MaxBodyBytes = 16 * 1024 + } + if config.MaxPropertiesBytes <= 0 { + config.MaxPropertiesBytes = 8 * 1024 + } + if ipResolver == nil { + ipResolver = clientip.MustNewResolver(nil) + } return &AnalyticsHandler{ analyticsService: analyticsService, siteService: siteService, + config: config, + ipResolver: ipResolver, + rateLimiter: rateLimiter, } } type collectRequest struct { - SiteKey string `json:"site_key"` Path string `json:"path"` Name string `json:"name"` Properties string `json:"properties"` Referrer string `json:"referrer"` - ScreenWidth int `json:"screen_width"` - Duration int `json:"duration"` + Exit bool `json:"exit"` UTMSource string `json:"utm_source"` UTMMedium string `json:"utm_medium"` UTMCampaign string `json:"utm_campaign"` @@ -39,55 +66,80 @@ func (h *AnalyticsHandler) Collect(w http.ResponseWriter, r *http.Request) { return } - var req collectRequest - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - respondError(w, http.StatusBadRequest, "Invalid request body") + siteKey := strings.TrimSpace(r.URL.Query().Get("site_key")) + if siteKey == "" { + respondError(w, http.StatusBadRequest, "site_key query parameter is required") return } - if req.SiteKey == "" { - respondError(w, http.StatusBadRequest, "site_key is required") + ip := h.clientIP(r) + if !h.allowCollect("ip|" + ip) { + respondError(w, http.StatusTooManyRequests, "rate limit exceeded") return } - if !h.applyAnalyticsCORS(w, r, req.SiteKey) { + site, err := h.loadAnalyticsSite(r, siteKey) + if err != nil { w.WriteHeader(http.StatusNoContent) return } + if !h.applyAnalyticsCORSForSite(w, r, site) { + w.WriteHeader(http.StatusNoContent) + return + } + if !h.allowCollect("site|" + site.PublicKey + "|ip|" + ip) { + respondError(w, http.StatusTooManyRequests, "rate limit exceeded") + return + } + + r.Body = http.MaxBytesReader(w, r.Body, h.config.MaxBodyBytes) + var req collectRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + var maxBytesErr *http.MaxBytesError + if errors.As(err, &maxBytesErr) { + respondError(w, http.StatusRequestEntityTooLarge, "request body is too large") + return + } + respondError(w, http.StatusBadRequest, "Invalid request body") + return + } if req.Properties != "" { + if len(req.Properties) > h.config.MaxPropertiesBytes { + respondError(w, http.StatusRequestEntityTooLarge, "properties are too large") + return + } var props map[string]interface{} - if err := json.Unmarshal([]byte(req.Properties), &props); err != nil { + if err := json.Unmarshal([]byte(req.Properties), &props); err != nil || props == nil { respondError(w, http.StatusBadRequest, "properties must be a JSON object") return } } - var err error + if req.Path == "" { + respondError(w, http.StatusBadRequest, "path is required") + return + } + if req.Name != "" { err = h.analyticsService.CollectEvent(r.Context(), services.EventInput{ - SiteKey: req.SiteKey, + SiteKey: siteKey, Name: req.Name, Path: req.Path, Properties: req.Properties, UserAgent: r.UserAgent(), - IP: clientip.GetClientIP(r.Header.Get("X-Forwarded-For"), r.Header.Get("X-Real-IP"), r.RemoteAddr), + IP: ip, Origin: r.Header.Get("Origin"), Referer: r.Header.Get("Referer"), }) } else { - if req.Path == "" { - respondError(w, http.StatusBadRequest, "path is required") - return - } err = h.analyticsService.CollectPageView(r.Context(), services.CollectInput{ - SiteKey: req.SiteKey, + SiteKey: siteKey, Path: req.Path, + Exit: req.Exit, Referrer: req.Referrer, - ScreenWidth: req.ScreenWidth, - Duration: req.Duration, UserAgent: r.UserAgent(), - IP: clientip.GetClientIP(r.Header.Get("X-Forwarded-For"), r.Header.Get("X-Real-IP"), r.RemoteAddr), + IP: ip, Origin: r.Header.Get("Origin"), Referer: r.Header.Get("Referer"), UTMSource: req.UTMSource, @@ -109,13 +161,14 @@ func (h *AnalyticsHandler) Event(w http.ResponseWriter, r *http.Request) { } func (h *AnalyticsHandler) handleAnalyticsPreflight(w http.ResponseWriter, r *http.Request) { - siteKey := r.URL.Query().Get("site_key") + siteKey := strings.TrimSpace(r.URL.Query().Get("site_key")) if siteKey == "" { w.WriteHeader(http.StatusNoContent) return } - if !h.applyAnalyticsCORS(w, r, siteKey) { + site, err := h.loadAnalyticsSite(r, siteKey) + if err != nil || !h.applyAnalyticsCORSForSite(w, r, site) { w.WriteHeader(http.StatusNoContent) return } @@ -123,12 +176,7 @@ func (h *AnalyticsHandler) handleAnalyticsPreflight(w http.ResponseWriter, r *ht w.WriteHeader(http.StatusNoContent) } -func (h *AnalyticsHandler) applyAnalyticsCORS(w http.ResponseWriter, r *http.Request, siteKey string) bool { - site, err := h.siteService.GetByPublicKey(r.Context(), siteKey) - if err != nil { - return false - } - +func (h *AnalyticsHandler) applyAnalyticsCORSForSite(w http.ResponseWriter, r *http.Request, site *models.Site) bool { origin := r.Header.Get("Origin") referer := r.Header.Get("Referer") if !services.IsAllowedDomain(origin, referer, site.Domains) { @@ -148,6 +196,18 @@ func (h *AnalyticsHandler) applyAnalyticsCORS(w http.ResponseWriter, r *http.Req return true } +func (h *AnalyticsHandler) loadAnalyticsSite(r *http.Request, siteKey string) (*models.Site, error) { + return h.siteService.GetByPublicKey(r.Context(), siteKey) +} + +func (h *AnalyticsHandler) clientIP(r *http.Request) string { + return h.ipResolver.GetClientIP(r.Header.Get("X-Forwarded-For"), r.Header.Get("X-Real-IP"), r.RemoteAddr) +} + +func (h *AnalyticsHandler) allowCollect(key string) bool { + return h.rateLimiter == nil || h.rateLimiter.Allow(key) +} + func respondError(w http.ResponseWriter, status int, message string) { http.Error(w, message, status) } diff --git a/server/internal/handlers/analytics_handler_test.go b/server/internal/handlers/analytics_handler_test.go new file mode 100644 index 00000000..4a67c133 --- /dev/null +++ b/server/internal/handlers/analytics_handler_test.go @@ -0,0 +1,266 @@ +package handlers + +import ( + "context" + "database/sql" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/lovely-eye/server/internal/database" + "github.com/lovely-eye/server/internal/models" + "github.com/lovely-eye/server/internal/repository" + "github.com/lovely-eye/server/internal/services" + "github.com/lovely-eye/server/pkg/clientip" + "github.com/stretchr/testify/require" + "github.com/uptrace/bun" + "github.com/uptrace/bun/dialect/sqlitedialect" + + _ "modernc.org/sqlite" +) + +func TestAnalyticsHandlerCollectRequiresQuerySiteKey(t *testing.T) { + handler := NewAnalyticsHandler(nil, nil, AnalyticsHandlerConfig{}, nil, nil) + req := httptest.NewRequest(http.MethodPost, "/api/collect", strings.NewReader(`{"path":"/pricing"}`)) + rec := httptest.NewRecorder() + + handler.Collect(rec, req) + + require.Equal(t, http.StatusBadRequest, rec.Code) +} + +func TestAnalyticsHandlerCollectRejectsOversizedBody(t *testing.T) { + handler, site := newAnalyticsHandlerTestFixture(t, AnalyticsHandlerConfig{ + MaxBodyBytes: 8, + MaxPropertiesBytes: 1024, + }, nil) + req := newAnalyticsCollectRequest(site.PublicKey, `{"path":"/pricing"}`) + rec := httptest.NewRecorder() + + handler.Collect(rec, req) + + require.Equal(t, http.StatusRequestEntityTooLarge, rec.Code) +} + +func TestAnalyticsHandlerCollectRejectsOversizedProperties(t *testing.T) { + handler, site := newAnalyticsHandlerTestFixture(t, AnalyticsHandlerConfig{ + MaxBodyBytes: 4096, + MaxPropertiesBytes: 10, + }, nil) + req := newAnalyticsCollectRequest(site.PublicKey, `{"path":"/pricing","properties":"{\"code\":\"PAYMENT_DECLINED\"}"}`) + rec := httptest.NewRecorder() + + handler.Collect(rec, req) + + require.Equal(t, http.StatusRequestEntityTooLarge, rec.Code) +} + +func TestAnalyticsHandlerCollectRateLimitsBySiteAndIP(t *testing.T) { + limiter := NewCollectRateLimiter(true, 1, 1) + handler, site := newAnalyticsHandlerTestFixture(t, AnalyticsHandlerConfig{ + MaxBodyBytes: 4096, + MaxPropertiesBytes: 1024, + }, limiter) + + req1 := newAnalyticsCollectRequest(site.PublicKey, `{"path":"/pricing"}`) + rec1 := httptest.NewRecorder() + handler.Collect(rec1, req1) + require.Equal(t, http.StatusNoContent, rec1.Code) + + req2 := newAnalyticsCollectRequest(site.PublicKey, `{"path":"/pricing"}`) + rec2 := httptest.NewRecorder() + handler.Collect(rec2, req2) + require.Equal(t, http.StatusTooManyRequests, rec2.Code) +} + +func TestAnalyticsHandlerCollectRateLimitsRotatedInvalidSiteKeysByIP(t *testing.T) { + limiter := NewCollectRateLimiter(true, 1, 1) + handler, _ := newAnalyticsHandlerTestFixture(t, AnalyticsHandlerConfig{ + MaxBodyBytes: 4096, + MaxPropertiesBytes: 1024, + }, limiter) + + req1 := newAnalyticsCollectRequest("missing-site-key-a", `{"path":"/pricing"}`) + rec1 := httptest.NewRecorder() + handler.Collect(rec1, req1) + require.Equal(t, http.StatusNoContent, rec1.Code) + + req2 := newAnalyticsCollectRequest("missing-site-key-b", `{"path":"/pricing"}`) + rec2 := httptest.NewRecorder() + handler.Collect(rec2, req2) + require.Equal(t, http.StatusTooManyRequests, rec2.Code) +} + +func TestAnalyticsHandlerCollectRejectsCustomEventWithoutPath(t *testing.T) { + handler, site := newAnalyticsHandlerTestFixture(t, AnalyticsHandlerConfig{ + MaxBodyBytes: 4096, + MaxPropertiesBytes: 1024, + }, nil) + req := newAnalyticsCollectRequest(site.PublicKey, `{"name":"checkout_failed"}`) + rec := httptest.NewRecorder() + + handler.Collect(rec, req) + + require.Equal(t, http.StatusBadRequest, rec.Code) +} + +func TestAnalyticsHandlerCollectRejectsLegacyDurationOnlyPayload(t *testing.T) { + handler, site := newAnalyticsHandlerTestFixture(t, AnalyticsHandlerConfig{ + MaxBodyBytes: 4096, + MaxPropertiesBytes: 1024, + }, nil) + req := newAnalyticsCollectRequest(site.PublicKey, `{"duration":60}`) + rec := httptest.NewRecorder() + + handler.Collect(rec, req) + + require.Equal(t, http.StatusBadRequest, rec.Code) +} + +func TestAnalyticsHandlerCollectHonorsForwardedIPFromTrustedRemote(t *testing.T) { + fixture := newAnalyticsHandlerTestFixtureWithResolver(t, AnalyticsHandlerConfig{ + MaxBodyBytes: 4096, + MaxPropertiesBytes: 1024, + }, nil, clientip.MustNewResolver([]string{"10.0.0.0/8"})) + insertAnalyticsHandlerBlockedIP(t, fixture.db, fixture.site.ID, "198.51.100.9") + + req := newAnalyticsCollectRequest(fixture.site.PublicKey, `{"path":"/pricing"}`) + req.RemoteAddr = "10.1.2.3:12345" + req.Header.Set("X-Forwarded-For", "198.51.100.9") + rec := httptest.NewRecorder() + + fixture.handler.Collect(rec, req) + + require.Equal(t, http.StatusNoContent, rec.Code) + require.Equal(t, 0, countAnalyticsHandlerPageViews(t, fixture.db, fixture.site.ID)) +} + +func TestAnalyticsHandlerCollectIgnoresForwardedIPFromUntrustedRemote(t *testing.T) { + fixture := newAnalyticsHandlerTestFixtureWithResolver(t, AnalyticsHandlerConfig{ + MaxBodyBytes: 4096, + MaxPropertiesBytes: 1024, + }, nil, clientip.MustNewResolver([]string{"10.0.0.0/8"})) + insertAnalyticsHandlerBlockedIP(t, fixture.db, fixture.site.ID, "198.51.100.9") + + req := newAnalyticsCollectRequest(fixture.site.PublicKey, `{"path":"/pricing"}`) + req.RemoteAddr = "203.0.113.10:12345" + req.Header.Set("X-Forwarded-For", "198.51.100.9") + rec := httptest.NewRecorder() + + fixture.handler.Collect(rec, req) + + require.Equal(t, http.StatusNoContent, rec.Code) + require.Equal(t, 1, countAnalyticsHandlerPageViews(t, fixture.db, fixture.site.ID)) +} + +type analyticsHandlerTestFixture struct { + handler *AnalyticsHandler + site *models.Site + db *bun.DB +} + +func newAnalyticsHandlerTestFixture(t *testing.T, handlerConfig AnalyticsHandlerConfig, limiter *CollectRateLimiter) (*AnalyticsHandler, *models.Site) { + t.Helper() + + fixture := newAnalyticsHandlerTestFixtureWithResolver(t, handlerConfig, limiter, clientip.MustNewResolver(nil)) + return fixture.handler, fixture.site +} + +func newAnalyticsHandlerTestFixtureWithResolver( + t *testing.T, + handlerConfig AnalyticsHandlerConfig, + limiter *CollectRateLimiter, + resolver *clientip.Resolver, +) *analyticsHandlerTestFixture { + t.Helper() + + db := setupAnalyticsHandlerTestDB(t) + ctx := context.Background() + + user := &models.User{ + Username: "handler-user", + PasswordHash: "hash", + Role: "admin", + } + _, err := db.NewInsert().Model(user).Exec(ctx) + require.NoError(t, err) + + site := &models.Site{ + UserID: user.ID, + Name: "Handler Site", + PublicKey: "handler-site-key", + } + _, err = db.NewInsert().Model(site).Exec(ctx) + require.NoError(t, err) + + domain := &models.SiteDomain{ + SiteID: site.ID, + Domain: "handler.test", + Position: 0, + } + _, err = db.NewInsert().Model(domain).Exec(ctx) + require.NoError(t, err) + + siteRepo := repository.NewSiteRepository(db) + analyticsRepo := repository.NewAnalyticsRepository(db) + eventDefinitionRepo := repository.NewEventDefinitionRepository(db) + siteService := services.NewSiteService(siteRepo) + analyticsService := services.NewAnalyticsService(analyticsRepo, siteRepo, eventDefinitionRepo, nil, nil, strings.Repeat("a", 32)) + if resolver == nil { + resolver = clientip.MustNewResolver(nil) + } + + return &analyticsHandlerTestFixture{ + handler: NewAnalyticsHandler(analyticsService, siteService, handlerConfig, resolver, limiter), + site: site, + db: db, + } +} + +func setupAnalyticsHandlerTestDB(t *testing.T) *bun.DB { + t.Helper() + + sqldb, err := sql.Open("sqlite", ":memory:") + require.NoError(t, err) + + db := bun.NewDB(sqldb, sqlitedialect.New()) + require.NoError(t, database.Migrate(context.Background(), db)) + + t.Cleanup(func() { + require.NoError(t, db.Close()) + }) + + return db +} + +func newAnalyticsCollectRequest(siteKey string, body string) *http.Request { + req := httptest.NewRequest(http.MethodPost, "/api/collect?site_key="+siteKey, strings.NewReader(body)) + req.RemoteAddr = "203.0.113.10:12345" + req.Header.Set("Origin", "https://handler.test") + req.Header.Set("Content-Type", "text/plain;charset=UTF-8") + return req +} + +func insertAnalyticsHandlerBlockedIP(t *testing.T, db *bun.DB, siteID int64, ip string) { + t.Helper() + + _, err := db.NewInsert().Model(&models.SiteBlockedIP{ + SiteID: siteID, + IP: ip, + }).Exec(context.Background()) + require.NoError(t, err) +} + +func countAnalyticsHandlerPageViews(t *testing.T, db *bun.DB, siteID int64) int { + t.Helper() + + count, err := db.NewSelect(). + TableExpr("events e"). + Join("INNER JOIN sessions s ON e.session_id = s.id"). + Where("s.site_id = ?", siteID). + Where("e.definition_id IS NULL"). + Count(context.Background()) + require.NoError(t, err) + return count +} diff --git a/server/internal/handlers/rate_limiter.go b/server/internal/handlers/rate_limiter.go new file mode 100644 index 00000000..721c7d3d --- /dev/null +++ b/server/internal/handlers/rate_limiter.go @@ -0,0 +1,74 @@ +package handlers + +import ( + "sync" + "time" +) + +type CollectRateLimiter struct { + enabled bool + rate float64 + burst float64 + now func() time.Time + + mu sync.Mutex + buckets map[string]*collectBucket + lastCleanup time.Time +} + +type collectBucket struct { + tokens float64 + seenAt time.Time +} + +func NewCollectRateLimiter(enabled bool, perMinute, burst int) *CollectRateLimiter { + if perMinute <= 0 || burst <= 0 { + enabled = false + } + return &CollectRateLimiter{ + enabled: enabled, + rate: float64(perMinute) / 60.0, + burst: float64(burst), + now: time.Now, + buckets: make(map[string]*collectBucket), + } +} + +func (l *CollectRateLimiter) Allow(key string) bool { + if l == nil || !l.enabled { + return true + } + + now := l.now() + l.mu.Lock() + defer l.mu.Unlock() + + if l.lastCleanup.IsZero() { + l.lastCleanup = now + } else if now.Sub(l.lastCleanup) > 10*time.Minute { + for key, bucket := range l.buckets { + if now.Sub(bucket.seenAt) > 15*time.Minute { + delete(l.buckets, key) + } + } + l.lastCleanup = now + } + + bucket := l.buckets[key] + if bucket == nil { + bucket = &collectBucket{tokens: l.burst, seenAt: now} + l.buckets[key] = bucket + } + + elapsed := now.Sub(bucket.seenAt).Seconds() + if elapsed > 0 { + bucket.tokens = min(l.burst, bucket.tokens+elapsed*l.rate) + } + bucket.seenAt = now + + if bucket.tokens < 1 { + return false + } + bucket.tokens-- + return true +} diff --git a/server/internal/repository/analytics_repository.go b/server/internal/repository/analytics_repository.go index 3832978a..deafd050 100644 --- a/server/internal/repository/analytics_repository.go +++ b/server/internal/repository/analytics_repository.go @@ -5,6 +5,7 @@ import ( "database/sql" "errors" "fmt" + "sort" "strings" "time" @@ -169,14 +170,17 @@ func (r *AnalyticsRepository) GetActiveSession(ctx context.Context, siteID, clie func (r *AnalyticsRepository) GetActiveSessionTx(ctx context.Context, tx bun.IDB, siteID, clientID int64, sinceUnix int64) (*models.Session, error) { session := new(models.Session) - err := tx.NewSelect(). + q := tx.NewSelect(). Model(session). Where("site_id = ?", siteID). Where("client_id = ?", clientID). Where("exit_time > ?", sinceUnix). Order("exit_time DESC"). - Limit(1). - Scan(ctx) + Limit(1) + if r.isPostgres() { + q = q.For("UPDATE") + } + err := q.Scan(ctx) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, sql.ErrNoRows @@ -186,6 +190,11 @@ func (r *AnalyticsRepository) GetActiveSessionTx(ctx context.Context, tx bun.IDB return session, nil } +func (r *AnalyticsRepository) isPostgres() bool { + dialect := fmt.Sprint(r.db.Dialect().Name()) + return dialect == "pg" || dialect == "postgres" || dialect == "postgresql" +} + func (r *AnalyticsRepository) GetRecentPageViewEvent(ctx context.Context, sessionID int64, path string, since int64) (*models.Event, error) { event := new(models.Event) err := r.db.NewSelect(). @@ -537,6 +546,7 @@ func (r *AnalyticsRepository) GetBounceRate(ctx context.Context, siteID int64, f Where("site_id = ?", siteID). Where("enter_time >= ?", fromUnix). Where("enter_time <= ?", toUnix). + Where("page_view_count > 0"). Scan(ctx, &result) if err != nil { return 0, fmt.Errorf("failed to get bounce rate: %w", err) @@ -557,7 +567,8 @@ func (r *AnalyticsRepository) GetAvgSessionDuration(ctx context.Context, siteID Where("site_id = ?", siteID). Where("enter_time >= ?", fromUnix). Where("enter_time <= ?", toUnix). - Where("page_view_count > 1"). + Where("page_view_count > 0"). + Where("exit_time > enter_time"). Scan(ctx, &avg) if err != nil { return 0, fmt.Errorf("failed to get average session duration: %w", err) @@ -580,7 +591,7 @@ func (r *AnalyticsRepository) GetTopPages(ctx context.Context, siteID int64, fro Join("INNER JOIN sessions s ON e.session_id = s.id"). ColumnExpr("e.path"). ColumnExpr("COUNT(*) as views"). - ColumnExpr("COUNT(DISTINCT e.session_id) as visitors"). + ColumnExpr("COUNT(DISTINCT s.client_id) as visitors"). Where("s.site_id = ?", siteID). Where("e.definition_id IS NULL"). Where("e.time >= ?", fromUnix). @@ -717,22 +728,12 @@ type DailyVisitorStats struct { } func (r *AnalyticsRepository) GetDailyStats(ctx context.Context, siteID int64, from, to time.Time) ([]DailyVisitorStats, error) { - var stats []DailyVisitorStats - fromUnix := from.Unix() - toUnix := to.Unix() - bucketExpr := r.timeBucketExpression(TimeBucketDaily) - err := r.db.NewSelect(). - Model((*models.Session)(nil)). - ColumnExpr(bucketExpr+" as date_bucket"). - ColumnExpr("COUNT(DISTINCT client_id) as visitors"). - ColumnExpr("SUM(page_view_count) as page_views"). - ColumnExpr("COUNT(*) as sessions"). - Where("site_id = ?", siteID). - Where("enter_time >= ?", fromUnix). - Where("enter_time <= ?", toUnix). - GroupExpr(bucketExpr). - Order("date_bucket ASC"). - Scan(ctx, &stats) + stats, err := r.GetTimeSeriesStatsWithFilter(ctx, AnalyticsQuery{ + SiteID: siteID, + From: from, + To: to, + Bucket: TimeBucketDaily, + }) if err != nil { return nil, fmt.Errorf("failed to get daily stats: %w", err) } @@ -751,7 +752,7 @@ func (r *AnalyticsRepository) GetActivePages(ctx context.Context, siteID int64, Model((*models.Event)(nil)). Join("INNER JOIN sessions s ON e.session_id = s.id"). ColumnExpr("e.path"). - ColumnExpr("COUNT(DISTINCT e.session_id) as visitors"). + ColumnExpr("COUNT(DISTINCT s.client_id) as visitors"). Where("s.site_id = ?", siteID). Where("e.definition_id IS NULL"). Where("e.time >= ?", sinceUnix). @@ -990,7 +991,8 @@ func (r *AnalyticsRepository) GetBounceRateWithFilter(ctx context.Context, query ColumnExpr(bouncedExpr+" as bounced"). Where("s.site_id = ?", query.SiteID). Where("s.enter_time >= ?", fromUnix). - Where("s.enter_time <= ?", toUnix) + Where("s.enter_time <= ?", toUnix). + Where("s.page_view_count > 0") q = applySessionFilters(q, query.Filter) err := q.Scan(ctx, &result) if err != nil { @@ -1012,7 +1014,8 @@ func (r *AnalyticsRepository) GetAvgSessionDurationWithFilter(ctx context.Contex Where("s.site_id = ?", query.SiteID). Where("s.enter_time >= ?", fromUnix). Where("s.enter_time <= ?", toUnix). - Where("s.page_view_count > 1") + Where("s.page_view_count > 0"). + Where("s.exit_time > s.enter_time") q = applySessionFilters(q, query.Filter) err := q.Scan(ctx, &avg) if err != nil { @@ -1030,7 +1033,7 @@ func (r *AnalyticsRepository) GetTopPagesWithFilter(ctx context.Context, query A Join("INNER JOIN sessions s ON e.session_id = s.id"). ColumnExpr("e.path"). ColumnExpr("COUNT(*) as views"). - ColumnExpr("COUNT(DISTINCT e.session_id) as visitors"). + ColumnExpr("COUNT(DISTINCT s.client_id) as visitors"). Where("s.site_id = ?", query.SiteID). Where("e.definition_id IS NULL"). Where("e.time >= ?", fromUnix). @@ -1159,7 +1162,7 @@ func (r *AnalyticsRepository) GetTopPagesWithFilterPaged(ctx context.Context, qu Join("INNER JOIN sessions s ON e.session_id = s.id"). ColumnExpr("e.path"). ColumnExpr("COUNT(*) as views"). - ColumnExpr("COUNT(DISTINCT e.session_id) as visitors"). + ColumnExpr("COUNT(DISTINCT s.client_id) as visitors"). Where("s.site_id = ?", query.SiteID). Where("e.definition_id IS NULL"). Where("e.time >= ?", fromUnix). @@ -1411,49 +1414,108 @@ const ( ) func (r *AnalyticsRepository) GetTimeSeriesStatsWithFilter(ctx context.Context, query AnalyticsQuery) ([]DailyVisitorStats, error) { - var stats []DailyVisitorStats fromUnix := query.From.Unix() toUnix := query.To.Unix() - bucketExpr := r.timeBucketExpression(query.Bucket) - base := r.db.NewSelect(). + sessionBucketExpr := r.sessionTimeBucketExpression(query.Bucket) + eventBucketExpr := r.eventTimeBucketExpression(query.Bucket) + + var sessionStats []struct { + DateBucket int64 + Visitors int + Sessions int + } + sessionQuery := r.db.NewSelect(). TableExpr("sessions s"). - ColumnExpr(bucketExpr+" as date_bucket"). + ColumnExpr(sessionBucketExpr+" as date_bucket"). ColumnExpr("COUNT(DISTINCT s.client_id) as visitors"). - ColumnExpr("SUM(s.page_view_count) as page_views"). ColumnExpr("COUNT(*) as sessions"). Where("s.site_id = ?", query.SiteID). Where("s.enter_time >= ?", fromUnix). Where("s.enter_time <= ?", toUnix) - base = applySessionFilters(base, query.Filter) - base = base.GroupExpr(bucketExpr) - if query.Limit > 0 { - inner := base.Order("date_bucket DESC").Offset(query.Offset).Limit(query.Limit) - outer := r.db.NewSelect(). - TableExpr("(?) as time_series", inner). - ColumnExpr("date_bucket, visitors, page_views, sessions"). - Order("date_bucket ASC") - err := outer.Scan(ctx, &stats) - if err != nil { - return nil, fmt.Errorf("failed to get time series stats with filter: %w", err) + sessionQuery = applySessionFilters(sessionQuery, query.Filter) + if err := sessionQuery.GroupExpr(sessionBucketExpr).Scan(ctx, &sessionStats); err != nil { + return nil, fmt.Errorf("failed to get time series session stats with filter: %w", err) + } + + var pageViewStats []struct { + DateBucket int64 + PageViews int + } + pageViewQuery := r.db.NewSelect(). + TableExpr("events e"). + Join("INNER JOIN sessions s ON e.session_id = s.id"). + ColumnExpr(eventBucketExpr+" as date_bucket"). + ColumnExpr("COUNT(*) as page_views"). + Where("s.site_id = ?", query.SiteID). + Where("e.definition_id IS NULL"). + Where("e.time >= ?", fromUnix). + Where("e.time <= ?", toUnix) + pageViewQuery = applyEventFilters(pageViewQuery, query.Filter) + if err := pageViewQuery.GroupExpr(eventBucketExpr).Scan(ctx, &pageViewStats); err != nil { + return nil, fmt.Errorf("failed to get time series pageview stats with filter: %w", err) + } + + statsByBucket := make(map[int64]*DailyVisitorStats, len(sessionStats)+len(pageViewStats)) + for _, stat := range sessionStats { + statsByBucket[stat.DateBucket] = &DailyVisitorStats{ + DateBucket: stat.DateBucket, + Visitors: stat.Visitors, + Sessions: stat.Sessions, } - return stats, nil } - q := base.Order("date_bucket ASC") - if query.Offset > 0 { - q = q.Offset(query.Offset) + for _, stat := range pageViewStats { + merged := statsByBucket[stat.DateBucket] + if merged == nil { + merged = &DailyVisitorStats{DateBucket: stat.DateBucket} + statsByBucket[stat.DateBucket] = merged + } + merged.PageViews = stat.PageViews } - err := q.Scan(ctx, &stats) - if err != nil { - return nil, fmt.Errorf("failed to get time series stats with filter: %w", err) + + buckets := make([]int64, 0, len(statsByBucket)) + for bucket := range statsByBucket { + buckets = append(buckets, bucket) + } + sort.Slice(buckets, func(i, j int) bool { return buckets[i] < buckets[j] }) + + if query.Limit > 0 { + descBuckets := append([]int64(nil), buckets...) + sort.Slice(descBuckets, func(i, j int) bool { return descBuckets[i] > descBuckets[j] }) + offset := max(query.Offset, 0) + if offset >= len(descBuckets) { + buckets = nil + } else { + end := min(offset+query.Limit, len(descBuckets)) + buckets = descBuckets[offset:end] + sort.Slice(buckets, func(i, j int) bool { return buckets[i] < buckets[j] }) + } + } else if query.Offset > 0 { + if query.Offset >= len(buckets) { + buckets = nil + } else { + buckets = buckets[query.Offset:] + } + } + + stats := make([]DailyVisitorStats, 0, len(buckets)) + for _, bucket := range buckets { + stats = append(stats, *statsByBucket[bucket]) } return stats, nil } -func (r *AnalyticsRepository) timeBucketExpression(bucket TimeBucket) string { +func (r *AnalyticsRepository) sessionTimeBucketExpression(bucket TimeBucket) string { + if bucket == TimeBucketHourly { + return "s.enter_hour" + } + + return "s.enter_day" +} +func (r *AnalyticsRepository) eventTimeBucketExpression(bucket TimeBucket) string { if bucket == TimeBucketHourly { - return "enter_hour" + return "e.hour" } - return "enter_day" + return "e.day" } diff --git a/server/internal/repository/analytics_repository_test.go b/server/internal/repository/analytics_repository_test.go index 085cc2a2..d4a6a449 100644 --- a/server/internal/repository/analytics_repository_test.go +++ b/server/internal/repository/analytics_repository_test.go @@ -3,7 +3,6 @@ package repository import ( "context" "database/sql" - "fmt" "testing" "time" @@ -107,6 +106,139 @@ func insertSession(t *testing.T, db *bun.DB, siteID int64, clientID int64, enter } } +func insertSessionWithReferrer(t *testing.T, db *bun.DB, siteID int64, clientID int64, referrer string, enterTime time.Time, durationSeconds int, pageViewCount int) { + t.Helper() + + enterUnix := enterTime.Unix() + exitUnix := enterUnix + int64(durationSeconds) + session := &models.Session{ + SiteID: siteID, + ClientID: clientID, + EnterTime: enterUnix, + EnterHour: enterUnix / 3600, + EnterDay: enterUnix / 86400, + EnterPath: "/", + ExitTime: exitUnix, + ExitHour: exitUnix / 3600, + ExitDay: exitUnix / 86400, + ExitPath: "/", + Referrer: referrer, + Duration: durationSeconds, + PageViewCount: pageViewCount, + } + + if _, err := db.NewInsert().Model(session).Exec(context.Background()); err != nil { + t.Fatalf("failed to insert session with referrer: %v", err) + } +} + +func insertSessionWithPath(t *testing.T, db *bun.DB, siteID int64, clientID int64, path string, enterTime time.Time, durationSeconds int, pageViewCount int) int64 { + t.Helper() + + enterUnix := enterTime.Unix() + exitUnix := enterUnix + int64(durationSeconds) + session := &models.Session{ + SiteID: siteID, + ClientID: clientID, + EnterTime: enterUnix, + EnterHour: enterUnix / 3600, + EnterDay: enterUnix / 86400, + EnterPath: path, + ExitTime: exitUnix, + ExitHour: exitUnix / 3600, + ExitDay: exitUnix / 86400, + ExitPath: path, + Duration: durationSeconds, + PageViewCount: pageViewCount, + } + + if _, err := db.NewInsert().Model(session).Exec(context.Background()); err != nil { + t.Fatalf("failed to insert session: %v", err) + } + return session.ID +} + +func insertPageViewEvent(t *testing.T, db *bun.DB, sessionID int64, path string, eventTime time.Time) int64 { + t.Helper() + + eventUnix := eventTime.Unix() + event := &models.Event{ + SessionID: sessionID, + Time: eventUnix, + Hour: eventUnix / 3600, + Day: eventUnix / 86400, + Path: path, + DefinitionID: nil, + } + + if _, err := db.NewInsert().Model(event).Exec(context.Background()); err != nil { + t.Fatalf("failed to insert pageview event: %v", err) + } + return event.ID +} + +func TestGetBounceRateExcludesEventOnlySessions(t *testing.T) { + db := setupTestDB(t) + repo := NewAnalyticsRepository(db) + ctx := context.Background() + + site := createTestSite(t, db) + now := time.Now() + from := now.Add(-24 * time.Hour) + to := now + + bouncedClient := createTestClient(t, db, site.ID, "hash-bounced", "desktop", "Chrome", "Windows") + insertSession(t, db, site.ID, bouncedClient, now.Add(-2*time.Hour), 0, 1) + + eventOnlyClient := createTestClient(t, db, site.ID, "hash-event-only", "desktop", "Chrome", "Windows") + insertSession(t, db, site.ID, eventOnlyClient, now.Add(-3*time.Hour), 60, 0) + + got, err := repo.GetBounceRate(ctx, site.ID, from, to) + if err != nil { + t.Fatalf("GetBounceRate() error = %v", err) + } + + want := 100.0 + if got != want { + t.Errorf("GetBounceRate() = %v, want %v", got, want) + } +} + +func TestGetBounceRateWithFilterExcludesEventOnlySessions(t *testing.T) { + db := setupTestDB(t) + repo := NewAnalyticsRepository(db) + ctx := context.Background() + + site := createTestSite(t, db) + now := time.Now() + from := now.Add(-24 * time.Hour) + to := now + + bouncedClient := createTestClient(t, db, site.ID, "hash-bounced-filter", "desktop", "Chrome", "Windows") + insertSessionWithReferrer(t, db, site.ID, bouncedClient, "https://google.com", now.Add(-2*time.Hour), 0, 1) + + eventOnlyClient := createTestClient(t, db, site.ID, "hash-event-only-filter", "desktop", "Chrome", "Windows") + insertSessionWithReferrer(t, db, site.ID, eventOnlyClient, "https://google.com", now.Add(-3*time.Hour), 60, 0) + + otherClient := createTestClient(t, db, site.ID, "hash-other-filter", "desktop", "Chrome", "Windows") + insertSessionWithReferrer(t, db, site.ID, otherClient, "https://example.com", now.Add(-4*time.Hour), 60, 2) + + got, err := repo.GetBounceRateWithFilter(ctx, AnalyticsQuery{ + SiteID: site.ID, + From: from, + To: to, + Filter: AnalyticsFilter{Referrer: []string{"https://google.com"}}, + }) + if err != nil { + t.Fatalf("GetBounceRateWithFilter() error = %v", err) + } + + want := 100.0 + if got != want { + t.Errorf("GetBounceRateWithFilter() = %v, want %v", got, want) + } +} + // TestGetAvgSessionDuration_EmptyResult tests that the function returns 0.0 // when there are no matching sessions. This test catches a bug where // COALESCE(AVG(duration), 0) returns int64 instead of float64 when there @@ -131,12 +263,12 @@ func TestGetAvgSessionDuration_EmptyResult(t *testing.T) { setup: func() {}, }, { - name: "only bounce sessions exist", + name: "only zero-duration sessions exist", setup: func() { clientID := createTestClient(t, db, site.ID, "hash1", "desktop", "Chrome", "Windows") sessionTime := now.Add(-1 * time.Hour) - insertSession(t, db, site.ID, clientID, sessionTime, 10, 1) + insertSession(t, db, site.ID, clientID, sessionTime, 0, 1) }, }, { @@ -195,7 +327,7 @@ func TestGetAvgSessionDuration_WithSessions(t *testing.T) { } } -func TestGetAvgSessionDuration_ExcludesBounces(t *testing.T) { +func TestGetAvgSessionDuration_IncludesSinglePageDurationsAndExcludesZeroDuration(t *testing.T) { db := setupTestDB(t) repo := NewAnalyticsRepository(db) ctx := context.Background() @@ -212,14 +344,20 @@ func TestGetAvgSessionDuration_ExcludesBounces(t *testing.T) { client2 := createTestClient(t, db, site.ID, "hash2", "mobile", "Safari", "iOS") insertSession(t, db, site.ID, client2, now.Add(-3*time.Hour), 1000, 1) + client3 := createTestClient(t, db, site.ID, "hash3", "mobile", "Safari", "iOS") + insertSession(t, db, site.ID, client3, now.Add(-4*time.Hour), 0, 1) + + client4 := createTestClient(t, db, site.ID, "hash4", "desktop", "Chrome", "Windows") + insertSession(t, db, site.ID, client4, now.Add(-5*time.Hour), 400, 0) + got, err := repo.GetAvgSessionDuration(ctx, site.ID, from, to) if err != nil { t.Fatalf("GetAvgSessionDuration() error = %v", err) } - want := 100.0 + want := 550.0 if got != want { - t.Errorf("GetAvgSessionDuration() = %v, want %v (bounce sessions should be excluded)", got, want) + t.Errorf("GetAvgSessionDuration() = %v, want %v", got, want) } } @@ -291,7 +429,6 @@ func TestGetAvgSessionDurationWithFilter_EmptyResult(t *testing.T) { Page: pages, }, }) - fmt.Println(got) if err != nil { t.Errorf("GetAvgSessionDurationWithFilter() error = %v, want nil", err) } @@ -335,6 +472,38 @@ func TestGetAvgSessionDurationWithFilter_WithData(t *testing.T) { t.Fatalf("failed to insert session 2: %v", err) } + client3 := createTestClient(t, db, site.ID, "hash3", "tablet", "Firefox", "Android") + enterTime3 := now.Add(-4 * time.Hour).Unix() + exitTime3 := enterTime3 + 180 + _, err = db.Exec( + "INSERT INTO sessions (site_id, client_id, enter_time, enter_hour, enter_day, enter_path, exit_time, exit_hour, exit_day, exit_path, duration, page_view_count, referrer) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + site.ID, client3, enterTime3, enterTime3/3600, enterTime3/86400, "/", exitTime3, exitTime3/3600, exitTime3/86400, "/", 180, 1, "", + ) + if err != nil { + t.Fatalf("failed to insert session 3: %v", err) + } + + client4 := createTestClient(t, db, site.ID, "hash4", "tablet", "Firefox", "Android") + enterTime4 := now.Add(-5 * time.Hour).Unix() + _, err = db.Exec( + "INSERT INTO sessions (site_id, client_id, enter_time, enter_hour, enter_day, enter_path, exit_time, exit_hour, exit_day, exit_path, duration, page_view_count, referrer) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + site.ID, client4, enterTime4, enterTime4/3600, enterTime4/86400, "/", enterTime4, enterTime4/3600, enterTime4/86400, "/", 0, 1, "", + ) + if err != nil { + t.Fatalf("failed to insert session 4: %v", err) + } + + client5 := createTestClient(t, db, site.ID, "hash5", "desktop", "Chrome", "Windows") + enterTime5 := now.Add(-6 * time.Hour).Unix() + exitTime5 := enterTime5 + 600 + _, err = db.Exec( + "INSERT INTO sessions (site_id, client_id, enter_time, enter_hour, enter_day, enter_path, exit_time, exit_hour, exit_day, exit_path, duration, page_view_count, referrer) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + site.ID, client5, enterTime5, enterTime5/3600, enterTime5/86400, "/", exitTime5, exitTime5/3600, exitTime5/86400, "/", 600, 0, "", + ) + if err != nil { + t.Fatalf("failed to insert session 5: %v", err) + } + tests := []struct { name string referrer *string @@ -344,7 +513,7 @@ func TestGetAvgSessionDurationWithFilter_WithData(t *testing.T) { }{ { name: "no filter", - want: 90.0, + want: 120.0, }, { name: "filter by referrer", @@ -393,6 +562,116 @@ func TestGetAvgSessionDurationWithFilter_WithData(t *testing.T) { } } +func TestGetTopPagesCountsDistinctClientsNotSessions(t *testing.T) { + db := setupTestDB(t) + repo := NewAnalyticsRepository(db) + ctx := context.Background() + + site := createTestSite(t, db) + clientID := createTestClient(t, db, site.ID, "hash1", "desktop", "Chrome", "Windows") + + firstEventTime := time.Date(2026, 3, 9, 10, 0, 0, 0, time.UTC) + session1 := insertSessionWithPath(t, db, site.ID, clientID, "/pricing", firstEventTime, 10, 1) + insertPageViewEvent(t, db, session1, "/pricing", firstEventTime) + + secondEventTime := firstEventTime.Add(time.Hour) + session2 := insertSessionWithPath(t, db, site.ID, clientID, "/pricing", secondEventTime, 10, 1) + insertPageViewEvent(t, db, session2, "/pricing", secondEventTime) + + stats, err := repo.GetTopPages(ctx, site.ID, firstEventTime.Add(-time.Minute), secondEventTime.Add(time.Minute), 10) + if err != nil { + t.Fatalf("GetTopPages() error = %v", err) + } + + if len(stats) != 1 { + t.Fatalf("GetTopPages() returned %d rows, want 1", len(stats)) + } + if stats[0].Path != "/pricing" { + t.Fatalf("GetTopPages()[0].Path = %q, want /pricing", stats[0].Path) + } + if stats[0].Views != 2 { + t.Fatalf("GetTopPages()[0].Views = %d, want 2", stats[0].Views) + } + if stats[0].Visitors != 1 { + t.Fatalf("GetTopPages()[0].Visitors = %d, want 1", stats[0].Visitors) + } +} + +func TestGetActivePagesCountsDistinctClientsNotSessions(t *testing.T) { + db := setupTestDB(t) + repo := NewAnalyticsRepository(db) + ctx := context.Background() + + site := createTestSite(t, db) + clientID := createTestClient(t, db, site.ID, "hash1", "desktop", "Chrome", "Windows") + + firstEventTime := time.Date(2026, 3, 9, 10, 0, 0, 0, time.UTC) + session1 := insertSessionWithPath(t, db, site.ID, clientID, "/pricing", firstEventTime, 10, 1) + insertPageViewEvent(t, db, session1, "/pricing", firstEventTime) + + secondEventTime := firstEventTime.Add(time.Minute) + session2 := insertSessionWithPath(t, db, site.ID, clientID, "/pricing", secondEventTime, 10, 1) + insertPageViewEvent(t, db, session2, "/pricing", secondEventTime) + + stats, err := repo.GetActivePages(ctx, site.ID, firstEventTime.Add(-time.Minute), 10, 0) + if err != nil { + t.Fatalf("GetActivePages() error = %v", err) + } + + if len(stats) != 1 { + t.Fatalf("GetActivePages() returned %d rows, want 1", len(stats)) + } + if stats[0].Path != "/pricing" { + t.Fatalf("GetActivePages()[0].Path = %q, want /pricing", stats[0].Path) + } + if stats[0].Visitors != 1 { + t.Fatalf("GetActivePages()[0].Visitors = %d, want 1", stats[0].Visitors) + } +} + +func TestGetTimeSeriesStatsWithFilterBucketsPageViewsByEventTime(t *testing.T) { + db := setupTestDB(t) + repo := NewAnalyticsRepository(db) + ctx := context.Background() + + site := createTestSite(t, db) + clientID := createTestClient(t, db, site.ID, "hash1", "desktop", "Chrome", "Windows") + + enterTime := time.Date(2026, 3, 9, 23, 59, 0, 0, time.UTC) + eventTime := time.Date(2026, 3, 10, 0, 1, 0, 0, time.UTC) + sessionID := insertSessionWithPath(t, db, site.ID, clientID, "/pricing", enterTime, 120, 1) + insertPageViewEvent(t, db, sessionID, "/pricing", eventTime) + + stats, err := repo.GetTimeSeriesStatsWithFilter(ctx, AnalyticsQuery{ + SiteID: site.ID, + From: enterTime.Add(-time.Minute), + To: eventTime.Add(time.Minute), + Bucket: TimeBucketDaily, + }) + if err != nil { + t.Fatalf("GetTimeSeriesStatsWithFilter() error = %v", err) + } + + if len(stats) != 2 { + t.Fatalf("GetTimeSeriesStatsWithFilter() returned %d rows, want 2", len(stats)) + } + + enterBucket := enterTime.Unix() / 86400 + eventBucket := eventTime.Unix() / 86400 + if stats[0].DateBucket != enterBucket { + t.Fatalf("stats[0].DateBucket = %d, want %d", stats[0].DateBucket, enterBucket) + } + if stats[0].Visitors != 1 || stats[0].Sessions != 1 || stats[0].PageViews != 0 { + t.Fatalf("stats[0] = %+v, want visitor/session without pageview", stats[0]) + } + if stats[1].DateBucket != eventBucket { + t.Fatalf("stats[1].DateBucket = %d, want %d", stats[1].DateBucket, eventBucket) + } + if stats[1].Visitors != 0 || stats[1].Sessions != 0 || stats[1].PageViews != 1 { + t.Fatalf("stats[1] = %+v, want pageview without visitor/session", stats[1]) + } +} + func stringPtr(s string) *string { return &s } diff --git a/server/internal/server/server.go b/server/internal/server/server.go index b9fa92b0..718e644a 100644 --- a/server/internal/server/server.go +++ b/server/internal/server/server.go @@ -20,6 +20,7 @@ import ( "github.com/lovely-eye/server/internal/middleware" "github.com/lovely-eye/server/internal/repository" "github.com/lovely-eye/server/internal/services" + "github.com/lovely-eye/server/pkg/clientip" "github.com/uptrace/bun" ) @@ -89,6 +90,7 @@ func New(cfg config.Config) (*Server, error) { identitySecret = cfg.Auth.JWTSecret } analyticsService := services.NewAnalyticsService(analyticsRepo, siteRepo, eventDefinitionRepo, geoIPService, countryService, identitySecret) + analyticsService.SetMaxSinglePageDuration(cfg.Analytics.MaxSinglePageDuration) if err := analyticsService.SyncGeoIPRequirement(context.Background()); err != nil { fmt.Printf("Warning: GeoIP database sync failed: %v\n", err) } @@ -100,12 +102,45 @@ func New(cfg config.Config) (*Server, error) { return nil, fmt.Errorf("create initial admin: %w", err) } - analyticsHandler := handlers.NewAnalyticsHandler(analyticsService, siteService) + ipResolver, err := clientip.NewResolver(cfg.Analytics.TrustedProxyCIDRs) + if err != nil { + if closeErr := database.Close(db); closeErr != nil { + slog.Error("failed to close database after trusted proxy config error", "error", closeErr) + } + return nil, fmt.Errorf("configure trusted proxies: %w", err) + } + collectRateLimiter := handlers.NewCollectRateLimiter( + cfg.Analytics.RateLimitEnabled, + cfg.Analytics.RateLimitPerMinute, + cfg.Analytics.RateLimitBurst, + ) + analyticsHandler := handlers.NewAnalyticsHandler( + analyticsService, + siteService, + handlers.AnalyticsHandlerConfig{ + MaxBodyBytes: cfg.Analytics.MaxBodyBytes, + MaxPropertiesBytes: cfg.Analytics.MaxPropertiesBytes, + }, + ipResolver, + collectRateLimiter, + ) // Initialize auth middleware authMiddleware := auth.NewMiddleware(authService) - resolver := graph.NewResolver(authService, siteService, analyticsService, countryService, eventDefinitionService) + resolver := graph.NewResolver( + authService, + siteService, + analyticsService, + countryService, + eventDefinitionService, + graph.DashboardLimits{ + MaxDailyRangeDays: cfg.Dashboard.MaxDailyRangeDays, + MaxHourlyRangeDays: cfg.Dashboard.MaxHourlyRangeDays, + MaxFilterValues: cfg.Dashboard.MaxFilterValues, + MaxFilterStringLength: cfg.Dashboard.MaxFilterStringLength, + }, + ) mux := http.NewServeMux() @@ -121,7 +156,7 @@ func New(cfg config.Config) (*Server, error) { // GraphQL endpoint // Auth uses JWT in HttpOnly + Secure cookies with SameSite=Strict/Lax // No CSRF protection needed - see https://www.reddit.com/r/node/comments/1im7yj0/comment/mc0ylfd/ - graphqlHandler := http.HandlerFunc(graph.Handler(resolver)) + graphqlHandler := http.HandlerFunc(graph.Handler(resolver, cfg.GraphQL.MaxBodyBytes)) graphqlPath := basePath + "/graphql" mux.Handle("POST "+graphqlPath, graphqlHandler) mux.HandleFunc("GET "+graphqlPath, graphqlPlaygroundHandler(graphqlPath)) diff --git a/server/internal/services/analytics_client_rotation.go b/server/internal/services/analytics_client_rotation.go index 6fe62f01..8a7c3c22 100644 --- a/server/internal/services/analytics_client_rotation.go +++ b/server/internal/services/analytics_client_rotation.go @@ -95,6 +95,27 @@ func (s *AnalyticsService) resolveClientWithRotation( return client, nil } +func (s *AnalyticsService) findClientForExit( + ctx context.Context, + tx bun.Tx, + siteID int64, + ip string, + browser models.ClientBrowser, + device models.ClientDevice, + now time.Time, +) (*models.Client, error) { + hashes := s.buildClientRotationHashes(siteID, ip, browser, device, now) + client, err := s.analyticsRepo.FindClientByHashesTx(ctx, tx, siteID, hashes.Today, hashes.Yesterday) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return nil, fmt.Errorf("find client by rotation hashes: %w", err) + } + + return client, nil +} + func backfillClientAnalyticsDimensions( client *models.Client, device models.ClientDevice, diff --git a/server/internal/services/analytics_identity_test.go b/server/internal/services/analytics_identity_test.go index d6844f39..35617905 100644 --- a/server/internal/services/analytics_identity_test.go +++ b/server/internal/services/analytics_identity_test.go @@ -221,6 +221,245 @@ func TestAnalyticsService_CollectPageView_DuplicatePageViewDoesNotMutateSession( require.Equal(t, 0, session.Duration) } +func TestAnalyticsService_CollectPageView_ExitSamePathUpdatesSessionWithoutPageView(t *testing.T) { + t.Parallel() + + ctx := context.Background() + db := setupAnalyticsServiceTestDB(t) + site := createAnalyticsIdentitySite(t, db) + service := newAnalyticsIdentityTestService(db, nil) + + firstTime := time.Date(2026, 3, 9, 10, 0, 0, 0, time.UTC) + currentTime := firstTime + service.now = func() time.Time { return currentTime } + + input := analyticsIdentityCollectInput(site.PublicKey) + require.NoError(t, service.CollectPageView(ctx, input)) + + currentTime = firstTime.Add(60 * time.Second) + input.Exit = true + require.NoError(t, service.CollectPageView(ctx, input)) + + require.Equal(t, 1, countClientsBySite(t, db, site.ID)) + require.Equal(t, 1, countSessionsBySite(t, db, site.ID)) + require.Equal(t, 1, countPageViewEventsBySite(t, db, site.ID)) + + session := latestSessionBySite(t, db, site.ID) + require.Equal(t, 1, session.PageViewCount) + require.Equal(t, "/home", session.ExitPath) + require.Equal(t, currentTime.Unix(), session.ExitTime) + require.Equal(t, 60, session.Duration) +} + +func TestAnalyticsService_CollectPageView_ExitSamePathAfterActiveWindowUpdatesSessionWithoutPageView(t *testing.T) { + t.Parallel() + + ctx := context.Background() + db := setupAnalyticsServiceTestDB(t) + site := createAnalyticsIdentitySite(t, db) + service := newAnalyticsIdentityTestService(db, nil) + + firstTime := time.Date(2026, 3, 9, 10, 0, 0, 0, time.UTC) + currentTime := firstTime + service.now = func() time.Time { return currentTime } + + input := analyticsIdentityCollectInput(site.PublicKey) + require.NoError(t, service.CollectPageView(ctx, input)) + + currentTime = firstTime.Add(2 * time.Hour) + input.Exit = true + require.NoError(t, service.CollectPageView(ctx, input)) + + require.Equal(t, 1, countClientsBySite(t, db, site.ID)) + require.Equal(t, 1, countSessionsBySite(t, db, site.ID)) + require.Equal(t, 1, countPageViewEventsBySite(t, db, site.ID)) + + session := latestSessionBySite(t, db, site.ID) + require.Equal(t, 1, session.PageViewCount) + require.Equal(t, "/home", session.ExitPath) + require.Equal(t, currentTime.Unix(), session.ExitTime) + require.Equal(t, int((2 * time.Hour).Seconds()), session.Duration) +} + +func TestAnalyticsService_CollectPageView_ExitSamePathAfterMaxDurationNoOps(t *testing.T) { + t.Parallel() + + ctx := context.Background() + db := setupAnalyticsServiceTestDB(t) + site := createAnalyticsIdentitySite(t, db) + service := newAnalyticsIdentityTestService(db, nil) + + firstTime := time.Date(2026, 3, 9, 10, 0, 0, 0, time.UTC) + currentTime := firstTime + service.now = func() time.Time { return currentTime } + + input := analyticsIdentityCollectInput(site.PublicKey) + require.NoError(t, service.CollectPageView(ctx, input)) + + currentTime = firstTime.Add(4*time.Hour + time.Minute) + input.Exit = true + require.NoError(t, service.CollectPageView(ctx, input)) + + require.Equal(t, 1, countClientsBySite(t, db, site.ID)) + require.Equal(t, 1, countSessionsBySite(t, db, site.ID)) + require.Equal(t, 1, countPageViewEventsBySite(t, db, site.ID)) + + session := latestSessionBySite(t, db, site.ID) + require.Equal(t, 1, session.PageViewCount) + require.Equal(t, "/home", session.ExitPath) + require.Equal(t, firstTime.Unix(), session.ExitTime) + require.Equal(t, 0, session.Duration) +} + +func TestAnalyticsService_CollectPageView_RepeatedSamePathExitCapsSinglePageDuration(t *testing.T) { + t.Parallel() + + ctx := context.Background() + db := setupAnalyticsServiceTestDB(t) + site := createAnalyticsIdentitySite(t, db) + service := newAnalyticsIdentityTestService(db, nil) + + firstTime := time.Date(2026, 3, 9, 10, 0, 0, 0, time.UTC) + currentTime := firstTime + service.now = func() time.Time { return currentTime } + + input := analyticsIdentityCollectInput(site.PublicKey) + require.NoError(t, service.CollectPageView(ctx, input)) + + currentTime = firstTime.Add(3*time.Hour + 59*time.Minute) + input.Exit = true + require.NoError(t, service.CollectPageView(ctx, input)) + + currentTime = firstTime.Add(7*time.Hour + 58*time.Minute) + require.NoError(t, service.CollectPageView(ctx, input)) + + require.Equal(t, 1, countClientsBySite(t, db, site.ID)) + require.Equal(t, 1, countSessionsBySite(t, db, site.ID)) + require.Equal(t, 1, countPageViewEventsBySite(t, db, site.ID)) + + session := latestSessionBySite(t, db, site.ID) + require.Equal(t, 1, session.PageViewCount) + require.Equal(t, "/home", session.ExitPath) + require.Equal(t, firstTime.Add(4*time.Hour).Unix(), session.ExitTime) + require.Equal(t, int((4 * time.Hour).Seconds()), session.Duration) +} + +func TestAnalyticsService_CollectPageView_ExitDifferentPathCountsPageView(t *testing.T) { + t.Parallel() + + ctx := context.Background() + db := setupAnalyticsServiceTestDB(t) + site := createAnalyticsIdentitySite(t, db) + service := newAnalyticsIdentityTestService(db, nil) + + firstTime := time.Date(2026, 3, 9, 10, 0, 0, 0, time.UTC) + currentTime := firstTime + service.now = func() time.Time { return currentTime } + + input := analyticsIdentityCollectInput(site.PublicKey) + require.NoError(t, service.CollectPageView(ctx, input)) + + currentTime = firstTime.Add(60 * time.Second) + input.Path = "/pricing" + input.Exit = true + require.NoError(t, service.CollectPageView(ctx, input)) + + require.Equal(t, 1, countClientsBySite(t, db, site.ID)) + require.Equal(t, 1, countSessionsBySite(t, db, site.ID)) + require.Equal(t, 2, countPageViewEventsBySite(t, db, site.ID)) + + session := latestSessionBySite(t, db, site.ID) + require.Equal(t, 2, session.PageViewCount) + require.Equal(t, "/pricing", session.ExitPath) + require.Equal(t, currentTime.Unix(), session.ExitTime) + require.Equal(t, 60, session.Duration) +} + +func TestAnalyticsService_CollectPageView_ExitDifferentPathAfterActiveWindowNoOps(t *testing.T) { + t.Parallel() + + ctx := context.Background() + db := setupAnalyticsServiceTestDB(t) + site := createAnalyticsIdentitySite(t, db) + service := newAnalyticsIdentityTestService(db, nil) + + firstTime := time.Date(2026, 3, 9, 10, 0, 0, 0, time.UTC) + currentTime := firstTime + service.now = func() time.Time { return currentTime } + + input := analyticsIdentityCollectInput(site.PublicKey) + require.NoError(t, service.CollectPageView(ctx, input)) + + currentTime = firstTime.Add(2 * time.Hour) + input.Path = "/pricing" + input.Exit = true + require.NoError(t, service.CollectPageView(ctx, input)) + + require.Equal(t, 1, countClientsBySite(t, db, site.ID)) + require.Equal(t, 1, countSessionsBySite(t, db, site.ID)) + require.Equal(t, 1, countPageViewEventsBySite(t, db, site.ID)) + + session := latestSessionBySite(t, db, site.ID) + require.Equal(t, 1, session.PageViewCount) + require.Equal(t, "/home", session.ExitPath) + require.Equal(t, firstTime.Unix(), session.ExitTime) + require.Equal(t, 0, session.Duration) +} + +func TestAnalyticsService_CollectPageView_ExitWithoutActiveSessionNoOps(t *testing.T) { + t.Parallel() + + ctx := context.Background() + db := setupAnalyticsServiceTestDB(t) + site := createAnalyticsIdentitySite(t, db) + service := newAnalyticsIdentityTestService(db, nil) + + currentTime := time.Date(2026, 3, 9, 10, 0, 0, 0, time.UTC) + service.now = func() time.Time { return currentTime } + + input := analyticsIdentityCollectInput(site.PublicKey) + input.Exit = true + require.NoError(t, service.CollectPageView(ctx, input)) + + require.Equal(t, 0, countClientsBySite(t, db, site.ID)) + require.Equal(t, 0, countSessionsBySite(t, db, site.ID)) + require.Equal(t, 0, countPageViewEventsBySite(t, db, site.ID)) +} + +func TestAnalyticsService_CollectPageView_ExitWithoutActiveSessionDoesNotRotateClient(t *testing.T) { + t.Parallel() + + ctx := context.Background() + db := setupAnalyticsServiceTestDB(t) + site := createAnalyticsIdentitySite(t, db) + service := newAnalyticsIdentityTestService(db, nil) + + firstTime := time.Date(2026, 3, 9, 10, 0, 0, 0, time.UTC) + currentTime := firstTime + service.now = func() time.Time { return currentTime } + + input := analyticsIdentityCollectInput(site.PublicKey) + require.NoError(t, service.CollectPageView(ctx, input)) + + originalClient := latestClientBySite(t, db, site.ID) + originalHash := originalClient.Hash + + currentTime = firstTime.Add(24*time.Hour + time.Minute) + input.Exit = true + require.NoError(t, service.CollectPageView(ctx, input)) + + require.Equal(t, 1, countClientsBySite(t, db, site.ID)) + require.Equal(t, 1, countSessionsBySite(t, db, site.ID)) + require.Equal(t, 1, countPageViewEventsBySite(t, db, site.ID)) + + persistedClient := clientByID(t, db, originalClient.ID) + require.Equal(t, originalHash, persistedClient.Hash) + + session := latestSessionBySite(t, db, site.ID) + require.Equal(t, firstTime.Unix(), session.ExitTime) + require.Equal(t, 0, session.Duration) +} + func TestAnalyticsService_CollectPageView_CreatesNewSessionAfterThirtyMinutes(t *testing.T) { t.Parallel() @@ -279,12 +518,11 @@ func TestAnalyticsService_CollectPageView_CountryTrackingDoesNotChangeIdentity(t func analyticsIdentityCollectInput(siteKey string) CollectInput { return CollectInput{ - SiteKey: siteKey, - Path: "/home", - ScreenWidth: 1440, - UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0", - IP: "203.0.113.42", - Origin: "https://identity.test", + SiteKey: siteKey, + Path: "/home", + UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0", + IP: "203.0.113.42", + Origin: "https://identity.test", } } diff --git a/server/internal/services/analytics_service.go b/server/internal/services/analytics_service.go index 1e7bcca9..fa41edc9 100644 --- a/server/internal/services/analytics_service.go +++ b/server/internal/services/analytics_service.go @@ -25,15 +25,21 @@ import ( "golang.org/x/crypto/hkdf" ) +const ( + activeSessionWindow = 30 * time.Minute + defaultMaxSinglePageExitDuration = 4 * time.Hour +) + type AnalyticsService struct { - analyticsRepo *repository.AnalyticsRepository - countryService countrySyncer - siteRepo *repository.SiteRepository - eventDefinitionRepo *repository.EventDefinitionRepository - botDetector *BotDetector - geoIPService geoIPProvider - identitySecret []byte - now func() time.Time + analyticsRepo *repository.AnalyticsRepository + countryService countrySyncer + siteRepo *repository.SiteRepository + eventDefinitionRepo *repository.EventDefinitionRepository + botDetector *BotDetector + geoIPService geoIPProvider + identitySecret []byte + maxSinglePageDuration time.Duration + now func() time.Time } type geoIPProvider interface { @@ -55,41 +61,58 @@ func NewAnalyticsService( identitySecret string, ) *AnalyticsService { return &AnalyticsService{ - analyticsRepo: analyticsRepo, - countryService: countryService, - siteRepo: siteRepo, - eventDefinitionRepo: eventDefinitionRepo, - botDetector: NewBotDetector(), - geoIPService: geoIPService, - identitySecret: []byte(identitySecret), - now: time.Now, + analyticsRepo: analyticsRepo, + countryService: countryService, + siteRepo: siteRepo, + eventDefinitionRepo: eventDefinitionRepo, + botDetector: NewBotDetector(), + geoIPService: geoIPService, + identitySecret: []byte(identitySecret), + maxSinglePageDuration: defaultMaxSinglePageExitDuration, + now: time.Now, + } +} + +func (s *AnalyticsService) SetMaxSinglePageDuration(duration time.Duration) { + if duration <= 0 { + duration = defaultMaxSinglePageExitDuration } + s.maxSinglePageDuration = duration +} + +func (s *AnalyticsService) sessionLookupWindow(exit bool) time.Duration { + if !exit { + return activeSessionWindow + } + if s.maxSinglePageDuration <= 0 { + return defaultMaxSinglePageExitDuration + } + return s.maxSinglePageDuration } type CollectInput struct { - SiteKey string `json:"site_key"` - Path string `json:"path"` - Referrer string `json:"referrer"` - ScreenWidth int `json:"screen_width"` - Duration int `json:"duration"` - UserAgent string `json:"-"` - IP string `json:"-"` - Origin string `json:"-"` - Referer string `json:"-"` - UTMSource string `json:"utm_source"` - UTMMedium string `json:"utm_medium"` - UTMCampaign string `json:"utm_campaign"` + SiteKey string + Path string + Exit bool + Referrer string + UserAgent string + IP string + Origin string + Referer string + UTMSource string + UTMMedium string + UTMCampaign string } type EventInput struct { - SiteKey string `json:"site_key"` - Name string `json:"name"` - Path string `json:"path"` - Properties string `json:"properties"` - UserAgent string `json:"-"` - IP string `json:"-"` - Origin string `json:"-"` - Referer string `json:"-"` + SiteKey string + Name string + Path string + Properties string + UserAgent string + IP string + Origin string + Referer string } func (s *AnalyticsService) CollectPageView(ctx context.Context, input CollectInput) error { @@ -112,28 +135,35 @@ func (s *AnalyticsService) CollectPageView(ctx context.Context, input CollectInp device := categorizeDevice(ua) browser := normalizeBrowser(ua) os := normalizeOS(ua) - screenSize := categorizeScreenSize(input.ScreenWidth) + screenSize := models.ClientScreenSizeUnknown now := s.now() nowUnix := now.Unix() country := UnknownCountry - if site.TrackCountry && s.geoIPService != nil { + if !input.Exit && site.TrackCountry && s.geoIPService != nil { country = s.resolveCountryBestEffort(input.IP) } - isDurationOnly := input.Duration > 0 && - input.ScreenWidth == 0 && - input.Referrer == "" && - input.UTMSource == "" && - input.UTMMedium == "" && - input.UTMCampaign == "" if err := s.analyticsRepo.RunInTx(ctx, func(ctx context.Context, tx bun.Tx) error { - client, err := s.resolveClientWithRotation(ctx, tx, site.ID, input.IP, device, browser, os, screenSize, country.ISOCode, now) - if err != nil { - return fmt.Errorf("resolve client with rotation: %w", err) + var client *models.Client + var err error + if input.Exit { + client, err = s.findClientForExit(ctx, tx, site.ID, input.IP, browser, device, now) + if err != nil { + return fmt.Errorf("find client for exit: %w", err) + } + if client == nil { + return nil + } + } else { + client, err = s.resolveClientWithRotation(ctx, tx, site.ID, input.IP, device, browser, os, screenSize, country.ISOCode, now) + if err != nil { + return fmt.Errorf("resolve client with rotation: %w", err) + } } - session, err := s.analyticsRepo.GetActiveSessionTx(ctx, tx, site.ID, client.ID, now.Add(-30*time.Minute).Unix()) + activeSinceUnix := now.Add(-activeSessionWindow).Unix() + session, err := s.analyticsRepo.GetActiveSessionTx(ctx, tx, site.ID, client.ID, now.Add(-s.sessionLookupWindow(input.Exit)).Unix()) if err != nil && !errors.Is(err, sql.ErrNoRows) { return fmt.Errorf("get active session: %w", err) } @@ -141,8 +171,10 @@ func (s *AnalyticsService) CollectPageView(ctx context.Context, input CollectInp session = nil } + // Exit pings are only trusted as lifecycle hints. Same-path exits close + // the active path; fresh different-path exits first record the path. if session == nil { - if isDurationOnly { + if input.Exit { return nil } @@ -168,16 +200,16 @@ func (s *AnalyticsService) CollectPageView(ctx context.Context, input CollectInp return fmt.Errorf("create session: %w", err) } } else { - if isDurationOnly { - session.ExitTime = nowUnix - session.ExitHour = nowUnix / 3600 - session.ExitDay = nowUnix / 86400 - if input.Path != "" { - session.ExitPath = input.Path - } - session.Duration = int(nowUnix - session.EnterTime) + // The extended exit lookup only closes the same path. A stale exit for + // another path is too weak to infer a real pageview after inactivity. + if input.Exit && session.ExitTime <= activeSinceUnix && session.ExitPath != input.Path { + return nil + } + + if input.Exit && session.ExitPath == input.Path { + updateSessionExit(session, input.Path, s.singlePageExitUnix(session, nowUnix)) if err := s.analyticsRepo.UpdateSessionTx(ctx, tx, session); err != nil { - return fmt.Errorf("update duration-only session: %w", err) + return fmt.Errorf("update exit session: %w", err) } return nil } @@ -187,24 +219,22 @@ func (s *AnalyticsService) CollectPageView(ctx context.Context, input CollectInp return fmt.Errorf("get recent pageview event: %w", err) } if err == nil && recentEvent != nil { + if input.Exit { + updateSessionExit(session, input.Path, s.exitUnixForDuplicateEvent(session, input.Path, nowUnix)) + if err := s.analyticsRepo.UpdateSessionTx(ctx, tx, session); err != nil { + return fmt.Errorf("update duplicate exit session: %w", err) + } + } return nil } - session.ExitTime = nowUnix - session.ExitHour = nowUnix / 3600 - session.ExitDay = nowUnix / 86400 - session.ExitPath = input.Path - session.Duration = int(nowUnix - session.EnterTime) + updateSessionExit(session, input.Path, nowUnix) session.PageViewCount++ if err := s.analyticsRepo.UpdateSessionTx(ctx, tx, session); err != nil { return fmt.Errorf("update session: %w", err) } } - if isDurationOnly { - return nil - } - event := &models.Event{ SessionID: session.ID, Time: nowUnix, @@ -224,6 +254,48 @@ func (s *AnalyticsService) CollectPageView(ctx context.Context, input CollectInp return nil } +func (s *AnalyticsService) singlePageExitUnix(session *models.Session, nowUnix int64) int64 { + if session.PageViewCount > 1 { + return nowUnix + } + + maxExitUnix := session.EnterTime + s.maxSinglePageDurationSeconds() + if nowUnix > maxExitUnix { + return maxExitUnix + } + return nowUnix +} + +func (s *AnalyticsService) exitUnixForDuplicateEvent(session *models.Session, path string, nowUnix int64) int64 { + if session.ExitPath == path { + return s.singlePageExitUnix(session, nowUnix) + } + return nowUnix +} + +func (s *AnalyticsService) maxSinglePageDurationSeconds() int64 { + duration := s.maxSinglePageDuration + if duration <= 0 { + duration = defaultMaxSinglePageExitDuration + } + + seconds := int64(duration / time.Second) + if seconds <= 0 { + return int64(defaultMaxSinglePageExitDuration / time.Second) + } + return seconds +} + +func updateSessionExit(session *models.Session, path string, nowUnix int64) { + session.ExitTime = nowUnix + session.ExitHour = nowUnix / 3600 + session.ExitDay = nowUnix / 86400 + if path != "" { + session.ExitPath = path + } + session.Duration = int(nowUnix - session.EnterTime) +} + func (s *AnalyticsService) CollectEvent(ctx context.Context, input EventInput) error { if s.botDetector.IsBot(input.UserAgent) { @@ -463,11 +535,26 @@ func (s *AnalyticsService) Close() error { } func (s *AnalyticsService) GetDashboardOverviewWithFilter(ctx context.Context, query AnalyticsQuery) (*DashboardOverview, error) { - visitors, _ := s.analyticsRepo.GetVisitorCountWithFilter(ctx, query) - pageViews, _ := s.analyticsRepo.GetPageViewCountWithFilter(ctx, query) - sessions, _ := s.analyticsRepo.GetSessionCountWithFilter(ctx, query) - bounceRate, _ := s.analyticsRepo.GetBounceRateWithFilter(ctx, query) - avgDuration, _ := s.analyticsRepo.GetAvgSessionDurationWithFilter(ctx, query) + visitors, err := s.analyticsRepo.GetVisitorCountWithFilter(ctx, query) + if err != nil { + return nil, fmt.Errorf("get visitor count with filter: %w", err) + } + pageViews, err := s.analyticsRepo.GetPageViewCountWithFilter(ctx, query) + if err != nil { + return nil, fmt.Errorf("get page view count with filter: %w", err) + } + sessions, err := s.analyticsRepo.GetSessionCountWithFilter(ctx, query) + if err != nil { + return nil, fmt.Errorf("get session count with filter: %w", err) + } + bounceRate, err := s.analyticsRepo.GetBounceRateWithFilter(ctx, query) + if err != nil { + return nil, fmt.Errorf("get bounce rate with filter: %w", err) + } + avgDuration, err := s.analyticsRepo.GetAvgSessionDurationWithFilter(ctx, query) + if err != nil { + return nil, fmt.Errorf("get average session duration with filter: %w", err) + } return &DashboardOverview{ Visitors: visitors, diff --git a/server/migrations/README.md b/server/migrations/README.md index 6354bf60..b072fab5 100644 --- a/server/migrations/README.md +++ b/server/migrations/README.md @@ -63,3 +63,14 @@ Separate directories needed because SQLite and PostgreSQL use different syntax ( - `DB_DSN` - Connection string - `JWT_SECRET` - Optional. If unset, the app generates one at startup. Set it explicitly in production because dashboard sessions will not survive restarts. - `ANALYTICS_IDENTITY_SECRET` - Optional. Falls back to `JWT_SECRET`. Set it explicitly in production if visitor identity should remain stable across restarts without sharing the auth secret. Analytics uses it for the daily UTC hashes behind UTC-day-skipped rotation, and it also reduces the impact of database-only leaks by making visitor IDs harder to recompute. +- `ANALYTICS_MAX_BODY_BYTES` - Optional. Defaults to `16384` for small collect payloads. +- `ANALYTICS_MAX_PROPERTIES_BYTES` - Optional. Defaults to `8192` for custom event properties. +- `ANALYTICS_RATE_LIMIT_ENABLED` - Optional. Defaults to `true` for the public collect endpoint. +- `ANALYTICS_RATE_LIMIT_PER_MINUTE` - Optional. Defaults to `120` per site key and client IP. +- `ANALYTICS_RATE_LIMIT_BURST` - Optional. Defaults to `240` per site key and client IP. +- `TRUSTED_PROXY_CIDRS` - Optional. Defaults to loopback, private IPv4 ranges, and IPv6 unique-local addresses. Public CDN ranges must be configured explicitly. +- `GRAPHQL_MAX_BODY_BYTES` - Optional. Defaults to `1048576`. +- `DASHBOARD_MAX_DAILY_RANGE_DAYS` - Optional. Defaults to `730`. +- `DASHBOARD_MAX_HOURLY_RANGE_DAYS` - Optional. Defaults to `31`. +- `DASHBOARD_MAX_FILTER_VALUES` - Optional. Defaults to `100`. +- `DASHBOARD_MAX_FILTER_STRING_LENGTH` - Optional. Defaults to `2048`. diff --git a/server/migrations/postgres/20260703120000_analytics_accuracy_indexes.down.sql b/server/migrations/postgres/20260703120000_analytics_accuracy_indexes.down.sql new file mode 100644 index 00000000..c9047e8a --- /dev/null +++ b/server/migrations/postgres/20260703120000_analytics_accuracy_indexes.down.sql @@ -0,0 +1,6 @@ +DROP INDEX "public"."sessions_site_enter_hour"; +DROP INDEX "public"."sessions_site_enter_day"; +DROP INDEX "public"."sessions_site_enter_time"; +DROP INDEX "public"."events_definition_time_path_session"; +DROP INDEX "public"."events_time_session_definition"; +DROP INDEX "public"."events_session_path_definition_time"; diff --git a/server/migrations/postgres/20260703120000_analytics_accuracy_indexes.up.sql b/server/migrations/postgres/20260703120000_analytics_accuracy_indexes.up.sql new file mode 100644 index 00000000..20cf763d --- /dev/null +++ b/server/migrations/postgres/20260703120000_analytics_accuracy_indexes.up.sql @@ -0,0 +1,6 @@ +CREATE INDEX "events_session_path_definition_time" ON "public"."events" ("session_id", "path", "definition_id", "time" DESC); +CREATE INDEX "events_time_session_definition" ON "public"."events" ("time" DESC, "session_id", "definition_id"); +CREATE INDEX "events_definition_time_path_session" ON "public"."events" ("definition_id", "time" DESC, "path", "session_id"); +CREATE INDEX "sessions_site_enter_time" ON "public"."sessions" ("site_id", "enter_time"); +CREATE INDEX "sessions_site_enter_day" ON "public"."sessions" ("site_id", "enter_day"); +CREATE INDEX "sessions_site_enter_hour" ON "public"."sessions" ("site_id", "enter_hour"); diff --git a/server/migrations/postgres/atlas.sum b/server/migrations/postgres/atlas.sum index cc6d94a3..7341a071 100644 --- a/server/migrations/postgres/atlas.sum +++ b/server/migrations/postgres/atlas.sum @@ -1,7 +1,15 @@ -h1:uSJrP2zYOnB9TcineUu30zcgj/YSrI7JJtUBvLd/wt4= -20260121204035_initial_db.up.sql h1:rygq/KQ1y9hMBnwv4LYpSBRYEGMzvVm3ioA0WjkTBJ8= -20260122093132_add_site_domain_ordering_and_event_definition_uniques.up.sql h1:qRx+MmQn5vUpN46T+xVBFh42ewl+fZwxCw001byXGW8= -20260123090000_remove_event_type.up.sql h1:SCtZB7QC8/Fxd9CeIDHhUCFBfAluioenDjxCu4dLRgc= -20260309120000_add_countries_table.up.sql h1:QNucva9TmSbliFotzPUjhxPfuwKhttYO9b7E6cFEe2A= -20260309151141_analytics_client_dimensions_enums.up.sql h1:ZzvGa5HJSChjnVUx2fGLYDKt43+X5wVsChgK3D/QPhc= -20260309183000_clients_hash_utc_day_skipped_rotation.up.sql h1:rgYejsPZ0Ps+JonW7R/ViZ9LKjtk/goW8XKDGHioUcM= +h1:8pfZuRCo/y63PNweujoTX/AyTwy9JryWha6Z9kARoVo= +20260121204035_initial_db.down.sql h1:YC6nx+jjGOK6e6YliQTesuHu+aD2ut1PClpQu0XEkhY= +20260121204035_initial_db.up.sql h1:yBeL2HYtlmYhUcVBfzRuZILaS+tfH92D1rSsNalmyW4= +20260122093132_add_site_domain_ordering_and_event_definition_uniques.down.sql h1:KmrlA9Iw1gvOWT/xztJpd7gVwkZ126thPx1ltEyVEak= +20260122093132_add_site_domain_ordering_and_event_definition_uniques.up.sql h1:P4uGI2dhmZ6yTI9wZfb06es74M3cw0ruM4IlPsxhjoA= +20260123090000_remove_event_type.down.sql h1:j1LfwuNCM/t+iMNRhdyzuYeAwJ3+WUGVFCQjPQzKOnE= +20260123090000_remove_event_type.up.sql h1:rJ5SdWSmz70ZmzeyLe+gvoCyin3MkWgDwo4acCEVE/Y= +20260309120000_add_countries_table.down.sql h1:2PEtAYgSyU5YUgylUjXDNxyApz00Lwn7Gs0N2MUMo4Y= +20260309120000_add_countries_table.up.sql h1:yg42Cs0sXtQ5ZJzuhQKx8wND8AkOTZQ3NqYS8ifbvkI= +20260309151141_analytics_client_dimensions_enums.down.sql h1:w88wMK4amX8C6tN2Aa7qS2X2c4tJyMyN4zSAMQ7ZnJQ= +20260309151141_analytics_client_dimensions_enums.up.sql h1:tFrfPxaI98BBhIHk+iIoQG2X0r7ef2ywDqpzcGRJaig= +20260309183000_clients_hash_utc_day_skipped_rotation.down.sql h1:T1t8x+hjFlCLGv6vZ1USbDKZK7vp1NAVWIsoCEm9x2M= +20260309183000_clients_hash_utc_day_skipped_rotation.up.sql h1:pN8eS3pSqBMYK8PSMKRA1r4ksklT6W+QcTK7PfKTkVI= +20260703120000_analytics_accuracy_indexes.down.sql h1:oGqxZcg07UX6g1aCuUYdy3Hjhjha/AibJe3eXyNcZ+8= +20260703120000_analytics_accuracy_indexes.up.sql h1:2nYsP3vqs9X1ToHmGIO52WPWI0aOlc7RuRnPlMM957w= diff --git a/server/migrations/sqlite/20260703120000_analytics_accuracy_indexes.down.sql b/server/migrations/sqlite/20260703120000_analytics_accuracy_indexes.down.sql new file mode 100644 index 00000000..f47e20dc --- /dev/null +++ b/server/migrations/sqlite/20260703120000_analytics_accuracy_indexes.down.sql @@ -0,0 +1,6 @@ +DROP INDEX `sessions_site_enter_hour`; +DROP INDEX `sessions_site_enter_day`; +DROP INDEX `sessions_site_enter_time`; +DROP INDEX `events_definition_time_path_session`; +DROP INDEX `events_time_session_definition`; +DROP INDEX `events_session_path_definition_time`; diff --git a/server/migrations/sqlite/20260703120000_analytics_accuracy_indexes.up.sql b/server/migrations/sqlite/20260703120000_analytics_accuracy_indexes.up.sql new file mode 100644 index 00000000..1c593d6f --- /dev/null +++ b/server/migrations/sqlite/20260703120000_analytics_accuracy_indexes.up.sql @@ -0,0 +1,6 @@ +CREATE INDEX `events_session_path_definition_time` ON `events` (`session_id`, `path`, `definition_id`, `time` DESC); +CREATE INDEX `events_time_session_definition` ON `events` (`time` DESC, `session_id`, `definition_id`); +CREATE INDEX `events_definition_time_path_session` ON `events` (`definition_id`, `time` DESC, `path`, `session_id`); +CREATE INDEX `sessions_site_enter_time` ON `sessions` (`site_id`, `enter_time`); +CREATE INDEX `sessions_site_enter_day` ON `sessions` (`site_id`, `enter_day`); +CREATE INDEX `sessions_site_enter_hour` ON `sessions` (`site_id`, `enter_hour`); diff --git a/server/migrations/sqlite/atlas.sum b/server/migrations/sqlite/atlas.sum index b53ba215..9e633023 100644 --- a/server/migrations/sqlite/atlas.sum +++ b/server/migrations/sqlite/atlas.sum @@ -1,7 +1,15 @@ -h1:aEreHY58Gbvu+KgWNTCkLWGnM2RxBcsIEyYyloh4BL4= -20260121204035_initial_db.up.sql h1:dZppik9Z4HgnZlPRlsvFkVX1APB5VC3bMOMJEij4m2s= -20260122093101_add_site_domain_ordering_and_event_definition_uniques.up.sql h1:lTaJue5sAVxhSZk/sph7nzQTzBNSYBVYngtCVeKvvXk= -20260123090000_remove_event_type.up.sql h1:B6GnF2n/Xs/ovnKHPzaFjc45+dPhC0s8lMHhbO6yEuE= -20260309120000_add_countries_table.up.sql h1:wEgCpqtoFyjEE6onP/Ferwlyt75WrlKFSY0c140Y6AA= -20260309151021_analytics_client_dimensions_enums.up.sql h1:JDBq6TzffB2c0jBHeYW4aVz4s5QXiG6fx6shbSoTZKA= -20260309183000_clients_hash_utc_day_skipped_rotation.up.sql h1:3dt6yK6u9ZgReRT13RJOmOyQ1XiMjR8PXamveR65Quo= +h1:p89FA4En3O+hbdKZkAePIVR5uJzhMq3zZ684ApBciWo= +20260121204035_initial_db.down.sql h1:eJr6OgW4gSTSFpbtNzsN+TXKUI68MHQMNfc6tWTv7lE= +20260121204035_initial_db.up.sql h1:HLEuAnRsrtllOmpD9+fR6C/dCIWsbzVrgnoJl9RhKkY= +20260122093101_add_site_domain_ordering_and_event_definition_uniques.down.sql h1:XekGCZl0cy1EojWh8uO2FNKOvYF1dVgwzd15kX8sbeM= +20260122093101_add_site_domain_ordering_and_event_definition_uniques.up.sql h1:aqzOL3O7UeTElgJrtSNcYX0vma/8aO2zn/XeySYZ5u4= +20260123090000_remove_event_type.down.sql h1:K60DRu+kG2HoksBBR1MI71YpXVwGqU6m41HNcVrKl7c= +20260123090000_remove_event_type.up.sql h1:MPTE7+CdZQhPdbvEz1iMrdxHrfaakwggV0bC61WFi/4= +20260309120000_add_countries_table.down.sql h1:rdQJWnzX2Pz46rLr0IuGzvxCBG/Uv5ofCdzYF1YA6Zc= +20260309120000_add_countries_table.up.sql h1:9IQi8lKG4nKZg6+t503Rb/z5yWh2armJPFdFIh2XnpY= +20260309151021_analytics_client_dimensions_enums.down.sql h1:C2sFPN1SFJGuOeHiSXzoWJ7nTvRniesauZ+KB9Xzoq4= +20260309151021_analytics_client_dimensions_enums.up.sql h1:FsMYvohM6wu9tQzoRWc5d/dGVXM75G4R3KdaPGUpXLo= +20260309183000_clients_hash_utc_day_skipped_rotation.down.sql h1:j0iNV64AQOMMnHPyYiFtKQAfSjdTFQ5E/Ce5/W92Xnw= +20260309183000_clients_hash_utc_day_skipped_rotation.up.sql h1:USyRN8KdirKLPdU/hdCWrntmOTdGtAJIVKE+4WcZiH8= +20260703120000_analytics_accuracy_indexes.down.sql h1:Oqk5RwupZ54me1h4g/B6L8CVVpNm4AJRM16Cv7yth4A= +20260703120000_analytics_accuracy_indexes.up.sql h1:LLeXaIAex5SvXj3f6KRAb3xZpdDzM9LEBX3vAgrhjWw= diff --git a/server/pkg/README.md b/server/pkg/README.md index a40a4a31..b0e388b9 100644 --- a/server/pkg/README.md +++ b/server/pkg/README.md @@ -3,3 +3,10 @@ App-agnostic code only. Packages that grow enough should be extracted and published as independent libraries. See each package's `doc.go` for package-level documentation. + +Current package boundaries: +- `clientip` - Resolves a client IP from `RemoteAddr`, `X-Forwarded-For`, and `X-Real-IP` only when the remote address is in a trusted proxy CIDR. +- `random` - Random value helpers. +- `textutil` - Text manipulation helpers. +- `urlpath` - URL path normalization helpers. +- `validation` - App-agnostic input validators and validation errors. diff --git a/server/pkg/clientip/clientip.go b/server/pkg/clientip/clientip.go index 950da8de..965ba01c 100644 --- a/server/pkg/clientip/clientip.go +++ b/server/pkg/clientip/clientip.go @@ -1,32 +1,142 @@ package clientip import ( + "fmt" "net" + "net/netip" "strings" ) +type Resolver struct { + trusted []netip.Prefix +} + +func NewResolver(trustedCIDRs []string) (*Resolver, error) { + resolver := &Resolver{trusted: make([]netip.Prefix, 0, len(trustedCIDRs))} + for _, raw := range trustedCIDRs { + value := strings.TrimSpace(raw) + if value == "" { + continue + } + prefix, err := parseTrustedPrefix(value) + if err != nil { + return nil, err + } + resolver.trusted = append(resolver.trusted, prefix) + } + return resolver, nil +} + +func MustNewResolver(trustedCIDRs []string) *Resolver { + resolver, err := NewResolver(trustedCIDRs) + if err != nil { + panic(err) + } + return resolver +} + func GetClientIP(xForwardedFor, xRealIP, remoteAddr string) string { - if xForwardedFor != "" { - ips := strings.Split(xForwardedFor, ",") - if len(ips) > 0 { - ip := strings.TrimSpace(ips[0]) - if ip != "" { - return ip - } + return MustNewResolver(nil).GetClientIP(xForwardedFor, xRealIP, remoteAddr) +} + +func (r *Resolver) GetClientIP(xForwardedFor, xRealIP, remoteAddr string) string { + remoteHost := hostFromRemoteAddr(remoteAddr) + remoteIP, remoteOK := parseIP(remoteHost) + if !remoteOK { + return remoteHost + } + + if r == nil || !r.isTrusted(remoteIP) { + return remoteIP.String() + } + + if ip, ok := r.clientFromForwardedFor(xForwardedFor); ok { + return ip.String() + } + if ip, ok := parseIP(xRealIP); ok { + return ip.String() + } + return remoteIP.String() +} + +func parseTrustedPrefix(value string) (netip.Prefix, error) { + if strings.Contains(value, "/") { + prefix, err := netip.ParsePrefix(value) + if err != nil { + return netip.Prefix{}, fmt.Errorf("invalid trusted proxy CIDR %q: %w", value, err) } + return prefix.Masked(), nil } - if xRealIP != "" { - return xRealIP + addr, err := netip.ParseAddr(value) + if err != nil { + return netip.Prefix{}, fmt.Errorf("invalid trusted proxy address %q: %w", value, err) } + if addr.Is4() { + return netip.PrefixFrom(addr, 32), nil + } + return netip.PrefixFrom(addr, 128), nil +} + +func (r *Resolver) clientFromForwardedFor(value string) (netip.Addr, bool) { + parts := strings.Split(value, ",") + var leftmostValid netip.Addr + hasLeftmostValid := false - if remoteAddr != "" { - host, _, err := net.SplitHostPort(remoteAddr) - if err == nil { - return host + // Match Nginx real_ip_recursive behavior: from the trusted proxy chain, + // choose the last non-trusted address as the client. + for i := len(parts) - 1; i >= 0; i-- { + ip, ok := parseIP(parts[i]) + if !ok { + continue + } + leftmostValid = ip + hasLeftmostValid = true + if !r.isTrusted(ip) { + return ip, true } - return remoteAddr } - return "" + return leftmostValid, hasLeftmostValid +} + +func (r *Resolver) isTrusted(ip netip.Addr) bool { + if r == nil { + return false + } + for _, prefix := range r.trusted { + if prefix.Contains(ip) { + return true + } + } + return false +} + +func hostFromRemoteAddr(remoteAddr string) string { + if remoteAddr == "" { + return "" + } + host, _, err := net.SplitHostPort(remoteAddr) + if err == nil { + return host + } + return strings.TrimSpace(remoteAddr) +} + +func parseIP(value string) (netip.Addr, bool) { + value = strings.TrimSpace(value) + if value == "" { + return netip.Addr{}, false + } + if host, _, err := net.SplitHostPort(value); err == nil { + value = host + } + addr, err := netip.ParseAddr(value) + if err != nil { + return netip.Addr{}, false + } + if addr.Is4In6() { + addr = netip.AddrFrom4(addr.As4()) + } + return addr, true } diff --git a/server/pkg/clientip/clientip_test.go b/server/pkg/clientip/clientip_test.go new file mode 100644 index 00000000..142db438 --- /dev/null +++ b/server/pkg/clientip/clientip_test.go @@ -0,0 +1,45 @@ +package clientip + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestResolverIgnoresForwardedHeadersFromUntrustedRemote(t *testing.T) { + resolver := MustNewResolver([]string{"10.0.0.0/8"}) + + got := resolver.GetClientIP("198.51.100.9", "198.51.100.10", "203.0.113.5:12345") + + require.Equal(t, "203.0.113.5", got) +} + +func TestResolverUsesForwardedHeaderFromTrustedRemote(t *testing.T) { + resolver := MustNewResolver([]string{"10.0.0.0/8"}) + + got := resolver.GetClientIP("198.51.100.9", "", "10.1.2.3:12345") + + require.Equal(t, "198.51.100.9", got) +} + +func TestResolverUsesLastNonTrustedForwardedHop(t *testing.T) { + resolver := MustNewResolver([]string{"10.0.0.0/8", "192.168.0.0/16"}) + + got := resolver.GetClientIP("198.51.100.9, 192.168.1.5, 10.1.2.3", "", "10.9.8.7:12345") + + require.Equal(t, "198.51.100.9", got) +} + +func TestResolverFallsBackToXRealIPFromTrustedRemote(t *testing.T) { + resolver := MustNewResolver([]string{"10.0.0.0/8"}) + + got := resolver.GetClientIP("", "198.51.100.11", "10.1.2.3:12345") + + require.Equal(t, "198.51.100.11", got) +} + +func TestNewResolverRejectsInvalidCIDR(t *testing.T) { + _, err := NewResolver([]string{"not-a-cidr"}) + + require.Error(t, err) +} diff --git a/server/pkg/clientip/doc.go b/server/pkg/clientip/doc.go index 893ecdc0..68d7aab8 100644 --- a/server/pkg/clientip/doc.go +++ b/server/pkg/clientip/doc.go @@ -1,3 +1,9 @@ -// Package clientip provides helpers to extract client IP addresses -// from common reverse-proxy headers and remote addresses. +// Package clientip resolves client IP addresses from remote addresses and +// common reverse-proxy headers. +// +// RemoteAddr is authoritative unless it belongs to a configured trusted proxy +// CIDR. Only trusted remotes may supply X-Forwarded-For or X-Real-IP. For +// X-Forwarded-For chains, the resolver scans from right to left and chooses +// the last non-trusted hop, matching the common real_ip_recursive deployment +// model used by Nginx-style reverse proxies. package clientip diff --git a/server/static/dist/tracker-size.svg b/server/static/dist/tracker-size.svg index 2999284d..fe8ac7af 100644 --- a/server/static/dist/tracker-size.svg +++ b/server/static/dist/tracker-size.svg @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ - - - tracker.js 2.1 KB | gzip 1004 B + + + tracker.js 1.9 KB | gzip 967 B diff --git a/server/static/dist/tracker.js b/server/static/dist/tracker.js index bedcbb24..4552b104 100644 --- a/server/static/dist/tracker.js +++ b/server/static/dist/tracker.js @@ -1 +1 @@ -"use strict";(()=>{(()=>{let o=document.currentScript,s=o?.getAttribute("data-site-key")??"",c=o?.getAttribute("data-api-url")??o?.src?.replace(/\/[^/]*$/,"")??"",y=o?.getAttribute("data-include-query")==="true";if(!s||!c)return;let u="",d=Date.now(),g=()=>y?window.location.pathname+window.location.search:window.location.pathname,h=()=>{let e=document.referrer;if(!e)return"";try{return new URL(e).hostname===window.location.hostname?"":e}catch{return e}},n=(e,r,t)=>{typeof t=="string"&&(e[r]=t)},m=(e,r,t)=>{typeof t=="number"&&(e[r]=t)},f=e=>{if(typeof e=="string")return e;if(e!==void 0)return JSON.stringify(e)},w=e=>{let r=new URLSearchParams(window.location.search),t={site_key:s,name:"",path:g(),properties:"",referrer:h(),screen_width:window.innerWidth,duration:0,utm_source:r.get("utm_source")||"",utm_medium:r.get("utm_medium")||"",utm_campaign:r.get("utm_campaign")||""};if(!e)return t;n(t,"name",e.name),n(t,"path",e.path),n(t,"referrer",e.referrer),m(t,"screen_width",e.screen_width),m(t,"duration",e.duration),n(t,"utm_source",e.utm_source),n(t,"utm_medium",e.utm_medium),n(t,"utm_campaign",e.utm_campaign);let a=f(e.properties);return a!==void 0&&(t.properties=a),t},_=(e,r)=>{let t=`${c}${e}?site_key=${encodeURIComponent(s)}`,a=JSON.stringify(r);if(navigator.sendBeacon){let b=new Blob([a],{type:"application/json"});navigator.sendBeacon(t,b)}else fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:a,keepalive:!0}).catch(()=>{})},i=e=>{let r=w(e);r.path===u&&!r.name&&r.duration===0||(u=r.path,_("/api/collect",r),d=Date.now())},p=()=>{let e=Math.round((Date.now()-d)/1e3);e>0&&e<3600&&i({duration:e})},l=()=>{i(),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&p()});let e=history.pushState;history.pushState=function(...t){e.apply(this,t),i()};let r=history.replaceState;history.replaceState=function(...t){r.apply(this,t),i()},window.addEventListener("popstate",()=>{i()}),window.addEventListener("beforeunload",p)};window.lovelyEye={track:i},document.readyState==="complete"?l():window.addEventListener("load",l)})();})(); +"use strict";(()=>{(()=>{let o=document.currentScript,d=o?.getAttribute("data-site-key")??"",m=o?.getAttribute("data-api-url")??o?.src?.replace(/\/[^/]*$/,"")??"",h=o?.getAttribute("data-include-query")==="true";if(!d||!m)return;let u="",s=!1,p=()=>h?window.location.pathname+window.location.search:window.location.pathname,w=()=>{let t=document.referrer;if(!t)return"";try{return new URL(t).hostname===window.location.hostname?"":t}catch{return t}},i=(t,r,e)=>{typeof e=="string"&&(t[r]=e)},_=t=>{if(typeof t=="string")return t;if(t!==void 0)return JSON.stringify(t)},S=t=>{let r=new URLSearchParams(window.location.search),e=w();e&&(t.referrer=e);let n=r.get("utm_source"),c=r.get("utm_medium"),y=r.get("utm_campaign");n&&(t.utm_source=n),c&&(t.utm_medium=c),y&&(t.utm_campaign=y)},k=(t,r=!1)=>{let e={path:p()};if(r&&S(e),!t)return e;i(e,"name",t.name),i(e,"path",t.path),i(e,"referrer",t.referrer),i(e,"utm_source",t.utm_source),i(e,"utm_medium",t.utm_medium),i(e,"utm_campaign",t.utm_campaign);let n=_(t.properties);return n!==void 0&&(e.properties=n),e},l=(t,r)=>{let e=`${m}${t}?site_key=${encodeURIComponent(d)}`,n=JSON.stringify(r);if(navigator.sendBeacon){let c=new Blob([n],{type:"text/plain;charset=UTF-8"});navigator.sendBeacon(e,c)}else fetch(e,{method:"POST",headers:{"Content-Type":"text/plain;charset=UTF-8"},body:n,keepalive:!0}).catch(()=>{})},a=t=>{let r=k(t,u===""&&!t?.name);r.path===u&&!r.name||(u=r.path,s=!1,l("/api/collect",r))},g=()=>{if(s)return;let t=p();t&&(s=!0,l("/api/collect",{path:t,exit:!0}))},f=()=>{a(),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?g():s=!1});let t=history.pushState;history.pushState=function(...e){t.apply(this,e),a()};let r=history.replaceState;history.replaceState=function(...e){r.apply(this,e),a()},window.addEventListener("popstate",()=>{a()}),window.addEventListener("pagehide",g)};window.lovelyEye={track:a},document.readyState==="complete"?f():window.addEventListener("load",f)})();})(); diff --git a/server/static/tracker.js b/server/static/tracker.js index 5feb8018..4552b104 100644 --- a/server/static/tracker.js +++ b/server/static/tracker.js @@ -1,145 +1 @@ -/** - * Lovely Eye Analytics Tracker - * Lightweight, privacy-focused analytics tracking script - */ -(function() { - 'use strict'; - - var script = document.currentScript; - var siteKey = script.getAttribute('data-site-key'); - var apiUrl = script.getAttribute('data-api-url') || (script.src.replace(/\/[^/]*$/, '')); - - if (!siteKey) { - console.warn('Lovely Eye: Missing data-site-key attribute'); - return; - } - - var lastPath = null; - var pageStartTime = Date.now(); - var includeQuery = script.getAttribute('data-include-query') === 'true'; - - function getPath() { - return includeQuery ? window.location.pathname + window.location.search : window.location.pathname; - } - - function getReferrer() { - var ref = document.referrer; - if (!ref) return ''; - try { - var refUrl = new URL(ref); - if (refUrl.hostname === window.location.hostname) { - return ''; // Internal referrer, treat as direct - } - return ref; - } catch (e) { - return ref; - } - } - - function getUTMParams() { - var params = new URLSearchParams(window.location.search); - return { - utm_source: params.get('utm_source') || '', - utm_medium: params.get('utm_medium') || '', - utm_campaign: params.get('utm_campaign') || '' - }; - } - - function send(endpoint, data) { - var url = apiUrl + endpoint + '?site_key=' + encodeURIComponent(siteKey); - - // Use sendBeacon if available for reliability - if (navigator.sendBeacon) { - var blob = new Blob([JSON.stringify(data)], { type: 'application/json' }); - navigator.sendBeacon(url, blob); - } else { - // Fallback to fetch - fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(data), - keepalive: true - }).catch(function() {}); - } - } - - function trackPageView() { - var path = getPath(); - - if (path === lastPath) return; - lastPath = path; - - var utm = getUTMParams(); - - send('/api/collect', { - site_key: siteKey, - path: path, - referrer: getReferrer(), - screen_width: window.innerWidth, - utm_source: utm.utm_source, - utm_medium: utm.utm_medium, - utm_campaign: utm.utm_campaign - }); - - pageStartTime = Date.now(); - } - - function trackEvent(name, properties) { - if (!name) return; - - send('/api/collect', { - site_key: siteKey, - name: name, - path: getPath(), - properties: properties ? JSON.stringify(properties) : '' - }); - } - - function trackLeave() { - var duration = Math.round((Date.now() - pageStartTime) / 1000); - if (duration > 0 && duration < 3600) { // Sanity check: max 1 hour - send('/api/collect', { - site_key: siteKey, - path: getPath(), - duration: duration - }); - } - } - - function init() { - trackPageView(); - - document.addEventListener('visibilitychange', function() { - if (document.visibilityState === 'hidden') { - trackLeave(); - } - }); - - var originalPushState = history.pushState; - history.pushState = function() { - originalPushState.apply(this, arguments); - trackPageView(); - }; - - var originalReplaceState = history.replaceState; - history.replaceState = function() { - originalReplaceState.apply(this, arguments); - trackPageView(); - }; - - window.addEventListener('popstate', trackPageView); - - window.addEventListener('beforeunload', trackLeave); - } - - window.lovelyEye = { - track: trackEvent, - trackPageView: trackPageView - }; - - if (document.readyState === 'complete') { - init(); - } else { - window.addEventListener('load', init); - } -})(); +"use strict";(()=>{(()=>{let o=document.currentScript,d=o?.getAttribute("data-site-key")??"",m=o?.getAttribute("data-api-url")??o?.src?.replace(/\/[^/]*$/,"")??"",h=o?.getAttribute("data-include-query")==="true";if(!d||!m)return;let u="",s=!1,p=()=>h?window.location.pathname+window.location.search:window.location.pathname,w=()=>{let t=document.referrer;if(!t)return"";try{return new URL(t).hostname===window.location.hostname?"":t}catch{return t}},i=(t,r,e)=>{typeof e=="string"&&(t[r]=e)},_=t=>{if(typeof t=="string")return t;if(t!==void 0)return JSON.stringify(t)},S=t=>{let r=new URLSearchParams(window.location.search),e=w();e&&(t.referrer=e);let n=r.get("utm_source"),c=r.get("utm_medium"),y=r.get("utm_campaign");n&&(t.utm_source=n),c&&(t.utm_medium=c),y&&(t.utm_campaign=y)},k=(t,r=!1)=>{let e={path:p()};if(r&&S(e),!t)return e;i(e,"name",t.name),i(e,"path",t.path),i(e,"referrer",t.referrer),i(e,"utm_source",t.utm_source),i(e,"utm_medium",t.utm_medium),i(e,"utm_campaign",t.utm_campaign);let n=_(t.properties);return n!==void 0&&(e.properties=n),e},l=(t,r)=>{let e=`${m}${t}?site_key=${encodeURIComponent(d)}`,n=JSON.stringify(r);if(navigator.sendBeacon){let c=new Blob([n],{type:"text/plain;charset=UTF-8"});navigator.sendBeacon(e,c)}else fetch(e,{method:"POST",headers:{"Content-Type":"text/plain;charset=UTF-8"},body:n,keepalive:!0}).catch(()=>{})},a=t=>{let r=k(t,u===""&&!t?.name);r.path===u&&!r.name||(u=r.path,s=!1,l("/api/collect",r))},g=()=>{if(s)return;let t=p();t&&(s=!0,l("/api/collect",{path:t,exit:!0}))},f=()=>{a(),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?g():s=!1});let t=history.pushState;history.pushState=function(...e){t.apply(this,e),a()};let r=history.replaceState;history.replaceState=function(...e){r.apply(this,e),a()},window.addEventListener("popstate",()=>{a()}),window.addEventListener("pagehide",g)};window.lovelyEye={track:a},document.readyState==="complete"?f():window.addEventListener("load",f)})();})(); diff --git a/server/static/tracker.ts b/server/static/tracker.ts index 9b51ddd9..da949b33 100644 --- a/server/static/tracker.ts +++ b/server/static/tracker.ts @@ -6,8 +6,6 @@ type TrackInput = { name?: string; path?: string; referrer?: string; - screen_width?: number; - duration?: number; properties?: Record | string; utm_source?: string; utm_medium?: string; @@ -15,22 +13,18 @@ type TrackInput = { }; type TrackPayload = { - site_key: string; - name: string; + name?: string; path: string; - properties: string; - referrer: string; - screen_width: number; - duration: number; - utm_source: string; - utm_medium: string; - utm_campaign: string; + properties?: string; + referrer?: string; + exit?: true; + utm_source?: string; + utm_medium?: string; + utm_campaign?: string; }; type PayloadStringKey = 'name' | 'path' | 'referrer' | 'utm_source' | 'utm_medium' | 'utm_campaign'; -type PayloadNumberKey = 'screen_width' | 'duration'; - declare global { interface Window { lovelyEye?: { @@ -48,7 +42,7 @@ declare global { if (!siteKey || !apiUrl) return; let lastPath = ''; - let pageStartTime = Date.now(); + let exitSent = false; const getPath = (): string => includeQuery ? window.location.pathname + window.location.search : window.location.pathname; @@ -75,16 +69,6 @@ declare global { } }; - const assignNumberOverride = ( - payload: TrackPayload, - key: PayloadNumberKey, - value: number | undefined - ): void => { - if (typeof value === 'number') { - payload[key] = value; - } - }; - const getPropertiesValue = (properties: TrackInput['properties']): string | undefined => { if (typeof properties === 'string') { return properties; @@ -97,28 +81,31 @@ declare global { return undefined; }; - const buildPayload = (data?: TrackInput): TrackPayload => { + const assignAttribution = (payload: TrackPayload): void => { const params = new URLSearchParams(window.location.search); - const payload: TrackPayload = { - site_key: siteKey, - name: '', - path: getPath(), - properties: '', - referrer: getReferrer(), - screen_width: window.innerWidth, - duration: 0, - utm_source: params.get('utm_source') || '', - utm_medium: params.get('utm_medium') || '', - utm_campaign: params.get('utm_campaign') || '', - }; + const referrer = getReferrer(); + if (referrer) payload.referrer = referrer; + + const utmSource = params.get('utm_source'); + const utmMedium = params.get('utm_medium'); + const utmCampaign = params.get('utm_campaign'); + if (utmSource) payload.utm_source = utmSource; + if (utmMedium) payload.utm_medium = utmMedium; + if (utmCampaign) payload.utm_campaign = utmCampaign; + }; + + const buildPayload = (data?: TrackInput, includeAttribution = false): TrackPayload => { + const payload: TrackPayload = { path: getPath() }; + + if (includeAttribution) { + assignAttribution(payload); + } if (!data) return payload; assignStringOverride(payload, 'name', data.name); assignStringOverride(payload, 'path', data.path); assignStringOverride(payload, 'referrer', data.referrer); - assignNumberOverride(payload, 'screen_width', data.screen_width); - assignNumberOverride(payload, 'duration', data.duration); assignStringOverride(payload, 'utm_source', data.utm_source); assignStringOverride(payload, 'utm_medium', data.utm_medium); assignStringOverride(payload, 'utm_campaign', data.utm_campaign); @@ -136,12 +123,12 @@ declare global { const payload = JSON.stringify(data); if (navigator.sendBeacon) { - const blob = new Blob([payload], { type: 'application/json' }); + const blob = new Blob([payload], { type: 'text/plain;charset=UTF-8' }); navigator.sendBeacon(url, blob); } else { fetch(url, { method: 'POST', - headers: { 'Content-Type': 'application/json' }, + headers: { 'Content-Type': 'text/plain;charset=UTF-8' }, body: payload, keepalive: true, }).catch(() => {}); @@ -149,18 +136,19 @@ declare global { }; const track = (data?: TrackInput): void => { - const payload = buildPayload(data); - if (payload.path === lastPath && !payload.name && payload.duration === 0) return; + const payload = buildPayload(data, lastPath === '' && !data?.name); + if (payload.path === lastPath && !payload.name) return; lastPath = payload.path; + exitSent = false; send('/api/collect', payload); - pageStartTime = Date.now(); }; - const trackLeave = (): void => { - const duration = Math.round((Date.now() - pageStartTime) / 1000); - if (duration > 0 && duration < 3600) { - track({ duration }); - } + const trackExit = (): void => { + if (exitSent) return; + const path = getPath(); + if (!path) return; + exitSent = true; + send('/api/collect', { path, exit: true }); }; const init = (): void => { @@ -168,7 +156,9 @@ declare global { document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') { - trackLeave(); + trackExit(); + } else { + exitSent = false; } }); @@ -187,7 +177,7 @@ declare global { window.addEventListener('popstate', () => { track(); }); - window.addEventListener('beforeunload', trackLeave); + window.addEventListener('pagehide', trackExit); }; window.lovelyEye = { track };