diff --git a/package-lock.json b/package-lock.json index e51fc585..25496f06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,9 +89,9 @@ } }, "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.214", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.214.tgz", - "integrity": "sha512-JeuX1xoYWXEeFD4RyAyvv8OD/NPdbLD6leKKpFLECWqsKY1YrwX0U8lr753CskflwaDGpU42pyyjPdiMZ7NiWA==", + "version": "2.2.215", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.215.tgz", + "integrity": "sha512-D+Jzwpl+zlBGjJf7nuRcz6JFNwqDQ+IzwIq0VSC4LMRRvrkhGE/ZE+zab3EnjmVkipcQqtQe+PVKefgmxETbvA==", "dev": true, "license": "Apache-2.0" }, @@ -363,17 +363,17 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.709.0.tgz", - "integrity": "sha512-MKnx5n7/Wp4qk+Wd1nJQGJ/520rNJDUnBbHTY3x8iPyeKK+8fNy25hWi0lV3gsHhTDvAcVb7UgSSJ5qNVec0GA==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.712.0.tgz", + "integrity": "sha512-vGTnWXQkWx+dfqS6wso+nSCvQB8o7+6R/im78gTzRXBsvj/b8MWYua0Kbvse+YFqegT+59BBmFB3tC3f5y3nEQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.709.0", - "@aws-sdk/client-sts": "3.709.0", + "@aws-sdk/client-sso-oidc": "3.712.0", + "@aws-sdk/client-sts": "3.712.0", "@aws-sdk/core": "3.709.0", - "@aws-sdk/credential-provider-node": "3.709.0", + "@aws-sdk/credential-provider-node": "3.712.0", "@aws-sdk/middleware-host-header": "3.709.0", "@aws-sdk/middleware-logger": "3.709.0", "@aws-sdk/middleware-recursion-detection": "3.709.0", @@ -382,7 +382,7 @@ "@aws-sdk/types": "3.709.0", "@aws-sdk/util-endpoints": "3.709.0", "@aws-sdk/util-user-agent-browser": "3.709.0", - "@aws-sdk/util-user-agent-node": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.712.0", "@smithy/config-resolver": "^3.0.13", "@smithy/core": "^2.5.5", "@smithy/eventstream-serde-browser": "^3.0.14", @@ -420,18 +420,18 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.709.0.tgz", - "integrity": "sha512-IvC7coELoQ4YenTdULArVdL5yk6jNRVUALX1aqv9JlPdrXxb3Om6YrM9e7AlSTLxrULTsAe1ubm8i/DmcSY/Ng==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.712.0.tgz", + "integrity": "sha512-Hq1IIwOFutmHtTz3mROR1XhTDL8rxcYbYw3ajjgeMJB5tjcvodpfkfz/L4dxXZMwqylWf6SNQNAiaGh5mlsGGQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.709.0", - "@aws-sdk/client-sts": "3.709.0", + "@aws-sdk/client-sso-oidc": "3.712.0", + "@aws-sdk/client-sts": "3.712.0", "@aws-sdk/core": "3.709.0", - "@aws-sdk/credential-provider-node": "3.709.0", + "@aws-sdk/credential-provider-node": "3.712.0", "@aws-sdk/middleware-bucket-endpoint": "3.709.0", "@aws-sdk/middleware-expect-continue": "3.709.0", "@aws-sdk/middleware-flexible-checksums": "3.709.0", @@ -447,7 +447,7 @@ "@aws-sdk/types": "3.709.0", "@aws-sdk/util-endpoints": "3.709.0", "@aws-sdk/util-user-agent-browser": "3.709.0", - "@aws-sdk/util-user-agent-node": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.712.0", "@aws-sdk/xml-builder": "3.709.0", "@smithy/config-resolver": "^3.0.13", "@smithy/core": "^2.5.5", @@ -489,17 +489,17 @@ } }, "node_modules/@aws-sdk/client-sqs": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.709.0.tgz", - "integrity": "sha512-qVMDxAnUbA/BnMf+utUZ+eoy6F4T7RsHnwor674/Bn5TsRPfGXYPTCpqqGZDTj4DYew6/G8ePpb3YwClVOqNRg==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.712.0.tgz", + "integrity": "sha512-O8g9KF9Rq7glKlQs5SbHO35Y3VN12j9W5TqmXEqyU7AkPaUHk0ZR3S99TytJHt67O3XGcUb/zmaoOqIvKIIqSA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.709.0", - "@aws-sdk/client-sts": "3.709.0", + "@aws-sdk/client-sso-oidc": "3.712.0", + "@aws-sdk/client-sts": "3.712.0", "@aws-sdk/core": "3.709.0", - "@aws-sdk/credential-provider-node": "3.709.0", + "@aws-sdk/credential-provider-node": "3.712.0", "@aws-sdk/middleware-host-header": "3.709.0", "@aws-sdk/middleware-logger": "3.709.0", "@aws-sdk/middleware-recursion-detection": "3.709.0", @@ -509,7 +509,7 @@ "@aws-sdk/types": "3.709.0", "@aws-sdk/util-endpoints": "3.709.0", "@aws-sdk/util-user-agent-browser": "3.709.0", - "@aws-sdk/util-user-agent-node": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.712.0", "@smithy/config-resolver": "^3.0.13", "@smithy/core": "^2.5.5", "@smithy/fetch-http-handler": "^4.1.2", @@ -543,17 +543,17 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.709.0.tgz", - "integrity": "sha512-WSm2RY7Tiix5+0V5oNqdmcKDgd10XZy8BYLPYPy0+dBHv0XcIYit5UmCHsrpgu4WBU0ppXq5XevCcMhBbJZu1A==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.712.0.tgz", + "integrity": "sha512-bUx1JaDaozyKOPDmSkirnqo3QQYhQoKzY6sbNv6q1Le27SgugQ3kQIpR4wceVzdJKI0oVfnjHrlPn5ijioBaqQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.709.0", - "@aws-sdk/client-sts": "3.709.0", + "@aws-sdk/client-sso-oidc": "3.712.0", + "@aws-sdk/client-sts": "3.712.0", "@aws-sdk/core": "3.709.0", - "@aws-sdk/credential-provider-node": "3.709.0", + "@aws-sdk/credential-provider-node": "3.712.0", "@aws-sdk/middleware-host-header": "3.709.0", "@aws-sdk/middleware-logger": "3.709.0", "@aws-sdk/middleware-recursion-detection": "3.709.0", @@ -562,7 +562,7 @@ "@aws-sdk/types": "3.709.0", "@aws-sdk/util-endpoints": "3.709.0", "@aws-sdk/util-user-agent-browser": "3.709.0", - "@aws-sdk/util-user-agent-node": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.712.0", "@smithy/config-resolver": "^3.0.13", "@smithy/core": "^2.5.5", "@smithy/fetch-http-handler": "^4.1.2", @@ -604,9 +604,9 @@ "license": "MIT" }, "node_modules/@aws-sdk/client-sso": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.709.0.tgz", - "integrity": "sha512-Qxeo8cN0jNy6Wnbqq4wucffAGJM6sJjofoTgNtPA6cC7sPYx7aYC6OAAAo6NaMRY+WywOKdS9Wgjx2QYRxKx7w==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.712.0.tgz", + "integrity": "sha512-tBo/eW3YpZ9f3Q1qA7aA8uliNFJJX0OP7R2IUJ8t6rqVTk15wWCEPNmXzUZKgruDnKUfCaF4+r9q/Yy4fBc9PA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -620,7 +620,7 @@ "@aws-sdk/types": "3.709.0", "@aws-sdk/util-endpoints": "3.709.0", "@aws-sdk/util-user-agent-browser": "3.709.0", - "@aws-sdk/util-user-agent-node": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.712.0", "@smithy/config-resolver": "^3.0.13", "@smithy/core": "^2.5.5", "@smithy/fetch-http-handler": "^4.1.2", @@ -653,15 +653,15 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.709.0.tgz", - "integrity": "sha512-1w6egz17QQy661lNCRmZZlqIANEbD6g2VFAQIJbVwSiu7brg+GUns+mT1eLLLHAMQc1sL0Ds8/ybSK2SrgGgIA==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.712.0.tgz", + "integrity": "sha512-xNFrG9syrG6pxUP7Ld/nu3afQ9+rbJM9qrE+wDNz4VnNZ3vLiJty4fH85zBFhOQ5OF2DIJTWsFzXGi2FYjsCMA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.709.0", - "@aws-sdk/credential-provider-node": "3.709.0", + "@aws-sdk/credential-provider-node": "3.712.0", "@aws-sdk/middleware-host-header": "3.709.0", "@aws-sdk/middleware-logger": "3.709.0", "@aws-sdk/middleware-recursion-detection": "3.709.0", @@ -670,7 +670,7 @@ "@aws-sdk/types": "3.709.0", "@aws-sdk/util-endpoints": "3.709.0", "@aws-sdk/util-user-agent-browser": "3.709.0", - "@aws-sdk/util-user-agent-node": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.712.0", "@smithy/config-resolver": "^3.0.13", "@smithy/core": "^2.5.5", "@smithy/fetch-http-handler": "^4.1.2", @@ -702,20 +702,20 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.709.0" + "@aws-sdk/client-sts": "^3.712.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.709.0.tgz", - "integrity": "sha512-cBAvlPg6yslXNL385UUGFPw+XY+lA9BzioNdIFkMo3fEUlTShogTtiWz4LsyLHoN6LhKojssP9DSmmWKWjCZIw==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.712.0.tgz", + "integrity": "sha512-gIO6BD+hkEe3GKQhbiFP0zcNQv0EkP1Cl9SOstxS+X9CeudEgVX/xEPUjyoFVkfkntPBJ1g0I1u5xOzzRExl4g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.709.0", + "@aws-sdk/client-sso-oidc": "3.712.0", "@aws-sdk/core": "3.709.0", - "@aws-sdk/credential-provider-node": "3.709.0", + "@aws-sdk/credential-provider-node": "3.712.0", "@aws-sdk/middleware-host-header": "3.709.0", "@aws-sdk/middleware-logger": "3.709.0", "@aws-sdk/middleware-recursion-detection": "3.709.0", @@ -724,7 +724,7 @@ "@aws-sdk/types": "3.709.0", "@aws-sdk/util-endpoints": "3.709.0", "@aws-sdk/util-user-agent-browser": "3.709.0", - "@aws-sdk/util-user-agent-node": "3.709.0", + "@aws-sdk/util-user-agent-node": "3.712.0", "@smithy/config-resolver": "^3.0.13", "@smithy/core": "^2.5.5", "@smithy/fetch-http-handler": "^4.1.2", @@ -816,16 +816,16 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.709.0.tgz", - "integrity": "sha512-qCF8IIGcPoUp+Ib3ANhbF5gElxFd+kIrtv2/1tKdvhudMANstQbMiWV0LTH47ZZR6c3as4iSrm09NZnpEoD/pA==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.712.0.tgz", + "integrity": "sha512-sTsdQ/Fm/suqMdpjhMuss/5uKL18vcuWnNTQVrG9iGNRqZLbq65MXquwbUpgzfoUmIcH+4CrY6H2ebpTIECIag==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.709.0", "@aws-sdk/credential-provider-env": "3.709.0", "@aws-sdk/credential-provider-http": "3.709.0", "@aws-sdk/credential-provider-process": "3.709.0", - "@aws-sdk/credential-provider-sso": "3.709.0", + "@aws-sdk/credential-provider-sso": "3.712.0", "@aws-sdk/credential-provider-web-identity": "3.709.0", "@aws-sdk/types": "3.709.0", "@smithy/credential-provider-imds": "^3.2.8", @@ -838,20 +838,20 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.709.0" + "@aws-sdk/client-sts": "^3.712.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.709.0.tgz", - "integrity": "sha512-4HRX9KYWPSjO5O/Vg03YAsebKpvTjTvpK1n7zHYBmlLMBLxUrVsL1nNKKC5p2/7OW3RL8XR1ki3QkoV7kGRxUQ==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.712.0.tgz", + "integrity": "sha512-gXrHymW3rMRYORkPVQwL8Gi5Lu92F16SoZR543x03qCi7rm00oL9tRD85ACxkhprS1Wh8lUIUMNoeiwnYWTNuQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.709.0", "@aws-sdk/credential-provider-http": "3.709.0", - "@aws-sdk/credential-provider-ini": "3.709.0", + "@aws-sdk/credential-provider-ini": "3.712.0", "@aws-sdk/credential-provider-process": "3.709.0", - "@aws-sdk/credential-provider-sso": "3.709.0", + "@aws-sdk/credential-provider-sso": "3.712.0", "@aws-sdk/credential-provider-web-identity": "3.709.0", "@aws-sdk/types": "3.709.0", "@smithy/credential-provider-imds": "^3.2.8", @@ -882,12 +882,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.709.0.tgz", - "integrity": "sha512-rYdTDOxazS2GdGScelsRK5CAkktRLCCdRjlwXaxrcW57j749hEqxcF5uTv9RD6WBwInfedcSywErNZB+hylQlg==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.712.0.tgz", + "integrity": "sha512-8lCMxY7Lb9VK9qdlNXRJXE3W1UDVURnJZ3a4XWYNY6yr1TfQaN40mMyXX1oNlXXJtMV0szRvjM8dZj37E/ESAw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.709.0", + "@aws-sdk/client-sso": "3.712.0", "@aws-sdk/core": "3.709.0", "@aws-sdk/token-providers": "3.709.0", "@aws-sdk/types": "3.709.0", @@ -1226,9 +1226,9 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.709.0.tgz", - "integrity": "sha512-trBfzSCVWy7ILgqhEXgiuM7hfRCw4F4a8IK90tjk9YL0jgoJ6eJuOp7+DfCtHJaygoBxD3cdMFkOu+lluFmGBA==", + "version": "3.712.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.712.0.tgz", + "integrity": "sha512-26X21bZ4FWsVpqs33uOXiB60TOWQdVlr7T7XONDFL/XN7GEpUJkWuuIB4PTok6VOmh1viYcdxZQqekXPuzXexQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-user-agent": "3.709.0", @@ -3767,9 +3767,9 @@ "license": "Apache-2.0" }, "node_modules/@firebase/app": { - "version": "0.10.16", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.16.tgz", - "integrity": "sha512-SUati2qH48gvVGnSsqMkZr1Iq7No52a3tJQ4itboSTM89Erezmw3v1RsfVymrDze9+KiOLmBpvLNKSvheITFjg==", + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.17.tgz", + "integrity": "sha512-53sIYyAnYEPIZdaxuyq5OST7j4KBc2pqmktz+tEb1BIUSbXh8Gp4k/o6qzLelLpm4ngrBz7SRN0PZJqNRAyPog==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.11", @@ -3833,12 +3833,12 @@ "license": "Apache-2.0" }, "node_modules/@firebase/app-compat": { - "version": "0.2.46", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.46.tgz", - "integrity": "sha512-9hSHWE5LMqtKIm13CnH5OZeMPbkVV3y5vgNZ5EMFHcG2ceRrncyNjG9No5XfWQw8JponZdGs4HlE4aMD/jxcFA==", + "version": "0.2.47", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.47.tgz", + "integrity": "sha512-TdEWGDp6kSwuO1mxiM2Fe39eLWygfyzqTZcoU3aPV0viqqphPCbBBnVjPbFJErZ4+yaS7uCWXEbFEP9m5/COKA==", "license": "Apache-2.0", "dependencies": { - "@firebase/app": "0.10.16", + "@firebase/app": "0.10.17", "@firebase/component": "0.6.11", "@firebase/logger": "0.4.4", "@firebase/util": "1.10.2", @@ -3927,9 +3927,9 @@ } }, "node_modules/@firebase/data-connect": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.1.2.tgz", - "integrity": "sha512-Bcf29mntFCt5V7aceMe36wnkHrG7cwbMlUVbDHOlh2foQKx9VtSXEONw9r6FtL1sFobHVYOM5L6umX35f59m5g==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.1.3.tgz", + "integrity": "sha512-FbAQpWNHownJx1VTCQI4ydbWGOZmSWXoFlirQn3ItHqsLJYSywqxSgDafzvyooifFh3J/2WqaM8y9hInnPcsTw==", "license": "Apache-2.0", "dependencies": { "@firebase/auth-interop-types": "0.2.4", @@ -4038,9 +4038,9 @@ } }, "node_modules/@firebase/functions": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.10.tgz", - "integrity": "sha512-TP+Dzebazhw6+GduBdWn1kOJRFH84G2z+BW3pNVfkpFRkc//+uT1Uw2+dLpMGSSBRG7FrcDG91vcPnOFCzr15w==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.12.0.tgz", + "integrity": "sha512-plTtzY/nT0jOgHzT0vB9qch4FpHFOhCnR8HhYBqqdArG6GOQMIruKZbiTyLybO8bcaaNgQ6kSm9yohGUwxHcIw==", "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.3", @@ -4058,13 +4058,13 @@ } }, "node_modules/@firebase/functions-compat": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.16.tgz", - "integrity": "sha512-FL7EXehiiBisNIR7mlb0i+moyWKLVfcEJgh/Wq6ZV6BdrCObpCTz7w5EvuRIEFX5e9cNL2oWInKg8S5X4HtINg==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.17.tgz", + "integrity": "sha512-oj2XV8YsJYutyPCRYUfbN6swmfrL6zar0/qtqZsKT7P7btOiYRl+lD6fxtQaT+pKE5YgOBGZW//kLPZfY0jWhw==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.11", - "@firebase/functions": "0.11.10", + "@firebase/functions": "0.12.0", "@firebase/functions-types": "0.6.3", "@firebase/util": "1.10.2", "tslib": "^2.1.0" @@ -4135,9 +4135,9 @@ } }, "node_modules/@firebase/messaging": { - "version": "0.12.14", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.14.tgz", - "integrity": "sha512-cSGP34jJswFvME8tdMDkvJvW6T1jEekyMSyq84AMBZ0KEpJbDWuC9n4wKT2lxUm1jaL651iZnn6g51yCl77ICg==", + "version": "0.12.15", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.15.tgz", + "integrity": "sha512-Bz+qvWNEwEWAbYtG4An8hgcNco6NWNoNLuLbGVwPL2fAoCF1zz+dcaBp+iTR2+K199JyRyDT9yDPAXhNHNDaKQ==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.11", @@ -4152,13 +4152,13 @@ } }, "node_modules/@firebase/messaging-compat": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.14.tgz", - "integrity": "sha512-r9weK8jTEA2aGiwy0IbMQPnzuJ0DHkOQaMxGJOlU2QZ1a7fh6RHpNtaoM+LKnn6u1NQgmAOWYNr9vezVQEm9zw==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.15.tgz", + "integrity": "sha512-mEKKASRvRWq1aBNHgioGsOYR2c5nBZpO7k90K794zjKe0WkGNf0k7PLs5SlCf8FKnzumEkhTAp/SjYxovuxa8A==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.11", - "@firebase/messaging": "0.12.14", + "@firebase/messaging": "0.12.15", "@firebase/util": "1.10.2", "tslib": "^2.1.0" }, @@ -4309,9 +4309,9 @@ } }, "node_modules/@firebase/vertexai": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/vertexai/-/vertexai-1.0.1.tgz", - "integrity": "sha512-f48MGSofhaS05ebpN7zMIv4tBqYf19pXr5/4njKtNZVLbjxUswDma0SuFDoO+IwgbdkhFxgtNctM+C1zfI/O1Q==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@firebase/vertexai/-/vertexai-1.0.2.tgz", + "integrity": "sha512-4dC9m2nD0tkfKJT5v+i27tELrmUePjFXW3CDAxhVHUEv647B2R7kqpGQnyPkNEeaXkCr76THe7GGg35EWn4lDw==", "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.3", @@ -5418,9 +5418,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -5923,9 +5923,9 @@ } }, "node_modules/@maxim_mazurok/gapi.client.drive-v3": { - "version": "0.0.20241206", - "resolved": "https://registry.npmjs.org/@maxim_mazurok/gapi.client.drive-v3/-/gapi.client.drive-v3-0.0.20241206.tgz", - "integrity": "sha512-OJW9xHcWqIKpQW+uIdGmPiHwscv30uF07wUNKVotbMX9X6/zo166XXbnPND39vxDdjtSndMGy55sOFLIuuDnqg==", + "version": "0.0.20241209", + "resolved": "https://registry.npmjs.org/@maxim_mazurok/gapi.client.drive-v3/-/gapi.client.drive-v3-0.0.20241209.tgz", + "integrity": "sha512-T/KqZwiCfULf7AhjwiE7aXSt8X0+hJg+q2RWblCDinp/GLzEkPMZEe/5ALVs3aClUQneYcJ55mFLq+Tvud8j7w==", "dev": true, "license": "MIT", "dependencies": { @@ -5934,19 +5934,19 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.48.0", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.48.0.tgz", - "integrity": "sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ==", + "version": "7.48.1", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.48.1.tgz", + "integrity": "sha512-HN9Osa1WxqLM66RaqB5nPAadx+nTIQmY/XtkFdaJvusjG8Tus++QqZtD7KPZDSkhEMGHsYeSyeU8qUzCDUXPjg==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.30.0", + "@microsoft/api-extractor-model": "7.30.1", "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.10.0", + "@rushstack/node-core-library": "5.10.1", "@rushstack/rig-package": "0.5.3", - "@rushstack/terminal": "0.14.3", - "@rushstack/ts-command-line": "4.23.1", + "@rushstack/terminal": "0.14.4", + "@rushstack/ts-command-line": "4.23.2", "lodash": "~4.17.15", "minimatch": "~3.0.3", "resolve": "~1.22.1", @@ -5959,15 +5959,15 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.0.tgz", - "integrity": "sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug==", + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.1.tgz", + "integrity": "sha512-CTS2PlASJHxVY8hqHORVb1HdECWOEMcMnM6/kDkPr0RZapAFSIHhg9D4jxuE8g+OWYHtPc10LCpmde5pylTRlA==", "dev": true, "license": "MIT", "dependencies": { "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.10.0" + "@rushstack/node-core-library": "5.10.1" } }, "node_modules/@microsoft/api-extractor/node_modules/brace-expansion": { @@ -8586,23 +8586,23 @@ } }, "node_modules/@prose-reader/core": { - "version": "1.140.0", - "resolved": "https://registry.npmjs.org/@prose-reader/core/-/core-1.140.0.tgz", - "integrity": "sha512-kYrXrB+GSKXUyuPP5GDBEBWG/dglTZJCHXxsd6rb1Z4ldsg/4gc/wifOGbZRH3KlinsjEJ0VnA95iXPCfprOLg==", + "version": "1.150.0", + "resolved": "https://registry.npmjs.org/@prose-reader/core/-/core-1.150.0.tgz", + "integrity": "sha512-0NaKXKKJWF6b0+tCVb9EKMDCONBEqO9f/PlmB0WvJpMPLafHF0xWZhsUsTptf8fwd7CYok0AAhtV16niSw5ALA==", "license": "MIT", "dependencies": { - "@prose-reader/shared": "^1.140.0" + "@prose-reader/shared": "^1.150.0" }, "peerDependencies": { "rxjs": "*" } }, "node_modules/@prose-reader/enhancer-gestures": { - "version": "1.140.0", - "resolved": "https://registry.npmjs.org/@prose-reader/enhancer-gestures/-/enhancer-gestures-1.140.0.tgz", - "integrity": "sha512-CC3cAtpXvv3HY9MbqtfdpENQZ3vhk1W6wZcc51cv/UN+/40wirKBuKm9yE9oOIHGeG9QMZJFLVVc1U04PMMkng==", + "version": "1.150.0", + "resolved": "https://registry.npmjs.org/@prose-reader/enhancer-gestures/-/enhancer-gestures-1.150.0.tgz", + "integrity": "sha512-JsqwgOQYIHWzE07s5KQ2QtR6SwhxDz4j/QSNGqu7e7qoDP7Nmw1YNR5bHeWdOH430uKiXWGieNXcHn/FkbTVgA==", "dependencies": { - "@prose-reader/core": "^1.140.0" + "@prose-reader/core": "^1.150.0" }, "peerDependencies": { "gesturx": "*", @@ -8610,18 +8610,18 @@ } }, "node_modules/@prose-reader/shared": { - "version": "1.140.0", - "resolved": "https://registry.npmjs.org/@prose-reader/shared/-/shared-1.140.0.tgz", - "integrity": "sha512-cg4u3kqoGAO/uWmAAeAJNH3V/lnD5sQ90Pov1ukFaEwiMYBuK8NHsgIpyuieLFLHzKw+MeMKEDOPzpOVx2LnIA==", + "version": "1.150.0", + "resolved": "https://registry.npmjs.org/@prose-reader/shared/-/shared-1.150.0.tgz", + "integrity": "sha512-Ynr2zVUIMI8cUzwB6LCP9mdhHszzg7lwUSoS286OAzBcAturPWlG30f0OodlKj5i70BkTm3bm9fT8PosK+YNbA==", "license": "MIT" }, "node_modules/@prose-reader/streamer": { - "version": "1.140.0", - "resolved": "https://registry.npmjs.org/@prose-reader/streamer/-/streamer-1.140.0.tgz", - "integrity": "sha512-vpW0xxwBQpOVVO+Fua+1Tf9k5ZUXg4a3pSMToB+7i4PQpTCeA1fPvEyX30XkmtfoWOQ0wxZ2U8J0qUTq9AcsKw==", + "version": "1.150.0", + "resolved": "https://registry.npmjs.org/@prose-reader/streamer/-/streamer-1.150.0.tgz", + "integrity": "sha512-RbHvOOBrGEO1Eh8skHD6KuqjmiTrtspqqIGiC3cD7U9AC+MVA3xuiefIC/4o4JVPtejXgQc7oijE3h5mVwn9yg==", "license": "MIT", "dependencies": { - "@prose-reader/shared": "^1.140.0" + "@prose-reader/shared": "^1.150.0" }, "peerDependencies": { "buffer": "^6.0.3", @@ -8703,9 +8703,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", - "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", "dev": true, "license": "MIT", "dependencies": { @@ -8728,9 +8728,9 @@ } }, "node_modules/@rollup/plugin-replace": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.1.tgz", - "integrity": "sha512-2sPh9b73dj5IxuMmDAsQWVFT7mR+yoHweBaXG2W/R8vQ+IWZlnaI7BR7J6EguVQUp1hd8Z7XuozpDjEKQAAC2Q==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz", + "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8773,9 +8773,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", - "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9076,9 +9076,9 @@ "license": "MIT" }, "node_modules/@rushstack/node-core-library": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.10.0.tgz", - "integrity": "sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.10.1.tgz", + "integrity": "sha512-BSb/KcyBHmUQwINrgtzo6jiH0HlGFmrUy33vO6unmceuVKTEyL2q+P0fQq2oB5hvXVWOEUhxB2QvlkZluvUEmg==", "dev": true, "license": "MIT", "dependencies": { @@ -9200,13 +9200,13 @@ } }, "node_modules/@rushstack/terminal": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.3.tgz", - "integrity": "sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.4.tgz", + "integrity": "sha512-NxACqERW0PHq8Rpq1V6v5iTHEwkRGxenjEW+VWqRYQ8T9puUzgmGHmEZUaUEDHAe9Qyvp0/Ew04sAiQw9XjhJg==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.10.0", + "@rushstack/node-core-library": "5.10.1", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -9235,13 +9235,13 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.1.tgz", - "integrity": "sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.2.tgz", + "integrity": "sha512-JJ7XZX5K3ThBBva38aomgsPv1L7FV6XmSOcR6HtM7HDFZJkepqT65imw26h9ggGqMjsY0R9jcl30tzKcVj9aOQ==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.14.3", + "@rushstack/terminal": "0.14.4", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" @@ -9265,67 +9265,67 @@ "license": "BSD-3-Clause" }, "node_modules/@sentry-internal/browser-utils": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.43.0.tgz", - "integrity": "sha512-5WhJZ3SA5sZVDBwOsChDd5JCzYcwBX7sEqBqEcm3pFru6TUihEnFIJmDIbreIyrQMwUhs3dTxnfnidgjr5z1Ag==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.45.1.tgz", + "integrity": "sha512-sZwtP3zAzDsjUS7WkMW5VGbvSl7hGKTMc8gAJbpEsrybMxllIP13zzMRwpeFF11RnnvbrZ/FtAeX58Mvj0jahA==", "license": "MIT", "dependencies": { - "@sentry/core": "8.43.0" + "@sentry/core": "8.45.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/feedback": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.43.0.tgz", - "integrity": "sha512-rcGR2kzFu4vLXBQbI9eGJwjyToyjl36O2q/UKbiZBNJ5IFtDvKRLke6jIHq/YqiHPfFGpVtq5M/lYduDfA/eaQ==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.45.1.tgz", + "integrity": "sha512-zCKptzki4SLnG+s8je8dgnppOKFjiiO4GVBc4fh7uL8zjNPBnxW8wK4SrPfAEKVYaHUzkKc5vixwUqcpmfLLGw==", "license": "MIT", "dependencies": { - "@sentry/core": "8.43.0" + "@sentry/core": "8.45.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.43.0.tgz", - "integrity": "sha512-geV5/zejLfGGwWHjylzrb1w8NI3U37GMG9/53nmv13FmTXUDF5XF2lh41KXFVYwvp7Ha4bd1FRQ9IU9YtBWskw==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.45.1.tgz", + "integrity": "sha512-cOA9CodNSR9+hmICDaGIDUvWiwxQxeMHk/esbjB8uAW8HG4CYTG3CTYTZmlmou7DuysfMd4JNuFmDFBj+YU5/A==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.43.0", - "@sentry/core": "8.43.0" + "@sentry-internal/browser-utils": "8.45.1", + "@sentry/core": "8.45.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.43.0.tgz", - "integrity": "sha512-rL8G7E1GtozH8VNalRrBQNjYDJ5ChWS/vpQI5hUG11PZfvQFXEVatLvT3uO2l0xIlHm4idTsHOSLTe/usxnogQ==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.45.1.tgz", + "integrity": "sha512-qiPg6XwOwkiMMe/8Qf3EhXCqkSlSnWLlorYngIbdkV2klbWjd7vKnqkFJF4PnaS0g7kkZr7nh+MdzpyLyuj2Mw==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "8.43.0", - "@sentry/core": "8.43.0" + "@sentry-internal/replay": "8.45.1", + "@sentry/core": "8.45.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/aws-serverless": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry/aws-serverless/-/aws-serverless-8.43.0.tgz", - "integrity": "sha512-hERUDzZYOGJRFE+RK+xT34GM9pIR3E1LDWrWaLFGIrPWP76Yr5nYdWa4Ni78H6pmAuOrat4OmKh32HOJuCscIQ==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry/aws-serverless/-/aws-serverless-8.45.1.tgz", + "integrity": "sha512-NHjKeLBRgHXEuVfNK382rdPxOIQ+sJd0iZKmhDvKHL911fzKTkweBEHcW+mKSKWd1noe2AMJlmcQVAEaUgbEZw==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/instrumentation": "^0.56.0", "@opentelemetry/instrumentation-aws-lambda": "0.49.0", "@opentelemetry/instrumentation-aws-sdk": "0.48.0", - "@sentry/core": "8.43.0", - "@sentry/node": "8.43.0", + "@sentry/core": "8.45.1", + "@sentry/node": "8.45.1", "@types/aws-lambda": "^8.10.62" }, "engines": { @@ -9333,34 +9333,34 @@ } }, "node_modules/@sentry/browser": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.43.0.tgz", - "integrity": "sha512-LGvLLnfmR8+AEgFmd7Q7KHiOTiV0P1Lvio2ENDELhEqJOIiICauttibVmig+AW02qg4kMeywvleMsUYaZv2RVA==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.45.1.tgz", + "integrity": "sha512-/KvYhQSRg8m9kotG8h9FrfXCWRlebrvdfXKjj1oE9SyZ2LmR8Ze9AcEw1qzsBsa1F1D/a5FQbUJahSoLBkaQPA==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.43.0", - "@sentry-internal/feedback": "8.43.0", - "@sentry-internal/replay": "8.43.0", - "@sentry-internal/replay-canvas": "8.43.0", - "@sentry/core": "8.43.0" + "@sentry-internal/browser-utils": "8.45.1", + "@sentry-internal/feedback": "8.45.1", + "@sentry-internal/replay": "8.45.1", + "@sentry-internal/replay-canvas": "8.45.1", + "@sentry/core": "8.45.1" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/core": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.43.0.tgz", - "integrity": "sha512-ktyovtjkTMNud+kC/XfqHVCoQKreIKgx/hgeRvzPwuPyd1t1KzYmRL3DBkbcWVnyOPpVTHn+RsEI1eRcVYHtvw==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.45.1.tgz", + "integrity": "sha512-1fGmkr0paZshh38mD29c4CfkRkgFoYDaAGyDLoGYfTbEph/lU8RHB2HWzN93McqNdMEhl1DRRyqIasUZoPlqSA==", "license": "MIT", "engines": { "node": ">=14.18" } }, "node_modules/@sentry/node": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.43.0.tgz", - "integrity": "sha512-qCQU9vFxf03ejw1h+qWJXCf0erV56HBi5xgi262lHiBLcRtuwj1xjufMVKOWX0sQEvAxzqpMZmqRE64lXLY4Ig==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.45.1.tgz", + "integrity": "sha512-xvlXifM/FSOQdLAqQBuo04SiOh7RP8rRRr+c5G/YbBtgJA867Pve0X8JZK2BJpDZ3OrGvzXV1Ubnt9ao4rBfYA==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.0", @@ -9395,8 +9395,8 @@ "@opentelemetry/sdk-trace-base": "^1.29.0", "@opentelemetry/semantic-conventions": "^1.28.0", "@prisma/instrumentation": "5.19.1", - "@sentry/core": "8.43.0", - "@sentry/opentelemetry": "8.43.0", + "@sentry/core": "8.45.1", + "@sentry/opentelemetry": "8.45.1", "import-in-the-middle": "^1.11.2" }, "engines": { @@ -9404,12 +9404,12 @@ } }, "node_modules/@sentry/opentelemetry": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.43.0.tgz", - "integrity": "sha512-Ey+z1+JuMsb+LNY5MddJhjJpCnmkVwGZwoc5T/wWfh+5WKnvZ5RSNwaUl71Ho0lpVhhejwuUtaNxc4Ilk1KjhA==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.45.1.tgz", + "integrity": "sha512-khnR5TS21ksITTXmXnpniRN7brlZS5RNNQuMZ9n3MYi/L1/s9LT73skNh1gder28OV6ZxGUgrTZ+1dtKqn9tig==", "license": "MIT", "dependencies": { - "@sentry/core": "8.43.0" + "@sentry/core": "8.45.1" }, "engines": { "node": ">=14.18" @@ -9423,14 +9423,14 @@ } }, "node_modules/@sentry/profiling-node": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-8.43.0.tgz", - "integrity": "sha512-WyPknmDWA1nChFHv22u1k+nC7zo0iGpNLf9JuhpFxD0tAbltiXz414DQE/ISZvtPkDng89dVzKy0FJEAaGg7Dg==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-8.45.1.tgz", + "integrity": "sha512-1fxFxN5+62XDVep/jndXv8SfFNpRZxkgmAJSRW8AYNVb30ukLK2AZhDEU076iYCWt5ITtuxboWrqd8cXfUaAJA==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@sentry/core": "8.43.0", - "@sentry/node": "8.43.0", + "@sentry/core": "8.45.1", + "@sentry/node": "8.45.1", "detect-libc": "^2.0.2", "node-abi": "^3.61.0" }, @@ -9442,13 +9442,13 @@ } }, "node_modules/@sentry/react": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.43.0.tgz", - "integrity": "sha512-PsTzLrYio/FOJU537Y5Gj9jJi7OMHEjdttsC9INUxy5062LOd8ObtHsjE0mopLaSYEwUfSROQOBZCwmISh8ByQ==", + "version": "8.45.1", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.45.1.tgz", + "integrity": "sha512-ooMR2Lt4YSc5CMJklBKiL/mb+uidcZMpflxUvVUbtWMif+PqTUkfPRyICv6vs7muxK9i84Rr4iCkyZ4ns4H27A==", "license": "MIT", "dependencies": { - "@sentry/browser": "8.43.0", - "@sentry/core": "8.43.0", + "@sentry/browser": "8.45.1", + "@sentry/core": "8.45.1", "hoist-non-react-statics": "^3.3.2" }, "engines": { @@ -10236,9 +10236,9 @@ } }, "node_modules/@supabase/auth-js": { - "version": "2.66.1", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.66.1.tgz", - "integrity": "sha512-kOW+04SuDXmP2jRX9JL1Rgzduj8BcOG1qC3RaWdZsxnv89svNCdLRv8PfXW3QPKJdw0k1jF30OlQDPkzbDEL9w==", + "version": "2.67.1", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.67.1.tgz", + "integrity": "sha512-1SRZG9VkLFz4rtiyEc1l49tMq9jTYu4wJt3pMQEWi7yshZFIBdVH1o5sshk1plQd5LY6GcrPIpCydM2gGDxchA==", "license": "MIT", "dependencies": { "@supabase/node-fetch": "^2.6.14" @@ -10266,9 +10266,9 @@ } }, "node_modules/@supabase/postgrest-js": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.16.3.tgz", - "integrity": "sha512-HI6dsbW68AKlOPofUjDTaosiDBCtW4XAm0D18pPwxoW3zKOE2Ru13Z69Wuys9fd6iTpfDViNco5sgrtnP0666A==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.17.7.tgz", + "integrity": "sha512-aOzOYaTADm/dVTNksyqv9KsbhVa1gHz1Hoxb2ZEF2Ed9H7qlWOfptECQWmkEmrrFjtNaiPrgiSaPECvzI/seDA==", "license": "MIT", "dependencies": { "@supabase/node-fetch": "^2.6.14" @@ -10296,15 +10296,15 @@ } }, "node_modules/@supabase/supabase-js": { - "version": "2.47.4", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.47.4.tgz", - "integrity": "sha512-E55lLvQkr3TVeUfHNZp3XTqnzKDHXLgOvD5CWe5MEz5tX/DJJmcxZpD+CiLsgtCszM4GQJGO6y0N9g7AwFdfyQ==", + "version": "2.47.8", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.47.8.tgz", + "integrity": "sha512-2GjK8/PrGJYDVBcjqGyM2irBLMQXvvkJLbS8VFPlym2uuNz+pPMnwLbNf5njkknUTy3PamjgIRoADpuPPPA6oA==", "license": "MIT", "dependencies": { - "@supabase/auth-js": "2.66.1", + "@supabase/auth-js": "2.67.1", "@supabase/functions-js": "2.4.3", "@supabase/node-fetch": "2.6.15", - "@supabase/postgrest-js": "1.16.3", + "@supabase/postgrest-js": "1.17.7", "@supabase/realtime-js": "2.11.2", "@supabase/storage-js": "2.7.1" } @@ -10613,12 +10613,12 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.1.tgz", - "integrity": "sha512-orn2QNe5tF6SqjucHJ6cKTKcRDe3GG7bcYqPNn72Yejj7noECdzgAyRfGt2pGDPemhYim3d1HIR/dgruCnLfUA==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.2.tgz", + "integrity": "sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.10.9" + "@tanstack/virtual-core": "3.11.2" }, "funding": { "type": "github", @@ -10630,9 +10630,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.10.9", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz", - "integrity": "sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.11.2.tgz", + "integrity": "sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==", "license": "MIT", "funding": { "type": "github", @@ -11162,9 +11162,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.16", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.16.tgz", - "integrity": "sha512-oh8AMIC4Y2ciKufU8hnKgs+ufgbA/dhPTACaZPM86AbwX9QwnFtSoPWEeRUj8fge+v6kFt78BXcDhAU1SrrAsw==", + "version": "18.3.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.17.tgz", + "integrity": "sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -11532,9 +11532,9 @@ "license": "ISC" }, "node_modules/@vercel/build-utils": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-8.7.0.tgz", - "integrity": "sha512-ofZX+ABiW76u5khIyYyH5xK5KSuiAteqRu5hz2k1a2WHLwF7VpeBg8gdFR+HwbVnNkHtkMA64ya5Dd/lNoABkw==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-8.8.0.tgz", + "integrity": "sha512-4jkeJ/Xr0epojgfiyQufB8vC0ubE9SCfA9I2BGcOIKcf65C25juSvuYwaLixnjZXHUTO4Y9W7fdgiLUk55MgbA==", "dev": true, "license": "Apache-2.0" }, @@ -11844,14 +11844,14 @@ "license": "Apache-2.0" }, "node_modules/@vercel/gatsby-plugin-vercel-builder": { - "version": "2.0.59", - "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.59.tgz", - "integrity": "sha512-Y3hMNGmi2wyYeOptjjyWOP9Tsx6ME7Xsv1/MhBImWjJrLhqy9L3PFThjJJELP9ghCFGdAB7z7lB8XH4MmczTng==", + "version": "2.0.61", + "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.0.61.tgz", + "integrity": "sha512-OchbRapri4fGCefvjOG9m0yP2JICvCwrrQ+jS3lumcvr6NimmdDu3yxnzFYlSZ06D8cqD3hXx7a+hJKY5zdk3Q==", "dev": true, "dependencies": { "@sinclair/typebox": "0.25.24", - "@vercel/build-utils": "8.7.0", - "@vercel/routing-utils": "3.1.0", + "@vercel/build-utils": "8.8.0", + "@vercel/routing-utils": "5.0.0", "esbuild": "0.14.47", "etag": "1.8.1", "fs-extra": "11.1.0" @@ -12054,9 +12054,9 @@ } }, "node_modules/@vercel/node": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vercel/node/-/node-3.2.29.tgz", - "integrity": "sha512-WRVYidBqtRyYUw36v/WyUB2v97PsiV2+LepUiOPWcW9UpszQGGT2DAzsXOYqWveXMJKFhx0aETR6Nn6i+Yps1Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.0.0.tgz", + "integrity": "sha512-l917aGyDkaOhqfDrYSqy9sjd+Pv6K8mCsVyxzGv4kwmbhERpi8rS6aBmfIf4fDevEPYiOasftPHASbdnyHOe/g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12064,7 +12064,7 @@ "@edge-runtime/primitives": "4.1.0", "@edge-runtime/vm": "3.2.0", "@types/node": "16.18.11", - "@vercel/build-utils": "8.7.0", + "@vercel/build-utils": "8.8.0", "@vercel/error-utils": "2.0.3", "@vercel/nft": "0.27.3", "@vercel/static-config": "3.0.0", @@ -12259,14 +12259,14 @@ "license": "Apache-2.0" }, "node_modules/@vercel/redwood": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.1.8.tgz", - "integrity": "sha512-qBUBqIDxPEYnxRh3tsvTaPMtBkyK/D2tt9tBugNPe0OeYnMCMXVj9SJYbxiDI2GzAEFUZn4Poh63CZtXMDb9Tg==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.1.10.tgz", + "integrity": "sha512-JscXZGNuZY1IHq5CbGBHt7BvHEHh35ZIgorJ5RAEjvuqaox/EE4bA0oyI8y/5aWoZfMvJifS+UATKwI8HrP97w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@vercel/nft": "0.27.3", - "@vercel/routing-utils": "3.1.0", + "@vercel/routing-utils": "5.0.0", "@vercel/static-config": "3.0.0", "semver": "6.3.1", "ts-morph": "12.0.0" @@ -12283,9 +12283,9 @@ } }, "node_modules/@vercel/remix-builder": { - "version": "2.2.14", - "resolved": "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-2.2.14.tgz", - "integrity": "sha512-w81xbhZh5YZtWBi6E7o9Og9GkT86DZYQ0FBZvR9pAJCG4ejK18SLLyXD2MORLosTFpecLL0VZ5vdPh9oD9hJug==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-4.0.0.tgz", + "integrity": "sha512-82O08BggyQgRR86jbkx6pTWaTVhlMA9vU0nvql8af76r3k0iBrkoe6tJiEnwut2YaePUNWr2Kr+mdy6OrJHmVw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12296,9 +12296,9 @@ } }, "node_modules/@vercel/routing-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-3.1.0.tgz", - "integrity": "sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-5.0.0.tgz", + "integrity": "sha512-llvozDbkGDSelbgigAt9IwCQS8boP4rNHfy3rpJf0DqSn6UDlkFX270NwIQruyXN9KHktHC9qOof6Ik2+bT88A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12349,14 +12349,14 @@ "license": "Apache-2.0" }, "node_modules/@vercel/static-build": { - "version": "2.5.37", - "resolved": "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.5.37.tgz", - "integrity": "sha512-2ARBtE3ct7h9V34T+so/U3+ahXdG/0bk9uN96YV4L128nY4RR/T1F1uuY33Tiiz2PHAoq43hhMRZUC06b+GAhw==", + "version": "2.5.39", + "resolved": "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.5.39.tgz", + "integrity": "sha512-gnurv1NWzyE5STFF0BlgWXzIMODv9HeVezRwiEyhndjeugwkzp3xyoRXXR178LZ87lZ7gcgOp6HWEpNmaHDSyw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@vercel/gatsby-plugin-vercel-analytics": "1.0.11", - "@vercel/gatsby-plugin-vercel-builder": "2.0.59", + "@vercel/gatsby-plugin-vercel-builder": "2.0.61", "@vercel/static-config": "3.0.0", "ts-morph": "12.0.0" } @@ -12545,30 +12545,30 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.10.tgz", - "integrity": "sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", + "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", "dev": true, "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.10" + "@volar/source-map": "2.4.11" } }, "node_modules/@volar/source-map": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.10.tgz", - "integrity": "sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", + "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", "dev": true, "license": "MIT" }, "node_modules/@volar/typescript": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.10.tgz", - "integrity": "sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", + "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.10", + "@volar/language-core": "2.4.11", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } @@ -13568,16 +13568,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -13587,16 +13587,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -13623,20 +13623,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -13759,9 +13758,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.172.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.172.0.tgz", - "integrity": "sha512-SbFn2FyKhsHQpS7M3qeMWnRKtBHELkY3rmejk07cPlJ/BCJk/af8eKyeiNEEB0AZSfIeP4ImZCLNy9JS34mlPw==", + "version": "2.173.1", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.173.1.tgz", + "integrity": "sha512-xlbom4s3sbJDoHzIQmvunTufDQoJHQK8PTh653TE3338PysMX3liZ7efET9/FSQn50S2U3nINDGhrMvjkMBoKw==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -14729,9 +14728,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -14749,9 +14748,9 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -14919,6 +14918,22 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -14967,9 +14982,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "version": "1.0.30001689", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz", + "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==", "funding": [ { "type": "opencollective", @@ -16874,9 +16889,9 @@ } }, "node_modules/effect": { - "version": "3.11.5", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.11.5.tgz", - "integrity": "sha512-oSzaR/S/2A/qDTnDqMWxQUNSjCG2sRLB4NEvTu+l9RqE122MTgKXOWzw0x4MHsdovRTzAihfkpgBj2aLFnH2+w==", + "version": "3.11.7", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.11.7.tgz", + "integrity": "sha512-laj+TCxWGn0eOv6jNmS9vavMO01Z4vvRr7v5airaOUfE7Zr5PrHiECpiI5HRvOewxa1im/4EcOvRodOZ1S2Y7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -16900,9 +16915,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.72", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz", - "integrity": "sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==", + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", "dev": true, "license": "ISC" }, @@ -17034,58 +17049,60 @@ } }, "node_modules/es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "version": "1.23.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.6.tgz", + "integrity": "sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "data-view-buffer": "^1.0.1", "data-view-byte-length": "^1.0.1", "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.7", + "get-intrinsic": "^1.2.6", "get-symbol-description": "^1.0.2", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", + "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", + "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", + "is-string": "^1.1.1", "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.0.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "safe-array-concat": "^1.1.3", + "safe-regex-test": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", + "typed-array-byte-offset": "^1.0.3", + "typed-array-length": "^1.0.7", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -17150,7 +17167,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -18475,9 +18491,9 @@ } }, "node_modules/fast-check": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.1.tgz", - "integrity": "sha512-u/MudsoQEgBUZgR5N1v87vEgybeVYus9VnDVaIkxkkGP2jt54naghQ3PCQHJiogS8U/GavZCUPFfx3Xkp+NaHw==", + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", "dev": true, "funding": [ { @@ -18800,31 +18816,31 @@ } }, "node_modules/firebase": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.0.2.tgz", - "integrity": "sha512-w4T8BSJpzdZA25QRch5ahLsgB6uRvg1LEic4BaC5rTD1YygroI1AXp+W+rbMnr8d8EjfAv6t4k8doULIjc1P8Q==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.1.0.tgz", + "integrity": "sha512-3OoNW3vBXmBLYJvcwbPCwfluptbDVp2zZYjrfHPVFAXfPgmyy/LWjidt+Sw2WNvRelsG0v++WN2Wor6J3OwDRg==", "license": "Apache-2.0", "dependencies": { "@firebase/analytics": "0.10.10", "@firebase/analytics-compat": "0.2.16", - "@firebase/app": "0.10.16", + "@firebase/app": "0.10.17", "@firebase/app-check": "0.8.10", "@firebase/app-check-compat": "0.3.17", - "@firebase/app-compat": "0.2.46", + "@firebase/app-compat": "0.2.47", "@firebase/app-types": "0.9.3", "@firebase/auth": "1.8.1", "@firebase/auth-compat": "0.5.16", - "@firebase/data-connect": "0.1.2", + "@firebase/data-connect": "0.1.3", "@firebase/database": "1.0.10", "@firebase/database-compat": "2.0.1", "@firebase/firestore": "4.7.5", "@firebase/firestore-compat": "0.3.40", - "@firebase/functions": "0.11.10", - "@firebase/functions-compat": "0.3.16", + "@firebase/functions": "0.12.0", + "@firebase/functions-compat": "0.3.17", "@firebase/installations": "0.6.11", "@firebase/installations-compat": "0.2.11", - "@firebase/messaging": "0.12.14", - "@firebase/messaging-compat": "0.2.14", + "@firebase/messaging": "0.12.15", + "@firebase/messaging-compat": "0.2.15", "@firebase/performance": "0.6.11", "@firebase/performance-compat": "0.2.11", "@firebase/remote-config": "0.4.11", @@ -18832,7 +18848,7 @@ "@firebase/storage": "0.13.4", "@firebase/storage-compat": "0.3.14", "@firebase/util": "1.10.2", - "@firebase/vertexai": "1.0.1" + "@firebase/vertexai": "1.0.2" } }, "node_modules/firebase-admin": { @@ -19141,16 +19157,17 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.7.tgz", + "integrity": "sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -19326,19 +19343,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", - "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", + "call-bind-apply-helpers": "^1.0.1", "dunder-proto": "^1.0.0", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", "gopd": "^1.2.0", "has-symbols": "^1.1.0", - "hasown": "^2.0.2" + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -20499,15 +20518,15 @@ } }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -20562,13 +20581,13 @@ } }, "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -20578,14 +20597,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -20646,13 +20666,13 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", - "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" }, "engines": { @@ -20698,9 +20718,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", + "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -20713,12 +20733,14 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -20729,13 +20751,14 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -20964,13 +20987,13 @@ } }, "node_modules/is-number-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", - "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -21027,14 +21050,14 @@ "license": "MIT" }, "node_modules/is-regex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", - "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "gopd": "^1.1.0", + "call-bound": "^1.0.2", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" }, @@ -21107,13 +21130,13 @@ } }, "node_modules/is-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", - "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -21124,15 +21147,15 @@ } }, "node_modules/is-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", - "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "has-symbols": "^1.0.3", - "safe-regex-test": "^1.0.3" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -21196,13 +21219,16 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21272,17 +21298,18 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", - "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", + "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "reflect.getprototypeof": "^1.0.8", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -22766,9 +22793,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.15", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.15.tgz", - "integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -22845,6 +22872,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", + "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", @@ -25722,13 +25758,12 @@ } }, "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", @@ -26834,9 +26869,9 @@ } }, "node_modules/rc-util": { - "version": "5.44.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.1.tgz", - "integrity": "sha512-h6z91oGfWJPZgunkFBWSobfL0CkyLeaUNWP1ru7b05GMUSe2uHgTk0EiFEQ11v+zJBrORuXFl6Htf949ZSDdOw==", + "version": "5.44.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.2.tgz", + "integrity": "sha512-uGSk3hpPBLa3/0QAcKhCjgl4SFnhQCJDLvvpoLdbR6KgDuXrujG+dQaUeUvBJr2ZWak1O/9n+cYbJiWmmk95EQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -26908,9 +26943,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.54.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.0.tgz", - "integrity": "sha512-PS05+UQy/IdSbJNojBypxAo9wllhHgGmyr8/dyGQcPoiMf3e7Dfb9PWYVRco55bLbxH9S+1yDDJeTdlYCSxO3A==", + "version": "7.54.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.1.tgz", + "integrity": "sha512-PUNzFwQeQ5oHiiTUO7GO/EJXGEtuun2Y1A59rLnZBBj+vNEOWt/3ERTiG1/zt7dVeJEM+4vDX/7XQ/qanuvPMg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -26924,9 +26959,9 @@ } }, "node_modules/react-i18next": { - "version": "15.1.4", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.1.4.tgz", - "integrity": "sha512-2tai71gmehbvl9ZIqPMqlCCkm/cbeV1G4STpmM3C8Uzo6T2l8jDvZxEVSsQKt8blP9X34iRFP/k1ROqG2296MQ==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.2.0.tgz", + "integrity": "sha512-iJNc8111EaDtVTVMKigvBtPHyrJV+KblWG73cUxqp+WmJCcwkzhWNFXmkAD5pwP2Z4woeDj/oXDdbjDsb3Gutg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", @@ -27711,12 +27746,12 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", + "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -28032,6 +28067,145 @@ "rxjs": "^7.8.0" } }, + "node_modules/rxdb/node_modules/@firebase/app": { + "version": "0.10.16", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.16.tgz", + "integrity": "sha512-SUati2qH48gvVGnSsqMkZr1Iq7No52a3tJQ4itboSTM89Erezmw3v1RsfVymrDze9+KiOLmBpvLNKSvheITFjg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.11", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.10.2", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/rxdb/node_modules/@firebase/app-compat": { + "version": "0.2.46", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.46.tgz", + "integrity": "sha512-9hSHWE5LMqtKIm13CnH5OZeMPbkVV3y5vgNZ5EMFHcG2ceRrncyNjG9No5XfWQw8JponZdGs4HlE4aMD/jxcFA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app": "0.10.16", + "@firebase/component": "0.6.11", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.10.2", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/rxdb/node_modules/@firebase/data-connect": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.1.2.tgz", + "integrity": "sha512-Bcf29mntFCt5V7aceMe36wnkHrG7cwbMlUVbDHOlh2foQKx9VtSXEONw9r6FtL1sFobHVYOM5L6umX35f59m5g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.11", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.10.2", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/rxdb/node_modules/@firebase/functions": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.10.tgz", + "integrity": "sha512-TP+Dzebazhw6+GduBdWn1kOJRFH84G2z+BW3pNVfkpFRkc//+uT1Uw2+dLpMGSSBRG7FrcDG91vcPnOFCzr15w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.11", + "@firebase/messaging-interop-types": "0.2.3", + "@firebase/util": "1.10.2", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/rxdb/node_modules/@firebase/functions-compat": { + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.16.tgz", + "integrity": "sha512-FL7EXehiiBisNIR7mlb0i+moyWKLVfcEJgh/Wq6ZV6BdrCObpCTz7w5EvuRIEFX5e9cNL2oWInKg8S5X4HtINg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.11", + "@firebase/functions": "0.11.10", + "@firebase/functions-types": "0.6.3", + "@firebase/util": "1.10.2", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/rxdb/node_modules/@firebase/messaging": { + "version": "0.12.14", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.14.tgz", + "integrity": "sha512-cSGP34jJswFvME8tdMDkvJvW6T1jEekyMSyq84AMBZ0KEpJbDWuC9n4wKT2lxUm1jaL651iZnn6g51yCl77ICg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.11", + "@firebase/installations": "0.6.11", + "@firebase/messaging-interop-types": "0.2.3", + "@firebase/util": "1.10.2", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/rxdb/node_modules/@firebase/messaging-compat": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.14.tgz", + "integrity": "sha512-r9weK8jTEA2aGiwy0IbMQPnzuJ0DHkOQaMxGJOlU2QZ1a7fh6RHpNtaoM+LKnn6u1NQgmAOWYNr9vezVQEm9zw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.11", + "@firebase/messaging": "0.12.14", + "@firebase/util": "1.10.2", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/rxdb/node_modules/@firebase/vertexai": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@firebase/vertexai/-/vertexai-1.0.1.tgz", + "integrity": "sha512-f48MGSofhaS05ebpN7zMIv4tBqYf19pXr5/4njKtNZVLbjxUswDma0SuFDoO+IwgbdkhFxgtNctM+C1zfI/O1Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/component": "0.6.11", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.10.2", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, "node_modules/rxdb/node_modules/@types/express": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", @@ -28079,6 +28253,42 @@ "node": ">= 6.0.0" } }, + "node_modules/rxdb/node_modules/firebase": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.0.2.tgz", + "integrity": "sha512-w4T8BSJpzdZA25QRch5ahLsgB6uRvg1LEic4BaC5rTD1YygroI1AXp+W+rbMnr8d8EjfAv6t4k8doULIjc1P8Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/analytics": "0.10.10", + "@firebase/analytics-compat": "0.2.16", + "@firebase/app": "0.10.16", + "@firebase/app-check": "0.8.10", + "@firebase/app-check-compat": "0.3.17", + "@firebase/app-compat": "0.2.46", + "@firebase/app-types": "0.9.3", + "@firebase/auth": "1.8.1", + "@firebase/auth-compat": "0.5.16", + "@firebase/data-connect": "0.1.2", + "@firebase/database": "1.0.10", + "@firebase/database-compat": "2.0.1", + "@firebase/firestore": "4.7.5", + "@firebase/firestore-compat": "0.3.40", + "@firebase/functions": "0.11.10", + "@firebase/functions-compat": "0.3.16", + "@firebase/installations": "0.6.11", + "@firebase/installations-compat": "0.2.11", + "@firebase/messaging": "0.12.14", + "@firebase/messaging-compat": "0.2.14", + "@firebase/performance": "0.6.11", + "@firebase/performance-compat": "0.2.11", + "@firebase/remote-config": "0.4.11", + "@firebase/remote-config-compat": "0.2.11", + "@firebase/storage": "0.13.4", + "@firebase/storage-compat": "0.3.14", + "@firebase/util": "1.10.2", + "@firebase/vertexai": "1.0.1" + } + }, "node_modules/rxdb/node_modules/gaxios": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", @@ -28225,15 +28435,16 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -28264,15 +28475,15 @@ "license": "MIT" }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -28423,9 +28634,9 @@ } }, "node_modules/serverless": { - "version": "4.4.15", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-4.4.15.tgz", - "integrity": "sha512-PxYhTB41KEzwgdFm4RDRQYhvGJbW+ywoFoyxSBUqrG/D2GT/UKAJ4aD0sAKatZhZUfp+8Heyq5PgMdv4bvGE+Q==", + "version": "4.4.16", + "resolved": "https://registry.npmjs.org/serverless/-/serverless-4.4.16.tgz", + "integrity": "sha512-m0jAobJMjLr+ObLw99y670zXKy3IxziGI3Bw1BFxcOlhtVyEdhYZoE/ui6eh2J/QYLiesgmcCJOoRyhvTxfpSQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -28992,15 +29203,69 @@ "license": "BSD-2-Clause" }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -29637,16 +29902,19 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -29656,16 +29924,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -30179,18 +30451,18 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -30214,6 +30486,46 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -31339,16 +31651,19 @@ "license": "MIT" }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -31760,23 +32075,23 @@ } }, "node_modules/vercel": { - "version": "39.2.0", - "resolved": "https://registry.npmjs.org/vercel/-/vercel-39.2.0.tgz", - "integrity": "sha512-KXpjRaVY+HVMRMXDXS8jgy6/VvMM4fu1Oq/VeqWxRu6svwoFrVEkrbaSkyFrXxBFDk6GktiZS8srmf9jY1JZ8w==", + "version": "39.2.2", + "resolved": "https://registry.npmjs.org/vercel/-/vercel-39.2.2.tgz", + "integrity": "sha512-FTt0r++eORfQ3TLshYFdq5WiC7xVfbKMLE5YsBzex41yeDSCo5a5KXD6nDyMm+IIlu++XsHEVJRnfOA/JjL/mw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@vercel/build-utils": "8.7.0", + "@vercel/build-utils": "8.8.0", "@vercel/fun": "1.1.0", "@vercel/go": "3.2.1", "@vercel/hydrogen": "1.0.9", "@vercel/next": "4.4.0", - "@vercel/node": "3.2.29", + "@vercel/node": "5.0.0", "@vercel/python": "4.5.1", - "@vercel/redwood": "2.1.8", - "@vercel/remix-builder": "2.2.14", + "@vercel/redwood": "2.1.10", + "@vercel/remix-builder": "4.0.0", "@vercel/ruby": "2.1.0", - "@vercel/static-build": "2.5.37", + "@vercel/static-build": "2.5.39", "chokidar": "4.0.0" }, "bin": { @@ -32850,17 +33165,17 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", - "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.0", - "is-number-object": "^1.1.0", - "is-string": "^1.1.0", - "is-symbol": "^1.1.0" + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -32870,25 +33185,25 @@ } }, "node_modules/which-builtin-type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", - "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", + "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -34068,9 +34383,9 @@ } }, "packages/api/node_modules/fast-xml-parser": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", - "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz", + "integrity": "sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==", "funding": [ { "type": "github", diff --git a/packages/api/src/functions/refreshMetadataCollectionLongProcess/src/refreshMetadata.ts b/packages/api/src/functions/refreshMetadataCollectionLongProcess/src/refreshMetadata.ts index 2a2f0742..92e03347 100644 --- a/packages/api/src/functions/refreshMetadataCollectionLongProcess/src/refreshMetadata.ts +++ b/packages/api/src/functions/refreshMetadataCollectionLongProcess/src/refreshMetadata.ts @@ -52,8 +52,11 @@ export const refreshMetadata = async ( const linkMetadataInfo = collection.linkResourceId && collection.linkType ? await pluginFacade.getMetadata({ - resourceId: collection.linkResourceId, - linkType: collection.linkType, + link: { + resourceId: collection.linkResourceId, + type: collection.linkType, + data: null + }, credentials }) : undefined diff --git a/packages/api/src/functions/refreshMetadataLongProcess/src/retrieveMetadataAndSaveCover.ts b/packages/api/src/functions/refreshMetadataLongProcess/src/retrieveMetadataAndSaveCover.ts index df02075d..551d1017 100644 --- a/packages/api/src/functions/refreshMetadataLongProcess/src/retrieveMetadataAndSaveCover.ts +++ b/packages/api/src/functions/refreshMetadataLongProcess/src/retrieveMetadataAndSaveCover.ts @@ -2,10 +2,7 @@ import fs from "fs" import path from "path" import { pluginFacade } from "../../../libs/plugins/facade" import { BookMetadata, directives } from "@oboku/shared" -import { - detectMimeTypeFromContent, - mergeSkippingUndefined -} from "../../../libs/utils" +import { detectMimeTypeFromContent } from "../../../libs/utils" import { Logger } from "@libs/logger" import { METADATA_EXTRACTOR_SUPPORTED_EXTENSIONS } from "../../../constants" import { getBookSourcesMetadata } from "@libs/metadata/getBookSourcesMetadata" @@ -29,7 +26,8 @@ export const retrieveMetadataAndSaveCover = async ( db: nano.DocumentScope } ) => { - logger.info( + console.log( + `[retrieveMetadataAndSaveCover]`, `syncMetadata run for user ${ctx.userName} with book ${ctx.book._id}` ) let bookNameForDebug = "" @@ -39,8 +37,10 @@ export const retrieveMetadataAndSaveCover = async ( try { bookNameForDebug = reduceMetadata(ctx.book.metadata).title || "" - logger.info( - `syncMetadata processing ${ctx.book._id} with resource id ${ctx.link.resourceId}` + console.log( + `[retrieveMetadataAndSaveCover]`, + `processing ${ctx.book._id} with link of type ${ctx.link.type}`, + { link: ctx.link } ) const bookIsProtected = await isBookProtected(ctx.db, ctx.book) @@ -49,31 +49,23 @@ export const retrieveMetadataAndSaveCover = async ( // in case some directive are needed to prevent downloading huge file. const { canDownload = false, ...linkResourceMetadata } = (await pluginFacade.getMetadata({ - linkType: ctx.link.type, - credentials: ctx.credentials, - resourceId: ctx.link.resourceId + link: ctx.link, + credentials: ctx.credentials })) ?? {} - const { isbn, ignoreMetadata } = directives.extractDirectivesFromName( - linkResourceMetadata.name ?? "" - ) - - const existingLinkMetadata = ctx.book.metadata?.find( - (item) => item.type === "link" - ) + const { isbn, ignoreMetadataFile, ignoreMetadataSources, googleVolumeId } = + directives.extractDirectivesFromName(linkResourceMetadata.name ?? "") - const newLinkMetadata: BookMetadata = mergeSkippingUndefined( - existingLinkMetadata ?? {}, - { - type: "link", - isbn, - title: linkResourceMetadata.name, - contentType: linkResourceMetadata.contentType, - ...linkResourceMetadata.bookMetadata - } - ) + const linkMetadata: BookMetadata = { + type: "link", + isbn, + title: linkResourceMetadata.name, + contentType: linkResourceMetadata.contentType, + googleVolumeId, + ...linkResourceMetadata.bookMetadata + } - let contentType = newLinkMetadata.contentType + let contentType = linkMetadata.contentType /** * Not all plugins return the valid content type so * we can only make some assumptions based on what we have @@ -83,19 +75,21 @@ export const retrieveMetadataAndSaveCover = async ( (contentType && METADATA_EXTRACTOR_SUPPORTED_EXTENSIONS.includes(contentType)) - const sourcesMetadata = await getBookSourcesMetadata( - { - ...newLinkMetadata, - // some plugins returns filename and not title - title: path.parse(newLinkMetadata.title ?? "").name - }, - { - googleApiKey: ctx.googleApiKey, - withGoogle: !bookIsProtected - } - ) - - const metadataList = [newLinkMetadata, ...sourcesMetadata] + const sourcesMetadata = ignoreMetadataSources + ? [] + : await getBookSourcesMetadata( + { + ...linkMetadata, + // some plugins returns filename and not title + title: path.parse(linkMetadata.title ?? "").name + }, + { + googleApiKey: ctx.googleApiKey, + withGoogle: !bookIsProtected + } + ) + + const metadataList = [linkMetadata, ...sourcesMetadata] const { filepath: tmpFilePath, metadata: downloadMetadata } = canDownload && isMaybeExtractAble @@ -127,12 +121,13 @@ export const retrieveMetadataAndSaveCover = async ( contentType = downloadMetadata.contentType || contentType console.log( + `[retrieveMetadataAndSaveCover]`, `syncMetadata processing ${ctx.book._id}`, - tmpFilePath, { - linkMetadata: newLinkMetadata - }, - contentType + linkMetadata, + contentType, + tmpFilePath + } ) const isRarArchive = contentType === "application/x-rar" @@ -145,7 +140,7 @@ export const retrieveMetadataAndSaveCover = async ( (await detectMimeTypeFromContent(tmpFilePath)) || contentType } - if (ignoreMetadata !== "file") { + if (!ignoreMetadataFile) { if (isRarArchive) { archiveExtractor = await getRarArchive(tmpFilePath) const fileMetadata = await getMetadataFromRarArchive( @@ -185,23 +180,15 @@ export const retrieveMetadataAndSaveCover = async ( }) console.log( - `metadataDaemon Finished processing book ${ctx.book._id} with resource id ${ctx.link.resourceId}` + `[retrieveMetadataAndSaveCover]`, + `prepare to update ${ctx.book._id} with`, + { metadataList } ) await atomicUpdate(ctx.db, "book", ctx.book._id, (old) => { - const linkMetadata = old.metadata?.find((item) => item.type === "link") - return { ...old, - /** - * We should always use previous link metadata. Some - * links do not have server state - */ - metadata: metadataList.map((item) => - item.type !== "link" - ? item - : mergeSkippingUndefined(linkMetadata ?? {}, item) - ), + metadata: metadataList, lastMetadataUpdatedAt: new Date().getTime(), metadataUpdateStatus: null, lastMetadataUpdateError: null diff --git a/packages/api/src/functions/syncDataSourceLongProcess/handler.ts b/packages/api/src/functions/syncDataSourceLongProcess/handler.ts index 504a9b39..ec1be808 100644 --- a/packages/api/src/functions/syncDataSourceLongProcess/handler.ts +++ b/packages/api/src/functions/syncDataSourceLongProcess/handler.ts @@ -1,19 +1,14 @@ import { ValidatedEventAPIGatewayProxyEvent } from "@libs/api-gateway" -import { AWS_API_URI } from "../../constants" import { configure as configureGoogleDataSource } from "@libs/plugins/google" import { withToken } from "@libs/auth" import schema from "./schema" import { createHttpError } from "@libs/httpErrors" import { getNanoDbForUser } from "@libs/couch/dbHelpers" -import axios from "axios" import { getParametersValue } from "@libs/ssm" import { deleteLock } from "@libs/supabase/deleteLock" import { supabase } from "@libs/supabase/client" -import { pluginFacade } from "@libs/plugins/facade" -import { Logger } from "@libs/logger" import { withMiddy } from "@libs/middy/withMiddy" - -const logger = Logger.child({ module: "handler" }) +import { sync } from "@libs/sync/sync" const lambda: ValidatedEventAPIGatewayProxyEvent = async ( event @@ -49,32 +44,10 @@ const lambda: ValidatedEventAPIGatewayProxyEvent = async ( throw createHttpError(400) } - const refreshBookMetadata = async ({ bookId }: { bookId: string }) => { - logger.info(`send refreshBookMetadata request for ${bookId}`) - - const response = await axios({ - method: `post`, - url: `${AWS_API_URI}/refresh-metadata`, - data: { - bookId - }, - headers: { - "content-type": "application/json", - accept: "application/json", - "oboku-credentials": JSON.stringify(credentials), - authorization: authorization - } - }) - - logger.info(`refreshBookMetadata request success for ${bookId}`) - logger.info(response) - } - - await pluginFacade.sync({ + await sync({ userName: name, dataSourceId, db: await getNanoDbForUser(name, jwtPrivateKey), - refreshBookMetadata, credentials, authorization }) diff --git a/packages/api/src/libs/books/metadata/getMetadataFromZipArchive.ts b/packages/api/src/libs/books/metadata/getMetadataFromZipArchive.ts index efce9639..7b647bb5 100644 --- a/packages/api/src/libs/books/metadata/getMetadataFromZipArchive.ts +++ b/packages/api/src/libs/books/metadata/getMetadataFromZipArchive.ts @@ -68,7 +68,9 @@ export const getMetadataFromZipArchive = async ( * Path in the archive to the cover image */ coverLink: opfCoverLink - ? `${opfBasePath}/${opfCoverLink}` + ? opfBasePath !== "" + ? `${opfBasePath}/${opfCoverLink}` + : opfCoverLink : firstValidImagePath } } diff --git a/packages/api/src/libs/couch/dbHelpers.ts b/packages/api/src/libs/couch/dbHelpers.ts index 26b791e0..6a94109a 100644 --- a/packages/api/src/libs/couch/dbHelpers.ts +++ b/packages/api/src/libs/couch/dbHelpers.ts @@ -117,6 +117,7 @@ export const findOne = async < if (Array.isArray(fieldsWithRequiredFields)) { fieldsWithRequiredFields.push(`rx_model`) } + const response = await retryFn(() => db.find({ ...restQuery, diff --git a/packages/api/src/libs/google/googleBooksApi.ts b/packages/api/src/libs/google/googleBooksApi.ts index 18948f3d..a1a404e7 100644 --- a/packages/api/src/libs/google/googleBooksApi.ts +++ b/packages/api/src/libs/google/googleBooksApi.ts @@ -3,21 +3,24 @@ import { GOOGLE_BOOK_API_URL } from "../../constants" import { Item } from "./types" import { performWithBackoff } from "@libs/utils" -export type GoogleBooksApiResult = { +export type GoogleBooksApiVolumesResponseData = { kind: `books#volumes` | `unknown` totalItems: number items?: Item[] // does not exist when totalItems is 0 } +export type GoogleBooksApiVolumeResponseData = Item + /** * Supports formats like: [9782413023470, 978-1-947804-36-4] */ export const findByISBN = async (isbn: string, apiKey: string) => { + const url = `${GOOGLE_BOOK_API_URL}/volumes?q=isbn:${encodeURIComponent(isbn)}&key=${apiKey}` + + console.log("[google] [findByISBN]", { url }) + const response = await performWithBackoff({ - asyncFunction: () => - axios.get( - `${GOOGLE_BOOK_API_URL}/volumes?q=isbn:${encodeURIComponent(isbn)}&key=${apiKey}` - ), + asyncFunction: () => axios.get(url), retry: (error: unknown) => { // we retry on Too many request error return isAxiosError(error) && error.response?.status === 429 @@ -36,8 +39,10 @@ export const findByISBN = async (isbn: string, apiKey: string) => { export const findByTitle = async (name: string, apiKey: string) => { const uri = `${GOOGLE_BOOK_API_URL}/volumes?q=intitle:${encodeURIComponent(name)}&key=${apiKey}` + console.log("[google] [findByTitle]", { uri }) + const response = await performWithBackoff({ - asyncFunction: () => axios.get(uri), + asyncFunction: () => axios.get(uri), retry: (error: unknown) => { // we retry on Too many request error return isAxiosError(error) && error.response?.status === 429 @@ -53,10 +58,32 @@ export const findByTitle = async (name: string, apiKey: string) => { throw new Error(`An error occurred during findByISBN`) } +export const findByVolumeId = async (name: string, apiKey: string) => { + const uri = `${GOOGLE_BOOK_API_URL}/volumes/${encodeURIComponent(name)}?key=${apiKey}` + + console.log("[google] [findByVolumeId]", { uri }) + + const response = await performWithBackoff({ + asyncFunction: () => axios.get(uri), + retry: (error: unknown) => { + // we retry on Too many request error + return isAxiosError(error) && error.response?.status === 429 + } + }) + + if (response.status === 200) { + return { + items: [response.data] + } + } + + throw new Error(`An error occurred during findByISBN`) +} + export const findSeriesByTitle = async (name: string, apiKey: string) => { const response = await performWithBackoff({ asyncFunction: () => - axios.get( + axios.get( `${GOOGLE_BOOK_API_URL}/volumes?q=intitle:${name}&key=${apiKey}` ), retry: (error: unknown) => { diff --git a/packages/api/src/libs/google/types.ts b/packages/api/src/libs/google/types.ts index 8061eea8..c7ef9896 100644 --- a/packages/api/src/libs/google/types.ts +++ b/packages/api/src/libs/google/types.ts @@ -12,7 +12,7 @@ export type Item = { title: string authors: string[] publisher: string - publishedDate: YEAR + publishedDate?: YEAR language: "de" | "fr" pageCount?: number categories?: Category[] diff --git a/packages/api/src/libs/metadata/extractDateComponents.ts b/packages/api/src/libs/metadata/extractDateComponents.ts index 4cd4ce36..295f7a94 100644 --- a/packages/api/src/libs/metadata/extractDateComponents.ts +++ b/packages/api/src/libs/metadata/extractDateComponents.ts @@ -1,4 +1,4 @@ -export function extractDateComponents(dateStr: string) { +export function extractDateComponents(dateStr: string | undefined = "") { const parts = dateStr.split(" ") let day = undefined, month = undefined, diff --git a/packages/api/src/libs/metadata/google/getGoogleBookMetadata.ts b/packages/api/src/libs/metadata/google/getGoogleBookMetadata.ts index ce07cae2..e77fc555 100644 --- a/packages/api/src/libs/metadata/google/getGoogleBookMetadata.ts +++ b/packages/api/src/libs/metadata/google/getGoogleBookMetadata.ts @@ -1,11 +1,8 @@ import { Metadata } from "../types" -import { findByISBN, findByTitle } from "@libs/google/googleBooksApi" +import { findByISBN, findByTitle, findByVolumeId } from "@libs/google/googleBooksApi" import { parseGoogleMetadata } from "./parseGoogleMetadata" -import { Logger } from "@libs/logger" import { refineTitle } from "../refineTitle" -const logger = Logger.child({ module: "getGoogleBookMetadata" }) - export const getGoogleBookMetadata = async ( metadata: Metadata, apiKey: string @@ -13,13 +10,17 @@ export const getGoogleBookMetadata = async ( let titleRefined = metadata.title ?? "" let response = metadata.isbn ? await findByISBN(metadata.isbn, apiKey) - : await findByTitle(titleRefined, apiKey) + : metadata.googleVolumeId + ? await findByVolumeId(metadata.googleVolumeId, apiKey) + : await findByTitle(titleRefined, apiKey) + console.log("[google] [getGoogleBookMetadata]", { response }) if (!response.items?.length) { titleRefined = refineTitle(metadata.title ?? "", 1) - logger.info( - `getGoogleMetadata was unable to find result for isbn:${metadata.isbn} or title:${metadata.title}. Trying to refine title with 1 deepness ${titleRefined}` + console.log( + `[getGoogleBookMetadata]`, + `was unable to find result for isbn:${metadata.isbn} or title:${metadata.title} or volumeId:${metadata.googleVolumeId}. Trying to refine title with 1 deepness ${titleRefined}` ) response = await findByTitle(titleRefined, apiKey) @@ -27,8 +28,9 @@ export const getGoogleBookMetadata = async ( if (!response.items?.length) { titleRefined = refineTitle(metadata.title ?? "", 2) - logger.info( - `getGoogleMetadata was unable to find result for ${titleRefined}. Trying to refine title with 2 deepness ${titleRefined}` + console.log( + `[getGoogleBookMetadata]`, + `was unable to find result for ${titleRefined}. Trying to refine title with 2 deepness ${titleRefined}` ) response = await findByTitle(titleRefined, apiKey) @@ -37,8 +39,9 @@ export const getGoogleBookMetadata = async ( if (!response.items?.length) { titleRefined = refineTitle(metadata.title ?? "", 3) - logger.info( - `getGoogleMetadata was unable to find result for ${titleRefined}. Trying to refine title with 3 deepness ${titleRefined}` + console.log( + `[getGoogleBookMetadata]`, + `was unable to find result for ${titleRefined}. Trying to refine title with 3 deepness ${titleRefined}` ) response = await findByTitle(titleRefined, apiKey) @@ -47,8 +50,9 @@ export const getGoogleBookMetadata = async ( if (!response.items?.length) { titleRefined = refineTitle(metadata.title ?? "", 4) - logger.info( - `getGoogleMetadata was unable to find result for ${titleRefined}. Trying to refine title with 4 deepness ${titleRefined}` + console.log( + `[getGoogleBookMetadata]`, + `was unable to find result for ${titleRefined}. Trying to refine title with 4 deepness ${titleRefined}` ) response = await findByTitle(titleRefined, apiKey) @@ -57,15 +61,16 @@ export const getGoogleBookMetadata = async ( if (!response.items?.length) { titleRefined = refineTitle(metadata.title ?? "", 5) - logger.info( - `getGoogleMetadata was unable to find result for ${titleRefined}. Trying to refine title with 5 deepness ${titleRefined}` + console.log( + `[getGoogleBookMetadata]`, + `was unable to find result for ${titleRefined}. Trying to refine title with 5 deepness ${titleRefined}` ) response = await findByTitle(titleRefined, apiKey) } } - logger.info( + console.log( `${response.items?.length ?? 0} items found from google book API for title "${metadata.title}" & isbn "${metadata.isbn}" thanks to refined title "${titleRefined}"` ) diff --git a/packages/api/src/libs/metadata/google/parseGoogleMetadata.test.ts b/packages/api/src/libs/metadata/google/parseGoogleMetadata.test.ts index 627562c3..039ba8cc 100644 --- a/packages/api/src/libs/metadata/google/parseGoogleMetadata.test.ts +++ b/packages/api/src/libs/metadata/google/parseGoogleMetadata.test.ts @@ -1,9 +1,9 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { GoogleBooksApiResult } from "@libs/google/googleBooksApi" +import { GoogleBooksApiVolumesResponseData } from "@libs/google/googleBooksApi" import { parseGoogleMetadata } from "./parseGoogleMetadata" import { describe, it, expect } from "vitest" -const getDefaultData = (): GoogleBooksApiResult => ({ +const getDefaultData = (): GoogleBooksApiVolumesResponseData => ({ kind: `books#volumes`, totalItems: 1, items: [ diff --git a/packages/api/src/libs/metadata/google/parseGoogleMetadata.ts b/packages/api/src/libs/metadata/google/parseGoogleMetadata.ts index 0fd8a556..3d466edf 100644 --- a/packages/api/src/libs/metadata/google/parseGoogleMetadata.ts +++ b/packages/api/src/libs/metadata/google/parseGoogleMetadata.ts @@ -1,9 +1,9 @@ import { extractDateComponents } from "../extractDateComponents" import { Metadata } from "../types" -import { GoogleBooksApiResult } from "@libs/google/googleBooksApi" +import { GoogleBooksApiVolumesResponseData } from "@libs/google/googleBooksApi" export const parseGoogleMetadata = ( - response: GoogleBooksApiResult + response: Pick ): Omit => { let coverLink: string | undefined diff --git a/packages/api/src/libs/plugins/facade.ts b/packages/api/src/libs/plugins/facade.ts index 5b17b8ec..d3b4560c 100644 --- a/packages/api/src/libs/plugins/facade.ts +++ b/packages/api/src/libs/plugins/facade.ts @@ -1,32 +1,23 @@ -import { LinkDocType, ObokuErrorCode, ObokuSharedError } from "@oboku/shared" -import { createHelpers } from "./helpers" -import { synchronizeFromDataSource } from "../sync/synchronizeFromDataSource" -import createNano from "nano" +import { LinkDocType } from "@oboku/shared" import { plugins } from "./plugins" -import { atomicUpdate } from "@libs/couch/dbHelpers" -import { SyncReport } from "@libs/sync/SyncReport" const urlPlugin = plugins.find(({ type }) => type === `URI`) export const pluginFacade = { getMetadata: async ({ - resourceId, - linkType, - resourceData, - credentials + credentials, + link }: { - resourceId: string - linkType: string + link: Pick credentials?: any - resourceData?: any }) => { - const plugin = plugins.find(({ type }) => type === linkType) || urlPlugin + const plugin = plugins.find(({ type }) => type === link.type) || urlPlugin if (plugin) { return await plugin.getMetadata({ - id: resourceId, + id: link.resourceId, credentials, - data: resourceData + data: link.data }) } @@ -40,103 +31,5 @@ export const pluginFacade = { } throw new Error(`No dataSource found for action`) - }, - sync: async ({ - dataSourceId, - userName, - credentials, - refreshBookMetadata, - authorization, - db - }: { - dataSourceId: string - userName: string - credentials?: any - authorization: string - refreshBookMetadata: ({ bookId }: { bookId: string }) => Promise - db: createNano.DocumentScope - }) => { - console.log( - `dataSourceFacade started sync for ${dataSourceId} with user ${userName}` - ) - - const syncReport = new SyncReport(dataSourceId, userName) - const nameHex = Buffer.from(userName).toString("hex") - const helpers = createHelpers(dataSourceId, refreshBookMetadata, db) - - try { - const dataSource = await helpers.findOne("datasource", { - selector: { _id: dataSourceId } - }) - - if (!dataSource) throw new Error("Data source not found") - - if (dataSource.syncStatus !== "fetching") { - await atomicUpdate(db, "datasource", dataSource._id, (old) => ({ - ...old, - syncStatus: "fetching" as const - })) - } - - const { type } = dataSource - - // we create the date now on purpose so that if something change on the datasource - // during the process (which can take time), user will not be misled to believe its - // latest changes have been synced - const lastSyncedAt = new Date().getTime() - const ctx = { - dataSourceId, - userName, - credentials, - dataSourceType: type, - authorization, - db, - syncReport, - userNameHex: nameHex - } - const plugin = plugins.find((plugin) => plugin.type === type) - - if (!plugin?.sync) { - throw new Error("plugin does not support sync") - } - - const synchronizeAbleDataSource = await plugin?.sync(ctx, helpers) - - console.log(`Execute sync process with ${plugin?.type} plugin`) - - if (synchronizeAbleDataSource) { - await synchronizeFromDataSource(synchronizeAbleDataSource, ctx, helpers) - } - - console.log(`Update datasource with sync success flag`) - - await atomicUpdate(db, "datasource", dataSourceId, (old) => ({ - ...old, - lastSyncedAt, - lastSyncErrorCode: null, - syncStatus: null - })) - - console.log(`dataSourcesSync for ${dataSourceId} completed successfully`) - } catch (e) { - syncReport.fail() - - let lastSyncErrorCode = ObokuErrorCode.ERROR_DATASOURCE_UNKNOWN - if (e instanceof ObokuSharedError) { - lastSyncErrorCode = e.code - } - - await atomicUpdate(db, "datasource", dataSourceId, (old) => ({ - ...old, - lastSyncErrorCode, - syncStatus: null - })) - - throw e - } finally { - syncReport.end() - - await syncReport.send() - } } } diff --git a/packages/api/src/libs/plugins/file/index.ts b/packages/api/src/libs/plugins/file/index.ts index 3a291cb2..153bc753 100644 --- a/packages/api/src/libs/plugins/file/index.ts +++ b/packages/api/src/libs/plugins/file/index.ts @@ -3,5 +3,15 @@ import { PLUGIN_FILE_TYPE } from "@oboku/shared" export const plugin: DataSourcePlugin = { type: PLUGIN_FILE_TYPE, - getMetadata: async () => undefined + getMetadata: async ({ data }) => { + const { filename = "" } = data ?? {} + + return { + name: filename, + canDownload: false, + bookMetadata: { + title: filename + } + } + } } diff --git a/packages/api/src/libs/plugins/google/index.ts b/packages/api/src/libs/plugins/google/index.ts index 6cf4901c..fd231025 100644 --- a/packages/api/src/libs/plugins/google/index.ts +++ b/packages/api/src/libs/plugins/google/index.ts @@ -7,10 +7,9 @@ import { drive_v3, google } from "googleapis" import { GoogleDriveDataSourceData, READER_SUPPORTED_MIME_TYPES, - READER_SUPPORTED_EXTENSIONS + isFileSupported } from "@oboku/shared" import { configure } from "./configure" -import path from "path" import { DataSourcePlugin, SynchronizeAbleDataSource @@ -150,39 +149,35 @@ export const dataSource: DataSourcePlugin = { ) const files = await getNextRes() + const supportedFiles = files.filter((file) => { + return ( + file.trashed !== true && (isFolder(file) || isFileSupported(file)) + ) + }) return Promise.all( - files - .filter( - (file) => - file.trashed !== true && - (isFolder(file) || - READER_SUPPORTED_EXTENSIONS.includes( - path.extname(file.name || ``).toLowerCase() - )) - ) - .map( - async ( - file - ): Promise => { - if (isFolder(file)) { - return { - type: "folder", - resourceId: generateResourceId(file.id || ""), - items: await getContentsFromFolder(file.id || ""), - name: file.name || "", - modifiedAt: file.modifiedTime || new Date().toISOString() - } - } - + supportedFiles.map( + async ( + file + ): Promise => { + if (isFolder(file)) { return { - type: "file", + type: "folder", resourceId: generateResourceId(file.id || ""), + items: await getContentsFromFolder(file.id || ""), name: file.name || "", modifiedAt: file.modifiedTime || new Date().toISOString() } } - ) + + return { + type: "file", + resourceId: generateResourceId(file.id || ""), + name: file.name || "", + modifiedAt: file.modifiedTime || new Date().toISOString() + } + } + ) ) } ) diff --git a/packages/api/src/libs/sync/SyncReport.ts b/packages/api/src/libs/sync/SyncReport.ts index 76ce234f..09ec01af 100644 --- a/packages/api/src/libs/sync/SyncReport.ts +++ b/packages/api/src/libs/sync/SyncReport.ts @@ -8,7 +8,7 @@ import { } from "@oboku/shared" export class SyncReport { - report: { + protected readonly report: { created_at: string ended_at: string report: ReportEntry[] @@ -18,6 +18,8 @@ export class SyncReport { report: [] } + protected readonly references: Record = {} + protected state: SupabaseTableSyncReportsEntry["state"] = "success" constructor( @@ -72,6 +74,12 @@ export class SyncReport { return typeof title === "string" ? title : title?.en } + upsetReference(id: string | undefined, label: string) { + if (!id) return this + + this.references[id] = label + } + addItem( rx_model: ReportEntry["rx_model"], { id, label }: { id: string; label?: string } @@ -301,12 +309,21 @@ export class SyncReport { }) } + fetchBookMetadata(bookId: string) { + const item = this.getOrCreateEntry("book", { id: bookId }) + + item.fetchedMetadata = true + } + async send() { try { const response = await supabase.from("sync_reports").insert({ created_at: this.report.created_at, ended_at: this.report.ended_at, - report: this.report.report, + report: this.report.report.map((entry) => ({ + ...entry, + label: entry.label ?? this.references[entry.id] ?? entry.id + })), datasource_id: this.datasourceId, user_name: this.userName, state: this.state diff --git a/packages/api/src/libs/sync/books/createOrUpdateBook.ts b/packages/api/src/libs/sync/books/createOrUpdateBook.ts index f97c6c52..4b23b3ea 100644 --- a/packages/api/src/libs/sync/books/createOrUpdateBook.ts +++ b/packages/api/src/libs/sync/books/createOrUpdateBook.ts @@ -41,8 +41,12 @@ export const createOrUpdateBook = async ({ helpers: Helpers }) => { const { dataSourceType, dataSourceId, syncReport, db } = ctx + try { - Logger.info(`createOrUpdateBook "${item.name}":`, item.resourceId) + console.log( + `[sync.books] [createOrUpdateBook] "${item.name}":`, + item.resourceId + ) const parentTagNames = parents.reduce( (tags: string[], parent) => [ @@ -141,6 +145,8 @@ export const createOrUpdateBook = async ({ } } + syncReport.upsetReference(existingBook?._id, item.name) + if (!linkForResourceId || !existingBook) { let bookId = existingBook?._id @@ -231,7 +237,8 @@ export const createOrUpdateBook = async ({ .refreshBookMetadata({ bookId: existingBook?._id }) .catch(logger.error) - Logger.info( + console.log( + `[sync.books] [createOrUpdateBook]`, `book ${ linkForResourceId.book } has changed in metadata, refresh triggered ${lastMetadataUpdatedAt} ${new Date( @@ -281,7 +288,7 @@ export const createOrUpdateBook = async ({ }) } - Logger.info(`createOrUpdateBook "${item.name}": DONE!`) + console.log(`[createOrUpdateBook]`, `"${item.name}": DONE!`) } catch (e) { logger.error( `createOrUpdateBook something went wrong for book ${item.name} (${item.resourceId})` diff --git a/packages/api/src/libs/sync/books/synchronizeBookWithParentCollections.ts b/packages/api/src/libs/sync/books/synchronizeBookWithParentCollections.ts index 965f8832..199eede3 100644 --- a/packages/api/src/libs/sync/books/synchronizeBookWithParentCollections.ts +++ b/packages/api/src/libs/sync/books/synchronizeBookWithParentCollections.ts @@ -27,7 +27,8 @@ export const synchronizeBookWithParentCollections = async ( ) => { const parentResourceIds = parents?.map((parent) => parent.resourceId) || [] - logger.info( + console.log( + `[synchronizeBookWithParentCollections]`, `${book._id} with ${parentResourceIds.length} parentResourceIds ${parentResourceIds}` ) diff --git a/packages/api/src/libs/sync/sync.ts b/packages/api/src/libs/sync/sync.ts new file mode 100644 index 00000000..44b20e6b --- /dev/null +++ b/packages/api/src/libs/sync/sync.ts @@ -0,0 +1,144 @@ +import createNano from "nano" +import { SyncReport } from "./SyncReport" +import { createHelpers } from "@libs/plugins/helpers" +import { atomicUpdate } from "@libs/couch/dbHelpers" +import { plugins } from "@libs/plugins/plugins" +import { synchronizeFromDataSource } from "./synchronizeFromDataSource" +import { ObokuErrorCode, ObokuSharedError } from "@oboku/shared" +import axios from "axios" +import { AWS_API_URI } from "src/constants" + +export const sync = async ({ + dataSourceId, + userName, + credentials, + authorization, + db +}: { + dataSourceId: string + userName: string + credentials?: any + authorization: string + db: createNano.DocumentScope +}) => { + const syncReport = new SyncReport(dataSourceId, userName) + + console.log( + `dataSourceFacade started sync for ${dataSourceId} with user ${userName}` + ) + + const refreshBookMetadata = async ({ bookId }: { bookId: string }) => { + console.log( + `[syncDataSourceLongProcess] [refreshBookMetadata]`, + `request for ${bookId}` + ) + + syncReport.fetchBookMetadata(bookId) + + const response = await axios({ + method: `post`, + url: `${AWS_API_URI}/refresh-metadata`, + data: { + bookId + }, + headers: { + "content-type": "application/json", + accept: "application/json", + "oboku-credentials": JSON.stringify(credentials), + authorization: authorization + } + }) + + if (response.status >= 400) { + console.error( + `[syncDataSourceLongProcess] [refreshBookMetadata]`, + `request error for ${bookId}`, + response.status + ) + } else { + console.log( + `[syncDataSourceLongProcess] [refreshBookMetadata]`, + `request success for ${bookId}`, + response.status + ) + } + } + + const nameHex = Buffer.from(userName).toString("hex") + const helpers = createHelpers(dataSourceId, refreshBookMetadata, db) + + try { + const dataSource = await helpers.findOne("datasource", { + selector: { _id: dataSourceId } + }) + + if (!dataSource) throw new Error("Data source not found") + + if (dataSource.syncStatus !== "fetching") { + await atomicUpdate(db, "datasource", dataSource._id, (old) => ({ + ...old, + syncStatus: "fetching" as const + })) + } + + const { type } = dataSource + + // we create the date now on purpose so that if something change on the datasource + // during the process (which can take time), user will not be misled to believe its + // latest changes have been synced + const lastSyncedAt = new Date().getTime() + const ctx = { + dataSourceId, + userName, + credentials, + dataSourceType: type, + authorization, + db, + syncReport, + userNameHex: nameHex + } + const plugin = plugins.find((plugin) => plugin.type === type) + + if (!plugin?.sync) { + throw new Error("plugin does not support sync") + } + + const synchronizeAbleDataSource = await plugin?.sync(ctx, helpers) + + console.log(`Execute sync process with ${plugin?.type} plugin`) + + if (synchronizeAbleDataSource) { + await synchronizeFromDataSource(synchronizeAbleDataSource, ctx, helpers) + } + + console.log(`Update datasource with sync success flag`) + + await atomicUpdate(db, "datasource", dataSourceId, (old) => ({ + ...old, + lastSyncedAt, + lastSyncErrorCode: null, + syncStatus: null + })) + + console.log(`dataSourcesSync for ${dataSourceId} completed successfully`) + } catch (e) { + syncReport.fail() + + let lastSyncErrorCode = ObokuErrorCode.ERROR_DATASOURCE_UNKNOWN + if (e instanceof ObokuSharedError) { + lastSyncErrorCode = e.code + } + + await atomicUpdate(db, "datasource", dataSourceId, (old) => ({ + ...old, + lastSyncErrorCode, + syncStatus: null + })) + + throw e + } finally { + syncReport.end() + + await syncReport.send() + } +} diff --git a/packages/api/src/libs/sync/synchronizeFromDataSource.ts b/packages/api/src/libs/sync/synchronizeFromDataSource.ts index 74ac9e80..12a6f9ee 100644 --- a/packages/api/src/libs/sync/synchronizeFromDataSource.ts +++ b/packages/api/src/libs/sync/synchronizeFromDataSource.ts @@ -148,8 +148,8 @@ const syncFolder = async ({ await syncCollection({ ctx, item, helpers }) } - logger.info( - `syncFolder ${item.name}: with items ${item.items?.length || 0} items` + console.log( + `[syncFolder] ${item.name}: with items ${item.items?.length || 0} items` ) await Promise.all( @@ -174,5 +174,5 @@ const syncFolder = async ({ }) ) - logger.info(`syncFolder ${item.name} DONE!`) + console.log(`[syncFolder] ${item.name} DONE!`) } diff --git a/packages/shared/src/contentType.ts b/packages/shared/src/contentType.ts new file mode 100644 index 00000000..9b69be3a --- /dev/null +++ b/packages/shared/src/contentType.ts @@ -0,0 +1,36 @@ +export const getUrlExtension = (url: string) => { + return url.split(/[#?]/)[0]?.split(`.`).pop()?.trim() || `` +} + +export const READER_ACCEPTED_EXTENSIONS = { + "text/plain": [".txt"], + "application/x-cbz": [".cbz"], + "application/zip": [".epub", ".zip"], + "application/x-zip-compressed": [".epub", ".zip"], + "application/epub+zip": [".epub", ".zip"], + "application/x-cbr": [".cbr"], + "application/x-rar": [".cbr"] +} + +export const READER_SUPPORTED_MIME_TYPES = Object.keys( + READER_ACCEPTED_EXTENSIONS +) + +export const READER_SUPPORTED_EXTENSIONS = Object.values( + READER_ACCEPTED_EXTENSIONS +).reduce((prev, next) => [...prev, ...next], []) + +export const isFileSupported = ({ + mimeType, + name +}: { + name?: string | null + mimeType?: string | null +}) => { + const extension = `.${getUrlExtension(name || "")}` + + return ( + READER_SUPPORTED_EXTENSIONS.includes(extension) || + READER_SUPPORTED_MIME_TYPES.includes(mimeType ?? "") + ) +} diff --git a/packages/shared/src/directives.ts b/packages/shared/src/directives.ts index 49d3852b..5fef4ba3 100644 --- a/packages/shared/src/directives.ts +++ b/packages/shared/src/directives.ts @@ -19,9 +19,11 @@ export const extractDirectivesFromName = ( isbn?: string | undefined series: boolean | undefined year?: string | undefined - ignoreMetadata?: string | undefined + ignoreMetadataFile: boolean + ignoreMetadataSources: boolean isWebtoon: boolean metadataTitle?: string | undefined + googleVolumeId?: string | undefined } => { let isNotACollection = false let tags: string[] = [] @@ -30,9 +32,11 @@ export const extractDirectivesFromName = ( let year: string | undefined = undefined let isbn: string | undefined = undefined let series: boolean | undefined = undefined - let ignoreMetadata: string | undefined = undefined + let ignoreMetadataFile = false + let ignoreMetadataSources = false let metadataTitle: string | undefined = undefined let isWebtoon: boolean = false + let googleVolumeId: string | undefined = undefined const directives = resourceId .match(/(\[oboku\~[^\]]*\])+/gi) @@ -47,9 +51,17 @@ export const extractDirectivesFromName = ( isWebtoon = true } - if (directive.startsWith("metadata-ignore~")) { - const value = directive.replace(/metadata-ignore\~/, "") - ignoreMetadata = value + if (directive.startsWith("google-volume-id~")) { + const value = directive.replace(/google-volume-id\~/, "") + googleVolumeId = value + } + + if (directive.startsWith("metadata-ignore-file")) { + ignoreMetadataFile = true + } + + if (directive.startsWith("metadata-ignore-sources")) { + ignoreMetadataSources = true } if (directive.startsWith("metadata-title~")) { @@ -98,9 +110,11 @@ export const extractDirectivesFromName = ( direction, isbn, year, - ignoreMetadata, + ignoreMetadataFile, + ignoreMetadataSources, isWebtoon, - metadataTitle + metadataTitle, + googleVolumeId } } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 60a1352a..caa22b76 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,21 +1,3 @@ -export const READER_ACCEPTED_EXTENSIONS = { - "text/plain": [".txt"], - "application/x-cbz": [".cbz"], - "application/zip": [".epub", ".zip"], - "application/x-zip-compressed": [".epub", ".zip"], - "application/epub+zip": [".epub", ".zip"], - "application/x-cbr": [".cbr"], - "application/x-rar": [".cbr"] -} - -export const READER_SUPPORTED_MIME_TYPES = Object.keys( - READER_ACCEPTED_EXTENSIONS -) - -export const READER_SUPPORTED_EXTENSIONS = Object.values( - READER_ACCEPTED_EXTENSIONS -).reduce((prev, next) => [...prev, ...next], []) - export const design = { palette: { orange: `rgb(225, 100, 50, 1)` @@ -90,4 +72,5 @@ export * from "./utils/truncate" export * from "./utils/intersection" export * from "./utils/groupBy" export * from "./utils/mergeWith" -export * from "./collections" \ No newline at end of file +export * from "./collections" +export * from "./contentType" \ No newline at end of file diff --git a/packages/shared/src/metadata/index.ts b/packages/shared/src/metadata/index.ts index 9c320abc..09fda9d9 100644 --- a/packages/shared/src/metadata/index.ts +++ b/packages/shared/src/metadata/index.ts @@ -14,6 +14,7 @@ export type BookMetadata = { isbn?: string publisher?: string | undefined rights?: string | undefined + googleVolumeId?: string | undefined /** * googleBookApi: Metadata scrapped through google book api * link: metadata scrapped from the current link diff --git a/packages/shared/src/sync/reports.ts b/packages/shared/src/sync/reports.ts index 143d8fe5..3792645b 100644 --- a/packages/shared/src/sync/reports.ts +++ b/packages/shared/src/sync/reports.ts @@ -7,6 +7,7 @@ export type ReportEntry = { // used for link & books linkedTo?: { id: string; label?: string; rx_model: RxModel }[] unlinkedTo?: { id: string; label?: string; rx_model: RxModel }[] + fetchedMetadata?: boolean added?: boolean updated?: boolean deleted?: boolean diff --git a/packages/web/src/constants.shared.ts b/packages/web/src/constants.shared.ts index 2da0d8ea..997cb42c 100644 --- a/packages/web/src/constants.shared.ts +++ b/packages/web/src/constants.shared.ts @@ -5,7 +5,6 @@ const hostname = ? window?.location?.hostname : sw?.location?.hostname - export const STREAMER_URL_PREFIX = `streamer` export const DOWNLOAD_PREFIX = `book-download` export const SENTRY_DSN = `https://0d7a61df8dba4122be660fcc1161bf49@o490447.ingest.sentry.io/5554285` diff --git a/packages/web/src/dataSources/reports/DataSourcesReportsScreen.tsx b/packages/web/src/dataSources/reports/DataSourcesReportsScreen.tsx index e820d462..83e58d76 100644 --- a/packages/web/src/dataSources/reports/DataSourcesReportsScreen.tsx +++ b/packages/web/src/dataSources/reports/DataSourcesReportsScreen.tsx @@ -59,7 +59,17 @@ export const DataSourcesReportsScreen = memo(() => { {!!entry.report.report.length && ( {entry.report.report.map( - ({ rx_model, linkedTo, label, id, added }, index) => { + ( + { + rx_model, + linkedTo, + label, + id, + added, + ...reportEntry + }, + index + ) => { const linkedToBooks = linkedTo?.filter( (item) => item.rx_model === "book" @@ -134,6 +144,19 @@ export const DataSourcesReportsScreen = memo(() => { )} + {rx_model === `book` && + reportEntry.fetchedMetadata && ( + + {icon}{" "} + + Book {label ?? id} had metadata + refetch + + + )} {rx_model === `obokucollection` && !!linkedToBooks?.length && ( diff --git a/packages/web/src/dataSources/reports/ReportSummary.tsx b/packages/web/src/dataSources/reports/ReportSummary.tsx index 2718a9b9..c94900af 100644 --- a/packages/web/src/dataSources/reports/ReportSummary.tsx +++ b/packages/web/src/dataSources/reports/ReportSummary.tsx @@ -40,6 +40,12 @@ export const ReportSummary = memo( (s) updated )} + {!!entry[rxModel].fetchedMetadata && ( + + {entry[rxModel].fetchedMetadata} {getRxModelLabelFromValue(rxModel)} + (s) with metadata fetched + + )} ) )} diff --git a/packages/web/src/dataSources/reports/useSyncReports.ts b/packages/web/src/dataSources/reports/useSyncReports.ts index d41d5cd4..23370ffc 100644 --- a/packages/web/src/dataSources/reports/useSyncReports.ts +++ b/packages/web/src/dataSources/reports/useSyncReports.ts @@ -15,14 +15,17 @@ export const useSyncReports = () => const entries = response?.data .map((report) => { return report.report.reduce( - (acc, { rx_model, added, deleted, updated }) => { + (acc, { rx_model, added, deleted, updated, fetchedMetadata }) => { const updateWith = (entry: { added: number deleted: number updated: number + fetchedMetadata: number }) => { return { - ...entry, + ...(fetchedMetadata && { + fetchedMetadata: entry.fetchedMetadata + 1 + }), ...(added && { added: entry.added + 1 }), @@ -47,27 +50,32 @@ export const useSyncReports = () => book: { added: 0, updated: 0, - deleted: 0 + deleted: 0, + fetchedMetadata: 0 }, tag: { added: 0, updated: 0, - deleted: 0 + deleted: 0, + fetchedMetadata: 0 }, link: { added: 0, updated: 0, - deleted: 0 + deleted: 0, + fetchedMetadata: 0 }, obokucollection: { added: 0, updated: 0, - deleted: 0 + deleted: 0, + fetchedMetadata: 0 }, datasource: { added: 0, updated: 0, - deleted: 0 + deleted: 0, + fetchedMetadata: 0 } } ) diff --git a/packages/web/src/plugins/local/useAddBookFromFile.ts b/packages/web/src/plugins/local/useAddBookFromFile.ts index 8c53e7c0..d905709f 100644 --- a/packages/web/src/plugins/local/useAddBookFromFile.ts +++ b/packages/web/src/plugins/local/useAddBookFromFile.ts @@ -13,7 +13,9 @@ export const useAddBookFromFile = () => { (await addBook({ link: { book: null, - data: {} satisfies PLUGIN_FILE_DATA, + data: { + filename: file.name + } satisfies PLUGIN_FILE_DATA, resourceId: "file", type: PLUGIN_FILE_TYPE, createdAt: new Date().toISOString(), diff --git a/packages/web/src/reader/gestures/useGestureHandler.ts b/packages/web/src/reader/gestures/useGestureHandler.ts index c772c614..7cf3c694 100644 --- a/packages/web/src/reader/gestures/useGestureHandler.ts +++ b/packages/web/src/reader/gestures/useGestureHandler.ts @@ -7,12 +7,12 @@ export const useGestureHandler = () => { useSubscribe( () => - reader?.gestures.unhandledEvent$.pipe( - tap((event) => { + reader?.gestures.gestures$.pipe( + tap(({ event, handled }) => { /** * Toggle menu when tap is not navigating */ - if (event.type === "tap") { + if (event.type === "tap" && !handled) { isMenuShownStateSignal.setValue((val) => !val) } })